├── Orion-API-Manager-Docs ├── .gitignore ├── dist │ ├── assets │ │ ├── js │ │ │ ├── 7.7c7c5df6.js │ │ │ ├── 3.7802b982.js │ │ │ ├── 4.7d75b37f.js │ │ │ └── 5.e199e4b4.js │ │ └── img │ │ │ └── search.83621669.svg │ ├── api.png │ ├── logo.png │ ├── alipay.jpg │ ├── favicon.ico │ ├── weixin.png │ ├── apigroup.png │ ├── projects.png │ ├── gitee_logo.png │ ├── client │ │ ├── favicon.ico │ │ ├── fonts │ │ │ ├── element-icons.535877f5.woff │ │ │ └── element-icons.732389de.ttf │ │ ├── index.html │ │ └── css │ │ │ └── app.af54f0fc.css │ ├── README.md │ ├── LICENSE │ └── 404.html ├── package-lock.json ├── README.md ├── docs │ ├── .vuepress │ │ ├── public │ │ │ ├── api.png │ │ │ ├── logo.png │ │ │ ├── alipay.jpg │ │ │ ├── favicon.ico │ │ │ ├── weixin.png │ │ │ ├── apigroup.png │ │ │ ├── gitee_logo.png │ │ │ ├── projects.png │ │ │ ├── client │ │ │ │ ├── favicon.ico │ │ │ │ ├── fonts │ │ │ │ │ ├── element-icons.732389de.ttf │ │ │ │ │ └── element-icons.535877f5.woff │ │ │ │ ├── index.html │ │ │ │ └── css │ │ │ │ │ └── app.af54f0fc.css │ │ │ ├── README.md │ │ │ └── LICENSE │ │ └── config.js │ └── README.md └── package.json ├── resources ├── start.bat ├── start.sh ├── 使用说明 │ ├── windowStart.bat │ ├── 修改成免JDK版说明.txt │ ├── 使用说明.txt │ ├── linuxStart.sh │ └── macStart.sh └── config │ ├── ConfigDB.db │ ├── user.json │ └── application.yml ├── Server-UI ├── css │ ├── chunk-c90e13c8.a585df94.css │ ├── chunk-66c2c60b.bf57b4eb.css │ ├── chunk-6960012a.8d198a30.css │ ├── chunk-773fa5fc.cab21ce2.css │ ├── chunk-25904293.f9f8df3c.css │ ├── chunk-d6d24374.6d4a83ac.css │ ├── chunk-85e0a1d0.f5e8739c.css │ ├── chunk-af94418a.c9ed0dc3.css │ ├── chunk-1c8ff139.2c0c59e8.css │ ├── chunk-7da4ef10.a3ff37ee.css │ ├── chunk-6951fa7a.11a1d5e3.css │ └── chunk-b62889f0.0fcd1e95.css ├── favicon.ico ├── img │ └── logo.ce61f367.png ├── fonts │ ├── element-icons.535877f5.woff │ └── element-icons.732389de.ttf ├── js │ ├── chunk-25904293.d8290f8f.js │ └── chunk-25904293.d8290f8f.js.map └── index.html ├── config ├── ConfigDB.db └── user.json ├── Client-UI ├── favicon.ico ├── fonts │ ├── element-icons.535877f5.woff │ └── element-icons.732389de.ttf ├── index.html └── css │ └── app.af54f0fc.css ├── .mvn └── wrapper │ ├── maven-wrapper.jar │ ├── maven-wrapper.properties │ └── MavenWrapperDownloader.java ├── src ├── main │ ├── resources │ │ ├── favicon.ico │ │ ├── META-INF │ │ │ └── additional-spring-configuration-metadata.json │ │ ├── application.yml │ │ └── application-mysql.yml │ └── java │ │ └── org │ │ └── mirrentools │ │ └── orion │ │ ├── common │ │ ├── LoginRole.java │ │ ├── NoStackTraceThrowable.java │ │ ├── OrionApiManager.java │ │ ├── ColumnsTags.java │ │ ├── ColumnsProjectShare.java │ │ ├── ColumnsApiTemplate.java │ │ ├── ColumnsApiGroup.java │ │ ├── ColumnsUsers.java │ │ ├── ColumnsProject.java │ │ ├── ColumnsAPI.java │ │ ├── WebSocket.java │ │ ├── LoginSessionStore.java │ │ ├── LoginSession.java │ │ ├── VerifyCodeSession.java │ │ ├── VerifyCodeSessionStore.java │ │ ├── ResultUtil.java │ │ ├── WebSocketBase.java │ │ ├── MD5Util.java │ │ └── ResultCode.java │ │ ├── service │ │ ├── DocsConverter.java │ │ ├── CommonService.java │ │ ├── impl │ │ │ ├── OpenApiConvertToOrionDocs.java │ │ │ └── DefaultCommonService.java │ │ ├── DocsConverterFactory.java │ │ ├── HttpApiProxy.java │ │ └── UsersService.java │ │ ├── entity │ │ ├── OrionHttpRequest.java │ │ ├── ProjectShare.java │ │ ├── Tags.java │ │ ├── ProjectInfo.java │ │ ├── RequestData.java │ │ ├── ProjectApiTemplate.java │ │ ├── MyServletRequestWrapper.java │ │ ├── Users.java │ │ └── ProjectApiGroup.java │ │ ├── interceptor │ │ ├── ProxyRequestReplaceFilter.java │ │ ├── ClientAllowsInterceptor.java │ │ ├── BasicAuthInterceptor.java │ │ └── LoginSessionAuthInterceptor.java │ │ ├── controller │ │ ├── CommonController.java │ │ ├── VerifyCodeController.java │ │ └── ImportWebSocketServer.java │ │ ├── WebMvcConfig.java │ │ ├── Main.java │ │ └── mapper │ │ ├── TagsMapper.java │ │ ├── UsersMapper.java │ │ ├── ProjectShareMapper.java │ │ ├── ProjectApiTemplateMapper.java │ │ ├── ProjectApiMapper.java │ │ ├── ProjectApiGroupMapper.java │ │ └── ProjectMapper.java └── test │ └── java │ └── org │ └── mirrentools │ └── orion │ └── scripts │ ├── CreateTable.java │ └── CreateCode.java ├── .gitignore ├── LICENSE ├── README.md └── pom.xml /Orion-API-Manager-Docs/.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/ -------------------------------------------------------------------------------- /resources/start.bat: -------------------------------------------------------------------------------- 1 | java -jar Orion-API-Manager.jar -------------------------------------------------------------------------------- /resources/start.sh: -------------------------------------------------------------------------------- 1 | java -jar ./Orion-API-Manager.jar -------------------------------------------------------------------------------- /Server-UI/css/chunk-c90e13c8.a585df94.css: -------------------------------------------------------------------------------- 1 | .novalidate input{border-color:#dcdfe6!important} -------------------------------------------------------------------------------- /resources/使用说明/windowStart.bat: -------------------------------------------------------------------------------- 1 | set path=runtime\jre\bin 2 | start java -jar Orion-API-Manager.jar -------------------------------------------------------------------------------- /Server-UI/css/chunk-66c2c60b.bf57b4eb.css: -------------------------------------------------------------------------------- 1 | .profile-item{text-align:right;padding-right:5px;color:#666} -------------------------------------------------------------------------------- /config/ConfigDB.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/config/ConfigDB.db -------------------------------------------------------------------------------- /Client-UI/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Client-UI/favicon.ico -------------------------------------------------------------------------------- /Server-UI/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Server-UI/favicon.ico -------------------------------------------------------------------------------- /resources/config/ConfigDB.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/resources/config/ConfigDB.db -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /Server-UI/img/logo.ce61f367.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Server-UI/img/logo.ce61f367.png -------------------------------------------------------------------------------- /src/main/resources/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/src/main/resources/favicon.ico -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/dist/assets/js/7.7c7c5df6.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[7],{9:function(n,w,o){}}]); -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/dist/api.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Orion-API-Manager-Docs/dist/api.png -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/dist/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Orion-API-Manager-Docs/dist/logo.png -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/dist/alipay.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Orion-API-Manager-Docs/dist/alipay.jpg -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/dist/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Orion-API-Manager-Docs/dist/favicon.ico -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/dist/weixin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Orion-API-Manager-Docs/dist/weixin.png -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/dist/apigroup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Orion-API-Manager-Docs/dist/apigroup.png -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/dist/projects.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Orion-API-Manager-Docs/dist/projects.png -------------------------------------------------------------------------------- /Client-UI/fonts/element-icons.535877f5.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Client-UI/fonts/element-icons.535877f5.woff -------------------------------------------------------------------------------- /Client-UI/fonts/element-icons.732389de.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Client-UI/fonts/element-icons.732389de.ttf -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/dist/gitee_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Orion-API-Manager-Docs/dist/gitee_logo.png -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Orion-API-Manager-Docs", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1 5 | } 6 | -------------------------------------------------------------------------------- /Server-UI/fonts/element-icons.535877f5.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Server-UI/fonts/element-icons.535877f5.woff -------------------------------------------------------------------------------- /Server-UI/fonts/element-icons.732389de.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Server-UI/fonts/element-icons.732389de.ttf -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip 2 | -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/dist/client/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Orion-API-Manager-Docs/dist/client/favicon.ico -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/README.md: -------------------------------------------------------------------------------- 1 | # 本文档使用vuepress进行编写 2 | # 启动方法yarn docs:dev 或 npm run docs:dev 3 | # 编译使用yarn docs:build 或 npm run docs:build 4 | # dist为编译后的文档,文档地址: -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/docs/.vuepress/public/api.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Orion-API-Manager-Docs/docs/.vuepress/public/api.png -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/docs/.vuepress/public/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Orion-API-Manager-Docs/docs/.vuepress/public/logo.png -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/docs/.vuepress/public/alipay.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Orion-API-Manager-Docs/docs/.vuepress/public/alipay.jpg -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/docs/.vuepress/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Orion-API-Manager-Docs/docs/.vuepress/public/favicon.ico -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/docs/.vuepress/public/weixin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Orion-API-Manager-Docs/docs/.vuepress/public/weixin.png -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/docs/.vuepress/public/apigroup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Orion-API-Manager-Docs/docs/.vuepress/public/apigroup.png -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/docs/.vuepress/public/gitee_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Orion-API-Manager-Docs/docs/.vuepress/public/gitee_logo.png -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/docs/.vuepress/public/projects.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Orion-API-Manager-Docs/docs/.vuepress/public/projects.png -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/docs/.vuepress/public/client/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Orion-API-Manager-Docs/docs/.vuepress/public/client/favicon.ico -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/dist/client/fonts/element-icons.535877f5.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Orion-API-Manager-Docs/dist/client/fonts/element-icons.535877f5.woff -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/dist/client/fonts/element-icons.732389de.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Orion-API-Manager-Docs/dist/client/fonts/element-icons.732389de.ttf -------------------------------------------------------------------------------- /Server-UI/css/chunk-6960012a.8d198a30.css: -------------------------------------------------------------------------------- 1 | .alink{background-color:transparent;color:#409eff;text-decoration:none;outline:none;display:inline-block;margin:3px 5px}.alink:active,.alink:hover{outline-width:0;opacity:.8} -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/docs/.vuepress/public/client/fonts/element-icons.732389de.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Orion-API-Manager-Docs/docs/.vuepress/public/client/fonts/element-icons.732389de.ttf -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/docs/.vuepress/public/client/fonts/element-icons.535877f5.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MirrenTools/Orion-API-Manager/HEAD/Orion-API-Manager-Docs/docs/.vuepress/public/client/fonts/element-icons.535877f5.woff -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/dist/assets/img/search.83621669.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /config/user.json: -------------------------------------------------------------------------------- 1 | { 2 | "__角色说明": "OAM有3中身份角色,root=超级管理员(管理所有项目),server=普通管理员(管理自己的项目),client=普通用户(查看自己加入的项目)", 3 | "__用户说明": "root用户在本配置中创建格式为:用户id{pwd:用户密码},server与client用户在管理端创建", 4 | "__账号规则说明":"root用户必须以X-作为前置,其他用户无法使用该前缀", 5 | "X-root": { 6 | "pwd": "helloOAM" 7 | } 8 | } -------------------------------------------------------------------------------- /resources/config/user.json: -------------------------------------------------------------------------------- 1 | { 2 | "__角色说明": "OAM有3中身份角色,root=超级管理员(管理所有项目),server=普通管理员(管理自己的项目),client=普通用户(查看自己加入的项目)", 3 | "__用户说明": "root用户在本配置中创建格式为:用户id{pwd:用户密码},server与client用户在管理端创建", 4 | "__账号规则说明":"root用户必须以X-作为前置,其他用户无法使用该前缀", 5 | "X-root": { 6 | "pwd": "helloOAM" 7 | } 8 | } -------------------------------------------------------------------------------- /Server-UI/css/chunk-773fa5fc.cab21ce2.css: -------------------------------------------------------------------------------- 1 | .user-tag-box{display:flex;flex-wrap:wrap;padding-top:5px}.user-tag-box span{margin-bottom:10px}.user-tag{padding:3px 10px;background-color:#f0f2f5;border:2px solid #f0f2f5;border-radius:3px;margin-right:5px;cursor:pointer}.user-tag-current{border:2px solid #409eff} -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/common/LoginRole.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.common; 2 | 3 | /** 4 | * 用户的角色 5 | * 6 | * @author Mirren 7 | * 8 | */ 9 | public enum LoginRole { 10 | /** 超级管理员 */ 11 | ROOT, 12 | /** 普通管理员 */ 13 | SERVER, 14 | /** 普通的用户 */ 15 | CLIENT 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/service/DocsConverter.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.service; 2 | /** 3 | * 将其他文档转换为OrionAPI文档的转换器 4 | * 5 | * @author Mirren 6 | * 7 | */ 8 | public interface DocsConverter { 9 | /** 10 | * 转换为OrionAPI字符串文档 11 | * 12 | * @param docs 13 | * @return 14 | */ 15 | String convert(String docs); 16 | } 17 | -------------------------------------------------------------------------------- /resources/使用说明/修改成免JDK版说明.txt: -------------------------------------------------------------------------------- 1 | 免JDK说明: 2 | 1.下载一个java1.8.0以上的jre下载地址https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 3 | 2.将下载的jre放在MSAM根目录的runtime文件夹中(没有runtime就创建),(Mac版从Contents开始,Linux版与Windows版从jrex.x.x开始,去掉x.x.x) 4 | 3. 5 | linux:复制linuxStart.sh到MSAM目录(与.jar同级),双击.sh文件启动 6 | mac:复制macStart.sh到MSAM目录(与.jar同级),双击.sh文件启动 7 | Windows:复制windowStart.bat到MSAM目录(与.jar同级),双击.bat文件启动 -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/dist/README.md: -------------------------------------------------------------------------------- 1 | # Orion-API-Manager-Docs 2 | 3 | #### 介绍 4 | Orion-API-Manager-Dosc是,Orion-API-Manager的使用帮助; 5 | 6 | 地址:[https://mirren.gitee.io/orion-api-manager-docs](https://mirren.gitee.io/orion-api-manager-docs) 7 | 8 | Orion-API-Manager是一个API文档管理器,为后端开发人员提供API管理,也为前端人员提供友好容易查看与测试的UI。系统集成了权限适合在一个机构中不同的团队使用,支持导入或显示OpenAPI (Swagger)等接口文档... 9 | [https://gitee.com/MirrenTools/Orion-API-Manager](https://gitee.com/MirrenTools/Orion-API-Manager) 10 | -------------------------------------------------------------------------------- /resources/使用说明/使用说明.txt: -------------------------------------------------------------------------------- 1 | 1.如果已经有java 1.8环境,直接运行start.bat(windows)或start.sh(unix) 2 | 2.软件默认端口号为8686,如果需要改端口可以在./config/application.yml中修改server-port 3 | 3.启动软件后在浏览器访问http://服务地址:端口号 4 | 4.选择服务端UI或客户端UI进行操作 5 | 5.服务端地址: http://服务地址:端口号/console/index.html 6 | 6.客户端地址: http://服务地址:端口号/client/index.html 7 | 7.默认超级管理员账号为X-root,密码为helloOAM,超级管理员账号在config/user.json中管理 8 | 8.软件升级时,可以将config里面的ConfigDB.db复制的新版本中就可以继续使用旧版本的数据 9 | 9.使用文档请参考: https://mirren.gitee.io/orion-api-manager-docs -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/common/NoStackTraceThrowable.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.common; 2 | /** 3 | * 没有下一步追踪信息的异常 4 | * 5 | * @author Mirren 6 | * 7 | */ 8 | public class NoStackTraceThrowable extends Throwable { 9 | private static final long serialVersionUID = 631462353705590765L; 10 | public NoStackTraceThrowable(String message) { 11 | super(message, null, false, false); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | 4 | ### STS ### 5 | .apt_generated 6 | .classpath 7 | .factorypath 8 | .project 9 | .settings 10 | .springBeans 11 | .sts4-cache 12 | 13 | ### IntelliJ IDEA ### 14 | .idea 15 | *.iws 16 | *.iml 17 | *.ipr 18 | 19 | ### NetBeans ### 20 | /nbproject/private/ 21 | /nbbuild/ 22 | /dist/ 23 | /nbdist/ 24 | /.nb-gradle/ 25 | /build/ 26 | /mvnw 27 | /mvnw.cmd 28 | /logs/ 29 | /SdTemplates/ 30 | -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/docs/.vuepress/public/README.md: -------------------------------------------------------------------------------- 1 | # Orion-API-Manager-Docs 2 | 3 | #### 介绍 4 | Orion-API-Manager-Dosc是,Orion-API-Manager的使用帮助; 5 | 6 | 地址:[https://mirren.gitee.io/orion-api-manager-docs](https://mirren.gitee.io/orion-api-manager-docs) 7 | 8 | Orion-API-Manager是一个API文档管理器,为后端开发人员提供API管理,也为前端人员提供友好容易查看与测试的UI。系统集成了权限适合在一个机构中不同的团队使用,支持导入或显示OpenAPI (Swagger)等接口文档... 9 | [https://gitee.com/MirrenTools/Orion-API-Manager](https://gitee.com/MirrenTools/Orion-API-Manager) 10 | -------------------------------------------------------------------------------- /resources/使用说明/linuxStart.sh: -------------------------------------------------------------------------------- 1 | SOURCE="${BASH_SOURCE[0]}" 2 | while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink 3 | DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" 4 | SOURCE="$(readlink "$SOURCE")" 5 | [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located 6 | done 7 | DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" 8 | set path = runtime/jre/bin 9 | java -jar $DIR/Orion-API-Manager.jar -------------------------------------------------------------------------------- /resources/使用说明/macStart.sh: -------------------------------------------------------------------------------- 1 | SOURCE="${BASH_SOURCE[0]}" 2 | while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink 3 | DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" 4 | SOURCE="$(readlink "$SOURCE")" 5 | [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located 6 | done 7 | DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" 8 | set path = runtime/Contents/Home/bin 9 | java -jar $DIR/Orion-API-Manager.jar -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Orion-API-Manager-Docs", 3 | "version": "1.0.0", 4 | "description": "Orion-API-Manager的帮助文档", 5 | "scripts": { 6 | "docs:dev": "vuepress dev docs", 7 | "docs:build": "vuepress build docs" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/MirrenTools/Orion-API-Manager.git" 12 | }, 13 | "keywords": [ 14 | "Orion-API-Manager", 15 | "API文档管理器" 16 | ], 17 | "author": "Mirren", 18 | "license": "MIT" 19 | } 20 | -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/dist/assets/js/3.7802b982.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[3],{202:function(t,e,n){"use strict";var a=n(72);n.n(a).a},207:function(t,e,n){"use strict";n.r(e);var a={functional:!0,props:{type:{type:String,default:"tip"},text:String,vertical:{type:String,default:"top"}},render:function(t,e){var n=e.props,a=e.slots;return t("span",{class:["badge",n.type],style:{verticalAlign:n.vertical}},n.text||a().default)}},i=(n(202),n(0)),r=Object(i.a)(a,void 0,void 0,!1,null,"5fd9ae70",null);e.default=r.exports},72:function(t,e,n){}}]); -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/common/OrionApiManager.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.common; 2 | /** 3 | * 项目信息的常量 4 | * 5 | * @author Mirren 6 | * 7 | */ 8 | public interface OrionApiManager { 9 | /** 项目的简称 */ 10 | static final String MIN_NAME = "Orion"; 11 | /** 项目的名字 */ 12 | static final String NAME = "Orion-API-Manager"; 13 | /** 项目的欢迎词 */ 14 | static final String WELCOME = "Welcome to "+NAME; 15 | /** 项目的版本 */ 16 | static final String VERSION = "1.0.0"; 17 | /** 项目的名称_版本 */ 18 | static final String NAME_VERSION = NAME + "_" + VERSION; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/common/ColumnsTags.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.common; 2 | 3 | /** 4 | * 用户标签的列名 5 | * 6 | * @author Mirren 7 | * 8 | */ 9 | public interface ColumnsTags { 10 | /** 表的名称 */ 11 | public final static String TABLE_NAME = "oam_tags"; 12 | /** 标签的id */ 13 | public static final String TID = "oam_tid"; 14 | /** 标签的名称 */ 15 | public static final String TNAME = "oam_tname"; 16 | /** 标签的排序 */ 17 | public static final String SORTS = "oam_sorts"; 18 | /** 标签的创建时间 */ 19 | public static final String CTIME = "oam_ctime"; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/common/ColumnsProjectShare.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.common; 2 | /** 3 | * 项目分享记录的表名属性列 4 | * 5 | * @author Mirren 6 | * 7 | */ 8 | public interface ColumnsProjectShare { 9 | /** 表的名称 */ 10 | public final static String TABLE_NAME = "oam_project_share"; 11 | /** 分享的id */ 12 | public final static String SID = "oam_sid"; 13 | /** 项目的id */ 14 | public final static String PID = "oam_pid"; 15 | /** 查看密码 */ 16 | public final static String PWD = "oam_pwd"; 17 | /** 分享的时间 */ 18 | public final static String SHARE_TIME = "oam_share_time"; 19 | } 20 | -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/dist/assets/js/4.7d75b37f.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[4],{204:function(t,e,s){"use strict";s.r(e);var o=["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."],n={methods:{getMsg:function(){return o[Math.floor(Math.random()*o.length)]}}},i=s(0),h=Object(i.a)(n,(function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"theme-container"},[e("div",{staticClass:"theme-default-content"},[e("h1",[this._v("404")]),this._v(" "),e("blockquote",[this._v(this._s(this.getMsg()))]),this._v(" "),e("router-link",{attrs:{to:"/"}},[this._v("Take me home.")])],1)])}),[],!1,null,null,null);e.default=h.exports}}]); -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/service/CommonService.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.service; 2 | 3 | import java.util.Map; 4 | 5 | /** 6 | * 通用服务 7 | * 8 | * @author Mirren 9 | * 10 | */ 11 | public interface CommonService { 12 | /** 13 | * 获取控制台配置 14 | * 15 | * @param loginSession 16 | * 用户的会话 17 | * @return 18 | */ 19 | Map getConsoleConfig(); 20 | /** 21 | * 检查API转换器是否可用 22 | * 23 | * @return 24 | */ 25 | Map checkConvert(String type); 26 | /** 27 | * 检查API转换器是否可用 28 | * 29 | * @return 30 | */ 31 | Map convertApi(String type, String body); 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/main/resources/META-INF/additional-spring-configuration-metadata.json: -------------------------------------------------------------------------------- 1 | {"properties": [ 2 | { 3 | "name": "clientAllowUnauthorized", 4 | "type": "java.lang.String", 5 | "description": "Allow unauthorized users to access the client" 6 | }, 7 | { 8 | "name": "proxyAllowUnauthorized", 9 | "type": "java.lang.String", 10 | "description": "Allow unauthorized users to use proxy requests" 11 | }, 12 | { 13 | "name": "orionConsoleTitle", 14 | "type": "java.lang.String", 15 | "description": "A description for 'orionConsoleTitle'" 16 | }, 17 | { 18 | "name": "orionConsoleWelcome", 19 | "type": "java.lang.String", 20 | "description": "A description for 'orionConsoleWelcome'" 21 | } 22 | ]} -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/service/impl/OpenApiConvertToOrionDocs.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.service.impl; 2 | 3 | import org.json.JSONObject; 4 | import org.mirrentools.orion.common.OpenApiConverter; 5 | import org.mirrentools.orion.service.DocsConverter; 6 | 7 | /** 8 | * OpenAPI文档转换为OrionAPI文档 9 | * 10 | * @author Mirren 11 | * 12 | */ 13 | public class OpenApiConvertToOrionDocs implements DocsConverter { 14 | @Override 15 | public String convert(String docs) { 16 | try { 17 | JSONObject convert = OpenApiConverter.convert(docs); 18 | return convert.toString(2); 19 | } catch (Exception e) { 20 | e.printStackTrace(); 21 | return e == null ? "convert openapi failed" : e.getMessage(); 22 | } 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /resources/config/application.yml: -------------------------------------------------------------------------------- 1 | # 是否允许未登录用户访问客户端(Allow unauthorized users to access the client) 2 | clientAllowUnauthorized: true 3 | # 是否允许未登录用户使用代理请求(Allow unauthorized users to access the proxy) 4 | proxyAllowUnauthorized: true 5 | # 控制台显示的标题(Title displayed on the console) 6 | orionConsoleTitle: Orion-API-Manager 7 | # 控制台登录页的欢迎语句(Welcome statement displayed on the console login page) 8 | orionConsoleWelcome: Welcome to Orion-API-Manager 9 | 10 | server: 11 | port: 8686 12 | spring: 13 | datasource: 14 | url: jdbc:sqlite:${user.dir}/config/ConfigDB.db 15 | driver-class-name: org.sqlite.JDBC 16 | #username: 登录账号 17 | #password: 登录密码 18 | mybatis: 19 | mapper-locations: classpath:mappers/*Mapper.xml 20 | logging: 21 | level: org.mirrentools.orion.mapper: debug file: path: ./logs 22 | -------------------------------------------------------------------------------- /src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | # 是否允许未登录用户访问客户端(Allow unauthorized users to access the client) 2 | clientAllowUnauthorized: true 3 | # 是否允许未登录用户使用代理请求(Allow unauthorized users to access the proxy) 4 | proxyAllowUnauthorized: true 5 | # 控制台显示的标题(Title displayed on the console) 6 | orionConsoleTitle: Orion-API-Manager 7 | # 控制台登录页的欢迎语句(Welcome statement displayed on the console login page) 8 | orionConsoleWelcome: Welcome to Orion-API-Manager 9 | 10 | server: 11 | port: 8686 12 | spring: 13 | datasource: 14 | url: jdbc:sqlite:${user.dir}/config/ConfigDB.db 15 | driver-class-name: org.sqlite.JDBC druid: validation-query: SELECT 1 16 | #username: 登录账号 17 | #password: 登录密码 18 | mybatis: 19 | mapper-locations: classpath:mappers/*Mapper.xml 20 | logging: 21 | level: org.mirrentools.orion.mapper: debug file: path: ./logs 22 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/common/ColumnsApiTemplate.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.common; 2 | /** 3 | * 项目分享记录的表名属性列 4 | * 5 | * @author Mirren 6 | * 7 | */ 8 | 9 | public interface ColumnsApiTemplate { 10 | /** 表的名称 */ 11 | public final static String TABLE_NAME = "oam_project_api_template"; 12 | /** 模板的id */ 13 | public final static String TID = "oam_tid"; 14 | /** 模板所属用户的id */ 15 | public final static String UID = "oam_uid"; 16 | /** 模板的名称 */ 17 | public final static String NAME = "oam_name"; 18 | /** API基本信息 */ 19 | public final static String API = "oam_api"; 20 | /** API中的请求参数 */ 21 | public final static String PARAMETERS = "oam_parameters"; 22 | /** API中的响应参数 */ 23 | public final static String RESPONSES = "oam_responses"; 24 | /** 模板创建的时间 */ 25 | public final static String CTIME = "oam_ctime"; 26 | } 27 | -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/docs/.vuepress/config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | base: '/orion-api-manager-docs/', 3 | title: 'Orion-API-Manager V1.0.0', 4 | description: '一个API文档管理器,为后端开发人员提供API管理,也为前端人员提供友好容易查看与测试的UI,支持导入或显示OpenAPI (Swagger)等接口文档...', 5 | dest: 'dist', 6 | themeConfig: { 7 | nav: [{ 8 | text: 'OrionAM客户端', 9 | link: 'https://mirren.gitee.io/orion-api-manager-docs/client/index.html' 10 | },{ 11 | text: 'MirrenTools', 12 | link: 'https://mirrentools.org' 13 | }, 14 | { 15 | text: 'github', 16 | link: 'https://github.com/MirrenTools/Orion-API-Manager' 17 | }, 18 | { 19 | text: 'gitee', 20 | link: 'https://gitee.com/MirrenTools/Orion-API-Manager' 21 | } 22 | ], 23 | sidebar: { 24 | '/': [{ 25 | title: '使用说明', 26 | collapsable: false, 27 | children: ['/start/introduction'] 28 | }] 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/resources/application-mysql.yml: -------------------------------------------------------------------------------- 1 | # 是否允许未登录用户访问客户端(Allow unauthorized users to access the client) 2 | clientAllowUnauthorized: true 3 | # 是否允许未登录用户使用代理请求(Allow unauthorized users to access the proxy) 4 | proxyAllowUnauthorized: true 5 | # 控制台显示的标题(Title displayed on the console) 6 | orionConsoleTitle: Orion-API-Manager 7 | # 控制台的欢迎语句(Welcome statement displayed on the console) 8 | orionConsoleWelcome: Welcome to Orion-API-Manager 9 | 10 | server: 11 | port: 8686 12 | spring: 13 | datasource: 14 | url: jdbc:mysql://10.0.0.79:3306/orion_api_manager?useUnicode=true&useSSL=false&serverTimezone=UTC 15 | driver-class-name: com.mysql.cj.jdbc.Driver druid: validation-query: SELECT 1 16 | username: root 17 | password: root 18 | mybatis: 19 | mapper-locations: classpath:mappers/*Mapper.xml 20 | logging: 21 | level: org.mirrentools.orion.mapper: debug file: path: ./logs 22 | -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/docs/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | home: true 3 | heroImage: logo.png 4 | actionText: 使用文档 5 | actionLink: /start/introduction 6 | footer: MIT Licensed | Copyright © 2019-present mirrentools.org 7 | --- 8 | ## 快速了解Orion-API-Manager的基本使用方法 9 | 如果不能观看你可以在 [哔哩哔哩中查看视频](https://www.bilibili.com/video/BV1rv4y1f78J/) 10 | 11 | 12 | 13 | ## 特别鸣谢 14 |
15 |
16 | 17 |
18 | 19 |
20 | 本使用文档由Gitee Pages 免费提供服务 21 |
22 |
23 | 24 |
25 |
-------------------------------------------------------------------------------- /Client-UI/index.html: -------------------------------------------------------------------------------- 1 | Orion-API-Manager
-------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/common/ColumnsApiGroup.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.common; 2 | /** 3 | * 接口分组表的列名 4 | * 5 | * @author Mirren 6 | * 7 | */ 8 | public interface ColumnsApiGroup { 9 | /** 表的名称 */ 10 | public final static String TABLE_NAME = "oam_project_api_group"; 11 | /** 分组的id */ 12 | public static final String GROUP_ID = "oam_group_id"; 13 | /** 项目的id */ 14 | public static final String PROJECT_ID = "oam_project_id"; 15 | /** 分组的名字 */ 16 | public static final String NAME = "oam_name"; 17 | /** 分组的简介 */ 18 | public static final String SUMMARY = "oam_summary"; 19 | /** 分组的描述 */ 20 | public static final String DESCRIPTION = "oam_description"; 21 | /** 分组的附加文档 */ 22 | public static final String EXTERNAL_DOCS = "oam_external_docs"; 23 | /** 分组的拓展字段 */ 24 | public static final String EXTENSIONS = "oam_extensions"; 25 | /** 排序 */ 26 | public static final String SORTS = "oam_sorts"; 27 | } 28 | -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/dist/client/index.html: -------------------------------------------------------------------------------- 1 | Orion-API-Manager
-------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/common/ColumnsUsers.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.common; 2 | 3 | /** 4 | * 用户的列名 5 | * 6 | * @author Mirren 7 | * 8 | */ 9 | public interface ColumnsUsers { 10 | /** 表的名称 */ 11 | public final static String TABLE_NAME = "oam_users"; 12 | /** 用户的id */ 13 | public static final String UID = "oam_uid"; 14 | /** 用户的角色 */ 15 | public static final String ROLE = "oam_role"; 16 | /** 用户的标签 */ 17 | public static final String TAGS = "oam_tags"; 18 | /** 用户的密码 */ 19 | public static final String PWD = "oam_pwd"; 20 | /** 用户的昵称 */ 21 | public static final String NICKNAME = "oam_nickname"; 22 | /** 用户的联系方式 */ 23 | public static final String CONTACT = "oam_contact"; 24 | /** 用户的简介 */ 25 | public static final String SUMMARY = "oam_summary"; 26 | /** 创建的时间 */ 27 | public static final String CTIME = "oam_ctime"; 28 | /** 最后登录时间 */ 29 | public static final String LASTTIME = "oam_lasttime"; 30 | } 31 | -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/docs/.vuepress/public/client/index.html: -------------------------------------------------------------------------------- 1 | Orion-API-Manager
-------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/service/DocsConverterFactory.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.service; 2 | 3 | import java.util.LinkedHashMap; 4 | import java.util.Map; 5 | import java.util.Set; 6 | 7 | import org.mirrentools.orion.service.impl.OpenApiConvertToOrionDocs; 8 | /** 9 | * 转换工具的实例工程工厂 10 | * 11 | * @author Mirren 12 | * 13 | */ 14 | public class DocsConverterFactory { 15 | /** 存储实例的map */ 16 | private static Map INSTANCES = new LinkedHashMap<>(); 17 | /** OpenAPI文档转换器的名称 */ 18 | private static final String OpenAPI = "OpenAPI"; 19 | static { 20 | INSTANCES.put(OpenAPI, new OpenApiConvertToOrionDocs()); 21 | } 22 | 23 | /** 24 | * 获取指定实例 25 | * 26 | * @param name 27 | * 对应names中的名称 28 | * @return 29 | */ 30 | public static DocsConverter get(String name) { 31 | return INSTANCES.get(name); 32 | } 33 | /** 34 | * 获取所有实例的名称 35 | * 36 | * @return 37 | */ 38 | public static Set names() { 39 | return INSTANCES.keySet(); 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/service/HttpApiProxy.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.service; 2 | 3 | import java.util.Map; 4 | 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | 8 | import org.mirrentools.orion.common.LoginSession; 9 | 10 | /** 11 | * 请求别人API的代理服务器 12 | * 13 | * @author Mirren 14 | * 15 | */ 16 | public interface HttpApiProxy { 17 | /** 18 | * get请求的代理 19 | * 20 | * @param loginSession 用户登录信息 21 | * @param url 22 | * @return 23 | */ 24 | Map getProxy(LoginSession loginSession, String url); 25 | 26 | /** 27 | * 代理执行请求,API方式 28 | * 29 | * @param request 30 | * @return 31 | */ 32 | // Map executeProxy(RequestData request); 33 | 34 | /** 35 | * 代理执行,代理方式 36 | * 37 | * @param loginSession 用户登录信息 38 | * @param request 39 | * @param response 40 | * @return 41 | */ 42 | void executeProxy(LoginSession loginSession, HttpServletRequest request, HttpServletResponse response); 43 | 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/entity/OrionHttpRequest.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.entity; 2 | 3 | import java.net.URI; 4 | 5 | import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; 6 | /** 7 | * HttpClient的请求类 8 | * 9 | * @author Mirren 10 | * 11 | */ 12 | public class OrionHttpRequest extends HttpEntityEnclosingRequestBase { 13 | /** 14 | * 请求的方法的类型 15 | */ 16 | private String requestMethod = "GET"; 17 | 18 | public OrionHttpRequest() { 19 | super(); 20 | } 21 | 22 | public OrionHttpRequest(final URI uri) { 23 | super(); 24 | setURI(uri); 25 | } 26 | 27 | public OrionHttpRequest(final String uri) { 28 | super(); 29 | setURI(URI.create(uri)); 30 | } 31 | public OrionHttpRequest(final String method, final String uri) { 32 | super(); 33 | this.requestMethod = method; 34 | setURI(URI.create(uri)); 35 | } 36 | 37 | @Override 38 | public String getMethod() { 39 | if (requestMethod == null) { 40 | requestMethod = "GET"; 41 | } 42 | return requestMethod.toUpperCase(); 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/interceptor/ProxyRequestReplaceFilter.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.interceptor; 2 | 3 | import java.io.IOException; 4 | 5 | import javax.servlet.FilterChain; 6 | import javax.servlet.ServletException; 7 | import javax.servlet.annotation.WebFilter; 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | 11 | import org.mirrentools.orion.entity.MyServletRequestWrapper; 12 | import org.springframework.web.filter.OncePerRequestFilter; 13 | /** 14 | * 复制请求流的过滤器 15 | * @author Mirren 16 | * 17 | */ 18 | @WebFilter(urlPatterns = { "/proxy/server" }) 19 | public class ProxyRequestReplaceFilter extends OncePerRequestFilter { 20 | 21 | @Override 22 | protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) 23 | throws ServletException, IOException { 24 | if (!(request instanceof MyServletRequestWrapper)) { 25 | request = new MyServletRequestWrapper(request); 26 | } 27 | filterChain.doFilter(request, response); 28 | } 29 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 MirrenTools.org 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/dist/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Mirren 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/docs/.vuepress/public/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Mirren 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Server-UI/js/chunk-25904293.d8290f8f.js: -------------------------------------------------------------------------------- 1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-25904293"],{"8cdb":function(t,i,s){"use strict";s.r(i);var a=function(){var t=this,i=t.$createElement,s=t._self._c||i;return s("div",{staticClass:"p404-container"},[t._m(0),s("div",{staticClass:"msg"},[s("div",[s("p",{staticClass:"msg-title"},[t._v("内容不存在")]),s("div",[s("el-button",{attrs:{type:"primary"},on:{click:function(i){return t.$router.back(-1)}}},[t._v("返回上一页")]),s("router-link",{staticStyle:{"margin-left":"0.5rem"},attrs:{to:"/"}},[s("el-button",{attrs:{type:"primary"}},[t._v("返回首页")])],1)],1)])])])},c=[function(){var t=this,i=t.$createElement,s=t._self._c||i;return s("div",{staticClass:"img"},[s("div",{staticClass:"img-404",staticStyle:{color:"#f56c6c"},attrs:{id:"img-404-1"}},[t._v("4")]),s("div",{staticClass:"img-404",staticStyle:{color:"#36b455"},attrs:{id:"img-404-2"}},[t._v("0")]),s("div",{staticClass:"img-404",staticStyle:{color:"#409eff"},attrs:{id:"img-404-3"}},[t._v("4")])])}],e=(s("9c1b"),s("2877")),r={},n=Object(e["a"])(r,a,c,!1,null,"381e4d4a",null);i["default"]=n.exports},"9c1b":function(t,i,s){"use strict";var a=s("d101"),c=s.n(a);c.a},d101:function(t,i,s){}}]); 2 | //# sourceMappingURL=chunk-25904293.d8290f8f.js.map -------------------------------------------------------------------------------- /Server-UI/css/chunk-25904293.f9f8df3c.css: -------------------------------------------------------------------------------- 1 | .p404-container[data-v-381e4d4a]{position:absolute;width:100%;height:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;background-color:#283443}.img[data-v-381e4d4a]{width:55%;height:49%;display:flex;align-items:center;justify-content:right}.img-404[data-v-381e4d4a]{font-size:20rem;font-family:sans-serif;-webkit-animation:float-data-v-381e4d4a 1s ease-in-out infinite alternate;animation:float-data-v-381e4d4a 1s ease-in-out infinite alternate}#img-404-1[data-v-381e4d4a]{-webkit-animation-delay:.1s;animation-delay:.1s}#img-404-2[data-v-381e4d4a]{-webkit-animation-delay:.3s;animation-delay:.3s}#img-404-3[data-v-381e4d4a]{-webkit-animation-delay:.6s;animation-delay:.6s}.msg[data-v-381e4d4a]{width:44%;height:49%;display:flex;align-items:center;justify-content:left}.msg .msg-title[data-v-381e4d4a]{font-size:2rem;color:#fff;text-align:left}@-webkit-keyframes float-data-v-381e4d4a{to{transform:translateY(30px)}}@keyframes float-data-v-381e4d4a{to{transform:translateY(30px)}}@media (max-width:1024px){.img-404[data-v-381e4d4a]{font-size:13rem}}@media (max-width:768px){.img[data-v-381e4d4a]{width:100%;align-items:flex-end;justify-content:center}.img-404[data-v-381e4d4a]{font-size:10rem}.msg[data-v-381e4d4a]{width:100%;align-items:flex-start;justify-content:center}.msg .msg-title[data-v-381e4d4a]{text-align:center}} -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/common/ColumnsProject.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.common; 2 | /** 3 | * 项目的表名属性列 4 | * 5 | * @author Mirren 6 | * 7 | */ 8 | public interface ColumnsProject { 9 | /** 表的名称 */ 10 | public final static String TABLE_NAME = "oam_project"; 11 | 12 | /** 项目的id */ 13 | public final static String KEY = "oam_key"; 14 | /** 项目的名称 */ 15 | public final static String NAME = "oam_name"; 16 | /** 项目的版本号 */ 17 | public final static String VERSIONS = "oam_versions"; 18 | /** 项目的简介 */ 19 | public final static String DESCRIPTION = "oam_description"; 20 | /** 项目的服务集 */ 21 | public final static String SERVERS = "oam_servers"; 22 | /** 联系人 */ 23 | public final static String CONTACT_NAME = "oam_contact_name"; 24 | /** 联系人信息 */ 25 | public final static String CONTACT_INFO = "oam_contact_info"; 26 | /** 附加文档 */ 27 | public final static String EXTERNAL_DOCS = "oam_external_docs"; 28 | /** 拓展属性 */ 29 | public final static String EXTENSIONS = "oam_extensions"; 30 | /** 创建该项目的人 */ 31 | public final static String OWNER = "oam_owner"; 32 | /** 可以查看该项目的人 */ 33 | public final static String OWNERS = "oam_owners"; 34 | /** 最后操作时间 */ 35 | public final static String LAST_TIME = "oam_last_time"; 36 | /** 项目排序 */ 37 | public final static String SORTS = "oam_sorts"; 38 | } 39 | -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/dist/assets/js/5.e199e4b4.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[5],{205:function(t,e,r){"use strict";r.r(e);var a=r(0),i=Object(a.a)({},(function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h2",{attrs:{id:"快速了解orion-api-manager的基本使用方法"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#快速了解orion-api-manager的基本使用方法"}},[t._v("#")]),t._v(" 快速了解Orion-API-Manager的基本使用方法")]),t._v(" "),r("p",[t._v("如果不能观看你可以在 "),r("a",{attrs:{href:"https://www.bilibili.com/video/BV1rv4y1f78J/",target:"_blank",rel:"noopener noreferrer"}},[t._v("哔哩哔哩中查看视频"),r("OutboundLink")],1)]),t._v(" "),r("iframe",{attrs:{src:"//player.bilibili.com/player.html?aid=543877750&bvid=BV1rv4y1f78J&cid=290114253&page=1",width:"100%",height:"600px",scrolling:"no",border:"0",frameborder:"no",framespacing:"0",allowfullscreen:"true"}}),t._v(" "),r("h2",{attrs:{id:"特别鸣谢"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#特别鸣谢"}},[t._v("#")]),t._v(" 特别鸣谢")]),t._v(" "),r("div",{staticStyle:{display:"flex","flex-wrap":"wrap"}},[r("div",{staticStyle:{"max-width":"200px","text-align":"center","margin-left":"40px"}},[r("a",{attrs:{href:"https://gitee.com/",target:"_blank"}},[r("div",[r("img",{staticStyle:{width:"200px"},attrs:{src:"gitee_logo.png"}})]),t._v("\n\t\t\t本使用文档由Gitee Pages 免费提供服务\n\t\t")])])]),t._v(" "),r("div",{staticStyle:{height:"40px"}})])}),[],!1,null,null,null);e.default=i.exports}}]); -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/common/ColumnsAPI.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.common; 2 | 3 | /** 4 | * 接口表的列名 5 | * 6 | * @author Mirren 7 | * 8 | */ 9 | public interface ColumnsAPI { 10 | /** 表的名称 */ 11 | public final static String TABLE_NAME = "oam_project_api"; 12 | /** API的id */ 13 | public static final String API_ID = "oam_api_id"; 14 | /** 分组的id */ 15 | public static final String GROUP_ID = "oam_group_id"; 16 | /** 请求方法 */ 17 | public static final String METHOD = "oam_method"; 18 | /** 请求的path */ 19 | public static final String PATH = "oam_path"; 20 | /** API的名称 */ 21 | public static final String TITLE = "oam_title"; 22 | /** API的简介 */ 23 | public static final String DESCRIPTION = "oam_description"; 24 | /** 请求类型 */ 25 | public static final String CONSUMES = "oam_consumes"; 26 | /** 请求参数 */ 27 | public static final String PARAMETERS = "oam_parameters"; 28 | /** 请求Body */ 29 | public static final String BODY = "oam_body"; 30 | /** 响应类型 */ 31 | public static final String PRODUCES = "oam_produces"; 32 | /** 响应参数 */ 33 | public static final String RESPONSES = "oam_responses"; 34 | /** API维护中 */ 35 | public static final String DEPRECATED = "oam_deprecated"; 36 | /** 附近参数 */ 37 | public static final String ADDITIONAL = "oam_additional"; 38 | /** 拓展文档 */ 39 | public static final String EXTERNAL_DOCS = "oam_external_docs"; 40 | /** 附加参数 */ 41 | public static final String EXTENSIONS = "oam_extensions"; 42 | /** 排序 */ 43 | public static final String SORTS = "oam_sorts"; 44 | } 45 | -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/dist/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Orion-API-Manager V1.0.0 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |

404

There's nothing here.
Take me home.
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/entity/ProjectShare.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.entity; 2 | 3 | 4 | /** 5 | * 项目记录表 6 | * @author 7 | */ 8 | public class ProjectShare { 9 | /** 分享的id */ 10 | private String sid; 11 | /** 项目的id */ 12 | private String pid; 13 | /** 查看密码 */ 14 | private String pwd; 15 | /** 分享的时间 */ 16 | private Long shareTime; 17 | /** 18 | * 获取分享的id 19 | * 20 | * @return 21 | */ 22 | public String getSid() { 23 | return sid; 24 | } 25 | /** 26 | * 设置分享的id 27 | * 28 | * @param sid 29 | */ 30 | public void setSid(String sid) { 31 | this.sid = sid; 32 | } 33 | /** 34 | * 获取项目的id 35 | * 36 | * @return 37 | */ 38 | public String getPid() { 39 | return pid; 40 | } 41 | /** 42 | * 设置项目的id 43 | * 44 | * @param pid 45 | */ 46 | public void setPid(String pid) { 47 | this.pid = pid; 48 | } 49 | /** 50 | * 获取查看密码 51 | * 52 | * @return 53 | */ 54 | public String getPwd() { 55 | return pwd; 56 | } 57 | /** 58 | * 设置查看密码 59 | * 60 | * @param pwd 61 | */ 62 | public void setPwd(String pwd) { 63 | this.pwd = pwd; 64 | } 65 | /** 66 | * 获取分享的时间 67 | * 68 | * @return 69 | */ 70 | public Long getShareTime() { 71 | return shareTime; 72 | } 73 | /** 74 | * 设置分享的时间 75 | * 76 | * @param shareTime 77 | */ 78 | public void setShareTime(Long shareTime) { 79 | this.shareTime = shareTime; 80 | } 81 | 82 | @Override 83 | public String toString() { 84 | return "ProjectShare [sid=" + sid + " , pid=" + pid + " , pwd=" + pwd + " , shareTime=" + shareTime + " ]"; 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/entity/Tags.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.entity; 2 | 3 | 4 | /** 5 | * 标签表 6 | * @author Mirren 7 | */ 8 | public class Tags { 9 | /** 标签的id */ 10 | private String tid; 11 | /** 标签的名称 */ 12 | private String tname; 13 | /** 项目排序 */ 14 | private Integer sorts; 15 | /** 创建的时间 */ 16 | private Long ctime; 17 | /** 18 | * 获取标签的id 19 | * 20 | * @return 21 | */ 22 | public String getTid() { 23 | return tid; 24 | } 25 | /** 26 | * 设置标签的id 27 | * 28 | * @param tid 29 | */ 30 | public void setTid(String tid) { 31 | this.tid = tid; 32 | } 33 | /** 34 | * 获取标签的名称 35 | * 36 | * @return 37 | */ 38 | public String getTname() { 39 | return tname; 40 | } 41 | /** 42 | * 设置标签的名称 43 | * 44 | * @param tname 45 | */ 46 | public void setTname(String tname) { 47 | this.tname = tname; 48 | } 49 | /** 50 | * 获取项目排序 51 | * 52 | * @return 53 | */ 54 | public Integer getSorts() { 55 | return sorts; 56 | } 57 | /** 58 | * 设置项目排序 59 | * 60 | * @param sorts 61 | */ 62 | public void setSorts(Integer sorts) { 63 | this.sorts = sorts; 64 | } 65 | /** 66 | * 获取创建的时间 67 | * 68 | * @return 69 | */ 70 | public Long getCtime() { 71 | return ctime; 72 | } 73 | /** 74 | * 设置创建的时间 75 | * 76 | * @param ctime 77 | */ 78 | public void setCtime(Long ctime) { 79 | this.ctime = ctime; 80 | } 81 | 82 | @Override 83 | public String toString() { 84 | return "Tags [tid=" + tid + " , tname=" + tname + " , sorts=" + sorts + " , ctime=" + ctime + " ]"; 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/entity/ProjectInfo.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.entity; 2 | 3 | /** 4 | * 项目的基本属性 5 | * 6 | * @author Mirren 7 | * 8 | */ 9 | public class ProjectInfo { 10 | /** 项目的id */ 11 | private String key; 12 | /** 项目的负责人 */ 13 | private String owner; 14 | /** 项目名称 */ 15 | private String name; 16 | /** 项目版本 */ 17 | private String version; 18 | /** 项目最后更新时间 */ 19 | private Long time; 20 | /** 项目的排序 */ 21 | private Integer sorts; 22 | 23 | public ProjectInfo() { 24 | super(); 25 | } 26 | 27 | public String getKey() { 28 | return key; 29 | } 30 | 31 | public void setKey(String key) { 32 | this.key = key; 33 | } 34 | 35 | public String getOwner() { 36 | return owner; 37 | } 38 | 39 | public void setOwner(String owner) { 40 | this.owner = owner; 41 | } 42 | 43 | public String getName() { 44 | return name; 45 | } 46 | 47 | public void setName(String name) { 48 | this.name = name; 49 | } 50 | 51 | public String getVersion() { 52 | return version; 53 | } 54 | 55 | public void setVersion(String version) { 56 | this.version = version; 57 | } 58 | 59 | public Long getTime() { 60 | return time; 61 | } 62 | 63 | public void setTime(Long time) { 64 | this.time = time; 65 | } 66 | 67 | public Integer getSorts() { 68 | return sorts; 69 | } 70 | 71 | public void setSorts(Integer sorts) { 72 | this.sorts = sorts; 73 | } 74 | 75 | @Override 76 | public String toString() { 77 | return "ProjectInfo [key=" + key + ", owner=" + owner + ", name=" + name + ", version=" + version + ", time=" + time 78 | + ", sorts=" + sorts + "]"; 79 | } 80 | 81 | } 82 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/entity/RequestData.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.entity; 2 | 3 | /** 4 | * 执行请求需要的数据 5 | * 6 | * @author Mirren 7 | * 8 | */ 9 | public class RequestData { 10 | /** 请求方法 */ 11 | private String type; 12 | /** 请求路径 */ 13 | private String url; 14 | /** consumes */ 15 | private String contentType; 16 | /** header */ 17 | private String headers; 18 | /** query参数 */ 19 | private String queryParams; 20 | /** body参数 */ 21 | private String data; 22 | public String getType() { 23 | return type == null ? "GET" : type.toUpperCase(); 24 | } 25 | public void setType(String type) { 26 | this.type = type; 27 | } 28 | public String getUrl() { 29 | return url; 30 | } 31 | public void setUrl(String url) { 32 | this.url = url; 33 | } 34 | public String getContentType() { 35 | return contentType; 36 | } 37 | public void setContentType(String contentType) { 38 | this.contentType = contentType; 39 | } 40 | public String getHeaders() { 41 | return headers; 42 | } 43 | public void setHeaders(String headers) { 44 | this.headers = headers; 45 | } 46 | public String getQueryParams() { 47 | return queryParams == null ? "" : queryParams; 48 | } 49 | public void setQueryParams(String queryParams) { 50 | this.queryParams = queryParams; 51 | } 52 | public String getData() { 53 | return data; 54 | } 55 | public void setData(String data) { 56 | this.data = data; 57 | } 58 | @Override 59 | public String toString() { 60 | return "RequestData [type=" + type + ", url=" + url + ", contentType=" + contentType + ", headers=" + headers + ", queryParams=" 61 | + queryParams + ", data=" + data + "]"; 62 | } 63 | 64 | } 65 | -------------------------------------------------------------------------------- /src/test/java/org/mirrentools/orion/scripts/CreateTable.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.scripts; 2 | 3 | import org.mirrentools.orion.Constant; 4 | import org.mirrentools.sd.ScrewDriver; 5 | import org.mirrentools.sd.constant.MySQL; 6 | import org.mirrentools.sd.constant.SQLite; 7 | import org.mirrentools.sd.options.ScrewDriverOptions; 8 | import org.mirrentools.sd.options.SdDatabaseOptions; 9 | 10 | /** 11 | * 创建项目需要用到的数据库表,该脚本依赖 ScrewDriver 12 | * 13 | * @author Mirren 14 | * 15 | */ 16 | public class CreateTable { 17 | public static void main(String[] args) { 18 | // 数据库的驱动类 19 | // String driver = SQLite.SQLITE_DERVER; 20 | String driver = MySQL.MYSQL_8_DERVER; 21 | // 数据库的连接地址 22 | // String url = "jdbc:sqlite:" + System.getProperty("user.dir") + "/config/ConfigDB.db"; 23 | String url = "jdbc:mysql://127.0.0.1:3306/orion_api_manager?useUnicode=true&useSSL=false&serverTimezone=UTC"; 24 | // 数据库的登录用户 25 | String username="root"; 26 | // 数据库的登录密码 27 | String password="root"; 28 | SdDatabaseOptions databaseOptions = new SdDatabaseOptions(driver, url); 29 | databaseOptions.setUser(username).setPassword(password); 30 | 31 | ScrewDriver screwDriver = ScrewDriver.instance(new ScrewDriverOptions(databaseOptions)); 32 | // 创建项目表 33 | screwDriver.createTable(Constant.getProjectBean()); 34 | // 创建项目分享记录表 35 | screwDriver.createTable(Constant.getProjectShareBean()); 36 | // 创建接口分组表 37 | screwDriver.createTable(Constant.getProjectApiGroupBean()); 38 | // 创建接口表 39 | screwDriver.createTable(Constant.getProjectApiBean()); 40 | // 创建接口模板表 41 | screwDriver.createTable(Constant.getProjectApiTemplateBean()); 42 | // 创建用户表 43 | screwDriver.createTable(Constant.getUsersBean()); 44 | // 创建标签表 45 | screwDriver.createTable(Constant.getTagsBean()); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /Server-UI/css/chunk-d6d24374.6d4a83ac.css: -------------------------------------------------------------------------------- 1 | .captcha-tips{text-align:left;height:40px;padding-right:.625rem;display:flex;align-items:center}.captcha-img{height:40px;width:200px;display:flex;margin-right:.3125rem}.captcha-num{width:2.5rem;height:2.5rem}.captcha-clicked{background-color:rgba(0,0,0,.4)}.captcha-reset{cursor:pointer;margin-left:8px;font-size:16px}@supports (-webkit-mask:none) and (not (cater-color:#fff)){.login-container .el-input input{color:#fff}}.login-container .el-input{display:inline-block;height:47px;width:85%}.login-container .el-input input{background:transparent;border:0;-webkit-appearance:none;border-radius:0;padding:12px 5px 12px 15px;color:#fff;height:47px;caret-color:#fff}.login-container .el-input input:-webkit-autofill{box-shadow:inset 0 0 0 1000px transparent!important;-webkit-text-fill-color:#fff!important}.login-container .el-form-item{border:1px solid hsla(0,0%,100%,.1);background:rgba(0,0,0,.1);border-radius:5px;color:#454545}.login-container[data-v-6384911c]{height:100vh;width:100%;overflow:hidden;background:#2d3a4b url(../img/links.f9ed4343.svg) no-repeat 50%}.login-container .login-form[data-v-6384911c]{position:relative;width:500px;max-width:100%;margin:20vh auto 0}.login-container .svg-container[data-v-6384911c]{padding-left:12px;vertical-align:middle}.login-container .title-container[data-v-6384911c]{position:relative}.login-container .title-container .title[data-v-6384911c]{font-size:26px;color:#eee;margin:0 auto 40px auto;text-align:center;font-weight:700}.login-container .show-pwd[data-v-6384911c]{position:absolute;right:10px;top:7px;font-size:16px;color:#889aa4;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.login-container .thirdparty-button[data-v-6384911c]{position:absolute;right:0;bottom:6px}@media only screen and (max-width:470px){.login-container .thirdparty-button[data-v-6384911c]{display:none}}@media (max-width:450px){.login-container .login-form[data-v-6384911c]{width:90%}} -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Orion-API-Manager API 文档管理器 2 | 3 | ## QQ交流群号: 796665306 4 | Orion-API-Manager(以下简称: OrionAM)是一个API文档管理器,为后端开发人员提供API管理,也为前端人员提供友好容易查看与测试的UI; 5 | 系统集成了权限适合在一个机构中不同的团队使用,支持导入或显示OpenAPI(Swagger)等接口文档... 6 | 7 | ## 使用文档 8 | [https://mirren.gitee.io/orion-api-manager-docs](https://mirren.gitee.io/orion-api-manager-docs) 9 | 10 | ## 一些解答 11 | - 问:为什么要做这么一个东西? 12 | - 答:因为大多前后端分离的公司基本都跟本人公司一样,要求先有接口文档然后再进行编码; 13 | - 问:这个东西可以做什么?可以像Swagger之类的生成API吗? 14 | - 答:OrionAM不能像Swagger一样为代码生成API,但是支持导入Swagger之类的API,OrionAM是用来可视化创建API或查看API的; 15 | - 问:市面上已经有接口文档管理器了为什么还要出OrionAM, 16 | - 答:在本人的公司,我写的另外一个接口文档管理器已经用了多年,前后端的同事们都已经习惯了,所以将其升级优化并进行的开源;愿景是让跟我们有类似需求的程序员可以有多一个选择,使大家的编码生涯简单一点方便一点;最主要的目的是要融合本人开发的另外一个API网关形成一套完整的体系 17 | 18 | ## 项目演示地址 19 | 暂无服务器可以来做演示,期待您来赞助或捐赠,你也观看使用文档中的视频以打开演示的效果 20 | 21 | ## 项目的结构 22 | - 项目的后台采用了大部分人熟悉的SpringBoot2.3编写(其实本人已经几年没用Spring套装了,这几年都是用Vert.x) 23 | - 存储默认使用Sqlite 3数据库,支持更换为其他数据库(数据库操作使用MyBatis) 24 | - 客户端使用Vue加Element-UI 25 | 26 | ## 客户端原码 27 | Server: [https://github.com/MirrenTools/Orion-Api-Manager-Server](https://github.com/MirrenTools/Orion-Api-Manager-Server) 28 | 29 | Client: [https://github.com/MirrenTools/Orion-API-Manager-Client](https://github.com/MirrenTools/Orion-API-Manager-Client) 30 | 31 | ## 项目如何运行 32 | - 运行环境要求:开发环境为java 1.8.0_121,理论上java1.8以上都可以运行,如果没有java运行环境,可以看使用说明里面的免JDK教程 33 | - 项目可以在releases(发行版)里面下载已经打包好的也可以自己打包项目 34 | - 执行 mvn clean package 进行项目打包 35 | - 执行完毕后 进入**target/Orion**目录,该目录包含了Client-UI(展示接口文档的UI),Server-UI(管理接口的UI),config(存放接口文档的Sqlite,配置信息与用户信息),Orion-API-Manager.jar 36 | - 在Orion目录中执行java -jar Orion-API-Manager.jar 或直接运行start.bat(windows)start.sh(unix)启动Orion服务,端口号默认为8686 37 | - 启动Orion服务后在浏览器访问http://服务地址:端口号 38 | - 默认超级管理员登录账号为**X-root**,登录密码为**helloOrionAM**,超级管理员账号在config/user.json中管理 39 | 40 | ## 使用说明 41 | - 第一步 启动Orion-API-Manager.jar(start.bat / start.sh) 42 | - 第二步 访问http://服务地址:端口号 43 | - 第三步 创建用户 44 | - 第四步 创建项目 45 | - 第五步 在API管理中创建分组与接口 46 | - 第六步 分享或在Client中查看 47 | 48 | 49 | -------------------------------------------------------------------------------- /Server-UI/css/chunk-85e0a1d0.f5e8739c.css: -------------------------------------------------------------------------------- 1 | .text-through{-webkit-text-decoration-line:line-through;text-decoration-line:line-through}.api{background-color:#f5f7fa;border:1px solid #3b4151}.get{background-color:#ebf3fb;border:1px solid #61affe}.post{background-color:#e8f6f0;border:1px solid #49cc90}.put{background-color:#fbf1e6;border:1px solid #fca130}.delete{background-color:#fae7e7;border:1px solid #f93e3e}.head{background-color:#f4e7ff;border:1px solid #9012fe}.options{background-color:#e6eef6;border:1px solid #0d5aa7}.patch{background-color:#edfcf9;border:1px solid #50e3c2}.trace{background-color:#ffe9e6;border:1px solid #ffa8be}.connect{background-color:#e6f6f1;border:1px solid #83bb83}.api-header{height:40px;display:flex;padding:3px 5px;align-items:center;border-radius:4px}.api .api-header{background-color:#f5f7fa}.get .api-header{background-color:#ebf3fb}.post .api-header{background-color:#e8f6f0}.put .api-header{background-color:#fbf1e6}.delete .api-header{background-color:#fae7e7}.head .api-header{background-color:#f4e7ff}.options .api-header{background-color:#e6eef6}.patch .api-header{background-color:#edfcf9}.trace .api-header{background-color:#ffe9e6}.connect .api-header{background-color:#e6f6f1}.api-method{font-size:14px;font-weight:700;padding:5px 15px;text-align:center;border-radius:3px;color:#fff}.api .api-method{background-color:#3b4151}.get .api-method{background-color:#61affe}.post .api-method{background-color:#49cc90}.put .api-method{background-color:#fca130}.delete .api-method{background-color:#f93e3e}.head .api-method{background-color:#9012fe}.options .api-method{background-color:#0d5aa7}.patch .api-method{background-color:#50e3c2}.trace .api-method{background-color:#ffa8be}.connect .api-method{background-color:#83bb83}.api-path-summary{align-items:center;word-break:break-all;padding-left:10px;color:#3b4151}.novalidate input{border-color:#dcdfe6!important}.alink:active,.alink:hover{outline-width:0;opacity:.8}.project-item{text-align:right;padding-right:5px}.desc-constraint span{display:inline-block;padding-right:10px} -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/common/WebSocket.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.common; 2 | 3 | import org.json.JSONObject; 4 | 5 | /** 6 | * WebSocket消息协议与消息工具
7 | * 请求协议:
8 | * type(int):操作类型
9 | * data(Object):数据信息
10 | * 响应协议:
11 | * code(int):状态码
12 | * type(int):操作类型
13 | * msg(String):操作说明
14 | * data(Object):数据信息
15 | * 16 | * @author Mirren 17 | * 18 | */ 19 | public class WebSocket extends WebSocketBase { 20 | /** 状态码-404:无法识别的指令! */ 21 | public final static int UNRECOGNIZED = 404; 22 | /** 状态码-1000:保存项目检查1: project不能为空,应为项目的json字符串! */ 23 | public final static int CHECK_PROJECT_JSON = 1000; 24 | /** 状态码-1001:保存项目检查2: 项目名称,服务集不能为空! */ 25 | public final static int CHECK_PROJECT_NAME_SERVERS = 1001; 26 | /** 状态码-1002:保存项目,data=项目的名称 */ 27 | public final static int PROJECT_SAVEING = 1002; 28 | /** 状态码-1003:保存项目成功,data=项目的名称 */ 29 | public final static int PROJECT_SAVED = 1003; 30 | /** 状态码-1004:保存项目异常,data=项目的名称 */ 31 | public final static int PROJECT_SAVE_EXCEPTION = 1004; 32 | /** 状态码-1005:保存分组,data:{name:"分组名称",index:当前第几个,count:总共多少个,result:受影响行数} */ 33 | public final static int GROUP_SAVED = 1005; 34 | /** 状态码-1006:保存API,data:{name:"API名称",index:当前第几个,count:总共多少个,result:受影响行数} */ 35 | public final static int API_SAVED = 1006; 36 | 37 | /** 38 | * 权限不足或没有权限 39 | * 40 | * @param data 41 | * @return 42 | */ 43 | public static String failed401() { 44 | return failed(C401, M401, null); 45 | } 46 | 47 | /** 48 | * 保存进度的模型,返回{name:"分组名称",index:当前第几个,count:总共多少个,result:受影响行数} 49 | * 50 | * @param name 51 | * @param index 52 | * @param count 53 | * @param result 54 | * @return 55 | */ 56 | public static String progressModel(String name, int index, int count, int result) { 57 | JSONObject object = new JSONObject(); 58 | object.put("name", name).put("index", index).put("count", count).put("result", result); 59 | return object.toString(); 60 | } 61 | 62 | } 63 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/controller/CommonController.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.controller; 2 | 3 | import java.util.Map; 4 | 5 | import org.mirrentools.orion.service.CommonService; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.web.bind.annotation.CrossOrigin; 8 | import org.springframework.web.bind.annotation.RequestMapping; 9 | import org.springframework.web.bind.annotation.RequestMethod; 10 | import org.springframework.web.bind.annotation.RestController; 11 | 12 | /** 13 | * 通用控制器 14 | * 15 | * @author Mirren 16 | * 17 | */ 18 | @CrossOrigin(allowedHeaders = {"x-session"}, methods = {RequestMethod.DELETE, RequestMethod.GET, RequestMethod.HEAD, RequestMethod.OPTIONS, 19 | RequestMethod.PATCH, RequestMethod.POST, RequestMethod.PUT, RequestMethod.TRACE,}) 20 | @RestController 21 | public class CommonController { 22 | /** 接口服务 */ 23 | @Autowired 24 | private CommonService service; 25 | /** 26 | * 获取控制台配置信息 27 | * 28 | * @param id 29 | * @param pwd 30 | * @return 31 | */ 32 | @RequestMapping(value = "/config/console", produces = {"application/json;charset=UTF-8"}) 33 | public Map getConsoleConfig(String id, String pwd, String index, String value) { 34 | Map result = service.getConsoleConfig(); 35 | return result; 36 | } 37 | // /** 38 | // * 检查转换器是否可用 39 | // * 40 | // * @return 41 | // */ 42 | // @PostMapping(value = "/public/checkconverter", produces = {"application/json;charset=UTF-8"}) 43 | // public Map checkConvert(String type) { 44 | // return service.checkConvert(type); 45 | // } 46 | // 47 | // /** 48 | // * 将其他接口文档转换为OrionAPI文档 49 | // * 50 | // * @param type 51 | // * @param body 52 | // * @return 53 | // */ 54 | // @PostMapping(value = "/public/convertApiDocs", produces = {"application/json;charset=UTF-8"}) 55 | // public Map convert(String type, String body) { 56 | // return service.convertApi(type, body); 57 | // } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/service/impl/DefaultCommonService.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.service.impl; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | import org.mirrentools.orion.common.OrionApiManager; 7 | import org.mirrentools.orion.common.ResultCode; 8 | import org.mirrentools.orion.common.ResultUtil; 9 | import org.mirrentools.orion.common.StringUtil; 10 | import org.mirrentools.orion.service.CommonService; 11 | import org.mirrentools.orion.service.DocsConverter; 12 | import org.mirrentools.orion.service.DocsConverterFactory; 13 | import org.springframework.beans.factory.annotation.Value; 14 | import org.springframework.stereotype.Service; 15 | 16 | /** 17 | * 通用服务的默认实现 18 | * 19 | * @author Mirren 20 | * 21 | */ 22 | @Service 23 | public class DefaultCommonService implements CommonService { 24 | @Value("${orionConsoleTitle}") 25 | private String orionConsoleTitle; 26 | @Value("${orionConsoleWelcome}") 27 | private String orionConsoleWelcome; 28 | @Override 29 | public Map getConsoleConfig() { 30 | Map result = new HashMap<>(); 31 | result.put("title", (StringUtil.isNullOrEmpty(orionConsoleTitle) ? OrionApiManager.NAME : orionConsoleTitle)); 32 | result.put("welcome", (StringUtil.isNullOrEmpty(orionConsoleWelcome) ? OrionApiManager.WELCOME : orionConsoleWelcome)); 33 | result.put("name", OrionApiManager.NAME); 34 | result.put("version", OrionApiManager.VERSION); 35 | return ResultUtil.format200(result); 36 | } 37 | @Override 38 | public Map checkConvert(String type) { 39 | DocsConverter converter = DocsConverterFactory.get(type); 40 | if (converter == null) { 41 | return ResultUtil.format200(0); 42 | } else { 43 | return ResultUtil.format200(1); 44 | } 45 | } 46 | 47 | @Override 48 | public Map convertApi(String type, String body) { 49 | if (StringUtil.isNullOrEmpty(type, body)) { 50 | return ResultUtil.format(ResultCode.R412); 51 | } 52 | DocsConverter converter = DocsConverterFactory.get(type); 53 | if (converter == null) { 54 | return ResultUtil.format(ResultCode.R413); 55 | } 56 | String result = converter.convert(body); 57 | return ResultUtil.format200(result); 58 | } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /Server-UI/index.html: -------------------------------------------------------------------------------- 1 | Orion-API-Manager
-------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/interceptor/ClientAllowsInterceptor.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.interceptor; 2 | 3 | import java.io.IOException; 4 | 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | 8 | import org.apache.logging.log4j.LogManager; 9 | import org.apache.logging.log4j.Logger; 10 | import org.json.JSONObject; 11 | import org.mirrentools.orion.common.LoginSession; 12 | import org.mirrentools.orion.common.LoginSessionStore; 13 | import org.mirrentools.orion.common.ResultCode; 14 | import org.springframework.http.HttpHeaders; 15 | import org.springframework.web.servlet.HandlerInterceptor; 16 | 17 | /** 18 | * 是否允许访问客户端拦截器 19 | * 20 | * @author Mirren 21 | * 22 | */ 23 | public class ClientAllowsInterceptor implements HandlerInterceptor { 24 | private static final Logger LOG = LogManager.getLogger(ClientAllowsInterceptor.class); 25 | /** 是否允许未登录的用户访问客户端 */ 26 | private boolean clientAllowUnauthorized; 27 | 28 | /** 29 | * 初始化客户端拦截器 30 | * 31 | * @param clientAllowUnauthorized 是否允许未登录的用户访问 32 | */ 33 | public ClientAllowsInterceptor(boolean clientAllowUnauthorized) { 34 | super(); 35 | this.clientAllowUnauthorized = clientAllowUnauthorized; 36 | } 37 | 38 | @Override 39 | public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 40 | if (!clientAllowUnauthorized) { 41 | String token = request.getParameter("token"); 42 | LoginSession session = LoginSessionStore.get(token); 43 | if (session == null) { 44 | String sessionId = request.getHeader("x-session"); 45 | session = LoginSessionStore.get(sessionId); 46 | } 47 | if (session == null || session.getUid() == null || session.getRole() == null) { 48 | LOG.info("\n未登录用户请求客户端-->检查不通过!"); 49 | JSONObject result = new JSONObject(); 50 | result.put("code", ResultCode.R403.code()); 51 | result.put("msg", ResultCode.R403.msg()); 52 | result.put("explain", ResultCode.R403.explain()); 53 | try { 54 | response.setHeader(HttpHeaders.CONTENT_TYPE, "application/json;charset=UTF-8"); 55 | response.getOutputStream().write(result.toString().getBytes("utf-8")); 56 | response.flushBuffer(); 57 | } catch (IOException e1) { 58 | } 59 | return false; 60 | } 61 | } 62 | return true; 63 | } 64 | 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/common/LoginSessionStore.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.common; 2 | 3 | import java.util.List; 4 | import java.util.Map; 5 | import java.util.concurrent.ConcurrentHashMap; 6 | 7 | /** 8 | * 一个简单的数据存储,本设计仅用于存储登录信息,为了简单,这并不是一个安全操作方式,默认会话保存7天,大于7天未登录则会话失效 9 | * 10 | * @author Mirren 11 | * 12 | */ 13 | public class LoginSessionStore { 14 | 15 | /** 存储数据的 */ 16 | private static Map DATA = new ConcurrentHashMap<>(); 17 | 18 | /** 19 | * 保存会话 20 | * 21 | * @param sessionId 会话的id 22 | * @param uid 用户的id 23 | * @param rule 用户的角色 24 | * @return 保存成功返回true,保存失败返回false,失败通常是三个参数存在控制 25 | */ 26 | public static boolean save(String sessionId, String uid, LoginRole rule) { 27 | return save(sessionId, uid, rule, null); 28 | } 29 | 30 | /** 31 | * 保存会话 32 | * 33 | * @param sessionId 会话的id 34 | * @param uid 用户的id 35 | * @param rule 用户的角色 36 | * @param tags 用户的标签 37 | * @return 保存成功返回true,保存失败返回false,失败通常是三个参数存在控制 38 | */ 39 | public static boolean save(String sessionId, String uid, LoginRole rule, List tags) { 40 | if (sessionId == null || uid == null || rule == null) { 41 | return false; 42 | } 43 | LoginSession session = new LoginSession(); 44 | session.setUid(uid); 45 | session.setRole(rule); 46 | if (tags != null) { 47 | session.setTags(tags); 48 | } 49 | session.setLastTime(System.currentTimeMillis()); 50 | DATA.put(sessionId, session); 51 | return true; 52 | } 53 | 54 | /** 55 | * 获取会话对应的用户id 56 | * 57 | * @param sessionId 会话id 58 | * @return 用户id 59 | */ 60 | public static LoginSession get(String sessionId) { 61 | if (sessionId == null) { 62 | return null; 63 | } 64 | LoginSession session = DATA.get(sessionId); 65 | if (session == null) { 66 | return null; 67 | } 68 | if ((System.currentTimeMillis() - session.getLastTime()) > (7 * 24 * 60 * 60 * 1000)) { 69 | DATA.remove(sessionId); 70 | return null; 71 | } else { 72 | session.setLastTime(System.currentTimeMillis()); 73 | DATA.put(sessionId, session); 74 | } 75 | return session; 76 | } 77 | 78 | /** 79 | * 删除会话 80 | * 81 | * @param sessionId 会话的id 82 | */ 83 | public static void remove(String sessionId) { 84 | if (sessionId == null) { 85 | return; 86 | } 87 | DATA.remove(sessionId); 88 | } 89 | 90 | } 91 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/common/LoginSession.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.common; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * 用户会话 8 | * 9 | * @author Mirren 10 | * 11 | */ 12 | public class LoginSession { 13 | 14 | /** 用户的id */ 15 | private String uid; 16 | /** 用户的角色 */ 17 | private LoginRole role; 18 | /** 用户的标签集 */ 19 | private List tags = new ArrayList(); 20 | /** 最后时间 */ 21 | private long lastTime; 22 | 23 | /** 24 | * 获取用户的id 25 | * 26 | * @return 27 | */ 28 | public String getUid() { 29 | return uid; 30 | } 31 | 32 | /** 33 | * 设置用户的id 34 | * 35 | * @param uid 36 | * @return 37 | */ 38 | public LoginSession setUid(String uid) { 39 | this.uid = uid; 40 | return this; 41 | } 42 | 43 | /** 44 | * 获取用户的角色 45 | * 46 | * @return 47 | */ 48 | public LoginRole getRole() { 49 | return role; 50 | } 51 | 52 | /** 53 | * 设置用户的角色 54 | * 55 | * @param role 56 | * @return 57 | */ 58 | public LoginSession setRole(LoginRole role) { 59 | this.role = role; 60 | return this; 61 | } 62 | 63 | /** 64 | * 获取用户的标签 65 | * 66 | * @return 67 | */ 68 | public List getTags() { 69 | return tags; 70 | } 71 | 72 | /** 73 | * 给用户添加标签 74 | * 75 | * @param tag 76 | * @return 77 | */ 78 | public LoginSession addTag(String tag) { 79 | if (this.tags == null) { 80 | this.tags = new ArrayList<>(); 81 | } 82 | this.tags.add(tag); 83 | return this; 84 | } 85 | 86 | /** 87 | * 设置用户的标签 88 | * 89 | * @param tags 90 | * @return 91 | */ 92 | public LoginSession setTags(List tags) { 93 | this.tags = tags; 94 | return this; 95 | } 96 | 97 | /** 98 | * 获取最后访问时间 99 | * 100 | * @return 101 | */ 102 | public long getLastTime() { 103 | return lastTime; 104 | } 105 | 106 | /** 107 | * 设置最后访问时间 108 | * 109 | * @param lastTime 110 | * @return 111 | */ 112 | public LoginSession setLastTime(long lastTime) { 113 | this.lastTime = lastTime; 114 | return this; 115 | } 116 | 117 | @Override 118 | public String toString() { 119 | return "LoginSession [uid=" + uid + ", role=" + role + ", tags=" + tags + ", lastTime=" + lastTime + "]"; 120 | } 121 | 122 | } 123 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/common/VerifyCodeSession.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.common; 2 | 3 | /** 4 | * 验证码的回话信息 5 | * 6 | * @author Mirren 7 | * 8 | */ 9 | public class VerifyCodeSession { 10 | /** 验证码的下标(索引) */ 11 | private String index; 12 | /** 验证码的值 */ 13 | private String value; 14 | /** 需要点击的验证码 */ 15 | private String data; 16 | /** 显示的验证码 */ 17 | private String code; 18 | /** 最后操作时间 */ 19 | private long lastTime; 20 | /** 21 | * 获取下标 22 | * 23 | * @return 24 | */ 25 | public String getIndex() { 26 | return index; 27 | } 28 | 29 | /** 30 | * 设置下标 31 | * 32 | * @param index 33 | * @return 34 | */ 35 | public VerifyCodeSession setIndex(String index) { 36 | this.index = index; 37 | return this; 38 | } 39 | /** 40 | * 获取正确的值 41 | * 42 | * @return 43 | */ 44 | public String getValue() { 45 | return value; 46 | } 47 | /** 48 | * 设置正确的值 49 | * 50 | * @param value 51 | * @return 52 | */ 53 | public VerifyCodeSession setValue(String value) { 54 | this.value = value; 55 | return this; 56 | } 57 | /** 58 | * 获取用户要选择的验证码 59 | * 60 | * @return 61 | */ 62 | public String getData() { 63 | return data; 64 | } 65 | /** 66 | * 设置用户需要选中的验证码 67 | * 68 | * @param data 69 | * @return 70 | */ 71 | public VerifyCodeSession setData(String data) { 72 | this.data = data; 73 | return this; 74 | } 75 | /** 76 | * 获取验证码 77 | * 78 | * @return 79 | */ 80 | public String getCode() { 81 | return code; 82 | } 83 | /** 84 | * 设置验证码 85 | * 86 | * @param code 87 | * @return 88 | */ 89 | public VerifyCodeSession setCode(String code) { 90 | this.code = code; 91 | return this; 92 | } 93 | /** 94 | * 获取最后操作的时间 95 | * 96 | * @return 97 | */ 98 | public long getLastTime() { 99 | return lastTime; 100 | } 101 | /** 102 | * 设置最后操作的时间 103 | * 104 | * @param lastTime 105 | * @return 106 | */ 107 | public VerifyCodeSession setLastTime(long lastTime) { 108 | this.lastTime = lastTime; 109 | return this; 110 | } 111 | 112 | @Override 113 | public String toString() { 114 | return "VerifyCodeSession [index=" + index + ", value=" + value + ", data=" + data + ", code=" + code + ", lastTime=" + lastTime + "]"; 115 | } 116 | 117 | } 118 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/service/UsersService.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.service; 2 | 3 | import java.util.Map; 4 | 5 | import org.mirrentools.orion.entity.Tags; 6 | import org.mirrentools.orion.entity.Users; 7 | 8 | /** 9 | * 用户相关的服务接口 10 | * 11 | * @author Mirren 12 | * 13 | */ 14 | public interface UsersService { 15 | /** 16 | * 登录 17 | * 18 | * @return 19 | */ 20 | Map login(String id, String pwd, String index, String value); 21 | 22 | /** 23 | * 退出登录 24 | * 25 | * @return 26 | */ 27 | Map logout(String sessionId); 28 | 29 | /** 30 | * 修改密码 31 | * @param id 用户的id 32 | * @param pwd 新的密码 33 | * @return 34 | */ 35 | Map putPassword(String id, String pwd); 36 | 37 | 38 | /** 39 | * 获取用户 40 | * 41 | * @param keywords 搜索的关键字 42 | * @param role 所在的标签 43 | * @param page 第几页 44 | * @param size 每页获取多少行数据 45 | * @return 46 | */ 47 | Map findUsers(String keywords, String tid, Integer page, Integer size); 48 | 49 | /** 50 | * 获取所有管理员用户 51 | * 52 | * @return 53 | */ 54 | Map findServerUsers(); 55 | 56 | /** 57 | * 获取指定用户 58 | * 59 | * @param uid 60 | * @return 61 | */ 62 | Map getUser(String uid); 63 | 64 | /** 65 | * 新增用户 66 | * 67 | * @param user 68 | * @return 69 | */ 70 | Map postUser(String sessionId, Users user); 71 | 72 | /** 73 | * 修改用户 74 | * 75 | * @param user 76 | * @return 77 | */ 78 | Map putUser(String sessionId, Users user); 79 | 80 | /** 81 | * 删除用户 82 | * 83 | * @param uid 84 | * @return 85 | */ 86 | Map deleteUser(String sessionId, String uid); 87 | 88 | /** 89 | * 获取所有标签 90 | * 91 | * @return 92 | */ 93 | Map findTags(); 94 | 95 | /** 96 | * 获取指定标签 97 | * 98 | * @param tid 99 | * @return 100 | */ 101 | Map getTag(String tid); 102 | 103 | /** 104 | * 新增标签 105 | * 106 | * @param tag 107 | * @return 108 | */ 109 | Map postTag(Tags tag); 110 | 111 | /** 112 | * 修改指定标签 113 | * 114 | * @param tag 115 | * @return 116 | */ 117 | Map putTag(Tags tag); 118 | 119 | /** 120 | * 删除指定标签 121 | * 122 | * @param tid 123 | * @return 124 | */ 125 | Map deleteTag(String tid); 126 | 127 | } 128 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/interceptor/BasicAuthInterceptor.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.interceptor; 2 | 3 | import java.nio.file.Files; 4 | import java.nio.file.Paths; 5 | import java.util.Base64; 6 | 7 | import javax.servlet.http.HttpServletRequest; 8 | import javax.servlet.http.HttpServletResponse; 9 | 10 | import org.json.JSONObject; 11 | import org.mirrentools.orion.common.OrionApiManager; 12 | import org.springframework.web.servlet.HandlerInterceptor; 13 | /** 14 | * 普通认证的拦截器,暂时没有使用 15 | * 16 | * @author Mirren 17 | * 18 | */ 19 | public class BasicAuthInterceptor implements HandlerInterceptor { 20 | public static final String AUTHORIZATION = "Authorization"; 21 | public static final String IS_AUTH = "isAuth"; 22 | @Override 23 | public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 24 | String auth = request.getHeader(AUTHORIZATION); 25 | if (auth == null) { 26 | response.addHeader("WWW-Authenticate", "Basic realm=\"" + OrionApiManager.NAME_VERSION + "\""); 27 | response.setStatus(401); 28 | return false; 29 | } else { 30 | if ("false".equals(request.getSession().getAttribute(IS_AUTH))) { 31 | request.getSession().removeAttribute(IS_AUTH); 32 | response.addHeader("WWW-Authenticate", "Basic realm=\"" + OrionApiManager.NAME_VERSION + "\""); 33 | response.setStatus(401); 34 | return false; 35 | } else { 36 | final String suser; 37 | final String spass; 38 | String decoded = new String(Base64.getDecoder().decode(auth.split(" ")[1])); 39 | int colonIdx = decoded.indexOf(":"); 40 | if (colonIdx != -1) { 41 | suser = decoded.substring(0, colonIdx); 42 | spass = decoded.substring(colonIdx + 1); 43 | } else { 44 | suser = decoded; 45 | spass = null; 46 | } 47 | 48 | byte[] bytes = Files.readAllBytes(Paths.get(System.getProperty("user.dir") + "/config/user.json")); 49 | JSONObject users = new JSONObject(new String(bytes)); 50 | 51 | boolean authResult = false; 52 | if (users.has(suser)) { 53 | JSONObject user = users.getJSONObject(suser); 54 | if (user.has("pwd")) { 55 | if (user.get("pwd").equals(spass)) { 56 | request.setAttribute(IS_AUTH, "true"); 57 | request.setAttribute(AUTHORIZATION, users); 58 | authResult = true; 59 | } 60 | } 61 | } 62 | 63 | if (!authResult) { 64 | response.addHeader("WWW-Authenticate", "Basic realm=\"" + OrionApiManager.NAME_VERSION + "\""); 65 | response.setStatus(401); 66 | } 67 | return authResult; 68 | } 69 | } 70 | } 71 | 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/common/VerifyCodeSessionStore.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.common; 2 | 3 | import java.util.Map; 4 | import java.util.concurrent.ConcurrentHashMap; 5 | import java.util.concurrent.ExecutorService; 6 | import java.util.concurrent.Executors; 7 | import java.util.concurrent.atomic.AtomicBoolean; 8 | 9 | /** 10 | * 一个简单的回话存储,默认验证码有效期为15分钟 11 | * 12 | * @author Mirren 13 | * 14 | */ 15 | public class VerifyCodeSessionStore { 16 | /** 删除过期回话的线程池 */ 17 | private static ExecutorService EXECUTOR = Executors.newSingleThreadExecutor(); 18 | /** 当前是否在删除过期回话标识 */ 19 | private static AtomicBoolean IS_EXECUTE = new AtomicBoolean(false); 20 | /** 存储数据的 */ 21 | private static Map DATA = new ConcurrentHashMap<>(); 22 | 23 | /** 24 | * 保存回话 25 | * 26 | * @param index 下标,也是回话的id 27 | * @param value 正确的值 28 | * @param data 需要点击的验证码 29 | * @param code 验证码 30 | * @return 31 | */ 32 | public static boolean save(String index, String value, String data, String code) { 33 | if (!IS_EXECUTE.get()) { 34 | try { 35 | EXECUTOR.execute(() -> { 36 | IS_EXECUTE.set(true); 37 | try { 38 | DATA.values().forEach(session -> { 39 | if ((System.currentTimeMillis() - session.getLastTime()) > (15 * 60 * 1000)) { 40 | DATA.remove(session.getIndex()); 41 | } 42 | }); 43 | } catch (Exception e) { 44 | } 45 | IS_EXECUTE.set(false); 46 | }); 47 | } catch (Exception e) { 48 | } 49 | } 50 | VerifyCodeSession session = new VerifyCodeSession(); 51 | session.setIndex(index).setValue(value).setData(data).setCode(code).setLastTime(System.currentTimeMillis()); 52 | DATA.put(index, session); 53 | return true; 54 | } 55 | 56 | /** 57 | * 获取会话对应的用户id 58 | * 59 | * @param sessionId 会话id 60 | * @return 用户id 61 | */ 62 | public static VerifyCodeSession get(String sessionId) { 63 | if (sessionId == null) { 64 | return null; 65 | } 66 | VerifyCodeSession session = DATA.get(sessionId); 67 | if (session == null) { 68 | return null; 69 | } 70 | if ((System.currentTimeMillis() - session.getLastTime()) > (15 * 60 * 1000)) { 71 | DATA.remove(sessionId); 72 | return null; 73 | } else { 74 | session.setLastTime(System.currentTimeMillis()); 75 | DATA.put(sessionId, session); 76 | } 77 | return session; 78 | } 79 | 80 | /** 81 | * 删除会话 82 | * 83 | * @param sessionId 会话的id 84 | */ 85 | public static void remove(String sessionId) { 86 | if (sessionId == null) { 87 | return; 88 | } 89 | DATA.remove(sessionId); 90 | 91 | } 92 | 93 | } 94 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/controller/VerifyCodeController.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.controller; 2 | 3 | import java.io.IOException; 4 | import java.util.HashMap; 5 | import java.util.Map; 6 | 7 | import org.apache.logging.log4j.LogManager; 8 | import org.apache.logging.log4j.Logger; 9 | import org.mirrentools.orion.common.ResultCode; 10 | import org.mirrentools.orion.common.ResultUtil; 11 | import org.mirrentools.orion.common.StringUtil; 12 | import org.mirrentools.orion.common.VerifyCodeSessionStore; 13 | import org.mirrentools.orion.common.VerifyCodeUtils; 14 | import org.springframework.web.bind.annotation.CrossOrigin; 15 | import org.springframework.web.bind.annotation.GetMapping; 16 | import org.springframework.web.bind.annotation.PathVariable; 17 | import org.springframework.web.bind.annotation.RequestMethod; 18 | import org.springframework.web.bind.annotation.RestController; 19 | 20 | /** 21 | * 验证码相关的控制器 22 | * 23 | * @author Mirren 24 | * 25 | */ 26 | @CrossOrigin(allowedHeaders = { "x-session", "content-type" }, methods = { RequestMethod.DELETE, RequestMethod.GET, 27 | RequestMethod.HEAD, RequestMethod.OPTIONS, RequestMethod.PATCH, RequestMethod.POST, RequestMethod.PUT, 28 | RequestMethod.TRACE, }) 29 | @RestController 30 | public class VerifyCodeController { 31 | private static final Logger LOG = LogManager.getLogger(VerifyCodeController.class); 32 | 33 | /** 34 | * 获取验证码数据 35 | * 36 | * @return 37 | */ 38 | @GetMapping(value = "/verification/data", produces = { "application/json;charset=UTF-8" }) 39 | public Map getdata() { 40 | try { 41 | Map verify = VerifyCodeUtils.generateVerityData(); 42 | String index = verify.get("index"); 43 | String data = verify.get("data"); 44 | String code = verify.get("code"); 45 | VerifyCodeSessionStore.save(index, verify.get("value"), data, code); 46 | Map result = new HashMap<>(); 47 | result.put("index", index); 48 | result.put("data", data); 49 | result.put("code", code); 50 | return result; 51 | } catch (Exception e) { 52 | LOG.error("执行生成验证码数据-->失败:", e); 53 | return ResultUtil.format(ResultCode.R1303, e == null ? "" : e.getMessage()); 54 | } 55 | } 56 | 57 | @GetMapping(value = "/verification/img/{code}", produces = { "image/jpeg" }) 58 | public byte[] getImg(@PathVariable("code") String code) { 59 | try { 60 | if (StringUtil.isNullOrEmpty(code)) { 61 | return null; 62 | } 63 | byte[] bs = VerifyCodeUtils.getImageBytes(code); 64 | return bs; 65 | } catch (IOException e) { 66 | LOG.error("执行生成验证码图片-->失败:", e); 67 | return null; 68 | } 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/interceptor/LoginSessionAuthInterceptor.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.interceptor; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | import javax.servlet.http.HttpServletResponse; 5 | 6 | import org.mirrentools.orion.common.LoginRole; 7 | import org.mirrentools.orion.common.LoginSession; 8 | import org.mirrentools.orion.common.LoginSessionStore; 9 | import org.mirrentools.orion.common.ResultCode; 10 | import org.mirrentools.orion.common.ResultUtil; 11 | import org.slf4j.Logger; 12 | import org.slf4j.LoggerFactory; 13 | import org.springframework.http.HttpMethod; 14 | import org.springframework.web.servlet.HandlerInterceptor; 15 | 16 | /** 17 | * 普通认证的拦截器 18 | * 19 | * @author Mirren 20 | * 21 | */ 22 | public class LoginSessionAuthInterceptor implements HandlerInterceptor { 23 | private Logger LOG = LoggerFactory.getLogger(LoginSessionAuthInterceptor.class); 24 | 25 | @Override 26 | public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 27 | response.setHeader("Access-Control-Allow-Origin", "*"); 28 | response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE"); 29 | response.setHeader("Access-Control-Allow-Headers", "x-session,content-type"); 30 | if (HttpMethod.valueOf(request.getMethod()) == HttpMethod.OPTIONS) { 31 | return true; 32 | } 33 | String sessionId = request.getHeader("x-session"); 34 | if (sessionId == null) { 35 | sessionId = request.getParameter("token"); 36 | } 37 | LoginSession session = LoginSessionStore.get(sessionId); 38 | if (session == null || session.getUid() == null || session.getRole() == null) { 39 | response.setHeader("Content-Type", "application/json;charset=UTF-8"); 40 | try { 41 | response.getWriter().write(ResultUtil.formatAsString(ResultCode.R401)); 42 | } catch (Exception e) { 43 | response.sendError(401, ResultCode.R401.msg()); 44 | } 45 | return false; 46 | } else { 47 | String uid = session.getUid(); 48 | String path = request.getServletPath(); 49 | LoginRole role = session.getRole(); 50 | if (role == LoginRole.CLIENT && path.startsWith("/private/server")) { 51 | response.setHeader("Content-Type", "application/json;charset=UTF-8"); 52 | try { 53 | response.getWriter().write(ResultUtil.formatAsString(ResultCode.R403)); 54 | } catch (Exception e) { 55 | response.sendError(403, ResultCode.R403.msg()); 56 | } 57 | return false; 58 | } 59 | LOG.info("\n请求记录-->User: " + uid + ", Role: " + role + ", Method: " + request.getMethod() + ", Path: " + path); 60 | } 61 | return true; 62 | } 63 | 64 | } 65 | -------------------------------------------------------------------------------- /Server-UI/css/chunk-af94418a.c9ed0dc3.css: -------------------------------------------------------------------------------- 1 | .text-through[data-v-7dc94b88]{-webkit-text-decoration-line:line-through;text-decoration-line:line-through}.api[data-v-7dc94b88]{background-color:#f5f7fa;border:1px solid #3b4151}.get[data-v-7dc94b88]{background-color:#ebf3fb;border:1px solid #61affe}.post[data-v-7dc94b88]{background-color:#e8f6f0;border:1px solid #49cc90}.put[data-v-7dc94b88]{background-color:#fbf1e6;border:1px solid #fca130}.delete[data-v-7dc94b88]{background-color:#fae7e7;border:1px solid #f93e3e}.head[data-v-7dc94b88]{background-color:#f4e7ff;border:1px solid #9012fe}.options[data-v-7dc94b88]{background-color:#e6eef6;border:1px solid #0d5aa7}.patch[data-v-7dc94b88]{background-color:#edfcf9;border:1px solid #50e3c2}.trace[data-v-7dc94b88]{background-color:#ffe9e6;border:1px solid #ffa8be}.connect[data-v-7dc94b88]{background-color:#e6f6f1;border:1px solid #83bb83}.api-header[data-v-7dc94b88]{height:40px;display:flex;padding:3px 5px;align-items:center;border-radius:4px}.api .api-header[data-v-7dc94b88]{background-color:#f5f7fa}.get .api-header[data-v-7dc94b88]{background-color:#ebf3fb}.post .api-header[data-v-7dc94b88]{background-color:#e8f6f0}.put .api-header[data-v-7dc94b88]{background-color:#fbf1e6}.delete .api-header[data-v-7dc94b88]{background-color:#fae7e7}.head .api-header[data-v-7dc94b88]{background-color:#f4e7ff}.options .api-header[data-v-7dc94b88]{background-color:#e6eef6}.patch .api-header[data-v-7dc94b88]{background-color:#edfcf9}.trace .api-header[data-v-7dc94b88]{background-color:#ffe9e6}.connect .api-header[data-v-7dc94b88]{background-color:#e6f6f1}.api-method[data-v-7dc94b88]{font-size:14px;font-weight:700;padding:5px 15px;text-align:center;border-radius:3px;color:#fff}.api .api-method[data-v-7dc94b88]{background-color:#3b4151}.get .api-method[data-v-7dc94b88]{background-color:#61affe}.post .api-method[data-v-7dc94b88]{background-color:#49cc90}.put .api-method[data-v-7dc94b88]{background-color:#fca130}.delete .api-method[data-v-7dc94b88]{background-color:#f93e3e}.head .api-method[data-v-7dc94b88]{background-color:#9012fe}.options .api-method[data-v-7dc94b88]{background-color:#0d5aa7}.patch .api-method[data-v-7dc94b88]{background-color:#50e3c2}.trace .api-method[data-v-7dc94b88]{background-color:#ffa8be}.connect .api-method[data-v-7dc94b88]{background-color:#83bb83}.api-path-summary[data-v-7dc94b88]{align-items:center;word-break:break-all;padding-left:10px;color:#3b4151}.novalidate input[data-v-7dc94b88]{border-color:#dcdfe6!important}.alink[data-v-7dc94b88]{background-color:transparent;color:#409eff;text-decoration:none;outline:none;display:inline-block;margin:3px 5px}.alink[data-v-7dc94b88]:active,.alink[data-v-7dc94b88]:hover{outline-width:0;opacity:.8}.project-item[data-v-7dc94b88]{text-align:right;padding-right:5px;color:#666}.desc-constraint span[data-v-7dc94b88]{display:inline-block;padding-right:10px}.user-tag[data-v-7dc94b88]{padding:3px 10px;background-color:#f0f2f5;border-radius:3px;margin-right:5px;margin-bottom:5px;cursor:pointer} -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/entity/ProjectApiTemplate.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.entity; 2 | 3 | 4 | /** 5 | * API接口模板 6 | * @author 7 | */ 8 | public class ProjectApiTemplate { 9 | /** 模板的id */ 10 | private String tid; 11 | /** 模板所属用户的id */ 12 | private String uid; 13 | /** 模板的名称 */ 14 | private String name; 15 | /** API基本信息 */ 16 | private String api; 17 | /** API中的请求参数 */ 18 | private String parameters; 19 | /** API中的响应参数 */ 20 | private String responses; 21 | /** 模板创建的时间 */ 22 | private Long ctime; 23 | /** 24 | * 获取模板的id 25 | * 26 | * @return 27 | */ 28 | public String getTid() { 29 | return tid; 30 | } 31 | /** 32 | * 设置模板的id 33 | * 34 | * @param tid 35 | */ 36 | public void setTid(String tid) { 37 | this.tid = tid; 38 | } 39 | /** 40 | * 获取模板所属用户的id 41 | * 42 | * @return 43 | */ 44 | public String getUid() { 45 | return uid; 46 | } 47 | /** 48 | * 设置模板所属用户的id 49 | * 50 | * @param uid 51 | */ 52 | public void setUid(String uid) { 53 | this.uid = uid; 54 | } 55 | /** 56 | * 获取模板的名称 57 | * 58 | * @return 59 | */ 60 | public String getName() { 61 | return name; 62 | } 63 | /** 64 | * 设置模板的名称 65 | * 66 | * @param name 67 | */ 68 | public void setName(String name) { 69 | this.name = name; 70 | } 71 | /** 72 | * 获取API基本信息 73 | * 74 | * @return 75 | */ 76 | public String getApi() { 77 | return api; 78 | } 79 | /** 80 | * 设置API基本信息 81 | * 82 | * @param api 83 | */ 84 | public void setApi(String api) { 85 | this.api = api; 86 | } 87 | /** 88 | * 获取API中的请求参数 89 | * 90 | * @return 91 | */ 92 | public String getParameters() { 93 | return parameters; 94 | } 95 | /** 96 | * 设置API中的请求参数 97 | * 98 | * @param parameters 99 | */ 100 | public void setParameters(String parameters) { 101 | this.parameters = parameters; 102 | } 103 | /** 104 | * 获取API中的响应参数 105 | * 106 | * @return 107 | */ 108 | public String getResponses() { 109 | return responses; 110 | } 111 | /** 112 | * 设置API中的响应参数 113 | * 114 | * @param responses 115 | */ 116 | public void setResponses(String responses) { 117 | this.responses = responses; 118 | } 119 | /** 120 | * 获取模板创建的时间 121 | * 122 | * @return 123 | */ 124 | public Long getCtime() { 125 | return ctime; 126 | } 127 | /** 128 | * 设置模板创建的时间 129 | * 130 | * @param ctime 131 | */ 132 | public void setCtime(Long ctime) { 133 | this.ctime = ctime; 134 | } 135 | 136 | @Override 137 | public String toString() { 138 | return "ProjectApiTemplate [tid=" + tid + " , uid=" + uid + " , name=" + name + " , api=" + api + " , parameters=" + parameters + " , responses=" + responses + " , ctime=" + ctime + " ]"; 139 | } 140 | } 141 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/WebMvcConfig.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion; 2 | 3 | import java.util.concurrent.TimeUnit; 4 | 5 | import javax.servlet.http.HttpServletRequest; 6 | import javax.servlet.http.HttpServletResponse; 7 | 8 | import org.mirrentools.orion.interceptor.ClientAllowsInterceptor; 9 | import org.mirrentools.orion.interceptor.LoginSessionAuthInterceptor; 10 | import org.springframework.beans.factory.annotation.Value; 11 | import org.springframework.context.annotation.Configuration; 12 | import org.springframework.http.CacheControl; 13 | import org.springframework.web.servlet.config.annotation.InterceptorRegistration; 14 | import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 15 | import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; 16 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 17 | import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; 18 | 19 | /** 20 | * WebMvc的文件配置 21 | * 22 | * @author Mirren 23 | * 24 | */ 25 | @Configuration 26 | public class WebMvcConfig implements WebMvcConfigurer { 27 | /** 配置文件是否允许未登录的用户访问客户端 */ 28 | @Value("${clientAllowUnauthorized}") 29 | private String clientAllowUnauthorized; 30 | 31 | @Override 32 | public void addResourceHandlers(ResourceHandlerRegistry registry) { 33 | registry.addResourceHandler("/console/**") 34 | .addResourceLocations("file:" + System.getProperty("user.dir") + "/Server-UI/") 35 | .setCacheControl(CacheControl.maxAge(7, TimeUnit.DAYS)); 36 | registry.addResourceHandler("/client/**") 37 | .addResourceLocations("file:" + System.getProperty("user.dir") + "/Client-UI/") 38 | .setCacheControl(CacheControl.maxAge(7, TimeUnit.DAYS)); 39 | registry.addResourceHandler("/favicon.ico") 40 | .addResourceLocations("classpath:favicon.ico","classpath:/BOOT-INF/classes/favicon.ico"); 41 | WebMvcConfigurer.super.addResourceHandlers(registry); 42 | } 43 | 44 | @Override 45 | public void addInterceptors(InterceptorRegistry registry) { 46 | InterceptorRegistration privateServers = registry.addInterceptor(new LoginSessionAuthInterceptor()); 47 | privateServers.addPathPatterns("/private/**"); 48 | InterceptorRegistration client = registry.addInterceptor(new ClientAllowsInterceptor("true".equalsIgnoreCase(clientAllowUnauthorized))); 49 | client.addPathPatterns("/client/index.html"); 50 | // 添加404页面跳转 51 | registry.addInterceptor(new HandlerInterceptorAdapter() { 52 | @Override 53 | public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 54 | if (response.getStatus() == 404) { 55 | response.sendRedirect("/console/index.html#/404"); 56 | return false; 57 | } 58 | return super.preHandle(request, response, handler); 59 | } 60 | }); 61 | WebMvcConfigurer.super.addInterceptors(registry); 62 | } 63 | 64 | } 65 | -------------------------------------------------------------------------------- /Server-UI/css/chunk-1c8ff139.2c0c59e8.css: -------------------------------------------------------------------------------- 1 | .text-through[data-v-d4afcaf6]{-webkit-text-decoration-line:line-through;text-decoration-line:line-through}.api[data-v-d4afcaf6]{background-color:#f5f7fa;border:1px solid #3b4151}.get[data-v-d4afcaf6]{background-color:#ebf3fb;border:1px solid #61affe}.post[data-v-d4afcaf6]{background-color:#e8f6f0;border:1px solid #49cc90}.put[data-v-d4afcaf6]{background-color:#fbf1e6;border:1px solid #fca130}.delete[data-v-d4afcaf6]{background-color:#fae7e7;border:1px solid #f93e3e}.head[data-v-d4afcaf6]{background-color:#f4e7ff;border:1px solid #9012fe}.options[data-v-d4afcaf6]{background-color:#e6eef6;border:1px solid #0d5aa7}.patch[data-v-d4afcaf6]{background-color:#edfcf9;border:1px solid #50e3c2}.trace[data-v-d4afcaf6]{background-color:#ffe9e6;border:1px solid #ffa8be}.connect[data-v-d4afcaf6]{background-color:#e6f6f1;border:1px solid #83bb83}.api-header[data-v-d4afcaf6]{height:40px;display:flex;padding:3px 5px;align-items:center;border-radius:4px}.api .api-header[data-v-d4afcaf6]{background-color:#f5f7fa}.get .api-header[data-v-d4afcaf6]{background-color:#ebf3fb}.post .api-header[data-v-d4afcaf6]{background-color:#e8f6f0}.put .api-header[data-v-d4afcaf6]{background-color:#fbf1e6}.delete .api-header[data-v-d4afcaf6]{background-color:#fae7e7}.head .api-header[data-v-d4afcaf6]{background-color:#f4e7ff}.options .api-header[data-v-d4afcaf6]{background-color:#e6eef6}.patch .api-header[data-v-d4afcaf6]{background-color:#edfcf9}.trace .api-header[data-v-d4afcaf6]{background-color:#ffe9e6}.connect .api-header[data-v-d4afcaf6]{background-color:#e6f6f1}.api-method[data-v-d4afcaf6]{font-size:14px;font-weight:700;padding:5px 15px;text-align:center;border-radius:3px;color:#fff}.api .api-method[data-v-d4afcaf6]{background-color:#3b4151}.get .api-method[data-v-d4afcaf6]{background-color:#61affe}.post .api-method[data-v-d4afcaf6]{background-color:#49cc90}.put .api-method[data-v-d4afcaf6]{background-color:#fca130}.delete .api-method[data-v-d4afcaf6]{background-color:#f93e3e}.head .api-method[data-v-d4afcaf6]{background-color:#9012fe}.options .api-method[data-v-d4afcaf6]{background-color:#0d5aa7}.patch .api-method[data-v-d4afcaf6]{background-color:#50e3c2}.trace .api-method[data-v-d4afcaf6]{background-color:#ffa8be}.connect .api-method[data-v-d4afcaf6]{background-color:#83bb83}.api-path-summary[data-v-d4afcaf6]{align-items:center;word-break:break-all;padding-left:10px;color:#3b4151}.alink[data-v-d4afcaf6]{background-color:transparent;color:#409eff;text-decoration:none;outline:none;display:inline-block;margin:3px 5px}.alink[data-v-d4afcaf6]:active,.alink[data-v-d4afcaf6]:hover{outline-width:0;opacity:.8}.group-items[data-v-d4afcaf6]{margin-top:5px;padding:0;list-style-type:none}.group-items li[data-v-d4afcaf6]{display:flex;align-items:center;padding:5px 0 3px 5px;border-left:3px solid transparent;cursor:pointer}.group-items li .group-item[data-v-d4afcaf6]{padding-bottom:2px;border-bottom:2px solid transparent}.group-items li:hover .group-item[data-v-d4afcaf6]{color:#409eff;border-bottom:2px solid #409eff}.group-items .current[data-v-d4afcaf6]{color:#409eff;border-left:3px solid #409eff}.td-item[data-v-d4afcaf6]{text-align:right;padding-right:5px} -------------------------------------------------------------------------------- /Server-UI/css/chunk-7da4ef10.a3ff37ee.css: -------------------------------------------------------------------------------- 1 | .text-through[data-v-73069256]{-webkit-text-decoration-line:line-through;text-decoration-line:line-through}.api[data-v-73069256]{background-color:#f5f7fa;border:1px solid #3b4151}.get[data-v-73069256]{background-color:#ebf3fb;border:1px solid #61affe}.post[data-v-73069256]{background-color:#e8f6f0;border:1px solid #49cc90}.put[data-v-73069256]{background-color:#fbf1e6;border:1px solid #fca130}.delete[data-v-73069256]{background-color:#fae7e7;border:1px solid #f93e3e}.head[data-v-73069256]{background-color:#f4e7ff;border:1px solid #9012fe}.options[data-v-73069256]{background-color:#e6eef6;border:1px solid #0d5aa7}.patch[data-v-73069256]{background-color:#edfcf9;border:1px solid #50e3c2}.trace[data-v-73069256]{background-color:#ffe9e6;border:1px solid #ffa8be}.connect[data-v-73069256]{background-color:#e6f6f1;border:1px solid #83bb83}.api-header[data-v-73069256]{height:40px;display:flex;padding:3px 5px;align-items:center;border-radius:4px}.api .api-header[data-v-73069256]{background-color:#f5f7fa}.get .api-header[data-v-73069256]{background-color:#ebf3fb}.post .api-header[data-v-73069256]{background-color:#e8f6f0}.put .api-header[data-v-73069256]{background-color:#fbf1e6}.delete .api-header[data-v-73069256]{background-color:#fae7e7}.head .api-header[data-v-73069256]{background-color:#f4e7ff}.options .api-header[data-v-73069256]{background-color:#e6eef6}.patch .api-header[data-v-73069256]{background-color:#edfcf9}.trace .api-header[data-v-73069256]{background-color:#ffe9e6}.connect .api-header[data-v-73069256]{background-color:#e6f6f1}.api-method[data-v-73069256]{font-size:14px;font-weight:700;padding:5px 15px;text-align:center;border-radius:3px;color:#fff}.api .api-method[data-v-73069256]{background-color:#3b4151}.get .api-method[data-v-73069256]{background-color:#61affe}.post .api-method[data-v-73069256]{background-color:#49cc90}.put .api-method[data-v-73069256]{background-color:#fca130}.delete .api-method[data-v-73069256]{background-color:#f93e3e}.head .api-method[data-v-73069256]{background-color:#9012fe}.options .api-method[data-v-73069256]{background-color:#0d5aa7}.patch .api-method[data-v-73069256]{background-color:#50e3c2}.trace .api-method[data-v-73069256]{background-color:#ffa8be}.connect .api-method[data-v-73069256]{background-color:#83bb83}.api-path-summary[data-v-73069256]{align-items:center;word-break:break-all;padding-left:10px;color:#3b4151}.alink[data-v-73069256]{background-color:transparent;color:#409eff;text-decoration:none;outline:none;display:inline-block;margin:3px 5px}.alink[data-v-73069256]:active,.alink[data-v-73069256]:hover{outline-width:0;opacity:.8}.group-items[data-v-73069256]{margin-top:5px;padding:0;list-style-type:none}.group-items li[data-v-73069256]{display:flex;align-items:center;padding:5px 0 3px 5px;border-left:3px solid transparent;cursor:pointer}.group-items li .group-item[data-v-73069256]{padding-bottom:2px;border-bottom:2px solid transparent}.group-items li:hover .group-item[data-v-73069256]{color:#409eff;border-bottom:2px solid #409eff}.group-items .current[data-v-73069256]{color:#409eff;border-left:3px solid #409eff}.td-item[data-v-73069256]{text-align:right;padding-right:5px} -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/Main.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion; 2 | 3 | import org.mirrentools.orion.controller.ImportWebSocketServer; 4 | import org.mybatis.spring.annotation.MapperScan; 5 | import org.springframework.boot.SpringApplication; 6 | import org.springframework.boot.autoconfigure.SpringBootApplication; 7 | import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; 8 | import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration; 9 | import org.springframework.boot.web.servlet.ServletComponentScan; 10 | import org.springframework.context.ConfigurableApplicationContext; 11 | import org.springframework.context.annotation.Bean; 12 | import org.springframework.web.servlet.config.annotation.EnableWebMvc; 13 | import org.springframework.web.socket.server.standard.ServerEndpointExporter; 14 | 15 | /** 16 | *
17 |  * 嗨!我通过下面这4行代码,运行了很长很长的时间后,它打印的内容进化成现在的这个项目
18 |  * Hi! I ran the following four lines of code for a long time, and the printed content evolved into the current project
19 |  * while (true) {
20 |  *   System.out.print(new Random().nextInt(2));
21 |  *   Thread.sleep(1000);
22 |  * }
23 |  *   可能我上面的内容很疯狂,但是你可能听信过更疯狂的,比如:我们现在生活的世界是大爆炸而来的;
24 |  * Maybe what I am talking above is crazy, but you may have heard much more crazy things, for example: The world we live in now is from the big bang;
25 |  * 因为我们不关心或不容易证实,所以一些假说与谎言传多了就被当真了;
26 |  * Because we don't care about it or it's not easy to prove it, some hypotheses and lies are taken seriously when they are spread too much;
27 |  * 计算机需要被制造,程序也需要被编写或生成才有;程序能做什么,能获取到计算机的什么信息都已经在编写的时候设定好了;
28 |  * A computer needs to be made, and a program needs to be written or generated. What a program can do and what information it can get has been set up at the time of writing;
29 |  * 计算机的世界好比我们现在生活的世界,程序好比现在看到这段注释的你我;
30 |  * The world of computer is like the world we live in now, and the program is like you and me who see this comment now;
31 |  * 这个世界有一位造物主,虽然眼不能见但是籍着祂所造的一切,只要我们不压着我们的良心我们都能感受到;
32 |  * There is a creator in this world, who can't see but can feel everything created by HIM as long as we don't press our conscience;
33 |  *   我们编写程序需要有文档或注释帮助我们了解程序相关的,同样如果要了解这个世界的一切我们只能通过她的说明书,就是圣经
34 |  * We need to have documents or notes to help us understand the program, and if we want to understand everything in the world, we can only through her instructions, that is, the BIBLE.
35 |  * 程序入口
36 |  * Main
37 |  * 
38 | * 39 | * @author Mirren 40 | * @date 2020-08-22 41 | */ 42 | @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class}) 43 | @EnableWebMvc 44 | @ServletComponentScan 45 | @MapperScan("org.mirrentools.orion.mapper") 46 | public class Main { 47 | public static void main(String[] args) { 48 | ConfigurableApplicationContext content = SpringApplication.run(Main.class, args); 49 | ImportWebSocketServer.setApplicationContext(content); 50 | } 51 | 52 | @Bean 53 | public ServerEndpointExporter serverEndpointExporter() { 54 | return new ServerEndpointExporter(); 55 | } 56 | 57 | } 58 | -------------------------------------------------------------------------------- /src/test/java/org/mirrentools/orion/scripts/CreateCode.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.scripts; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | import org.mirrentools.orion.Constant; 7 | import org.mirrentools.sd.ScrewDriver; 8 | import org.mirrentools.sd.models.SdTemplate; 9 | import org.mirrentools.sd.options.ScrewDriverOptions; 10 | 11 | /** 12 | * 创建代码,该脚本依赖 ScrewDriver 13 | * 14 | * @author Mirren 15 | * 16 | */ 17 | public class CreateCode { 18 | /** 19 | * 不同数据库只需要修改这个变量后重新启动执行 20 | * MySQL = MySqlMapper.ftl 21 | * PostgreSQL = PostgreSqlMapper.ftl 22 | * SQLite = SqliteMapper.ftl 23 | * Oracle = OracleMapper.ftl 24 | * SQL Server = SqlServerMapper.ftl 25 | * DB2 = DB2Mapper.ftl 26 | */ 27 | private static String MYBATIS_MAAPPER_TEMPLATE = "MySqlMapper.ftl"; 28 | public static void main(String[] args) { 29 | ScrewDriver screwDriver = ScrewDriver.instance(new ScrewDriverOptions()); 30 | 31 | // // 创建项目的代码 32 | // screwDriver.createCode(Constant.getProjectBean(), getTemplates("Project")); 33 | // // 创建项目分享记录的代码 34 | // screwDriver.createCode(Constant.getProjectShareBean(), getTemplates("ProjectShare")); 35 | // // 创建接口分组的代码 36 | // screwDriver.createCode(Constant.getProjectApiGroupBean(), getTemplates("ProjectApiGroup")); 37 | // // 创建接口的代码 38 | // screwDriver.createCode(Constant.getProjectApiBean(), getTemplates("ProjectApi")); 39 | // // 创建接口模板的代码 40 | // screwDriver.createCode(Constant.getProjectApiTemplateBean(), getTemplates("ProjectApiTemplate")); 41 | // // 创建用户代码 42 | // screwDriver.createCode(Constant.getUsersBean(), getTemplates("Users")); 43 | // 创建用户代码 44 | screwDriver.createCode(Constant.getTagsBean(), getTemplates("Tags")); 45 | } 46 | 47 | /** 48 | * 获取生成代码需要用到的模板 49 | * 50 | * @param entityName 51 | * 类的名称 52 | * @return 53 | */ 54 | public static Map getTemplates(String entityName) { 55 | String packageName = "org.mirrentools.orion."; 56 | String templatePath = "mybatis"; 57 | // 设置实体生成模板 58 | Map templates = new HashMap(); 59 | // 实体类 60 | templates.put("entity", new SdTemplate() 61 | .setPath(templatePath) 62 | .setFile("Entity.ftl") 63 | .setPackageName(packageName + "entity") 64 | .setOverride(false).setClassName(entityName)); 65 | // 数据库操作dao 66 | templates.put("dao", new SdTemplate() 67 | .setPath(templatePath) 68 | .setFile("Dao.ftl") 69 | .setPackageName(packageName + "mapper").setOverride(false) 70 | .setClassName(entityName + "Mapper")); 71 | // 查询帮助类 72 | templates.put("assist", new SdTemplate() 73 | .setPath(templatePath) 74 | .setFile("SqlAssist.ftl") 75 | .setPackageName(packageName + "common") 76 | .setOverride(false).setClassName("SqlAssist")); 77 | // MyBatis的mapper 78 | templates.put("mapper", new SdTemplate() 79 | .setPath(templatePath) 80 | .setFile(MYBATIS_MAAPPER_TEMPLATE) 81 | .setPackageName("mappers") 82 | .setSourceFolder("src/main/resources") 83 | .setClassName(entityName + "Mapper").setSuffix(".xml")); 84 | return templates; 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/common/ResultUtil.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.common; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | import org.json.JSONObject; 7 | 8 | /** 9 | * 返回结果工具 10 | * 11 | * @author Mirren 12 | * 13 | */ 14 | public class ResultUtil { 15 | 16 | /** 17 | * 格式化为成功 {@link org.mirrentools.orion.common.ResultCode#R200} 18 | * 19 | * @return 20 | */ 21 | public static Map format200(Object data) { 22 | return format(ResultCode.R200, data); 23 | } 24 | 25 | /** 26 | * 格式化为登录超时 {@link org.mirrentools.orion.common.ResultCode#R401} 27 | * 28 | * @return 29 | */ 30 | public static Map format401() { 31 | return format(ResultCode.R401); 32 | } 33 | 34 | /** 35 | * 格式化为没有权限 {@link org.mirrentools.orion.common.ResultCode#R403} 36 | * 37 | * @return 38 | */ 39 | public static Map format403() { 40 | return format(ResultCode.R403); 41 | } 42 | 43 | /** 44 | * 格式化为资源不存在 {@link org.mirrentools.orion.common.ResultCode#R404} 45 | * 46 | * @return 47 | */ 48 | public static Map format404() { 49 | return format(ResultCode.R404); 50 | } 51 | 52 | /** 53 | * 响应数据 54 | * 55 | * @param status 响应的状态 56 | * @param data 响应的数据 57 | * @return 58 | */ 59 | public static Map format(ResultCode status) { 60 | if (status == null) { 61 | status = ResultCode.DEFAULT; 62 | } 63 | Map result = new HashMap<>(); 64 | result.put("code", status.code()); 65 | result.put("msg", status.msg()); 66 | result.put("explain", status.explain()); 67 | return result; 68 | } 69 | 70 | /** 71 | * 响应数据 72 | * 73 | * @param status 响应的状态 74 | * @param data 响应的数据 75 | * @return 76 | */ 77 | public static Map format(ResultCode status, Object data) { 78 | if (status == null) { 79 | status = ResultCode.DEFAULT; 80 | } 81 | Map result = new HashMap<>(); 82 | result.put("code", status.code()); 83 | result.put("msg", status.msg()); 84 | result.put("explain", status.explain()); 85 | result.put("data", data); 86 | return result; 87 | } 88 | 89 | /** 90 | * 返回格式化为JSON字符串 91 | * 92 | * @param status 响应的状态 93 | * @return 94 | * @throws Exception 95 | */ 96 | public static String formatAsString(ResultCode status) { 97 | JSONObject result = new JSONObject(); 98 | result.put("code", status.code()); 99 | result.put("msg", status.msg()); 100 | result.put("explain", status.explain()); 101 | return result.toString(); 102 | } 103 | 104 | /** 105 | * 返回格式化为JSON字符串 106 | * 107 | * @param status 响应的状态 108 | * @param data 响应的数据 109 | * @return 110 | * @throws Exception 111 | */ 112 | public static String formatAsString(ResultCode status, Object data) { 113 | JSONObject result = new JSONObject(); 114 | result.put("code", status.code()); 115 | result.put("msg", status.msg()); 116 | result.put("explain", status.explain()); 117 | result.put("data", data); 118 | return result.toString(); 119 | } 120 | 121 | } 122 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/entity/MyServletRequestWrapper.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.entity; 2 | 3 | import java.io.BufferedReader; 4 | import java.io.ByteArrayOutputStream; 5 | import java.io.IOException; 6 | import java.io.InputStream; 7 | import java.io.InputStreamReader; 8 | 9 | import javax.servlet.ReadListener; 10 | import javax.servlet.ServletInputStream; 11 | import javax.servlet.http.HttpServletRequest; 12 | import javax.servlet.http.HttpServletRequestWrapper; 13 | 14 | /** 15 | * 用于复制Request的流使其可以被重复使用,该类目前只作用于代理请求 16 | * @author Mirren 17 | * 18 | */ 19 | public class MyServletRequestWrapper extends HttpServletRequestWrapper { 20 | 21 | private final byte[] body; 22 | 23 | public MyServletRequestWrapper(HttpServletRequest request) throws IOException { 24 | super(request); 25 | body = toByteArray(super.getInputStream()); 26 | } 27 | 28 | @Override 29 | public BufferedReader getReader() throws IOException { 30 | return new BufferedReader(new InputStreamReader(getInputStream())); 31 | } 32 | 33 | @Override 34 | public ServletInputStream getInputStream() throws IOException { 35 | return new RequestBodyCachingInputStream(body); 36 | } 37 | 38 | private class RequestBodyCachingInputStream extends ServletInputStream { 39 | private byte[] body; 40 | private int lastIndexRetrieved = -1; 41 | private ReadListener listener; 42 | 43 | public RequestBodyCachingInputStream(byte[] body) { 44 | this.body = body; 45 | } 46 | 47 | @Override 48 | public int read() throws IOException { 49 | if (isFinished()) { 50 | return -1; 51 | } 52 | int i = body[lastIndexRetrieved + 1]; 53 | lastIndexRetrieved++; 54 | if (isFinished() && listener != null) { 55 | try { 56 | listener.onAllDataRead(); 57 | } catch (IOException e) { 58 | listener.onError(e); 59 | throw e; 60 | } 61 | } 62 | return i; 63 | } 64 | 65 | @Override 66 | public boolean isFinished() { 67 | return lastIndexRetrieved == body.length - 1; 68 | } 69 | 70 | @Override 71 | public boolean isReady() { 72 | return isFinished(); 73 | } 74 | 75 | @Override 76 | public void setReadListener(ReadListener listener) { 77 | if (listener == null) { 78 | throw new IllegalArgumentException("listener cann not be null"); 79 | } 80 | if (this.listener != null) { 81 | throw new IllegalArgumentException("listener has been set"); 82 | } 83 | this.listener = listener; 84 | if (!isFinished()) { 85 | try { 86 | listener.onAllDataRead(); 87 | } catch (IOException e) { 88 | listener.onError(e); 89 | } 90 | } else { 91 | try { 92 | listener.onAllDataRead(); 93 | } catch (IOException e) { 94 | listener.onError(e); 95 | } 96 | } 97 | } 98 | 99 | @Override 100 | public int available() throws IOException { 101 | return body.length - lastIndexRetrieved - 1; 102 | } 103 | 104 | @Override 105 | public void close() throws IOException { 106 | lastIndexRetrieved = body.length - 1; 107 | body = null; 108 | } 109 | } 110 | public byte[] toByteArray(InputStream input) throws IOException { 111 | ByteArrayOutputStream output = new ByteArrayOutputStream(); 112 | byte[] buffer = new byte[4096]; 113 | int n = 0; 114 | while (-1 != (n = input.read(buffer))) { 115 | output.write(buffer, 0, n); 116 | } 117 | return output.toByteArray(); 118 | } 119 | } -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/entity/Users.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.entity; 2 | 3 | 4 | /** 5 | * 用户表 6 | * @author Mirren 7 | */ 8 | public class Users { 9 | /** 用户的账号 */ 10 | private String uid; 11 | /** 用户的角色 */ 12 | private String role; 13 | /** 用户的标签 */ 14 | private String tags; 15 | /** 用户的密码 */ 16 | private String pwd; 17 | /** 用户的昵称 */ 18 | private String nickname; 19 | /** 用户的联系信息 */ 20 | private String contact; 21 | /** 用户的简介 */ 22 | private String summary; 23 | /** 创建的时间 */ 24 | private Long ctime; 25 | /** 最后访问时间 */ 26 | private Long lasttime; 27 | /** 28 | * 获取用户的账号 29 | * 30 | * @return 31 | */ 32 | public String getUid() { 33 | return uid; 34 | } 35 | /** 36 | * 设置用户的账号 37 | * 38 | * @param uid 39 | */ 40 | public void setUid(String uid) { 41 | this.uid = uid; 42 | } 43 | /** 44 | * 获取用户的角色 45 | * 46 | * @return 47 | */ 48 | public String getRole() { 49 | return role; 50 | } 51 | /** 52 | * 设置用户的角色 53 | * 54 | * @param role 55 | */ 56 | public void setRole(String role) { 57 | this.role = role; 58 | } 59 | /** 60 | * 获取用户的标签 61 | * 62 | * @return 63 | */ 64 | public String getTags() { 65 | return tags; 66 | } 67 | /** 68 | * 设置用户的标签 69 | * 70 | * @param tags 71 | */ 72 | public void setTags(String tags) { 73 | this.tags = tags; 74 | } 75 | /** 76 | * 获取用户的密码 77 | * 78 | * @return 79 | */ 80 | public String getPwd() { 81 | return pwd; 82 | } 83 | /** 84 | * 设置用户的密码 85 | * 86 | * @param pwd 87 | */ 88 | public void setPwd(String pwd) { 89 | this.pwd = pwd; 90 | } 91 | /** 92 | * 获取用户的昵称 93 | * 94 | * @return 95 | */ 96 | public String getNickname() { 97 | return nickname; 98 | } 99 | /** 100 | * 设置用户的昵称 101 | * 102 | * @param nickname 103 | */ 104 | public void setNickname(String nickname) { 105 | this.nickname = nickname; 106 | } 107 | /** 108 | * 获取用户的联系信息 109 | * 110 | * @return 111 | */ 112 | public String getContact() { 113 | return contact; 114 | } 115 | /** 116 | * 设置用户的联系信息 117 | * 118 | * @param contact 119 | */ 120 | public void setContact(String contact) { 121 | this.contact = contact; 122 | } 123 | /** 124 | * 获取用户的简介 125 | * 126 | * @return 127 | */ 128 | public String getSummary() { 129 | return summary; 130 | } 131 | /** 132 | * 设置用户的简介 133 | * 134 | * @param summary 135 | */ 136 | public void setSummary(String summary) { 137 | this.summary = summary; 138 | } 139 | /** 140 | * 获取创建的时间 141 | * 142 | * @return 143 | */ 144 | public Long getCtime() { 145 | return ctime; 146 | } 147 | /** 148 | * 设置创建的时间 149 | * 150 | * @param ctime 151 | */ 152 | public void setCtime(Long ctime) { 153 | this.ctime = ctime; 154 | } 155 | /** 156 | * 获取最后访问时间 157 | * 158 | * @return 159 | */ 160 | public Long getLasttime() { 161 | return lasttime; 162 | } 163 | /** 164 | * 设置最后访问时间 165 | * 166 | * @param lasttime 167 | */ 168 | public void setLasttime(Long lasttime) { 169 | this.lasttime = lasttime; 170 | } 171 | 172 | @Override 173 | public String toString() { 174 | return "Users [uid=" + uid + " , role=" + role + " , tags=" + tags + " , pwd=" + pwd + " , nickname=" + nickname + " , contact=" + contact + " , summary=" + summary + " , ctime=" + ctime + " , lasttime=" + lasttime + " ]"; 175 | } 176 | } 177 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/common/WebSocketBase.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.common; 2 | 3 | import org.json.JSONObject; 4 | 5 | /** 6 | * WebSocket响应协议 7 | * 8 | * @author Mirren 9 | * 10 | */ 11 | public class WebSocketBase { 12 | 13 | /** 操作类型,当前默认只有1000 */ 14 | public final static int TYPE = 1000; 15 | 16 | /** 状态码-成功 */ 17 | protected final static int C200 = 200; 18 | /** 状态码-登录超时 */ 19 | protected final static int C401 = 401; 20 | /** 状态码-失败 */ 21 | protected final static int C500 = 500; 22 | /** 状态码-操作完成 */ 23 | protected final static int C999 = 999; 24 | 25 | /** 消息说明成功 */ 26 | protected final static String M200 = "成功!"; 27 | /** 消息说明登录超时 */ 28 | protected final static String M401 = "登录超时,请重新登录!"; 29 | /** 消息说明失败 */ 30 | protected final static String M500 = "失败!"; 31 | /** 消息说明操作完成 */ 32 | protected final static String M999 = "操作完成!"; 33 | 34 | /** 协议中的code */ 35 | private final static String KEY_CODE = "code"; 36 | /** 协议中的type */ 37 | private final static String KEY_TYPE = "type"; 38 | /** 协议中的data */ 39 | private final static String KEY_DATA = "data"; 40 | /** 协议中的msg */ 41 | private final static String KEY_MSG = "msg"; 42 | 43 | /** 44 | * 操作完成 45 | * 46 | * @param code 47 | * @param data 48 | * @return 49 | */ 50 | public static String end() { 51 | return result(C999, TYPE, M200, null); 52 | } 53 | 54 | /** 55 | * 成功状态 56 | * 57 | * @param code 58 | * @param data 59 | * @return 60 | */ 61 | public static String success(int code, String data) { 62 | return result(code, TYPE, M200, data); 63 | } 64 | 65 | /** 66 | * 成功状态 67 | * 68 | * @param code 69 | * @param msg 70 | * @param data 71 | * @return 72 | */ 73 | public static String success(int code, String msg, String data) { 74 | return result(code, TYPE, msg, data); 75 | } 76 | 77 | /** 78 | * 异常或失败 79 | * 80 | * @param msg 81 | * @param data 82 | * @return 83 | */ 84 | public static String failed(String msg) { 85 | return result(C500, TYPE, msg, null); 86 | } 87 | 88 | /** 89 | * 异常或失败 90 | * 91 | * @param code 92 | * @return 93 | */ 94 | public static String failed(int code) { 95 | return result(code, TYPE, M500, null); 96 | } 97 | 98 | /** 99 | * 异常或失败 100 | * 101 | * @param code 102 | * @param data 103 | * @return 104 | */ 105 | public static String failed(int code, String data) { 106 | return result(code, TYPE, M500, data); 107 | } 108 | 109 | /** 110 | * 异常或失败 111 | * 112 | * @param msg 113 | * @param data 114 | * @return 115 | */ 116 | public static String failed(String msg, String data) { 117 | return result(C500, TYPE, msg, data); 118 | } 119 | 120 | /** 121 | * 异常或失败 122 | * 123 | * @param code 124 | * @param msg 125 | * @param data 126 | * @return 127 | */ 128 | public static String failed(int code, String msg, String data) { 129 | return result(code, TYPE, msg, data); 130 | } 131 | 132 | /** 133 | * 响应信息 134 | * 135 | * @param code 136 | * @param type 137 | * @param state 138 | * @param msg 139 | * @param data 140 | * @return 141 | */ 142 | protected static String result(int code, int type, String msg, String data) { 143 | JSONObject result = new JSONObject(); 144 | result.put(KEY_CODE, code); 145 | result.put(KEY_TYPE, type); 146 | result.put(KEY_MSG, msg); 147 | result.put(KEY_DATA, data); 148 | return result.toString(); 149 | } 150 | } 151 | -------------------------------------------------------------------------------- /Server-UI/js/chunk-25904293.d8290f8f.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///./src/views/404.vue?0e5c","webpack:///./src/views/404.vue","webpack:///./src/views/404.vue?049e"],"names":["render","_vm","this","_h","$createElement","_c","_self","staticClass","_m","_v","attrs","on","$event","$router","back","staticStyle","staticRenderFns","script","component"],"mappings":"yHAAA,IAAIA,EAAS,WAAa,IAAIC,EAAIC,KAASC,EAAGF,EAAIG,eAAmBC,EAAGJ,EAAIK,MAAMD,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACE,YAAY,kBAAkB,CAACN,EAAIO,GAAG,GAAGH,EAAG,MAAM,CAACE,YAAY,OAAO,CAACF,EAAG,MAAM,CAACA,EAAG,IAAI,CAACE,YAAY,aAAa,CAACN,EAAIQ,GAAG,WAAWJ,EAAG,MAAM,CAACA,EAAG,YAAY,CAACK,MAAM,CAAC,KAAO,WAAWC,GAAG,CAAC,MAAQ,SAASC,GAAQ,OAAOX,EAAIY,QAAQC,MAAM,MAAM,CAACb,EAAIQ,GAAG,WAAWJ,EAAG,cAAc,CAACU,YAAY,CAAC,cAAc,UAAUL,MAAM,CAAC,GAAK,MAAM,CAACL,EAAG,YAAY,CAACK,MAAM,CAAC,KAAO,YAAY,CAACT,EAAIQ,GAAG,WAAW,IAAI,UACxfO,EAAkB,CAAC,WAAa,IAAIf,EAAIC,KAASC,EAAGF,EAAIG,eAAmBC,EAAGJ,EAAIK,MAAMD,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACE,YAAY,OAAO,CAACF,EAAG,MAAM,CAACE,YAAY,UAAUQ,YAAY,CAAC,MAAQ,WAAWL,MAAM,CAAC,GAAK,cAAc,CAACT,EAAIQ,GAAG,OAAOJ,EAAG,MAAM,CAACE,YAAY,UAAUQ,YAAY,CAAC,MAAQ,WAAWL,MAAM,CAAC,GAAK,cAAc,CAACT,EAAIQ,GAAG,OAAOJ,EAAG,MAAM,CAACE,YAAY,UAAUQ,YAAY,CAAC,MAAQ,WAAWL,MAAM,CAAC,GAAK,cAAc,CAACT,EAAIQ,GAAG,W,wBCAxbQ,EAAS,GAMTC,EAAY,eACdD,EACAjB,EACAgB,GACA,EACA,KACA,WACA,MAIa,aAAAE,E,6CClBf,yBAAie,EAAG,G","file":"js/chunk-25904293.d8290f8f.js","sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"p404-container\"},[_vm._m(0),_c('div',{staticClass:\"msg\"},[_c('div',[_c('p',{staticClass:\"msg-title\"},[_vm._v(\"内容不存在\")]),_c('div',[_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":function($event){return _vm.$router.back(-1)}}},[_vm._v(\"返回上一页\")]),_c('router-link',{staticStyle:{\"margin-left\":\"0.5rem\"},attrs:{\"to\":\"/\"}},[_c('el-button',{attrs:{\"type\":\"primary\"}},[_vm._v(\"返回首页\")])],1)],1)])])])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"img\"},[_c('div',{staticClass:\"img-404\",staticStyle:{\"color\":\"#f56c6c\"},attrs:{\"id\":\"img-404-1\"}},[_vm._v(\"4\")]),_c('div',{staticClass:\"img-404\",staticStyle:{\"color\":\"#36b455\"},attrs:{\"id\":\"img-404-2\"}},[_vm._v(\"0\")]),_c('div',{staticClass:\"img-404\",staticStyle:{\"color\":\"#409eff\"},attrs:{\"id\":\"img-404-3\"}},[_vm._v(\"4\")])])}]\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./404.vue?vue&type=template&id=381e4d4a&scoped=true&\"\nvar script = {}\nimport style0 from \"./404.vue?vue&type=style&index=0&id=381e4d4a&scoped=scoped&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"381e4d4a\",\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./404.vue?vue&type=style&index=0&id=381e4d4a&scoped=scoped&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/index.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./404.vue?vue&type=style&index=0&id=381e4d4a&scoped=scoped&lang=css&\""],"sourceRoot":""} -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/mapper/TagsMapper.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.mapper; 2 | 3 | import java.util.List; 4 | 5 | import org.apache.ibatis.annotations.Mapper; 6 | import org.apache.ibatis.annotations.Param; 7 | 8 | import org.mirrentools.orion.common.SqlAssist; 9 | import org.mirrentools.orion.common.SqlAssist.LimitResult; 10 | import org.mirrentools.orion.entity.Tags; 11 | 12 | /** 13 | * Tags数据库相关操作 14 | * @author 15 | */ 16 | @Mapper 17 | public interface TagsMapper { 18 | 19 | /** 20 | * 获取数据总行数 21 | * 22 | * @param assist 查询帮助类,没有时可以传入null 23 | * @return 24 | */ 25 | long getCount(SqlAssist assist); 26 | 27 | /** 28 | * 查询所有数据 29 | * 30 | * @param assist 查询帮助类,没有时可以传入null 31 | * @return 32 | */ 33 | List selectAll(SqlAssist assist); 34 | 35 | /** 36 | * 分页获取数据, 37 | * 38 | * @param assist 查询帮助类,默认page=1,rowSize=15 39 | * @return 40 | */ 41 | default LimitResult limitAll(SqlAssist assist) { 42 | if (assist == null) { 43 | assist = new SqlAssist(); 44 | } 45 | if (assist.getPage() == null || assist.getPage() < 1) { 46 | assist.setPage(1); 47 | } 48 | if (assist.getRowSize() == null || assist.getRowSize() < 1) { 49 | assist.setRowSize(15); 50 | } 51 | if (assist.getPage() == 1) { 52 | assist.setStartRow(0); 53 | } else { 54 | assist.setStartRow((assist.getPage() - 1) * assist.getRowSize()); 55 | } 56 | long count = getCount(assist); 57 | LimitResult result = new SqlAssist().new LimitResult(count, assist.getPage(), assist.getRowSize()); 58 | if (count == 0) { 59 | return result; 60 | } 61 | List data = selectAll(assist); 62 | result.setData(data); 63 | return result; 64 | } 65 | 66 | 67 | /** 68 | * 通过对象中不为空的属性为条件获取数据,只返回一条结果 69 | * 70 | * @param data 71 | * @return 72 | */ 73 | Tags selectSingleByObj(Tags data); 74 | 75 | /** 76 | * 通过对象中不为空的属性作为条件获取数据 77 | * 78 | * @param data 79 | * @return 80 | */ 81 | List selectByObj(Tags data); 82 | 83 | /** 84 | * 插入一个对象包括属性值为null的值 85 | * 86 | * @param data 87 | * @return 88 | */ 89 | int insertAll(Tags data); 90 | 91 | /** 92 | * 插入一个对象,只插入对象中值不为null的属性 93 | * 94 | * @param data 95 | * @return 96 | */ 97 | int insertNotNull(Tags data); 98 | 99 | /** 100 | * 批量添加全部所有字段 101 | * 102 | * @param data 103 | * @return 104 | */ 105 | int insertBatch(List data); 106 | 107 | /** 108 | * 插入一个对象,如果该对象不存在就新建如果该对象已经存在就更新 109 | * 110 | * @param data 111 | * @return 112 | */ 113 | int replace(Tags data); 114 | 115 | 116 | /** 117 | * 通过查询帮助类删除数据 118 | * 119 | * @param assist 查询帮助类,没有时可以传入null 120 | * @return 121 | */ 122 | int deleteByAssist(SqlAssist assist); 123 | 124 | 125 | /** 126 | * 更新一个对象中所有的属性包括null值,条件为SqlAssist查询帮助类 127 | * 128 | * @param data 对象 129 | * @param assist 查询帮助类 130 | * @return 131 | */ 132 | int updateAllByAssist(@Param("data") Tags data, @Param("assist") SqlAssist assist); 133 | 134 | /** 135 | * 更新一个对象中属性不为null值,条件为SqlAssist查询帮助类 136 | * 137 | * @param data 对象 138 | * @param assist 查询帮助类 139 | * @return 140 | */ 141 | int updateNotNullByAssist(@Param("data") Tags data, @Param("assist") SqlAssist assist); 142 | /** 143 | * 通过id获取数据 144 | * 145 | * @param id 146 | * @return 147 | */ 148 | Tags selectById(String id); 149 | /** 150 | * 通过id删除数据 151 | * 152 | * @param id 153 | * @return 154 | */ 155 | int deleteById(String id); 156 | /** 157 | * 更新一个对象中所有的属性包括null值,条件为对象中的id 158 | * 159 | * @param data 160 | * @return 161 | */ 162 | int updateAllById(Tags data); 163 | 164 | /** 165 | * 更新一个对象中属性不为null值,条件为对象中的id 166 | * 167 | * @param data 168 | * @return 169 | */ 170 | int updateNotNullById(Tags data); 171 | } 172 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/mapper/UsersMapper.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.mapper; 2 | 3 | import java.util.List; 4 | 5 | import org.apache.ibatis.annotations.Mapper; 6 | import org.apache.ibatis.annotations.Param; 7 | 8 | import org.mirrentools.orion.common.SqlAssist; 9 | import org.mirrentools.orion.common.SqlAssist.LimitResult; 10 | import org.mirrentools.orion.entity.Users; 11 | 12 | /** 13 | * Users数据库相关操作 14 | * @author 15 | */ 16 | @Mapper 17 | public interface UsersMapper { 18 | 19 | /** 20 | * 获取数据总行数 21 | * 22 | * @param assist 查询帮助类,没有时可以传入null 23 | * @return 24 | */ 25 | long getCount(SqlAssist assist); 26 | 27 | /** 28 | * 查询所有数据 29 | * 30 | * @param assist 查询帮助类,没有时可以传入null 31 | * @return 32 | */ 33 | List selectAll(SqlAssist assist); 34 | 35 | /** 36 | * 分页获取数据, 37 | * 38 | * @param assist 查询帮助类,默认page=1,rowSize=15 39 | * @return 40 | */ 41 | default LimitResult limitAll(SqlAssist assist) { 42 | if (assist == null) { 43 | assist = new SqlAssist(); 44 | } 45 | if (assist.getPage() == null || assist.getPage() < 1) { 46 | assist.setPage(1); 47 | } 48 | if (assist.getRowSize() == null || assist.getRowSize() < 1) { 49 | assist.setRowSize(15); 50 | } 51 | if (assist.getPage() == 1) { 52 | assist.setStartRow(0); 53 | } else { 54 | assist.setStartRow((assist.getPage() - 1) * assist.getRowSize()); 55 | } 56 | long count = getCount(assist); 57 | LimitResult result = new SqlAssist().new LimitResult(count, assist.getPage(), assist.getRowSize()); 58 | if (count == 0) { 59 | return result; 60 | } 61 | List data = selectAll(assist); 62 | result.setData(data); 63 | return result; 64 | } 65 | 66 | 67 | /** 68 | * 通过对象中不为空的属性为条件获取数据,只返回一条结果 69 | * 70 | * @param data 71 | * @return 72 | */ 73 | Users selectSingleByObj(Users data); 74 | 75 | /** 76 | * 通过对象中不为空的属性作为条件获取数据 77 | * 78 | * @param data 79 | * @return 80 | */ 81 | List selectByObj(Users data); 82 | 83 | /** 84 | * 插入一个对象包括属性值为null的值 85 | * 86 | * @param data 87 | * @return 88 | */ 89 | int insertAll(Users data); 90 | 91 | /** 92 | * 插入一个对象,只插入对象中值不为null的属性 93 | * 94 | * @param data 95 | * @return 96 | */ 97 | int insertNotNull(Users data); 98 | 99 | /** 100 | * 批量添加全部所有字段 101 | * 102 | * @param data 103 | * @return 104 | */ 105 | int insertBatch(List data); 106 | 107 | /** 108 | * 插入一个对象,如果该对象不存在就新建如果该对象已经存在就更新 109 | * 110 | * @param data 111 | * @return 112 | */ 113 | int replace(Users data); 114 | 115 | 116 | /** 117 | * 通过查询帮助类删除数据 118 | * 119 | * @param assist 查询帮助类,没有时可以传入null 120 | * @return 121 | */ 122 | int deleteByAssist(SqlAssist assist); 123 | 124 | 125 | /** 126 | * 更新一个对象中所有的属性包括null值,条件为SqlAssist查询帮助类 127 | * 128 | * @param data 对象 129 | * @param assist 查询帮助类 130 | * @return 131 | */ 132 | int updateAllByAssist(@Param("data") Users data, @Param("assist") SqlAssist assist); 133 | 134 | /** 135 | * 更新一个对象中属性不为null值,条件为SqlAssist查询帮助类 136 | * 137 | * @param data 对象 138 | * @param assist 查询帮助类 139 | * @return 140 | */ 141 | int updateNotNullByAssist(@Param("data") Users data, @Param("assist") SqlAssist assist); 142 | /** 143 | * 通过id获取数据 144 | * 145 | * @param id 146 | * @return 147 | */ 148 | Users selectById(String id); 149 | /** 150 | * 通过id删除数据 151 | * 152 | * @param id 153 | * @return 154 | */ 155 | int deleteById(String id); 156 | /** 157 | * 更新一个对象中所有的属性包括null值,条件为对象中的id 158 | * 159 | * @param data 160 | * @return 161 | */ 162 | int updateAllById(Users data); 163 | 164 | /** 165 | * 更新一个对象中属性不为null值,条件为对象中的id 166 | * 167 | * @param data 168 | * @return 169 | */ 170 | int updateNotNullById(Users data); 171 | } 172 | -------------------------------------------------------------------------------- /Server-UI/css/chunk-6951fa7a.11a1d5e3.css: -------------------------------------------------------------------------------- 1 | a[data-v-7fcad5ce]{text-decoration:none;color:#304455}img[data-v-7fcad5ce]{border:none}.body-max-width[data-v-7fcad5ce]{max-width:1240px}.xs-left-sm-rigth[data-v-7fcad5ce]{text-align:right}.mb10px[data-v-7fcad5ce]{margin-bottom:10px}.prem05[data-v-7fcad5ce]{padding:.5rem}.plrrem05[data-v-7fcad5ce]{padding:0 .5rem}.background-color-white[data-v-7fcad5ce]{background-color:#fff}.flexCenter[data-v-7fcad5ce]{display:flex;align-items:center}.api-body[data-v-7fcad5ce]{border:1px solid #3b4151;background-color:#f5f7fa;margin-bottom:50px}.api-body .api-header[data-v-7fcad5ce]{background-color:#3b4151;font-size:1.25rem;color:#fff;padding:.3125rem .625rem}.api-body-get[data-v-7fcad5ce]{background-color:#ebf3fb;border:1px solid #61affe}.api-body .api-header-get[data-v-7fcad5ce]{background-color:#61affe}.api-body-post[data-v-7fcad5ce]{background-color:#e8f6f0;border:1px solid #49cc90}.api-body .api-header-post[data-v-7fcad5ce]{background-color:#49cc90}.api-body-put[data-v-7fcad5ce]{background-color:#fbf1e6;border:1px solid #fca130}.api-body .api-header-put[data-v-7fcad5ce]{background-color:#fca130}.api-body-delete[data-v-7fcad5ce]{background-color:#fae7e7;border:1px solid #f93e3e}.api-body .api-header-delete[data-v-7fcad5ce]{background-color:#f93e3e}.api-body-head[data-v-7fcad5ce]{background-color:#f4e7ff;border:1px solid #9012fe}.api-body .api-header-head[data-v-7fcad5ce]{background-color:#9012fe}.api-body-options[data-v-7fcad5ce]{background-color:#e6eef6;border:1px solid #0d5aa7}.api-body .api-header-options[data-v-7fcad5ce]{background-color:#0d5aa7}.api-body-patch[data-v-7fcad5ce]{background-color:#edfcf9;border:1px solid #50e3c2}.api-body .api-header-patch[data-v-7fcad5ce]{background-color:#50e3c2}.api-body-trace[data-v-7fcad5ce]{background-color:#ffe9e6;border:1px solid #ffa8be}.api-body .api-header-trace[data-v-7fcad5ce]{background-color:#ffa8be}.api-body-connect[data-v-7fcad5ce]{background-color:#e6f6f1;border:1px solid #83bb83}.api-body .api-header-connect[data-v-7fcad5ce]{background-color:#83bb83}.api-body .api-header .api-header-item[data-v-7fcad5ce]{line-height:2.5rem}.api-body .api-body-param-header[data-v-7fcad5ce],.api-body .api-body-response-header[data-v-7fcad5ce],.api-body .api-body-result-header[data-v-7fcad5ce]{padding:.5rem;display:flex;flex-wrap:wrap;align-items:first baseline;justify-content:space-between}.api-body .api-body-response-body[data-v-7fcad5ce]{color:#fff;background-color:#18181a;padding:0 .5rem .5rem .5rem;display:flex}.api-body .api-body-response-body .el-tabs__item[data-v-7fcad5ce]{color:#fff}.api-body .api-body-response-body .el-tabs__item.is-active[data-v-7fcad5ce]{color:#409eff}.api-body .api-body-response-body .el-divider__text[data-v-7fcad5ce]{background-color:#18181a;color:#409eff}.api-body .api-body-response-body .jv-container[data-v-7fcad5ce]{background-color:#18181a}.api-body .api-body-response-body .jv-container.jv-light .jv-item.jv-array[data-v-7fcad5ce],.api-body .api-body-response-body .jv-container.jv-light .jv-item.jv-object[data-v-7fcad5ce],.api-body .api-body-response-body .jv-container.jv-light[data-v-7fcad5ce]{color:#fff}.api-body .api-body-response-body .jv-container.jv-light .jv-item.jv-string[data-v-7fcad5ce]{color:#ff7de9}.api-body .api-body-response-body .jv-container.jv-light .jv-item.jv-boolean[data-v-7fcad5ce]{color:gold}.api-body .api-body-response-body .jv-container.jv-light .jv-key[data-v-7fcad5ce]{color:#409eff}.alink[data-v-7fcad5ce]{background-color:transparent;color:#409eff;text-decoration:none;outline:none;display:inline-block;margin:3px 5px}.alink[data-v-7fcad5ce]:active,.alink[data-v-7fcad5ce]:hover{outline-width:0;opacity:.8}.group-items[data-v-7fcad5ce]{margin-top:5px;padding:0;list-style-type:none}.group-items li[data-v-7fcad5ce]{display:flex;align-items:center;padding:5px 0 3px 5px;border-left:3px solid transparent;cursor:pointer}.group-items li .group-item[data-v-7fcad5ce]{padding-bottom:2px;border-bottom:2px solid transparent}.group-items li:hover .group-item[data-v-7fcad5ce]{color:#409eff;border-bottom:2px solid #409eff}.group-items .current[data-v-7fcad5ce]{color:#409eff;border-left:3px solid #409eff}.td-item[data-v-7fcad5ce]{text-align:right;padding-right:5px} -------------------------------------------------------------------------------- /Server-UI/css/chunk-b62889f0.0fcd1e95.css: -------------------------------------------------------------------------------- 1 | a[data-v-20c7d437]{text-decoration:none;color:#304455}img[data-v-20c7d437]{border:none}.body-max-width[data-v-20c7d437]{max-width:1240px}.xs-left-sm-rigth[data-v-20c7d437]{text-align:right}.mb10px[data-v-20c7d437]{margin-bottom:10px}.prem05[data-v-20c7d437]{padding:.5rem}.plrrem05[data-v-20c7d437]{padding:0 .5rem}.background-color-white[data-v-20c7d437]{background-color:#fff}.flexCenter[data-v-20c7d437]{display:flex;align-items:center}.api-body[data-v-20c7d437]{border:1px solid #3b4151;background-color:#f5f7fa;margin-bottom:50px}.api-body .api-header[data-v-20c7d437]{background-color:#3b4151;font-size:1.25rem;color:#fff;padding:.3125rem .625rem}.api-body-get[data-v-20c7d437]{background-color:#ebf3fb;border:1px solid #61affe}.api-body .api-header-get[data-v-20c7d437]{background-color:#61affe}.api-body-post[data-v-20c7d437]{background-color:#e8f6f0;border:1px solid #49cc90}.api-body .api-header-post[data-v-20c7d437]{background-color:#49cc90}.api-body-put[data-v-20c7d437]{background-color:#fbf1e6;border:1px solid #fca130}.api-body .api-header-put[data-v-20c7d437]{background-color:#fca130}.api-body-delete[data-v-20c7d437]{background-color:#fae7e7;border:1px solid #f93e3e}.api-body .api-header-delete[data-v-20c7d437]{background-color:#f93e3e}.api-body-head[data-v-20c7d437]{background-color:#f4e7ff;border:1px solid #9012fe}.api-body .api-header-head[data-v-20c7d437]{background-color:#9012fe}.api-body-options[data-v-20c7d437]{background-color:#e6eef6;border:1px solid #0d5aa7}.api-body .api-header-options[data-v-20c7d437]{background-color:#0d5aa7}.api-body-patch[data-v-20c7d437]{background-color:#edfcf9;border:1px solid #50e3c2}.api-body .api-header-patch[data-v-20c7d437]{background-color:#50e3c2}.api-body-trace[data-v-20c7d437]{background-color:#ffe9e6;border:1px solid #ffa8be}.api-body .api-header-trace[data-v-20c7d437]{background-color:#ffa8be}.api-body-connect[data-v-20c7d437]{background-color:#e6f6f1;border:1px solid #83bb83}.api-body .api-header-connect[data-v-20c7d437]{background-color:#83bb83}.api-body .api-header .api-header-item[data-v-20c7d437]{line-height:2.5rem}.api-body .api-body-param-header[data-v-20c7d437],.api-body .api-body-response-header[data-v-20c7d437],.api-body .api-body-result-header[data-v-20c7d437]{padding:.5rem;display:flex;flex-wrap:wrap;align-items:first baseline;justify-content:space-between}.api-body .api-body-response-body[data-v-20c7d437]{color:#fff;background-color:#18181a;padding:0 .5rem .5rem .5rem;display:flex}.api-body .api-body-response-body .el-tabs__item[data-v-20c7d437]{color:#fff}.api-body .api-body-response-body .el-tabs__item.is-active[data-v-20c7d437]{color:#409eff}.api-body .api-body-response-body .el-divider__text[data-v-20c7d437]{background-color:#18181a;color:#409eff}.api-body .api-body-response-body .jv-container[data-v-20c7d437]{background-color:#18181a}.api-body .api-body-response-body .jv-container.jv-light .jv-item.jv-array[data-v-20c7d437],.api-body .api-body-response-body .jv-container.jv-light .jv-item.jv-object[data-v-20c7d437],.api-body .api-body-response-body .jv-container.jv-light[data-v-20c7d437]{color:#fff}.api-body .api-body-response-body .jv-container.jv-light .jv-item.jv-string[data-v-20c7d437]{color:#ff7de9}.api-body .api-body-response-body .jv-container.jv-light .jv-item.jv-boolean[data-v-20c7d437]{color:gold}.api-body .api-body-response-body .jv-container.jv-light .jv-key[data-v-20c7d437]{color:#409eff}.alink[data-v-20c7d437]{background-color:transparent;color:#409eff;text-decoration:none;outline:none;display:inline-block;margin:3px 5px}.alink[data-v-20c7d437]:active,.alink[data-v-20c7d437]:hover{outline-width:0;opacity:.8}.group-items[data-v-20c7d437]{margin-top:5px;padding:0;list-style-type:none}.group-items li[data-v-20c7d437]{display:flex;align-items:center;padding:5px 0 3px 5px;border-left:3px solid transparent;cursor:pointer}.group-items li .group-item[data-v-20c7d437]{padding-bottom:2px;border-bottom:2px solid transparent}.group-items li:hover .group-item[data-v-20c7d437]{color:#409eff;border-bottom:2px solid #409eff}.group-items .current[data-v-20c7d437]{color:#409eff;border-left:3px solid #409eff}.td-item[data-v-20c7d437]{text-align:right;padding-right:5px} -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/entity/ProjectApiGroup.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.entity; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * 接口分组的实体类 7 | * 8 | * @author Mirren 9 | * 10 | */ 11 | public class ProjectApiGroup { 12 | /** 分组的id */ 13 | private String groupId; 14 | /** 项目的id */ 15 | private String projectId; 16 | /** 分组的名字 */ 17 | private String name; 18 | /** 分组的简单描述 */ 19 | private String summary; 20 | /** 分组的详细描述(支持HTML) */ 21 | private String description; 22 | /** 23 | * 分组的拓展文档(JsonObject): 24 | * description(String):附加文档说明 25 | * url(String): 附加文档路径 26 | */ 27 | private String externalDocs; 28 | /** 分组的拓展属性String|String(JsonArray)|String(JsonObject) */ 29 | private String extensions; 30 | /** 分组的排序 */ 31 | private Integer sorts; 32 | /** 该分组下的所有接口 */ 33 | private List apis; 34 | 35 | /** 36 | * 实例化 37 | */ 38 | public ProjectApiGroup() { 39 | super(); 40 | } 41 | 42 | /** 43 | * 获取groupId 44 | * 45 | * @return 46 | */ 47 | public String getGroupId() { 48 | return groupId; 49 | } 50 | 51 | /** 52 | * 设置groupId 53 | * 54 | * @param groupId 55 | */ 56 | public void setGroupId(String groupId) { 57 | this.groupId = groupId; 58 | } 59 | 60 | /** 61 | * 获取projectId 62 | * 63 | * @return 64 | */ 65 | public String getProjectId() { 66 | return projectId; 67 | } 68 | 69 | /** 70 | * 设置projectId 71 | * 72 | * @param projectId 73 | */ 74 | public void setProjectId(String projectId) { 75 | this.projectId = projectId; 76 | } 77 | 78 | /** 79 | * 获取name 80 | * 81 | * @return 82 | */ 83 | public String getName() { 84 | return name; 85 | } 86 | 87 | /** 88 | * 设置name 89 | * 90 | * @param name 91 | */ 92 | public void setName(String name) { 93 | this.name = name; 94 | } 95 | 96 | /** 97 | * 获取summary 98 | * 99 | * @return 100 | */ 101 | public String getSummary() { 102 | return summary; 103 | } 104 | 105 | /** 106 | * 设置summary 107 | * 108 | * @param summary 109 | */ 110 | public void setSummary(String summary) { 111 | this.summary = summary; 112 | } 113 | 114 | /** 115 | * 获取description 116 | * 117 | * @return 118 | */ 119 | public String getDescription() { 120 | return description; 121 | } 122 | 123 | /** 124 | * 设置description 125 | * 126 | * @param description 127 | */ 128 | public void setDescription(String description) { 129 | this.description = description; 130 | } 131 | 132 | /** 133 | * 获取externalDocs 134 | * 135 | * @return 136 | */ 137 | public String getExternalDocs() { 138 | return externalDocs; 139 | } 140 | 141 | /** 142 | * 设置externalDocs 143 | * 144 | * @param externalDocs 145 | */ 146 | public void setExternalDocs(String externalDocs) { 147 | this.externalDocs = externalDocs; 148 | } 149 | 150 | /** 151 | * 获取extensions 152 | * 153 | * @return 154 | */ 155 | public String getExtensions() { 156 | return extensions; 157 | } 158 | 159 | /** 160 | * 设置extensions 161 | * 162 | * @param extensions 163 | */ 164 | public void setExtensions(String extensions) { 165 | this.extensions = extensions; 166 | } 167 | 168 | public Integer getSorts() { 169 | return sorts; 170 | } 171 | 172 | public void setSorts(Integer sorts) { 173 | this.sorts = sorts; 174 | } 175 | 176 | public List getApis() { 177 | return apis; 178 | } 179 | 180 | public void setApis(List apis) { 181 | this.apis = apis; 182 | } 183 | 184 | @Override 185 | public String toString() { 186 | return "ProjectApiGroup [groupId=" + groupId + ", projectId=" + projectId + ", name=" + name + ", summary=" 187 | + summary + ", description=" + description + ", externalDocs=" + externalDocs + ", extensions=" + extensions 188 | + ", sorts=" + sorts + ", apis=" + apis + "]"; 189 | } 190 | 191 | } 192 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/controller/ImportWebSocketServer.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.controller; 2 | 3 | import java.io.IOException; 4 | import java.util.Map; 5 | import java.util.concurrent.ConcurrentHashMap; 6 | 7 | import javax.websocket.OnClose; 8 | import javax.websocket.OnError; 9 | import javax.websocket.OnMessage; 10 | import javax.websocket.OnOpen; 11 | import javax.websocket.Session; 12 | import javax.websocket.server.PathParam; 13 | import javax.websocket.server.ServerEndpoint; 14 | 15 | import org.apache.logging.log4j.LogManager; 16 | import org.apache.logging.log4j.Logger; 17 | import org.json.JSONObject; 18 | import org.mirrentools.orion.common.LoginRole; 19 | import org.mirrentools.orion.common.LoginSession; 20 | import org.mirrentools.orion.common.LoginSessionStore; 21 | import org.mirrentools.orion.common.WebSocket; 22 | import org.mirrentools.orion.service.ProjectService; 23 | import org.springframework.context.ApplicationContext; 24 | import org.springframework.stereotype.Component; 25 | 26 | /** 27 | * 用于导入API的WebSocket 28 | * 29 | * @author Mirren 30 | * 31 | */ 32 | @ServerEndpoint("/private/server/ws/project/fromJson/{sessionId}") 33 | @Component 34 | public class ImportWebSocketServer { 35 | private static final Logger LOG = LogManager.getLogger(ImportWebSocketServer.class); 36 | /** Spring的上下文 */ 37 | private static ApplicationContext applicationContext; 38 | /** 项目服务接口 */ 39 | private ProjectService proService; 40 | /** 41 | * 存放所有在线的客户端 42 | */ 43 | private static Map clients = new ConcurrentHashMap<>(); 44 | 45 | public static void setApplicationContext(ApplicationContext applicationContext) { 46 | ImportWebSocketServer.applicationContext = applicationContext; 47 | } 48 | 49 | @OnOpen 50 | public void onOpen(Session session, @PathParam(value = "sessionId") String sessionId) { 51 | LoginSession login = LoginSessionStore.get(sessionId); 52 | if (login == null || login.getUid() == null || LoginRole.CLIENT == login.getRole()) { 53 | session.getAsyncRemote().sendText(WebSocket.failed401()); 54 | try { 55 | session.close(); 56 | } catch (IOException e) { 57 | LOG.error("执行打开Websocket->关闭会话-->失败:", e); 58 | } 59 | return; 60 | } 61 | this.proService = applicationContext.getBean(ProjectService.class); 62 | session.setMaxTextMessageBufferSize(10 * 1024 * 1024); 63 | clients.put(sessionId, session); 64 | } 65 | 66 | /** 67 | * 客户端关闭 68 | * 69 | * @param session session 70 | */ 71 | @OnClose 72 | public void onClose(Session session, @PathParam(value = "sessionId") String sessionId) { 73 | clients.remove(sessionId); 74 | } 75 | 76 | /** 77 | * 发生错误 78 | * 79 | * @param throwable e 80 | */ 81 | @OnError 82 | public void onError(Throwable throwable, @PathParam(value = "sessionId") String sessionId) { 83 | Session session = clients.get(sessionId); 84 | try { 85 | session.close(); 86 | } catch (IOException e) { 87 | LOG.error("执行Websocket发生异常->关闭会话-->失败:", e); 88 | } 89 | LOG.error("执行Websocket发生异常:", throwable); 90 | } 91 | 92 | /** 93 | * 收到客户端发来消息 94 | * 95 | * @param message 消息对象 96 | */ 97 | @OnMessage 98 | public void onMessage(String message, @PathParam(value = "sessionId") String sessionId) { 99 | LoginSession login = LoginSessionStore.get(sessionId); 100 | Session session = clients.get(sessionId); 101 | if (session == null) { 102 | return; 103 | } 104 | JSONObject msg = new JSONObject(message); 105 | if (msg.getInt("type") != WebSocket.TYPE) { 106 | session.getAsyncRemote().sendText(WebSocket.failed(WebSocket.UNRECOGNIZED)); 107 | try { 108 | session.close(); 109 | } catch (IOException e) { 110 | } 111 | return; 112 | } 113 | proService.saveProjectfromJsonWebSocket(login, msg.getString("data"), session); 114 | try { 115 | session.close(); 116 | } catch (IOException e) { 117 | LOG.error("执行Websocket消息事件->关闭会话-->失败:", e); 118 | } 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/mapper/ProjectShareMapper.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.mapper; 2 | 3 | import java.util.List; 4 | 5 | import org.apache.ibatis.annotations.Mapper; 6 | import org.apache.ibatis.annotations.Param; 7 | 8 | import org.mirrentools.orion.common.SqlAssist; 9 | import org.mirrentools.orion.common.SqlAssist.LimitResult; 10 | import org.mirrentools.orion.entity.ProjectShare; 11 | 12 | /** 13 | * ProjectShare数据库相关操作 14 | * @author 15 | */ 16 | @Mapper 17 | public interface ProjectShareMapper { 18 | 19 | /** 20 | * 获取数据总行数 21 | * 22 | * @param assist 查询帮助类,没有时可以传入null 23 | * @return 24 | */ 25 | long getCount(SqlAssist assist); 26 | 27 | /** 28 | * 查询所有数据 29 | * 30 | * @param assist 查询帮助类,没有时可以传入null 31 | * @return 32 | */ 33 | List selectAll(SqlAssist assist); 34 | 35 | /** 36 | * 分页获取数据, 37 | * 38 | * @param assist 查询帮助类,默认page=1,rowSize=15 39 | * @return 40 | */ 41 | default LimitResult limitAll(SqlAssist assist) { 42 | if (assist == null) { 43 | assist = new SqlAssist(); 44 | } 45 | if (assist.getPage() == null || assist.getPage() < 1) { 46 | assist.setPage(1); 47 | } 48 | if (assist.getRowSize() == null || assist.getRowSize() < 1) { 49 | assist.setRowSize(15); 50 | } 51 | if (assist.getPage() == 1) { 52 | assist.setStartRow(0); 53 | } else { 54 | assist.setStartRow((assist.getPage() - 1) * assist.getRowSize()); 55 | } 56 | long count = getCount(assist); 57 | LimitResult result = new SqlAssist().new LimitResult(count, assist.getPage(), assist.getRowSize()); 58 | if (count == 0) { 59 | return result; 60 | } 61 | List data = selectAll(assist); 62 | result.setData(data); 63 | return result; 64 | } 65 | 66 | 67 | /** 68 | * 通过对象中不为空的属性为条件获取数据,只返回一条结果 69 | * 70 | * @param data 71 | * @return 72 | */ 73 | ProjectShare selectSingleByObj(ProjectShare data); 74 | 75 | /** 76 | * 通过对象中不为空的属性作为条件获取数据 77 | * 78 | * @param data 79 | * @return 80 | */ 81 | List selectByObj(ProjectShare data); 82 | 83 | /** 84 | * 插入一个对象包括属性值为null的值 85 | * 86 | * @param data 87 | * @return 88 | */ 89 | int insertAll(ProjectShare data); 90 | 91 | /** 92 | * 插入一个对象,只插入对象中值不为null的属性 93 | * 94 | * @param data 95 | * @return 96 | */ 97 | int insertNotNull(ProjectShare data); 98 | 99 | /** 100 | * 批量添加全部所有字段 101 | * 102 | * @param data 103 | * @return 104 | */ 105 | int insertBatch(List data); 106 | 107 | /** 108 | * 插入一个对象,如果该对象不存在就新建如果该对象已经存在就更新 109 | * 110 | * @param data 111 | * @return 112 | */ 113 | int replace(ProjectShare data); 114 | 115 | 116 | /** 117 | * 通过查询帮助类删除数据 118 | * 119 | * @param assist 查询帮助类,没有时可以传入null 120 | * @return 121 | */ 122 | int deleteByAssist(SqlAssist assist); 123 | 124 | 125 | /** 126 | * 更新一个对象中所有的属性包括null值,条件为SqlAssist查询帮助类 127 | * 128 | * @param data 对象 129 | * @param assist 查询帮助类 130 | * @return 131 | */ 132 | int updateAllByAssist(@Param("data") ProjectShare data, @Param("assist") SqlAssist assist); 133 | 134 | /** 135 | * 更新一个对象中属性不为null值,条件为SqlAssist查询帮助类 136 | * 137 | * @param data 对象 138 | * @param assist 查询帮助类 139 | * @return 140 | */ 141 | int updateNotNullByAssist(@Param("data") ProjectShare data, @Param("assist") SqlAssist assist); 142 | /** 143 | * 通过id获取数据 144 | * 145 | * @param id 146 | * @return 147 | */ 148 | ProjectShare selectById(String id); 149 | /** 150 | * 通过id删除数据 151 | * 152 | * @param id 153 | * @return 154 | */ 155 | int deleteById(String id); 156 | /** 157 | * 更新一个对象中所有的属性包括null值,条件为对象中的id 158 | * 159 | * @param data 160 | * @return 161 | */ 162 | int updateAllById(ProjectShare data); 163 | 164 | /** 165 | * 更新一个对象中属性不为null值,条件为对象中的id 166 | * 167 | * @param data 168 | * @return 169 | */ 170 | int updateNotNullById(ProjectShare data); 171 | } 172 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/mapper/ProjectApiTemplateMapper.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.mapper; 2 | 3 | import java.util.List; 4 | 5 | import org.apache.ibatis.annotations.Mapper; 6 | import org.apache.ibatis.annotations.Param; 7 | 8 | import org.mirrentools.orion.common.SqlAssist; 9 | import org.mirrentools.orion.common.SqlAssist.LimitResult; 10 | import org.mirrentools.orion.entity.ProjectApiTemplate; 11 | 12 | /** 13 | * ProjectApiTemplate数据库相关操作 14 | * @author 15 | */ 16 | @Mapper 17 | public interface ProjectApiTemplateMapper { 18 | 19 | /** 20 | * 获取数据总行数 21 | * 22 | * @param assist 查询帮助类,没有时可以传入null 23 | * @return 24 | */ 25 | long getCount(SqlAssist assist); 26 | 27 | /** 28 | * 查询所有数据 29 | * 30 | * @param assist 查询帮助类,没有时可以传入null 31 | * @return 32 | */ 33 | List selectAll(SqlAssist assist); 34 | 35 | /** 36 | * 分页获取数据, 37 | * 38 | * @param assist 查询帮助类,默认page=1,rowSize=15 39 | * @return 40 | */ 41 | default LimitResult limitAll(SqlAssist assist) { 42 | if (assist == null) { 43 | assist = new SqlAssist(); 44 | } 45 | if (assist.getPage() == null || assist.getPage() < 1) { 46 | assist.setPage(1); 47 | } 48 | if (assist.getRowSize() == null || assist.getRowSize() < 1) { 49 | assist.setRowSize(15); 50 | } 51 | if (assist.getPage() == 1) { 52 | assist.setStartRow(0); 53 | } else { 54 | assist.setStartRow((assist.getPage() - 1) * assist.getRowSize()); 55 | } 56 | long count = getCount(assist); 57 | LimitResult result = new SqlAssist().new LimitResult(count, assist.getPage(), assist.getRowSize()); 58 | if (count == 0) { 59 | return result; 60 | } 61 | List data = selectAll(assist); 62 | result.setData(data); 63 | return result; 64 | } 65 | 66 | 67 | /** 68 | * 通过对象中不为空的属性为条件获取数据,只返回一条结果 69 | * 70 | * @param data 71 | * @return 72 | */ 73 | ProjectApiTemplate selectSingleByObj(ProjectApiTemplate data); 74 | 75 | /** 76 | * 通过对象中不为空的属性作为条件获取数据 77 | * 78 | * @param data 79 | * @return 80 | */ 81 | List selectByObj(ProjectApiTemplate data); 82 | 83 | /** 84 | * 插入一个对象包括属性值为null的值 85 | * 86 | * @param data 87 | * @return 88 | */ 89 | int insertAll(ProjectApiTemplate data); 90 | 91 | /** 92 | * 插入一个对象,只插入对象中值不为null的属性 93 | * 94 | * @param data 95 | * @return 96 | */ 97 | int insertNotNull(ProjectApiTemplate data); 98 | 99 | /** 100 | * 批量添加全部所有字段 101 | * 102 | * @param data 103 | * @return 104 | */ 105 | int insertBatch(List data); 106 | 107 | /** 108 | * 插入一个对象,如果该对象不存在就新建如果该对象已经存在就更新 109 | * 110 | * @param data 111 | * @return 112 | */ 113 | int replace(ProjectApiTemplate data); 114 | 115 | 116 | /** 117 | * 通过查询帮助类删除数据 118 | * 119 | * @param assist 查询帮助类,没有时可以传入null 120 | * @return 121 | */ 122 | int deleteByAssist(SqlAssist assist); 123 | 124 | 125 | /** 126 | * 更新一个对象中所有的属性包括null值,条件为SqlAssist查询帮助类 127 | * 128 | * @param data 对象 129 | * @param assist 查询帮助类 130 | * @return 131 | */ 132 | int updateAllByAssist(@Param("data") ProjectApiTemplate data, @Param("assist") SqlAssist assist); 133 | 134 | /** 135 | * 更新一个对象中属性不为null值,条件为SqlAssist查询帮助类 136 | * 137 | * @param data 对象 138 | * @param assist 查询帮助类 139 | * @return 140 | */ 141 | int updateNotNullByAssist(@Param("data") ProjectApiTemplate data, @Param("assist") SqlAssist assist); 142 | /** 143 | * 通过id获取数据 144 | * 145 | * @param id 146 | * @return 147 | */ 148 | ProjectApiTemplate selectById(String id); 149 | /** 150 | * 通过id删除数据 151 | * 152 | * @param id 153 | * @return 154 | */ 155 | int deleteById(String id); 156 | /** 157 | * 更新一个对象中所有的属性包括null值,条件为对象中的id 158 | * 159 | * @param data 160 | * @return 161 | */ 162 | int updateAllById(ProjectApiTemplate data); 163 | 164 | /** 165 | * 更新一个对象中属性不为null值,条件为对象中的id 166 | * 167 | * @param data 168 | * @return 169 | */ 170 | int updateNotNullById(ProjectApiTemplate data); 171 | } 172 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/common/MD5Util.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.common; 2 | 3 | import java.security.MessageDigest; 4 | /** 5 | * MD5工具 6 | * 7 | * @author Mirren 8 | * 9 | */ 10 | public class MD5Util { 11 | /** 小写十六进制 */ 12 | private static final char[] DIGITS_LOWER = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; 13 | /** 大写十六进制 */ 14 | private static final char[] DIGITS_UPPER = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; 15 | 16 | /** 17 | * 将字符串编码为小写MD5 18 | * 19 | * @param value 20 | * 字符串 21 | * @return 22 | */ 23 | public static String encode(String value) { 24 | try { 25 | MessageDigest md = MessageDigest.getInstance("MD5"); 26 | byte[] digest = md.digest(value.getBytes()); 27 | return new String(encodeHex(digest, DIGITS_LOWER)); 28 | } catch (Exception e) { 29 | e.printStackTrace(); 30 | return null; 31 | } 32 | } 33 | 34 | /** 35 | * 将字符串编码为大写字的MD5 36 | * 37 | * @param value 38 | * @return 39 | */ 40 | public static String encodeUpperCase(String value) { 41 | try { 42 | MessageDigest md = MessageDigest.getInstance("MD5"); 43 | byte[] digest = md.digest(value.getBytes()); 44 | return new String(encodeHex(digest, DIGITS_UPPER)); 45 | } catch (Exception e) { 46 | e.printStackTrace(); 47 | return null; 48 | } 49 | } 50 | /** 51 | * 将字符串按次数编码为小写MD5 52 | * 53 | * @param value 54 | * 字符串 55 | * @param count 56 | * 次数 57 | * @return 58 | */ 59 | public static String encode(String value, int count) { 60 | String result = encode(value); 61 | for (int i = 1; i < count; i++) { 62 | result = encode(result); 63 | } 64 | return result; 65 | } 66 | /** 67 | * 将字符串按次数编码为大写MD5 68 | * 69 | * @param value 70 | * 字符串 71 | * @param count 72 | * 次数 73 | * @return 74 | */ 75 | public static String encodeUpperCase(String value, int count) { 76 | String result = encode(value); 77 | for (int i = 1; i < count; i++) { 78 | result = encodeUpperCase(result); 79 | } 80 | return result; 81 | } 82 | 83 | /** 84 | * 对比小写MD5字符串是否相等 85 | * 86 | * @param str 87 | * 字符串 88 | * @param md5Code 89 | * MD5码 90 | * @return 91 | */ 92 | public static boolean compare(String str, String md5Code) { 93 | if (encode(str).equals(md5Code)) { 94 | return true; 95 | } 96 | return false; 97 | } 98 | /** 99 | * 对比小写MD5字符串是否相等 100 | * 101 | * @param str 102 | * 字符串 103 | * @param encodeCount 104 | * 将字符串加密几次 105 | * @param md5Code 106 | * MD5码 107 | * @return 108 | */ 109 | public static boolean compare(String str, int encodeCount, String md5Code) { 110 | if (encode(str, encodeCount).equals(md5Code)) { 111 | return true; 112 | } 113 | return false; 114 | } 115 | /** 116 | * 对比大写MD5字符串是否相等 117 | * 118 | * @param str 119 | * 字符串 120 | * @param md5Code 121 | * MD5码 122 | * @return 123 | */ 124 | public static boolean compareUpperCase(String str, String md5Code) { 125 | if (encodeUpperCase(str).equals(md5Code)) { 126 | return true; 127 | } 128 | return false; 129 | } 130 | /** 131 | * 对比大写MD5字符串是否相等 132 | * 133 | * @param str 134 | * 字符串 135 | * @param encodeCount 136 | * 将字符串加密几次 137 | * @param md5Code 138 | * MD5码 139 | * @return 140 | */ 141 | public static boolean compareUpperCase(String str, int encodeCount, String md5Code) { 142 | if (encodeUpperCase(str, encodeCount).equals(md5Code)) { 143 | return true; 144 | } 145 | return false; 146 | } 147 | 148 | /** 149 | * 字节数组转换十六进制 150 | * 151 | * @param data 152 | * @param toDigits 153 | * @return 154 | */ 155 | protected static char[] encodeHex(final byte[] data, final char[] toDigits) { 156 | final int l = data.length; 157 | final char[] out = new char[l << 1]; 158 | for (int i = 0, j = 0; i < l; i++) { 159 | out[j++] = toDigits[(0xF0 & data[i]) >>> 4]; 160 | out[j++] = toDigits[0x0F & data[i]]; 161 | } 162 | return out; 163 | } 164 | 165 | } 166 | -------------------------------------------------------------------------------- /Client-UI/css/app.af54f0fc.css: -------------------------------------------------------------------------------- 1 | .oam_tree_node_default[data-v-ac06bb60]{word-wrap:break-word;padding:5px;margin-left:42px;border-left:3px solid transparent}.oam_tree_node_default[data-v-ac06bb60]:hover{color:#1890ff}.slide-fade-enter-active[data-v-110bca00]{transition:all .2s ease}.slide-fade-leave-active[data-v-110bca00]{transition:all .2s cubic-bezier(1,.5,.8,1)}.slide-fade-enter[data-v-110bca00],.slide-fade-leave-to[data-v-110bca00]{opacity:0}.oam_tree[data-v-110bca00]{max-width:100%;min-height:70%;cursor:pointer}.oam_tree_group_icon[data-v-110bca00]{width:30px;height:100%;display:flex;align-items:center;justify-content:center;transform:rotate(0deg);transition:transform .3s ease-in-out}.oam_tree_group_icon_expand[data-v-110bca00]{transform:rotate(90deg)}.oam_tree_group_title[data-v-110bca00]{padding:5px;padding-left:3px;cursor:pointer;border-left:3px solid transparent;width:100%}.oam_tree_group_title[data-v-110bca00]:hover{color:#1890ff}.oam_tree_select[data-v-110bca00]{background-color:#e6f7ff;border-left:3px solid #1890ff}a{text-decoration:none;color:#304455}img{border:none}.body-max-width{max-width:1240px}.xs-left-sm-rigth{text-align:right}.mb10px{margin-bottom:10px}.prem05{padding:.5rem}.plrrem05{padding:0 .5rem}.background-color-white{background-color:#fff}.flexCenter{display:flex;align-items:center}.api-body{border:1px solid #3b4151;background-color:#f5f7fa;margin-bottom:50px}.api-body .api-header{background-color:#3b4151;font-size:1.25rem;color:#fff;padding:.3125rem .625rem}.api-body-get{background-color:#ebf3fb;border:1px solid #61affe}.api-body .api-header-get{background-color:#61affe}.api-body-post{background-color:#e8f6f0;border:1px solid #49cc90}.api-body .api-header-post{background-color:#49cc90}.api-body-put{background-color:#fbf1e6;border:1px solid #fca130}.api-body .api-header-put{background-color:#fca130}.api-body-delete{background-color:#fae7e7;border:1px solid #f93e3e}.api-body .api-header-delete{background-color:#f93e3e}.api-body-head{background-color:#f4e7ff;border:1px solid #9012fe}.api-body .api-header-head{background-color:#9012fe}.api-body-options{background-color:#e6eef6;border:1px solid #0d5aa7}.api-body .api-header-options{background-color:#0d5aa7}.api-body-patch{background-color:#edfcf9;border:1px solid #50e3c2}.api-body .api-header-patch{background-color:#50e3c2}.api-body-trace{background-color:#ffe9e6;border:1px solid #ffa8be}.api-body .api-header-trace{background-color:#ffa8be}.api-body-connect{background-color:#e6f6f1;border:1px solid #83bb83}.api-body .api-header-connect{background-color:#83bb83}.api-body .api-header .api-header-item{line-height:2.5rem}.api-body .api-body-param-header,.api-body .api-body-response-header,.api-body .api-body-result-header{padding:.5rem;display:flex;flex-wrap:wrap;align-items:first baseline;justify-content:space-between}.api-body .api-body-response-body{color:#fff;background-color:#18181a;padding:0 .5rem .5rem .5rem;display:flex}.api-body .api-body-response-body .el-tabs__item{color:#fff}.api-body .api-body-response-body .el-tabs__item.is-active{color:#409eff}.api-body .api-body-response-body .el-divider__text{background-color:#18181a;color:#409eff}.api-body .api-body-response-body .jv-container{background-color:#18181a}.api-body .api-body-response-body .jv-container.jv-light,.api-body .api-body-response-body .jv-container.jv-light .jv-item.jv-array,.api-body .api-body-response-body .jv-container.jv-light .jv-item.jv-object{color:#fff}.api-body .api-body-response-body .jv-container.jv-light .jv-item.jv-string{color:#ff7de9}.api-body .api-body-response-body .jv-container.jv-light .jv-item.jv-boolean{color:gold}.api-body .api-body-response-body .jv-container.jv-light .jv-key{color:#409eff}.clearBtn[data-v-3fef6540]{color:#909399;margin-right:10px;font-size:80%;cursor:pointer}.clearBtn[data-v-3fef6540]:hover{color:red}.el-main{padding:14px!important}.el-table__indent{padding-left:0!important}@media screen and (max-width:768px){#header #collapse{display:block!important}#header #project-title{white-space:normal!important}.mini-screen-mide{display:none}.mini-screen-show{display:flex!important}}.mini-screen-show{display:none;align-items:center;margin-left:.3125rem}#app{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#2c3e50}#header{position:fixed;top:0;width:100%;box-shadow:0 0 1px rgba(0,0,0,.25);transition:background-color .3s ease-in-out;background-color:#fff;height:60px;z-index:10;display:flex;align-items:center}#header .nav-item{padding-left:20px}#header .nav-item-color{color:#2c3e50}#header #collapse{display:none;padding-left:10px;font-size:30px}#header #project-title{width:380px;padding-left:8px;display:flex;cursor:pointer;align-items:center;white-space:nowrap} -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/dist/client/css/app.af54f0fc.css: -------------------------------------------------------------------------------- 1 | .oam_tree_node_default[data-v-ac06bb60]{word-wrap:break-word;padding:5px;margin-left:42px;border-left:3px solid transparent}.oam_tree_node_default[data-v-ac06bb60]:hover{color:#1890ff}.slide-fade-enter-active[data-v-110bca00]{transition:all .2s ease}.slide-fade-leave-active[data-v-110bca00]{transition:all .2s cubic-bezier(1,.5,.8,1)}.slide-fade-enter[data-v-110bca00],.slide-fade-leave-to[data-v-110bca00]{opacity:0}.oam_tree[data-v-110bca00]{max-width:100%;min-height:70%;cursor:pointer}.oam_tree_group_icon[data-v-110bca00]{width:30px;height:100%;display:flex;align-items:center;justify-content:center;transform:rotate(0deg);transition:transform .3s ease-in-out}.oam_tree_group_icon_expand[data-v-110bca00]{transform:rotate(90deg)}.oam_tree_group_title[data-v-110bca00]{padding:5px;padding-left:3px;cursor:pointer;border-left:3px solid transparent;width:100%}.oam_tree_group_title[data-v-110bca00]:hover{color:#1890ff}.oam_tree_select[data-v-110bca00]{background-color:#e6f7ff;border-left:3px solid #1890ff}a{text-decoration:none;color:#304455}img{border:none}.body-max-width{max-width:1240px}.xs-left-sm-rigth{text-align:right}.mb10px{margin-bottom:10px}.prem05{padding:.5rem}.plrrem05{padding:0 .5rem}.background-color-white{background-color:#fff}.flexCenter{display:flex;align-items:center}.api-body{border:1px solid #3b4151;background-color:#f5f7fa;margin-bottom:50px}.api-body .api-header{background-color:#3b4151;font-size:1.25rem;color:#fff;padding:.3125rem .625rem}.api-body-get{background-color:#ebf3fb;border:1px solid #61affe}.api-body .api-header-get{background-color:#61affe}.api-body-post{background-color:#e8f6f0;border:1px solid #49cc90}.api-body .api-header-post{background-color:#49cc90}.api-body-put{background-color:#fbf1e6;border:1px solid #fca130}.api-body .api-header-put{background-color:#fca130}.api-body-delete{background-color:#fae7e7;border:1px solid #f93e3e}.api-body .api-header-delete{background-color:#f93e3e}.api-body-head{background-color:#f4e7ff;border:1px solid #9012fe}.api-body .api-header-head{background-color:#9012fe}.api-body-options{background-color:#e6eef6;border:1px solid #0d5aa7}.api-body .api-header-options{background-color:#0d5aa7}.api-body-patch{background-color:#edfcf9;border:1px solid #50e3c2}.api-body .api-header-patch{background-color:#50e3c2}.api-body-trace{background-color:#ffe9e6;border:1px solid #ffa8be}.api-body .api-header-trace{background-color:#ffa8be}.api-body-connect{background-color:#e6f6f1;border:1px solid #83bb83}.api-body .api-header-connect{background-color:#83bb83}.api-body .api-header .api-header-item{line-height:2.5rem}.api-body .api-body-param-header,.api-body .api-body-response-header,.api-body .api-body-result-header{padding:.5rem;display:flex;flex-wrap:wrap;align-items:first baseline;justify-content:space-between}.api-body .api-body-response-body{color:#fff;background-color:#18181a;padding:0 .5rem .5rem .5rem;display:flex}.api-body .api-body-response-body .el-tabs__item{color:#fff}.api-body .api-body-response-body .el-tabs__item.is-active{color:#409eff}.api-body .api-body-response-body .el-divider__text{background-color:#18181a;color:#409eff}.api-body .api-body-response-body .jv-container{background-color:#18181a}.api-body .api-body-response-body .jv-container.jv-light,.api-body .api-body-response-body .jv-container.jv-light .jv-item.jv-array,.api-body .api-body-response-body .jv-container.jv-light .jv-item.jv-object{color:#fff}.api-body .api-body-response-body .jv-container.jv-light .jv-item.jv-string{color:#ff7de9}.api-body .api-body-response-body .jv-container.jv-light .jv-item.jv-boolean{color:gold}.api-body .api-body-response-body .jv-container.jv-light .jv-key{color:#409eff}.clearBtn[data-v-3fef6540]{color:#909399;margin-right:10px;font-size:80%;cursor:pointer}.clearBtn[data-v-3fef6540]:hover{color:red}.el-main{padding:14px!important}.el-table__indent{padding-left:0!important}@media screen and (max-width:768px){#header #collapse{display:block!important}#header #project-title{white-space:normal!important}.mini-screen-mide{display:none}.mini-screen-show{display:flex!important}}.mini-screen-show{display:none;align-items:center;margin-left:.3125rem}#app{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#2c3e50}#header{position:fixed;top:0;width:100%;box-shadow:0 0 1px rgba(0,0,0,.25);transition:background-color .3s ease-in-out;background-color:#fff;height:60px;z-index:10;display:flex;align-items:center}#header .nav-item{padding-left:20px}#header .nav-item-color{color:#2c3e50}#header #collapse{display:none;padding-left:10px;font-size:30px}#header #project-title{width:380px;padding-left:8px;display:flex;cursor:pointer;align-items:center;white-space:nowrap} -------------------------------------------------------------------------------- /Orion-API-Manager-Docs/docs/.vuepress/public/client/css/app.af54f0fc.css: -------------------------------------------------------------------------------- 1 | .oam_tree_node_default[data-v-ac06bb60]{word-wrap:break-word;padding:5px;margin-left:42px;border-left:3px solid transparent}.oam_tree_node_default[data-v-ac06bb60]:hover{color:#1890ff}.slide-fade-enter-active[data-v-110bca00]{transition:all .2s ease}.slide-fade-leave-active[data-v-110bca00]{transition:all .2s cubic-bezier(1,.5,.8,1)}.slide-fade-enter[data-v-110bca00],.slide-fade-leave-to[data-v-110bca00]{opacity:0}.oam_tree[data-v-110bca00]{max-width:100%;min-height:70%;cursor:pointer}.oam_tree_group_icon[data-v-110bca00]{width:30px;height:100%;display:flex;align-items:center;justify-content:center;transform:rotate(0deg);transition:transform .3s ease-in-out}.oam_tree_group_icon_expand[data-v-110bca00]{transform:rotate(90deg)}.oam_tree_group_title[data-v-110bca00]{padding:5px;padding-left:3px;cursor:pointer;border-left:3px solid transparent;width:100%}.oam_tree_group_title[data-v-110bca00]:hover{color:#1890ff}.oam_tree_select[data-v-110bca00]{background-color:#e6f7ff;border-left:3px solid #1890ff}a{text-decoration:none;color:#304455}img{border:none}.body-max-width{max-width:1240px}.xs-left-sm-rigth{text-align:right}.mb10px{margin-bottom:10px}.prem05{padding:.5rem}.plrrem05{padding:0 .5rem}.background-color-white{background-color:#fff}.flexCenter{display:flex;align-items:center}.api-body{border:1px solid #3b4151;background-color:#f5f7fa;margin-bottom:50px}.api-body .api-header{background-color:#3b4151;font-size:1.25rem;color:#fff;padding:.3125rem .625rem}.api-body-get{background-color:#ebf3fb;border:1px solid #61affe}.api-body .api-header-get{background-color:#61affe}.api-body-post{background-color:#e8f6f0;border:1px solid #49cc90}.api-body .api-header-post{background-color:#49cc90}.api-body-put{background-color:#fbf1e6;border:1px solid #fca130}.api-body .api-header-put{background-color:#fca130}.api-body-delete{background-color:#fae7e7;border:1px solid #f93e3e}.api-body .api-header-delete{background-color:#f93e3e}.api-body-head{background-color:#f4e7ff;border:1px solid #9012fe}.api-body .api-header-head{background-color:#9012fe}.api-body-options{background-color:#e6eef6;border:1px solid #0d5aa7}.api-body .api-header-options{background-color:#0d5aa7}.api-body-patch{background-color:#edfcf9;border:1px solid #50e3c2}.api-body .api-header-patch{background-color:#50e3c2}.api-body-trace{background-color:#ffe9e6;border:1px solid #ffa8be}.api-body .api-header-trace{background-color:#ffa8be}.api-body-connect{background-color:#e6f6f1;border:1px solid #83bb83}.api-body .api-header-connect{background-color:#83bb83}.api-body .api-header .api-header-item{line-height:2.5rem}.api-body .api-body-param-header,.api-body .api-body-response-header,.api-body .api-body-result-header{padding:.5rem;display:flex;flex-wrap:wrap;align-items:first baseline;justify-content:space-between}.api-body .api-body-response-body{color:#fff;background-color:#18181a;padding:0 .5rem .5rem .5rem;display:flex}.api-body .api-body-response-body .el-tabs__item{color:#fff}.api-body .api-body-response-body .el-tabs__item.is-active{color:#409eff}.api-body .api-body-response-body .el-divider__text{background-color:#18181a;color:#409eff}.api-body .api-body-response-body .jv-container{background-color:#18181a}.api-body .api-body-response-body .jv-container.jv-light,.api-body .api-body-response-body .jv-container.jv-light .jv-item.jv-array,.api-body .api-body-response-body .jv-container.jv-light .jv-item.jv-object{color:#fff}.api-body .api-body-response-body .jv-container.jv-light .jv-item.jv-string{color:#ff7de9}.api-body .api-body-response-body .jv-container.jv-light .jv-item.jv-boolean{color:gold}.api-body .api-body-response-body .jv-container.jv-light .jv-key{color:#409eff}.clearBtn[data-v-3fef6540]{color:#909399;margin-right:10px;font-size:80%;cursor:pointer}.clearBtn[data-v-3fef6540]:hover{color:red}.el-main{padding:14px!important}.el-table__indent{padding-left:0!important}@media screen and (max-width:768px){#header #collapse{display:block!important}#header #project-title{white-space:normal!important}.mini-screen-mide{display:none}.mini-screen-show{display:flex!important}}.mini-screen-show{display:none;align-items:center;margin-left:.3125rem}#app{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#2c3e50}#header{position:fixed;top:0;width:100%;box-shadow:0 0 1px rgba(0,0,0,.25);transition:background-color .3s ease-in-out;background-color:#fff;height:60px;z-index:10;display:flex;align-items:center}#header .nav-item{padding-left:20px}#header .nav-item-color{color:#2c3e50}#header #collapse{display:none;padding-left:10px;font-size:30px}#header #project-title{width:380px;padding-left:8px;display:flex;cursor:pointer;align-items:center;white-space:nowrap} -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/mapper/ProjectApiMapper.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.mapper; 2 | 3 | import java.util.List; 4 | 5 | import org.apache.ibatis.annotations.Mapper; 6 | import org.apache.ibatis.annotations.Param; 7 | import org.apache.ibatis.annotations.Update; 8 | import org.mirrentools.orion.common.ColumnsAPI; 9 | import org.mirrentools.orion.common.SqlAssist; 10 | import org.mirrentools.orion.common.SqlAssist.LimitResult; 11 | import org.mirrentools.orion.entity.ProjectApi; 12 | 13 | /** 14 | * ProjectApi数据库相关操作 15 | * 16 | * @author 17 | */ 18 | @Mapper 19 | public interface ProjectApiMapper { 20 | 21 | /** 22 | * 获取数据总行数 23 | * 24 | * @param assist 查询帮助类,没有时可以传入null 25 | * @return 26 | */ 27 | long getCount(SqlAssist assist); 28 | 29 | /** 30 | * 查询所有数据 31 | * 32 | * @param assist 查询帮助类,没有时可以传入null 33 | * @return 34 | */ 35 | List selectAll(SqlAssist assist); 36 | 37 | /** 38 | * 分页获取数据, 39 | * 40 | * @param assist 查询帮助类,默认page=1,rowSize=15 41 | * @return 42 | */ 43 | default LimitResult limitAll(SqlAssist assist) { 44 | if (assist == null) { 45 | assist = new SqlAssist(); 46 | } 47 | if (assist.getPage() == null || assist.getPage() < 1) { 48 | assist.setPage(1); 49 | } 50 | if (assist.getRowSize() == null || assist.getRowSize() < 1) { 51 | assist.setRowSize(15); 52 | } 53 | if (assist.getPage() == 1) { 54 | assist.setStartRow(0); 55 | } else { 56 | assist.setStartRow((assist.getPage() - 1) * assist.getRowSize()); 57 | } 58 | long count = getCount(assist); 59 | LimitResult result = new SqlAssist().new LimitResult(count, assist.getPage(), 60 | assist.getRowSize()); 61 | if (count == 0) { 62 | return result; 63 | } 64 | List data = selectAll(assist); 65 | result.setData(data); 66 | return result; 67 | } 68 | 69 | /** 70 | * 通过对象中不为空的属性为条件获取数据,只返回一条结果 71 | * 72 | * @param data 73 | * @return 74 | */ 75 | ProjectApi selectSingleByObj(ProjectApi data); 76 | 77 | /** 78 | * 通过对象中不为空的属性作为条件获取数据 79 | * 80 | * @param data 81 | * @return 82 | */ 83 | List selectByObj(ProjectApi data); 84 | 85 | /** 86 | * 插入一个对象包括属性值为null的值 87 | * 88 | * @param data 89 | * @return 90 | */ 91 | int insertAll(ProjectApi data); 92 | 93 | /** 94 | * 插入一个对象,只插入对象中值不为null的属性 95 | * 96 | * @param data 97 | * @return 98 | */ 99 | int insertNotNull(ProjectApi data); 100 | 101 | /** 102 | * 批量添加全部所有字段 103 | * 104 | * @param data 105 | * @return 106 | */ 107 | int insertBatch(List data); 108 | 109 | /** 110 | * 插入一个对象,如果该对象不存在就新建如果该对象已经存在就更新 111 | * 112 | * @param data 113 | * @return 114 | */ 115 | int replace(ProjectApi data); 116 | 117 | /** 118 | * 通过查询帮助类删除数据 119 | * 120 | * @param assist 查询帮助类,没有时可以传入null 121 | * @return 122 | */ 123 | int deleteByAssist(SqlAssist assist); 124 | 125 | /** 126 | * 更新一个对象中所有的属性包括null值,条件为SqlAssist查询帮助类 127 | * 128 | * @param data 对象 129 | * @param assist 查询帮助类 130 | * @return 131 | */ 132 | int updateAllByAssist(@Param("data") ProjectApi data, @Param("assist") SqlAssist assist); 133 | 134 | /** 135 | * 更新一个对象中属性不为null值,条件为SqlAssist查询帮助类 136 | * 137 | * @param data 对象 138 | * @param assist 查询帮助类 139 | * @return 140 | */ 141 | int updateNotNullByAssist(@Param("data") ProjectApi data, @Param("assist") SqlAssist assist); 142 | 143 | /** 144 | * 通过id获取数据 145 | * 146 | * @param id 147 | * @return 148 | */ 149 | ProjectApi selectById(String id); 150 | 151 | /** 152 | * 通过id删除数据 153 | * 154 | * @param id 155 | * @return 156 | */ 157 | int deleteById(String id); 158 | 159 | /** 160 | * 更新一个对象中所有的属性包括null值,条件为对象中的id 161 | * 162 | * @param data 163 | * @return 164 | */ 165 | int updateAllById(ProjectApi data); 166 | 167 | /** 168 | * 更新一个对象中属性不为null值,条件为对象中的id 169 | * 170 | * @param data 171 | * @return 172 | */ 173 | int updateNotNullById(ProjectApi data); 174 | 175 | /** 176 | * 将接口上移动 177 | * 178 | * @param aid 接口的id 179 | * @return 180 | */ 181 | @Update("UPDATE " + ColumnsAPI.TABLE_NAME 182 | + " SET " + ColumnsAPI.SORTS + "=" + ColumnsAPI.SORTS + "-1 " 183 | + " WHERE "+ ColumnsAPI.API_ID + "=#{aid}") 184 | int updateProjectApiMoveUp(@Param("aid") String aid); 185 | 186 | /** 187 | * 将接口下移动 188 | * 189 | * @param aid 接口的id 190 | * @return 191 | */ 192 | @Update("UPDATE " + ColumnsAPI.TABLE_NAME 193 | + " SET " + ColumnsAPI.SORTS + "=" + ColumnsAPI.SORTS + "+1 " 194 | + " WHERE "+ ColumnsAPI.API_ID + "=#{aid}") 195 | int updateProjectApiMoveDown(@Param("aid") String aid); 196 | } 197 | -------------------------------------------------------------------------------- /.mvn/wrapper/MavenWrapperDownloader.java: -------------------------------------------------------------------------------- 1 | /* 2 | Licensed to the Apache Software Foundation (ASF) under one 3 | or more contributor license agreements. See the NOTICE file 4 | distributed with this work for additional information 5 | regarding copyright ownership. The ASF licenses this file 6 | to you under the Apache License, Version 2.0 (the 7 | "License"); you may not use this file except in compliance 8 | with the License. You may obtain a copy of the License at 9 | 10 | http://www.apache.org/licenses/LICENSE-2.0 11 | 12 | Unless required by applicable law or agreed to in writing, 13 | software distributed under the License is distributed on an 14 | "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | KIND, either express or implied. See the License for the 16 | specific language governing permissions and limitations 17 | under the License. 18 | */ 19 | 20 | import java.io.File; 21 | import java.io.FileInputStream; 22 | import java.io.FileOutputStream; 23 | import java.io.IOException; 24 | import java.net.URL; 25 | import java.nio.channels.Channels; 26 | import java.nio.channels.ReadableByteChannel; 27 | import java.util.Properties; 28 | 29 | public class MavenWrapperDownloader { 30 | 31 | /** 32 | * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. 33 | */ 34 | private static final String DEFAULT_DOWNLOAD_URL = 35 | "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"; 36 | 37 | /** 38 | * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to 39 | * use instead of the default one. 40 | */ 41 | private static final String MAVEN_WRAPPER_PROPERTIES_PATH = 42 | ".mvn/wrapper/maven-wrapper.properties"; 43 | 44 | /** 45 | * Path where the maven-wrapper.jar will be saved to. 46 | */ 47 | private static final String MAVEN_WRAPPER_JAR_PATH = 48 | ".mvn/wrapper/maven-wrapper.jar"; 49 | 50 | /** 51 | * Name of the property which should be used to override the default download url for the wrapper. 52 | */ 53 | private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; 54 | 55 | public static void main(String args[]) { 56 | System.out.println("- Downloader started"); 57 | File baseDirectory = new File(args[0]); 58 | System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); 59 | 60 | // If the maven-wrapper.properties exists, read it and check if it contains a custom 61 | // wrapperUrl parameter. 62 | File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); 63 | String url = DEFAULT_DOWNLOAD_URL; 64 | if(mavenWrapperPropertyFile.exists()) { 65 | FileInputStream mavenWrapperPropertyFileInputStream = null; 66 | try { 67 | mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); 68 | Properties mavenWrapperProperties = new Properties(); 69 | mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); 70 | url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); 71 | } catch (IOException e) { 72 | System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); 73 | } finally { 74 | try { 75 | if(mavenWrapperPropertyFileInputStream != null) { 76 | mavenWrapperPropertyFileInputStream.close(); 77 | } 78 | } catch (IOException e) { 79 | // Ignore ... 80 | } 81 | } 82 | } 83 | System.out.println("- Downloading from: : " + url); 84 | 85 | File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); 86 | if(!outputFile.getParentFile().exists()) { 87 | if(!outputFile.getParentFile().mkdirs()) { 88 | System.out.println( 89 | "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'"); 90 | } 91 | } 92 | System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); 93 | try { 94 | downloadFileFromURL(url, outputFile); 95 | System.out.println("Done"); 96 | System.exit(0); 97 | } catch (Throwable e) { 98 | System.out.println("- Error downloading"); 99 | e.printStackTrace(); 100 | System.exit(1); 101 | } 102 | } 103 | 104 | private static void downloadFileFromURL(String urlString, File destination) throws Exception { 105 | URL website = new URL(urlString); 106 | ReadableByteChannel rbc; 107 | rbc = Channels.newChannel(website.openStream()); 108 | FileOutputStream fos = new FileOutputStream(destination); 109 | fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); 110 | fos.close(); 111 | rbc.close(); 112 | } 113 | 114 | } 115 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/mapper/ProjectApiGroupMapper.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.mapper; 2 | 3 | import java.util.List; 4 | 5 | import org.apache.ibatis.annotations.Mapper; 6 | import org.apache.ibatis.annotations.Param; 7 | import org.apache.ibatis.annotations.Update; 8 | import org.mirrentools.orion.common.ColumnsApiGroup; 9 | import org.mirrentools.orion.common.SqlAssist; 10 | import org.mirrentools.orion.common.SqlAssist.LimitResult; 11 | import org.mirrentools.orion.entity.ProjectApiGroup; 12 | 13 | /** 14 | * ProjectApiGroup数据库相关操作 15 | * 16 | * @author 17 | */ 18 | @Mapper 19 | public interface ProjectApiGroupMapper { 20 | 21 | /** 22 | * 获取数据总行数 23 | * 24 | * @param assist 25 | * 查询帮助类,没有时可以传入null 26 | * @return 27 | */ 28 | long getCount(SqlAssist assist); 29 | 30 | /** 31 | * 查询所有数据 32 | * 33 | * @param assist 34 | * 查询帮助类,没有时可以传入null 35 | * @return 36 | */ 37 | List selectAll(SqlAssist assist); 38 | 39 | /** 40 | * 分页获取数据, 41 | * 42 | * @param assist 43 | * 查询帮助类,默认page=1,rowSize=15 44 | * @return 45 | */ 46 | default LimitResult limitAll(SqlAssist assist) { 47 | if (assist == null) { 48 | assist = new SqlAssist(); 49 | } 50 | if (assist.getPage() == null || assist.getPage() < 1) { 51 | assist.setPage(1); 52 | } 53 | if (assist.getRowSize() == null || assist.getRowSize() < 1) { 54 | assist.setRowSize(15); 55 | } 56 | if (assist.getPage() == 1) { 57 | assist.setStartRow(0); 58 | } else { 59 | assist.setStartRow((assist.getPage() - 1) * assist.getRowSize()); 60 | } 61 | long count = getCount(assist); 62 | LimitResult result = new SqlAssist().new LimitResult(count, assist.getPage(), assist.getRowSize()); 63 | if (count == 0) { 64 | return result; 65 | } 66 | List data = selectAll(assist); 67 | result.setData(data); 68 | return result; 69 | } 70 | 71 | /** 72 | * 通过对象中不为空的属性为条件获取数据,只返回一条结果 73 | * 74 | * @param data 75 | * @return 76 | */ 77 | ProjectApiGroup selectSingleByObj(ProjectApiGroup data); 78 | 79 | /** 80 | * 通过对象中不为空的属性作为条件获取数据 81 | * 82 | * @param data 83 | * @return 84 | */ 85 | List selectByObj(ProjectApiGroup data); 86 | 87 | /** 88 | * 插入一个对象包括属性值为null的值 89 | * 90 | * @param data 91 | * @return 92 | */ 93 | int insertAll(ProjectApiGroup data); 94 | 95 | /** 96 | * 插入一个对象,只插入对象中值不为null的属性 97 | * 98 | * @param data 99 | * @return 100 | */ 101 | int insertNotNull(ProjectApiGroup data); 102 | 103 | /** 104 | * 批量添加全部所有字段 105 | * 106 | * @param data 107 | * @return 108 | */ 109 | int insertBatch(List data); 110 | 111 | /** 112 | * 插入一个对象,如果该对象不存在就新建如果该对象已经存在就更新 113 | * 114 | * @param data 115 | * @return 116 | */ 117 | int replace(ProjectApiGroup data); 118 | 119 | /** 120 | * 通过查询帮助类删除数据 121 | * 122 | * @param assist 123 | * 查询帮助类,没有时可以传入null 124 | * @return 125 | */ 126 | int deleteByAssist(SqlAssist assist); 127 | 128 | /** 129 | * 更新一个对象中所有的属性包括null值,条件为SqlAssist查询帮助类 130 | * 131 | * @param data 132 | * 对象 133 | * @param assist 134 | * 查询帮助类 135 | * @return 136 | */ 137 | int updateAllByAssist(@Param("data") ProjectApiGroup data, @Param("assist") SqlAssist assist); 138 | 139 | /** 140 | * 更新一个对象中属性不为null值,条件为SqlAssist查询帮助类 141 | * 142 | * @param data 143 | * 对象 144 | * @param assist 145 | * 查询帮助类 146 | * @return 147 | */ 148 | int updateNotNullByAssist(@Param("data") ProjectApiGroup data, @Param("assist") SqlAssist assist); 149 | /** 150 | * 通过id获取数据 151 | * 152 | * @param id 153 | * @return 154 | */ 155 | ProjectApiGroup selectById(String id); 156 | /** 157 | * 通过id删除数据 158 | * 159 | * @param id 160 | * @return 161 | */ 162 | int deleteById(String id); 163 | /** 164 | * 更新一个对象中所有的属性包括null值,条件为对象中的id 165 | * 166 | * @param data 167 | * @return 168 | */ 169 | int updateAllById(ProjectApiGroup data); 170 | 171 | /** 172 | * 更新一个对象中属性不为null值,条件为对象中的id 173 | * 174 | * @param data 175 | * @return 176 | */ 177 | int updateNotNullById(ProjectApiGroup data); 178 | /** 179 | * 将接口分组上移动 180 | * 181 | * @param gid 182 | * 分组的id 183 | * @return 184 | */ 185 | @Update("UPDATE " + ColumnsApiGroup.TABLE_NAME 186 | + " SET " + ColumnsApiGroup.SORTS + "=" + ColumnsApiGroup.SORTS + "-1 " 187 | + " WHERE "+ ColumnsApiGroup.GROUP_ID + "=#{gid}") 188 | int updateProjectApiGroupMoveUp(@Param("gid") String gid); 189 | 190 | /** 191 | * 将接口分组下移动 192 | * 193 | * @param gid 194 | * 分组的id 195 | * @return 196 | */ 197 | @Update("UPDATE " + ColumnsApiGroup.TABLE_NAME 198 | + " SET " + ColumnsApiGroup.SORTS + "=" + ColumnsApiGroup.SORTS + "+1 " 199 | + " WHERE "+ ColumnsApiGroup.GROUP_ID + "=#{gid}") 200 | int updateProjectApiGroupMoveDown(@Param("gid") String gid); 201 | } 202 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/mapper/ProjectMapper.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.mapper; 2 | 3 | import java.util.List; 4 | 5 | import org.apache.ibatis.annotations.Mapper; 6 | import org.apache.ibatis.annotations.Param; 7 | import org.apache.ibatis.annotations.Select; 8 | import org.apache.ibatis.annotations.Update; 9 | import org.mirrentools.orion.common.ColumnsAPI; 10 | import org.mirrentools.orion.common.ColumnsApiGroup; 11 | import org.mirrentools.orion.common.ColumnsProject; 12 | import org.mirrentools.orion.common.SqlAssist; 13 | import org.mirrentools.orion.common.SqlAssist.LimitResult; 14 | import org.mirrentools.orion.entity.Project; 15 | 16 | /** 17 | * Project数据库相关操作 18 | * 19 | * @author 20 | */ 21 | @Mapper 22 | public interface ProjectMapper { 23 | 24 | /** 25 | * 获取数据总行数 26 | * 27 | * @param assist 查询帮助类,没有时可以传入null 28 | * @return 29 | */ 30 | long getCount(SqlAssist assist); 31 | 32 | /** 33 | * 查询所有数据 34 | * 35 | * @param assist 查询帮助类,没有时可以传入null 36 | * @return 37 | */ 38 | List selectAll(SqlAssist assist); 39 | 40 | /** 41 | * 分页获取数据, 42 | * 43 | * @param assist 查询帮助类,默认page=1,rowSize=15 44 | * @return 45 | */ 46 | default LimitResult limitAll(SqlAssist assist) { 47 | if (assist == null) { 48 | assist = new SqlAssist(); 49 | } 50 | if (assist.getPage() == null || assist.getPage() < 1) { 51 | assist.setPage(1); 52 | } 53 | if (assist.getRowSize() == null || assist.getRowSize() < 1) { 54 | assist.setRowSize(15); 55 | } 56 | if (assist.getPage() == 1) { 57 | assist.setStartRow(0); 58 | } else { 59 | assist.setStartRow((assist.getPage() - 1) * assist.getRowSize()); 60 | } 61 | long count = getCount(assist); 62 | LimitResult result = new SqlAssist().new LimitResult(count, assist.getPage(), 63 | assist.getRowSize()); 64 | if (count == 0) { 65 | return result; 66 | } 67 | List data = selectAll(assist); 68 | result.setData(data); 69 | return result; 70 | } 71 | 72 | /** 73 | * 通过对象中不为空的属性为条件获取数据,只返回一条结果 74 | * 75 | * @param data 76 | * @return 77 | */ 78 | Project selectSingleByObj(Project data); 79 | 80 | /** 81 | * 通过对象中不为空的属性作为条件获取数据 82 | * 83 | * @param data 84 | * @return 85 | */ 86 | List selectByObj(Project data); 87 | 88 | /** 89 | * 插入一个对象包括属性值为null的值 90 | * 91 | * @param data 92 | * @return 93 | */ 94 | int insertAll(Project data); 95 | 96 | /** 97 | * 插入一个对象,只插入对象中值不为null的属性 98 | * 99 | * @param data 100 | * @return 101 | */ 102 | int insertNotNull(Project data); 103 | 104 | /** 105 | * 批量添加全部所有字段 106 | * 107 | * @param data 108 | * @return 109 | */ 110 | int insertBatch(List data); 111 | 112 | /** 113 | * 插入一个对象,如果该对象不存在就新建如果该对象已经存在就更新 114 | * 115 | * @param data 116 | * @return 117 | */ 118 | int replace(Project data); 119 | 120 | /** 121 | * 通过查询帮助类删除数据 122 | * 123 | * @param assist 查询帮助类,没有时可以传入null 124 | * @return 125 | */ 126 | int deleteByAssist(SqlAssist assist); 127 | 128 | /** 129 | * 更新一个对象中所有的属性包括null值,条件为SqlAssist查询帮助类 130 | * 131 | * @param data 对象 132 | * @param assist 查询帮助类 133 | * @return 134 | */ 135 | int updateAllByAssist(@Param("data") Project data, @Param("assist") SqlAssist assist); 136 | 137 | /** 138 | * 更新一个对象中属性不为null值,条件为SqlAssist查询帮助类 139 | * 140 | * @param data 对象 141 | * @param assist 查询帮助类 142 | * @return 143 | */ 144 | int updateNotNullByAssist(@Param("data") Project data, @Param("assist") SqlAssist assist); 145 | 146 | /** 147 | * 通过id获取数据 148 | * 149 | * @param id 150 | * @return 151 | */ 152 | Project selectById(String id); 153 | 154 | /** 155 | * 通过id删除数据 156 | * 157 | * @param id 158 | * @return 159 | */ 160 | int deleteById(String id); 161 | 162 | /** 163 | * 更新一个对象中所有的属性包括null值,条件为对象中的id 164 | * 165 | * @param data 166 | * @return 167 | */ 168 | int updateAllById(Project data); 169 | 170 | /** 171 | * 更新一个对象中属性不为null值,条件为对象中的id 172 | * 173 | * @param data 174 | * @return 175 | */ 176 | int updateNotNullById(Project data); 177 | 178 | /** 179 | * 通过api的id获取项目的负责人uid 180 | * 181 | * @param apiId 182 | * @return 183 | */ 184 | @Select(" select p."+ColumnsProject.KEY+" from "+ColumnsProject.TABLE_NAME+" p" 185 | + " inner join "+ColumnsApiGroup.TABLE_NAME+" g on p." + ColumnsProject.KEY + "=g."+ ColumnsApiGroup.PROJECT_ID 186 | + " inner join "+ColumnsAPI.TABLE_NAME+" a on a." + ColumnsAPI.GROUP_ID + "=g."+ ColumnsApiGroup.GROUP_ID 187 | + " where a."+ColumnsAPI.API_ID+"=#{apiId}") 188 | Project getProjectOwnerByApiId(@Param("apiId") String apiId); 189 | 190 | /** 191 | * 将项目上移动 192 | * 193 | * @param pid 项目的id 194 | * @return 195 | */ 196 | @Update("UPDATE "+ColumnsProject.TABLE_NAME+" SET "+ColumnsProject.SORTS+"="+ColumnsProject.SORTS+"-1 WHERE "+ColumnsProject.KEY+"=#{pid}") 197 | int updateProjectMoveUp(@Param("pid") String pid); 198 | 199 | /** 200 | * 将项目下移动 201 | * 202 | * @param pid 项目的id 203 | * @return 204 | */ 205 | @Update("UPDATE "+ColumnsProject.TABLE_NAME+" SET "+ColumnsProject.SORTS+"="+ColumnsProject.SORTS+"+1 WHERE "+ColumnsProject.KEY+"=#{pid}") 206 | int updateProjectMoveDown(@Param("pid") String pid); 207 | } 208 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | org.springframework.boot 8 | spring-boot-starter-parent 9 | 2.3.3.RELEASE 10 | 11 | org.mirrentools.orion 12 | Orion-API-Manager 13 | 1.0.1 14 | Orion-API-Manager 15 | Orion API Document Management 16 | 17 | 18 | UTF-8 19 | UTF-8 20 | 0.60.0 21 | 1.8 22 | 23 | 24 | 25 | 26 | 27 | org.springframework.boot 28 | spring-boot-starter-jdbc 29 | 30 | 31 | org.springframework.boot 32 | spring-boot-starter-web 33 | 34 | 35 | org.springframework.boot 36 | spring-boot-starter-websocket 37 | 38 | 39 | org.springframework.boot 40 | spring-boot-devtools 41 | 42 | 43 | org.springframework.boot 44 | spring-boot-starter-logging 45 | 46 | 47 | org.springframework.boot 48 | spring-boot-starter-test 49 | test 50 | 51 | 52 | org.mybatis.spring.boot 53 | mybatis-spring-boot-starter 54 | 2.1.3 55 | 56 | 57 | com.alibaba 58 | druid-spring-boot-starter 59 | 1.1.9 60 | 61 | 62 | 63 | 64 | org.xerial 65 | sqlite-jdbc 66 | 3.8.11.2 67 | 68 | 69 | mysql 70 | mysql-connector-java 71 | 8.0.16 72 | 73 | 74 | io.swagger.parser.v3 75 | swagger-parser 76 | 2.0.24 77 | 78 | 79 | org.json 80 | json 81 | 20180813 82 | 83 | 84 | 85 | com.vladsch.flexmark 86 | flexmark 87 | ${flexmark.version} 88 | 89 | 90 | com.vladsch.flexmark 91 | flexmark-util 92 | ${flexmark.version} 93 | 94 | 95 | com.vladsch.flexmark 96 | flexmark-ext-tables 97 | ${flexmark.version} 98 | 99 | 100 | 101 | org.apache.httpcomponents 102 | httpclient 103 | 104 | 105 | org.mirrentools 106 | screw-driver 107 | 1.2.3 108 | test 109 | 110 | 111 | 112 | 113 | 114 | ${project.artifactId} 115 | 116 | 117 | org.springframework.boot 118 | spring-boot-maven-plugin 119 | 120 | ${project.build.directory}/Orion/ 121 | 122 | 123 | 124 | org.apache.maven.plugins 125 | maven-resources-plugin 126 | 127 | 128 | woff 129 | woff2 130 | eot 131 | ttf 132 | svg 133 | 134 | 135 | 136 | src/main/resources/ 137 | 138 | 139 | ${basedir}/resources 140 | ${project.build.directory}/Orion/ 141 | 142 | 143 | ${basedir}/Server-UI 144 | true 145 | ${project.build.directory}/Orion/Server-UI 146 | 147 | 148 | ${basedir}/Client-UI 149 | true 150 | ${project.build.directory}/Orion/Client-UI 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | -------------------------------------------------------------------------------- /src/main/java/org/mirrentools/orion/common/ResultCode.java: -------------------------------------------------------------------------------- 1 | package org.mirrentools.orion.common; 2 | 3 | /** 4 | * 响应状态码 5 | * 6 | * @author Mirren 7 | * 8 | */ 9 | public enum ResultCode { 10 | /** 状态码:200, "success", "成功" */ 11 | DEFAULT(200, "Succeeded", "成功"), 12 | /** 状态码:200, "success", "成功" */ 13 | R200(200, "Succeeded", "成功"), 14 | /** 15 | * 状态码:202,
16 | * "The operation is complete, but you need to check whether it is successful", 17 | *
18 | * "操作完成,但需要你检查是否成功" 19 | */ 20 | R202(202, "The operation is complete, but you need to check whether it is successful", "操作完成,但需要你检查是否成功"), 21 | /** 22 | * 状态码:401,
23 | * "Login timeout, please login again",
24 | * "登录超时,请重新登录!" 25 | */ 26 | R401(401, "Login timeout, please login again", "登录超时,请重新登录"), 27 | /** 28 | * 状态码:402,
29 | * "Login failed, invalid account or password",
30 | * "登录失败,账号或密码错误" 31 | */ 32 | R402(402, "Login failed, invalid account or password", "登录失败,账号或密码错误"), 33 | /** 34 | * 状态码:403,
35 | * "Illegal operation or no permission",
36 | * "非法操作或者没有权限" 37 | */ 38 | R403(403, "Illegal operation or no permission,if you have the permission, please login again", 39 | "非法操作或者没有权限,如果你有该权限请重新登录"), 40 | /** 41 | * 状态码:404,
42 | * "The resource does not exist",
43 | * "资源不存在" 44 | */ 45 | R404(404, "The resource does not exist", "资源不存在"), 46 | /** 47 | * 状态码:405,
48 | * "View password is incorrect or invalid, please re-enter",
49 | * "查看密码错误,或查看密码无效,请重新输入" 50 | */ 51 | R405(405, "View password is incorrect or invalid, please re-enter", "查看密码错误,或查看密码无效,请重新输入"), 52 | /** 53 | * 状态码:412,
54 | * "Please fill in all required parameters",
55 | * "请按要求填写所有必填项" 56 | */ 57 | R412(412, "Please fill in all required parameters", "请按要求填写所有必填项"), 58 | /** 59 | * 状态码:413,
60 | * "Invalid request parameter",
61 | * "无效的请求参数" 62 | */ 63 | R413(413, "Invalid request parameter", "无效的请求参数"), 64 | /** 状态码:500, "failed", "失败" */ 65 | R500(500, "Failed", "失败"), 66 | /** 67 | * 状态码:555,
68 | * "failed. Please try again later. Please check the console for more 69 | * information",
70 | * "请稍后重试,更多信息请查看控制台" 71 | */ 72 | R555(555, "Failed. Please try again later. Please check the console for more information", "请稍后重试,更多信息请查看控制台"), 73 | /** 74 | * 状态码:1303,
75 | * "Failed to get the Captcha. Please try again later",
76 | * "获取验证码失败,请稍后重试" 77 | */ 78 | R1303(1303, "Failed to get the Captcha. Please try again later", "获取验证码失败,请稍后重试"), 79 | /** 80 | * 状态码:1304,
81 | * "The Captcha is incorrect, please select again",
82 | * "验证码错误,请重新选择" 83 | */ 84 | R1304(1304, "The Captcha is incorrect, please select again", "验证码错误,请重新选择"), 85 | /** 86 | * 状态码:1001,
87 | * "The user's account already exists!",
88 | * "该用户的账号已存在!" 89 | */ 90 | R1001(1001, "The user's account already exists!", "该用户的账号已存在!"), 91 | /** 92 | * 状态码:1002,
93 | * "Ordinary administrator cannot create user with administrator role!",
94 | * "普通管理员无法创建管理员角色的用户!" 95 | */ 96 | R1002(1002, "Ordinary administrator cannot create user with administrator role!", "普通管理员无法创建管理员角色的用户!"), 97 | /** 98 | * 状态码:1003,
99 | * "Failed. invalid role",
100 | * "失败,无效的角色" 101 | */ 102 | R1003(1003, "Failed. invalid role", "失败,无效的角色"), 103 | /** 104 | * 状态码:1004,
105 | * "Login failed, account password and Captcha cannot be empty!",
106 | * "登录失败,账号密码与验证码不能为空!" 107 | */ 108 | R1004(1004, "Login failed, account password and Captcha cannot be empty!", "登录失败,账号密码与验证码不能为空!"), 109 | /** 110 | * 状态码:1010,
111 | * "Ordinary administrators can only delete ordinary users",
112 | * "普通管理员只能删除普通用户" 113 | */ 114 | R1010(1010, "Ordinary administrators can only delete ordinary users", "普通管理员只能删除普通用户"), 115 | /** 116 | * 状态码:1011,
117 | * "Only administrators can delete users",
118 | * "只有管理员可以删除用户" 119 | */ 120 | R1011(1011, "Only administrators can delete users", "只有管理员可以删除用户"), 121 | /** 122 | * 状态码:1100,
123 | * "The tags is referenced by the project and cannot be deleted",
124 | * "该标签已被项目引用,无法进行删除" 125 | */ 126 | R1100(1100, "The tags is referenced by the project and cannot be deleted", "该标签已被项目引用,无法进行删除"), 127 | /** 128 | * 状态码:1101,
129 | * "The tags is referenced by the users and cannot be deleted",
130 | * "该标签下有用户,无法进行删除" 131 | */ 132 | R1101(1101, "The tags is referenced by the users and cannot be deleted", "该标签下有用户,无法进行删除"), 133 | /** 134 | * 状态码: 1501,
135 | * "Invalid URL path. If there is a path parameter, please fill in the path 136 | * parameter",
137 | * "无效的URL路径,如果有Path参数请填充Path参数" 138 | */ 139 | R1501(1501, "Invalid URL path. If there is a path parameter, please fill in the path parameter", 140 | "无效的URL路径,如果有Path参数请填充Path参数"), 141 | /** 142 | * 状态码: 1502,
143 | * "Unrecognized host or address",
144 | * "无法识别主机" 145 | */ 146 | R1502(1502, "Unrecognized host or address", "无法识别主机"),; 147 | 148 | /** 状态信息 */ 149 | private int code; 150 | /** 状态信息 */ 151 | private String msg; 152 | /** 提示信息 */ 153 | private String explain; 154 | 155 | private ResultCode(int code, String msg, String explain) { 156 | this.code = code; 157 | this.msg = msg; 158 | this.explain = explain; 159 | } 160 | 161 | /** 162 | * 获取状态码 163 | * 164 | * @return 165 | */ 166 | public int code() { 167 | return code; 168 | } 169 | 170 | /** 171 | * 获取状态信息 172 | * 173 | * @return 174 | */ 175 | public String msg() { 176 | return msg; 177 | } 178 | 179 | /** 180 | * 获取描述信息 181 | * 182 | * @return 183 | */ 184 | public String explain() { 185 | return explain; 186 | } 187 | 188 | } 189 | --------------------------------------------------------------------------------