├── .gitignore
├── LICENSE
├── README.md
├── TestHub-client
├── .eslintrc.js
├── .gitignore
├── .npmrc
├── .prettierignore
├── .prettierrc
├── .umirc.desktop.ts
├── .umirc.ts
├── .umirc.web.ts
├── package.json
├── public
│ └── logo.ico
├── src
│ ├── assets
│ │ ├── font
│ │ │ ├── demo.css
│ │ │ ├── demo_index.html
│ │ │ ├── iconfont.css
│ │ │ ├── iconfont.js
│ │ │ ├── iconfont.json
│ │ │ ├── iconfont.ttf
│ │ │ ├── iconfont.woff
│ │ │ └── iconfont.woff2
│ │ ├── img
│ │ │ ├── contact.jpeg
│ │ │ ├── empty.svg
│ │ │ ├── login-bg.svg
│ │ │ ├── theme-auto.png
│ │ │ ├── theme-dark.png
│ │ │ └── theme-light.png
│ │ └── logo
│ │ │ ├── logo.icns
│ │ │ ├── logo.ico
│ │ │ ├── logo.png
│ │ │ └── logo.webp
│ ├── blocks
│ │ └── Setting
│ │ │ ├── About
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ │ ├── BaseSetting
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ │ ├── ProxySetting
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ │ ├── UpdateDetection
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ │ ├── User
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ ├── components
│ │ ├── TestHub
│ │ │ ├── MonacoEditor
│ │ │ │ ├── MyMonacoDiffEditor
│ │ │ │ │ ├── editorConfig.ts
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── MyMonacoEditor
│ │ │ │ │ ├── editorConfig.ts
│ │ │ │ │ ├── index.less
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── language
│ │ │ │ │ │ └── casexml
│ │ │ │ │ │ ├── CasexmlEditor.tsx
│ │ │ │ │ │ ├── index.tsx
│ │ │ │ │ │ └── item
│ │ │ │ │ │ └── suggestions
│ │ │ │ │ │ └── dom.tsx
│ │ │ │ ├── initMonaco.tsx
│ │ │ │ └── useMonacoTheme.ts
│ │ │ ├── ProjectSelect
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── SearchInput
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── SearchTree
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── assembly
│ │ │ │ └── params
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ ├── dataTypeShow
│ │ │ │ └── index.tsx
│ │ │ ├── errorBoundary
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── expLog
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── formulaLog
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── http
│ │ │ │ ├── Body.tsx
│ │ │ │ ├── FormData.tsx
│ │ │ │ ├── RequestView
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── ResponseView
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── i18n
│ │ │ │ │ ├── en-us
│ │ │ │ │ │ └── index.ts
│ │ │ │ │ └── zh-cn
│ │ │ │ │ │ └── index.ts
│ │ │ │ └── typings.d.ts
│ │ │ ├── myReactJson
│ │ │ │ └── index.tsx
│ │ │ └── plugins
│ │ │ │ ├── ActionType.ts
│ │ │ │ ├── Entry.tsx
│ │ │ │ ├── Icon.tsx
│ │ │ │ ├── Result.tsx
│ │ │ │ ├── i18n
│ │ │ │ ├── plugin-en-us.ts
│ │ │ │ └── plugin-zh-cn.ts
│ │ │ │ └── item
│ │ │ │ ├── app
│ │ │ │ ├── entry
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── i18n
│ │ │ │ │ ├── app-en-us.ts
│ │ │ │ │ └── app-zh-cn.ts
│ │ │ │ └── result
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── check
│ │ │ │ ├── entry
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── i18n
│ │ │ │ │ ├── check-en-us.ts
│ │ │ │ │ └── check-zh-cn.ts
│ │ │ │ └── result
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── checkObj
│ │ │ │ ├── entry
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── i18n
│ │ │ │ │ ├── checkObj-en-us.ts
│ │ │ │ │ └── checkObj-zh-cn.ts
│ │ │ │ └── result
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── const
│ │ │ │ └── entry
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── http
│ │ │ │ ├── entry
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── i18n
│ │ │ │ │ ├── http-en-us.ts
│ │ │ │ │ └── http-zh-cn.ts
│ │ │ │ └── result
│ │ │ │ │ ├── HttpRes.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── sleep
│ │ │ │ ├── entry
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── i18n
│ │ │ │ │ ├── sleep-en-us.ts
│ │ │ │ │ └── sleep-zh-cn.ts
│ │ │ │ └── result
│ │ │ │ │ └── index.tsx
│ │ │ │ └── sql
│ │ │ │ ├── entry
│ │ │ │ └── index.tsx
│ │ │ │ ├── i18n
│ │ │ │ ├── sql-en-us.ts
│ │ │ │ └── sql-zh-cn.ts
│ │ │ │ └── result
│ │ │ │ └── index.tsx
│ │ └── base
│ │ │ ├── BasePage
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ │ ├── BrandLogo
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ │ ├── Contact
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ │ ├── Draggable
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ │ ├── Empty
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ │ ├── Iconfont
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ │ ├── Loading
│ │ │ ├── LazyLoading
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── Loading
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── LoadingContent
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── LoadingGracile
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ └── LoadingLiquid
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── MenuLabel
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ │ ├── Modal
│ │ │ └── BaseModal
│ │ │ │ └── index.tsx
│ │ │ ├── MyNotification
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ │ ├── StateIndicator
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ │ ├── Tabs
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ │ └── TextHighlighter
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ ├── constants
│ │ ├── common.ts
│ │ ├── console.ts
│ │ ├── index.ts
│ │ ├── table.ts
│ │ └── theme.ts
│ ├── electron
│ │ ├── ipcRenderer.js
│ │ └── main.js
│ ├── hooks
│ │ ├── getConnection.ts
│ │ ├── index.ts
│ │ ├── useClickAndDoubleClick.ts
│ │ ├── useEventSource.ts
│ │ ├── useFocusData.ts
│ │ ├── usePollRequestService.ts
│ │ ├── useTheme.ts
│ │ └── useUpdateEffect.ts
│ ├── i18n
│ │ ├── en-us
│ │ │ ├── caseUS.ts
│ │ │ ├── common.ts
│ │ │ ├── index.ts
│ │ │ ├── login.ts
│ │ │ ├── menu.ts
│ │ │ ├── setting.ts
│ │ │ └── testhub.ts
│ │ ├── index.tsx
│ │ └── zh-cn
│ │ │ ├── caseCN.ts
│ │ │ ├── common.ts
│ │ │ ├── index.ts
│ │ │ ├── login.ts
│ │ │ ├── menu.ts
│ │ │ ├── setting.ts
│ │ │ └── testhub.ts
│ ├── layouts
│ │ ├── GlobalLayout
│ │ │ ├── ServerLoading
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ └── init
│ │ │ ├── GlobalComponent.tsx
│ │ │ ├── init.ts
│ │ │ ├── registerMessage.ts
│ │ │ └── registerNotification.ts
│ ├── models
│ │ ├── appPage.ts
│ │ ├── casePage.ts
│ │ ├── httpPage.ts
│ │ └── testPage.ts
│ ├── pages
│ │ ├── demo
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ ├── document.ejs
│ │ ├── login
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ └── main
│ │ │ ├── case
│ │ │ ├── components
│ │ │ │ ├── CaseConsole
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── CaseLeft
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── CaseAdd
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ ├── TreeAdd
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ └── TreeRename
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── CaseRight
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── caseResult
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── caseResultLeft
│ │ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ └── caseResultRight
│ │ │ │ │ │ │ ├── index.less
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ └── caseRunParam
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ │ ├── http
│ │ │ ├── components
│ │ │ │ ├── HttpConsole
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── HttpLeft
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── ApiAdd
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ ├── TreeAdd
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ │ └── TreeRename
│ │ │ │ │ │ │ └── index.tsx
│ │ │ │ │ └── index.tsx
│ │ │ │ └── HttpRigth
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ │ ├── index.less
│ │ │ ├── index.tsx
│ │ │ ├── meta
│ │ │ ├── components
│ │ │ │ ├── MetaLeft
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ ├── MetaRight
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ └── container
│ │ │ │ │ ├── actionPool
│ │ │ │ │ ├── env.tsx
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ │ │ └── paramPool
│ │ │ │ │ ├── env.tsx
│ │ │ │ │ ├── index.less
│ │ │ │ │ └── index.tsx
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ │ ├── store
│ │ │ ├── connection
│ │ │ │ └── index.ts
│ │ │ ├── main
│ │ │ │ └── index.ts
│ │ │ └── monaco
│ │ │ │ └── index.ts
│ │ │ ├── test
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ │ │ └── tools
│ │ │ ├── components
│ │ │ ├── Tools
│ │ │ │ └── FileSearch
│ │ │ │ │ ├── index.less
│ │ │ │ │ ├── index.tsx
│ │ │ │ │ └── store.ts
│ │ │ ├── ToolsLeft
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ └── ToolsRight
│ │ │ │ ├── index.less
│ │ │ │ └── index.tsx
│ │ │ ├── index.less
│ │ │ └── index.tsx
│ ├── service
│ │ ├── base.ts
│ │ ├── caseApi.ts
│ │ ├── config.ts
│ │ ├── plugins
│ │ │ └── http
│ │ │ │ └── httpApi.ts
│ │ ├── project.ts
│ │ ├── system.ts
│ │ ├── treeApi.ts
│ │ └── user.ts
│ ├── store
│ │ ├── common
│ │ │ ├── components.ts
│ │ │ ├── copyFocusedContent.ts
│ │ │ └── index.ts
│ │ └── setting
│ │ │ └── index.ts
│ ├── styles
│ │ ├── antd.less
│ │ ├── common.less
│ │ ├── global.less
│ │ └── var.less
│ ├── theme
│ │ ├── background
│ │ │ ├── dark.ts
│ │ │ └── light.ts
│ │ ├── common.ts
│ │ ├── custom
│ │ │ ├── dark.less
│ │ │ └── light.less
│ │ └── index.ts
│ ├── typings
│ │ ├── client
│ │ │ ├── index.ts
│ │ │ └── testHub.ts
│ │ ├── common.ts
│ │ ├── index.ts
│ │ ├── main.ts
│ │ ├── server
│ │ │ ├── base.ts
│ │ │ ├── case.ts
│ │ │ ├── execution.ts
│ │ │ ├── index.ts
│ │ │ ├── plugins
│ │ │ │ ├── app.ts
│ │ │ │ ├── http.ts
│ │ │ │ └── index.ts
│ │ │ ├── project.ts
│ │ │ └── user.ts
│ │ ├── theme.ts
│ │ └── tree.ts
│ └── utils
│ │ ├── check.ts
│ │ ├── date.ts
│ │ ├── index.ts
│ │ ├── localStorage.ts
│ │ └── webpack.ts
├── tsconfig.json
├── typings.d.ts
└── yarn.lock
├── TestHub-demo
├── TestHubDemo
│ ├── demo备份
│ │ └── h2db.mv.db
│ ├── docker-compose.yaml
│ └── env
│ │ ├── pgsql
│ │ └── init.sql
│ │ └── testhub
│ │ └── data
│ │ └── db
│ │ └── data
│ │ └── h2db.mv.db
├── server
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ └── com
│ │ │ └── goddess
│ │ │ └── server
│ │ │ ├── SpringbootMybatisplusApplication.java
│ │ │ ├── controller
│ │ │ └── OrderController.java
│ │ │ ├── dao
│ │ │ ├── AccountMapper.java
│ │ │ └── OrderMapper.java
│ │ │ ├── dto
│ │ │ └── XmlData.java
│ │ │ ├── entity
│ │ │ ├── Account.java
│ │ │ └── Order.java
│ │ │ └── util
│ │ │ └── IdGenerator.java
│ │ └── resources
│ │ ├── application.yml
│ │ └── mapper
│ │ ├── AccountMapper.xml
│ │ └── OrderMapper.xml
└── serverDocker
│ ├── backend
│ └── application.yml
│ ├── build_and_push.sh
│ └── dockerfile
├── TestHub-doc
├── .gitignore
├── package.json
├── pnpm-lock.yaml
├── src
│ ├── .vuepress
│ │ ├── build_and_push.sh
│ │ ├── config.ts
│ │ ├── dockerfile
│ │ ├── navbar.ts
│ │ ├── public
│ │ │ ├── assets
│ │ │ │ ├── icon
│ │ │ │ │ ├── apple-icon-152.png
│ │ │ │ │ ├── chrome-192.png
│ │ │ │ │ ├── chrome-512.png
│ │ │ │ │ ├── chrome-mask-192.png
│ │ │ │ │ ├── chrome-mask-512.png
│ │ │ │ │ ├── guide-maskable.png
│ │ │ │ │ └── ms-icon-144.png
│ │ │ │ └── image
│ │ │ │ │ ├── advanced.svg
│ │ │ │ │ ├── blog.svg
│ │ │ │ │ ├── box.svg
│ │ │ │ │ ├── features.svg
│ │ │ │ │ ├── github-dark.svg
│ │ │ │ │ ├── github-light.svg
│ │ │ │ │ ├── layout.svg
│ │ │ │ │ └── markdown.svg
│ │ │ ├── contact.jpeg
│ │ │ ├── demo
│ │ │ │ ├── antiocn.png
│ │ │ │ ├── check.png
│ │ │ │ ├── check_loop.png
│ │ │ │ ├── check_obj.png
│ │ │ │ ├── const.png
│ │ │ │ ├── convert.png
│ │ │ │ ├── cutoff.png
│ │ │ │ ├── demo.png
│ │ │ │ ├── http.png
│ │ │ │ ├── sleep.png
│ │ │ │ ├── sql.png
│ │ │ │ └── sqldmi.png
│ │ │ ├── favicon.ico
│ │ │ ├── images
│ │ │ │ ├── build
│ │ │ │ │ └── 表达式.jpg
│ │ │ │ ├── friends
│ │ │ │ │ └── link
│ │ │ │ │ │ ├── Binlog4j.png
│ │ │ │ │ │ ├── Disjob.png
│ │ │ │ │ │ ├── cloudeon.png
│ │ │ │ │ │ ├── cubic.png
│ │ │ │ │ │ ├── dantecloud-logo.png
│ │ │ │ │ │ ├── disjob-2.png
│ │ │ │ │ │ ├── dromara.png
│ │ │ │ │ │ ├── dynamic-tp.png
│ │ │ │ │ │ ├── easy-es2.png
│ │ │ │ │ │ ├── fast-request.gif
│ │ │ │ │ │ ├── fast-request.png
│ │ │ │ │ │ ├── file4j.png
│ │ │ │ │ │ ├── forest-logo.png
│ │ │ │ │ │ ├── gobrsasync-logo.png
│ │ │ │ │ │ ├── goview-logo.png
│ │ │ │ │ │ ├── hertzbeat-logo.png
│ │ │ │ │ │ ├── hmily.png
│ │ │ │ │ │ ├── hodor.png
│ │ │ │ │ │ ├── hutool2.png
│ │ │ │ │ │ ├── imagecombiner-logo.png
│ │ │ │ │ │ ├── jpom.png
│ │ │ │ │ │ ├── koalas-rpc2.png
│ │ │ │ │ │ ├── liteflow2.png
│ │ │ │ │ │ ├── maxkey.png
│ │ │ │ │ │ ├── maxkey3.png
│ │ │ │ │ │ ├── mayfly-go.png
│ │ │ │ │ │ ├── mendmix.png
│ │ │ │ │ │ ├── myth.png
│ │ │ │ │ │ ├── northstar_logo.png
│ │ │ │ │ │ ├── raincat.png
│ │ │ │ │ │ ├── ruoyi-plus.png
│ │ │ │ │ │ ├── sa-token.png
│ │ │ │ │ │ ├── shenyu.svg
│ │ │ │ │ │ ├── sms4j.png
│ │ │ │ │ │ ├── sureness.png
│ │ │ │ │ │ ├── test-hub-heng.png
│ │ │ │ │ │ ├── tlog2.png
│ │ │ │ │ │ ├── wemq.png
│ │ │ │ │ │ ├── wiki-logo.png
│ │ │ │ │ │ ├── xeasypdf-logo.png
│ │ │ │ │ │ └── yft-design.png
│ │ │ │ ├── global
│ │ │ │ │ ├── 参数覆盖规则.jpg
│ │ │ │ │ └── 行为覆盖规则.jpg
│ │ │ │ └── logDesc
│ │ │ │ │ ├── 1_0_2
│ │ │ │ │ ├── 全局行为.jpg
│ │ │ │ │ ├── 环境级参数.jpg
│ │ │ │ │ ├── 退出登陆.jpg
│ │ │ │ │ └── 选择环境.jpg
│ │ │ │ │ └── 1_0_4
│ │ │ │ │ ├── jiansuo.jpg
│ │ │ │ │ ├── tabs.jpg
│ │ │ │ │ └── yidong.jpg
│ │ │ ├── logo.png
│ │ │ └── logo.svg
│ │ ├── sidebar.ts
│ │ ├── styles
│ │ │ ├── config.scss
│ │ │ ├── index.scss
│ │ │ └── palette.scss
│ │ └── theme.ts
│ ├── README.md
│ ├── ability
│ │ ├── README.md
│ │ ├── check.md
│ │ ├── checkobj.md
│ │ ├── const.md
│ │ ├── convert.md
│ │ ├── http.md
│ │ ├── sleep.md
│ │ └── sql.md
│ ├── custom
│ │ ├── README.md
│ │ ├── base.md
│ │ └── extend.md
│ ├── global
│ │ └── README.md
│ ├── group.md
│ ├── issue.md
│ ├── log.md
│ ├── logDesc
│ │ ├── 1_0_2.md
│ │ └── 1_0_4.md
│ ├── principle
│ │ ├── README.md
│ │ ├── datatype.md
│ │ ├── expression.md
│ │ ├── function.md
│ │ └── operand.md
│ └── slides.md
└── yarn.lock
├── TestHub-docker
├── backend
│ ├── application.yml
│ └── config
│ │ └── logback-spring.xml
├── build_and_push.sh
├── dockerfile
├── frontend
│ ├── 174.1dd360cb.async.js
│ ├── 261.3cb8403b.async.js
│ ├── 359.99bc372a.async.js
│ ├── 377.d436d266.async.js
│ ├── 571.238148b3.async.js
│ ├── 665.22c46b9d.async.js
│ ├── 778.cb2b4a7d.async.js
│ ├── 880.c5f0499b.async.js
│ ├── 902.89162dd9.async.js
│ ├── 961.e343c808.async.js
│ ├── 967.5b6e12b1.async.js
│ ├── 978.86e09468.async.js
│ ├── 996.a38e64f9.async.js
│ ├── editor.worker.js
│ ├── html.worker.js
│ ├── index.html
│ ├── json.worker.js
│ ├── layouts__GlobalLayout__index.696dbead.chunk.css
│ ├── logo.ico
│ ├── p__demo__index.d115d76a.async.js
│ ├── p__demo__index.f735e0fb.chunk.css
│ ├── p__login__index.0885e91e.chunk.css
│ ├── p__login__index.46a5c138.async.js
│ ├── p__main__index.e52c5db4.chunk.css
│ ├── static
│ │ ├── codicon.ecfbfe4b.ttf
│ │ ├── contact.6e1d01ef.jpeg
│ │ ├── iconfont.302ebffe.woff
│ │ ├── iconfont.8290aa03.ttf
│ │ ├── iconfont.ae8e71c5.woff2
│ │ ├── login-bg.e6f3ac5d.svg
│ │ └── logo.5eb2613d.webp
│ └── umi.0cbef2e1.css
└── nginx.conf
├── TestHub-electron
├── LICENSE
├── README.md
├── README.zh-CN.md
├── build.sh
├── build
│ ├── icons
│ │ ├── 256x256.png
│ │ ├── 32x32.png
│ │ ├── 512x512.png
│ │ ├── 64x64.png
│ │ └── icon.png
│ └── script
│ │ └── installer.nsh
├── electron
│ ├── addon
│ │ ├── autoUpdater
│ │ │ └── index.js
│ │ ├── awaken
│ │ │ └── index.js
│ │ ├── chromeExtension
│ │ │ └── index.js
│ │ ├── javaServer
│ │ │ ├── index.js
│ │ │ ├── ps.js
│ │ │ └── server.js
│ │ ├── security
│ │ │ └── index.js
│ │ └── tray
│ │ │ └── index.js
│ ├── config
│ │ ├── builder.json
│ │ ├── config.default.js
│ │ ├── config.local.js
│ │ ├── config.prod.js
│ │ ├── encrypt.js
│ │ └── nodemon.json
│ ├── controller
│ │ ├── example.js
│ │ └── framework.js
│ ├── index.js
│ ├── jobs
│ │ └── example
│ │ │ ├── hello.js
│ │ │ └── timer.js
│ ├── preload
│ │ ├── bridge.js
│ │ └── index.js
│ └── service
│ │ └── example.js
├── main.js
├── package.json
├── public
│ ├── html
│ │ └── view_example.html
│ ├── images
│ │ ├── 1tray.png
│ │ ├── logo-32.png
│ │ ├── logo.png
│ │ └── tray.png
│ └── ssl
│ │ ├── localhost+1.key
│ │ └── localhost+1.pem
├── test.sh
└── yarn.lock
├── TestHub-server
├── .gitignore
├── pom.xml
├── testhub-framework
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── org
│ │ └── dromara
│ │ └── testhub
│ │ └── framework
│ │ ├── aop
│ │ └── LogAspect.java
│ │ ├── config
│ │ ├── AsyncConfig.java
│ │ ├── CorsConfig.java
│ │ ├── DruidConfig.java
│ │ ├── ImageWebAppConfig.java
│ │ ├── SaTokenConfigure.java
│ │ ├── Swagger3Config.java
│ │ ├── WebDataConfigurer.java
│ │ ├── WebInterceptorConfig.java
│ │ ├── WebSocketConfig.java
│ │ └── WebViewConfig.java
│ │ ├── exception
│ │ ├── AppException.java
│ │ └── TestHubException.java
│ │ ├── exceptionHandler
│ │ ├── AppExceptionHandler.java
│ │ ├── ErrorCode.java
│ │ └── ValidMsg.java
│ │ ├── interceptor
│ │ ├── ExtraParam.java
│ │ ├── ExtraParamInterceptor.java
│ │ └── ExtraParamUtil.java
│ │ ├── mybatis
│ │ ├── BasePo.java
│ │ ├── IBaseMapper.java
│ │ ├── MyMetaObjectHandler.java
│ │ └── QueryParamUtils.java
│ │ ├── trace
│ │ ├── TraceInterceptor.java
│ │ └── WebConfig.java
│ │ ├── util
│ │ ├── ContextManager.java
│ │ ├── DateUtil.java
│ │ ├── FileUtil.java
│ │ ├── IdGenerator.java
│ │ ├── Key.java
│ │ ├── ListUtils.java
│ │ ├── SnowFlakeGenerator.java
│ │ ├── SpringBootBeanUtils.java
│ │ ├── SpringUtil.java
│ │ └── UserUtil.java
│ │ └── web
│ │ ├── PageResult.java
│ │ ├── ResultResponse.java
│ │ └── dto
│ │ ├── IRequestDto.java
│ │ └── IResponseDto.java
├── testhub-nsrule
│ ├── nsrule-core
│ │ ├── antlr4
│ │ │ └── Formula.g4
│ │ ├── pom.xml
│ │ └── src
│ │ │ ├── main
│ │ │ ├── java
│ │ │ │ └── org
│ │ │ │ │ └── dromara
│ │ │ │ │ └── testhub
│ │ │ │ │ └── nsrule
│ │ │ │ │ └── core
│ │ │ │ │ ├── constant
│ │ │ │ │ ├── ConstantUtil.java
│ │ │ │ │ ├── ExceptionCode.java
│ │ │ │ │ ├── RuleConstant.java
│ │ │ │ │ └── RuleException.java
│ │ │ │ │ ├── eventbus
│ │ │ │ │ ├── AsyncEventBus.java
│ │ │ │ │ ├── EventBus.java
│ │ │ │ │ ├── EventMessage.java
│ │ │ │ │ ├── EventType.java
│ │ │ │ │ ├── ObserverAction.java
│ │ │ │ │ ├── ObserverRegistry.java
│ │ │ │ │ └── Subscribe.java
│ │ │ │ │ ├── executer
│ │ │ │ │ ├── context
│ │ │ │ │ │ ├── Context.java
│ │ │ │ │ │ ├── DefContext.java
│ │ │ │ │ │ ├── JudgeData.java
│ │ │ │ │ │ ├── JudgePath.java
│ │ │ │ │ │ ├── MetaContext.java
│ │ │ │ │ │ ├── RuleConfig.java
│ │ │ │ │ │ └── RuleProject.java
│ │ │ │ │ ├── meta
│ │ │ │ │ │ ├── MetaClass.java
│ │ │ │ │ │ ├── MetaEnum.java
│ │ │ │ │ │ ├── MetaJavaType.java
│ │ │ │ │ │ ├── MetaObject.java
│ │ │ │ │ │ └── MetaProperty.java
│ │ │ │ │ ├── mode
│ │ │ │ │ │ ├── BaseDataPo.java
│ │ │ │ │ │ ├── BasePo.java
│ │ │ │ │ │ ├── Rule.java
│ │ │ │ │ │ ├── base
│ │ │ │ │ │ │ ├── BaseLog.java
│ │ │ │ │ │ │ ├── Result.java
│ │ │ │ │ │ │ ├── action
│ │ │ │ │ │ │ │ ├── Action.java
│ │ │ │ │ │ │ │ ├── DoExecute.java
│ │ │ │ │ │ │ │ ├── Execute.java
│ │ │ │ │ │ │ │ ├── Inject.java
│ │ │ │ │ │ │ │ ├── Mapping.java
│ │ │ │ │ │ │ │ ├── Param.java
│ │ │ │ │ │ │ │ ├── RunState.java
│ │ │ │ │ │ │ │ └── Util.java
│ │ │ │ │ │ │ ├── bound
│ │ │ │ │ │ │ │ ├── Bound.java
│ │ │ │ │ │ │ │ └── FreeMarker.java
│ │ │ │ │ │ │ ├── formula
│ │ │ │ │ │ │ │ ├── ArithmeticNode.java
│ │ │ │ │ │ │ │ ├── DataNode.java
│ │ │ │ │ │ │ │ ├── FormulaNode.java
│ │ │ │ │ │ │ │ ├── FuncNode.java
│ │ │ │ │ │ │ │ ├── MixNode.java
│ │ │ │ │ │ │ │ ├── PathNode.java
│ │ │ │ │ │ │ │ ├── antlr
│ │ │ │ │ │ │ │ │ ├── Formula.interp
│ │ │ │ │ │ │ │ │ ├── Formula.tokens
│ │ │ │ │ │ │ │ │ ├── FormulaBaseListener.java
│ │ │ │ │ │ │ │ │ ├── FormulaBaseVisitor.java
│ │ │ │ │ │ │ │ │ ├── FormulaLexer.interp
│ │ │ │ │ │ │ │ │ ├── FormulaLexer.java
│ │ │ │ │ │ │ │ │ ├── FormulaLexer.tokens
│ │ │ │ │ │ │ │ │ ├── FormulaListener.java
│ │ │ │ │ │ │ │ │ ├── FormulaParser.java
│ │ │ │ │ │ │ │ │ └── FormulaVisitor.java
│ │ │ │ │ │ │ │ ├── ast
│ │ │ │ │ │ │ │ │ ├── ASTTransformVisitor.java
│ │ │ │ │ │ │ │ │ └── MyErrorListener.java
│ │ │ │ │ │ │ │ └── log
│ │ │ │ │ │ │ │ │ ├── ArithmeticLog.java
│ │ │ │ │ │ │ │ │ ├── DataLog.java
│ │ │ │ │ │ │ │ │ ├── FormulaLog.java
│ │ │ │ │ │ │ │ │ ├── MinLog.java
│ │ │ │ │ │ │ │ │ ├── PathItemLog.java
│ │ │ │ │ │ │ │ │ └── PathLog.java
│ │ │ │ │ │ │ └── function
│ │ │ │ │ │ │ │ ├── FunctionHandler.java
│ │ │ │ │ │ │ │ ├── FunctionHandlerFactory.java
│ │ │ │ │ │ │ │ └── impl
│ │ │ │ │ │ │ │ ├── FunctionAdd.java
│ │ │ │ │ │ │ │ ├── FunctionDiv.java
│ │ │ │ │ │ │ │ ├── FunctionLength.java
│ │ │ │ │ │ │ │ ├── FunctionMult.java
│ │ │ │ │ │ │ │ ├── FunctionSize.java
│ │ │ │ │ │ │ │ └── FunctionSub.java
│ │ │ │ │ │ └── ruleLine
│ │ │ │ │ │ │ ├── Expression.java
│ │ │ │ │ │ │ ├── JavaActuator.java
│ │ │ │ │ │ │ └── RuleLine.java
│ │ │ │ │ └── operation
│ │ │ │ │ │ ├── Operation.java
│ │ │ │ │ │ ├── OperationFactory.java
│ │ │ │ │ │ └── impl
│ │ │ │ │ │ ├── compose
│ │ │ │ │ │ ├── Ge.java
│ │ │ │ │ │ ├── Le.java
│ │ │ │ │ │ ├── Like.java
│ │ │ │ │ │ ├── Nbe.java
│ │ │ │ │ │ ├── Nbed.java
│ │ │ │ │ │ ├── Neq.java
│ │ │ │ │ │ ├── Neqd.java
│ │ │ │ │ │ ├── Nin.java
│ │ │ │ │ │ └── Nn.java
│ │ │ │ │ │ └── simple
│ │ │ │ │ │ ├── Be.java
│ │ │ │ │ │ ├── Bed.java
│ │ │ │ │ │ ├── Bel.java
│ │ │ │ │ │ ├── Ber.java
│ │ │ │ │ │ ├── En.java
│ │ │ │ │ │ ├── Eq.java
│ │ │ │ │ │ ├── Eqd.java
│ │ │ │ │ │ ├── Gt.java
│ │ │ │ │ │ ├── In.java
│ │ │ │ │ │ └── Lt.java
│ │ │ │ │ ├── expand
│ │ │ │ │ ├── FormulaBuilder.java
│ │ │ │ │ └── impl
│ │ │ │ │ │ ├── DefaultFormulaBuilder.java
│ │ │ │ │ │ └── DoExecuteFactory.java
│ │ │ │ │ ├── parser
│ │ │ │ │ ├── ActionParser.java
│ │ │ │ │ ├── BoundParser.java
│ │ │ │ │ ├── BoundParser2.java
│ │ │ │ │ ├── BoundParserFreeMarker.java
│ │ │ │ │ ├── ExecuteParser.java
│ │ │ │ │ ├── RuleConfigBuilder.java
│ │ │ │ │ └── RuleParser.java
│ │ │ │ │ └── util
│ │ │ │ │ └── DataCheckUtil.java
│ │ │ └── resources
│ │ │ │ ├── META-INF
│ │ │ │ └── services
│ │ │ │ │ └── org.dromara.testhub.nsrule.core.executer.mode.base.function.FunctionHandler
│ │ │ │ └── demo
│ │ │ │ ├── Demo.g4
│ │ │ │ ├── Formula2.g4
│ │ │ │ ├── Formula3.g4
│ │ │ │ └── Formula4.g4
│ │ │ └── test
│ │ │ └── java
│ │ │ └── org
│ │ │ └── dromara
│ │ │ └── testhub
│ │ │ └── nsrule
│ │ │ └── core
│ │ │ └── executer
│ │ │ └── mode
│ │ │ └── base
│ │ │ └── formula
│ │ │ └── FormulaTest.java
│ ├── nsrule-flow
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── org
│ │ │ └── dromara
│ │ │ └── testhub
│ │ │ └── nsrule
│ │ │ └── flow
│ │ │ └── model
│ │ │ ├── Flow.java
│ │ │ ├── FlowContext.java
│ │ │ └── RuleFlow.java
│ ├── nsrule-graph
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ └── java
│ │ │ └── org
│ │ │ └── dromara
│ │ │ └── testhub
│ │ │ └── nsrule
│ │ │ └── graph
│ │ │ ├── constant
│ │ │ └── Constant.java
│ │ │ └── model
│ │ │ ├── Branch.java
│ │ │ ├── DecisionResult.java
│ │ │ ├── Graph.java
│ │ │ ├── GraphContext.java
│ │ │ ├── Link.java
│ │ │ ├── Result.java
│ │ │ └── RuleGraph.java
│ ├── nsrule-xml
│ │ ├── pom.xml
│ │ └── src
│ │ │ ├── main
│ │ │ └── java
│ │ │ │ └── org
│ │ │ │ └── dromara
│ │ │ │ └── testhub
│ │ │ │ └── nsrule
│ │ │ │ └── parserXml
│ │ │ │ ├── XMLRuleConfigBuilder.java
│ │ │ │ ├── XMLRuleParser.java
│ │ │ │ ├── XmlActionDefaultParser.java
│ │ │ │ ├── XmlBoundParser.java
│ │ │ │ └── XmlExecuteDefaultParser.java
│ │ │ └── test
│ │ │ └── java
│ │ │ ├── JsonPtahTest.java
│ │ │ └── Main.java
│ └── pom.xml
├── testhub-plugins
│ ├── plugins-check
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ ├── java
│ │ │ └── org
│ │ │ │ └── dromara
│ │ │ │ └── testhub
│ │ │ │ └── plugins
│ │ │ │ └── check
│ │ │ │ └── actions
│ │ │ │ ├── CheckDTOConvertor.java
│ │ │ │ ├── CheckExecuteResultHandler.java
│ │ │ │ ├── CheckJsonExecuteParser.java
│ │ │ │ ├── CheckPlugin.java
│ │ │ │ ├── CheckXMLExecuteParser.java
│ │ │ │ ├── dto
│ │ │ │ ├── CheckExecuteResult.java
│ │ │ │ ├── CheckResultDto.java
│ │ │ │ └── RuleCheckItemResDto.java
│ │ │ │ └── model
│ │ │ │ ├── CheckItem.java
│ │ │ │ ├── CheckParamResult.java
│ │ │ │ └── TestHubExecuteCheck.java
│ │ │ └── resources
│ │ │ └── META-INF
│ │ │ └── services
│ │ │ └── org.dromara.testhub.sdk.action.Plugin
│ ├── plugins-compare
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ ├── java
│ │ │ └── org
│ │ │ │ └── dromara
│ │ │ │ └── testhub
│ │ │ │ └── plugins
│ │ │ │ └── compare
│ │ │ │ └── actions
│ │ │ │ ├── CheckObjExecuteResultHandler.java
│ │ │ │ ├── CheckObjJsonExecuteParser.java
│ │ │ │ ├── CheckObjPlugin.java
│ │ │ │ ├── CheckObjXMLExecuteParser.java
│ │ │ │ ├── dto
│ │ │ │ ├── CheckObjExecuteResult.java
│ │ │ │ └── CheckObjResultDto.java
│ │ │ │ ├── model
│ │ │ │ ├── CheckObj.java
│ │ │ │ ├── CheckResultObj.java
│ │ │ │ └── TestHubExecuteCheckObj.java
│ │ │ │ └── util
│ │ │ │ └── DiffTool.java
│ │ │ └── resources
│ │ │ └── META-INF
│ │ │ └── services
│ │ │ └── org.dromara.testhub.sdk.action.Plugin
│ ├── plugins-constant
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ ├── java
│ │ │ └── org
│ │ │ │ └── dromara
│ │ │ │ └── testhub
│ │ │ │ └── plugins
│ │ │ │ └── constant
│ │ │ │ └── actions
│ │ │ │ ├── ConstDTOConvertor.java
│ │ │ │ ├── ConstJsonActionParser.java
│ │ │ │ ├── ConstPlugin.java
│ │ │ │ ├── ConstXMLActionParser.java
│ │ │ │ └── model
│ │ │ │ └── TestHubActionConst.java
│ │ │ └── resources
│ │ │ └── META-INF
│ │ │ └── services
│ │ │ └── org.dromara.testhub.sdk.action.Plugin
│ ├── plugins-convert
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ ├── java
│ │ │ └── org
│ │ │ │ └── dromara
│ │ │ │ └── testhub
│ │ │ │ └── plugins
│ │ │ │ └── convert
│ │ │ │ └── actions
│ │ │ │ ├── ConvertJsonActionParser.java
│ │ │ │ ├── ConvertPlugin.java
│ │ │ │ ├── ConvertXMLActionParser.java
│ │ │ │ ├── model
│ │ │ │ ├── Convert.java
│ │ │ │ └── TestHubActionConvert.java
│ │ │ │ └── util
│ │ │ │ └── JSONAttrUtil.java
│ │ │ └── resources
│ │ │ └── META-INF
│ │ │ └── services
│ │ │ └── org.dromara.testhub.sdk.action.Plugin
│ ├── plugins-http
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ ├── java
│ │ │ └── org
│ │ │ │ └── dromara
│ │ │ │ └── testhub
│ │ │ │ └── plugins
│ │ │ │ └── http
│ │ │ │ ├── HttpConstant.java
│ │ │ │ ├── actions
│ │ │ │ ├── HttpDTOConvertor.java
│ │ │ │ ├── HttpJsonActionParser.java
│ │ │ │ ├── HttpJsonExecuteParser.java
│ │ │ │ ├── HttpPlugin.java
│ │ │ │ ├── HttpXMLActionParser.java
│ │ │ │ ├── HttpXMLExecuteParser.java
│ │ │ │ └── model
│ │ │ │ │ ├── Body.java
│ │ │ │ │ ├── TestHubActionHttp.java
│ │ │ │ │ └── TestHubExecuteHttp.java
│ │ │ │ ├── core
│ │ │ │ ├── HttpModel.java
│ │ │ │ ├── ResData.java
│ │ │ │ └── SendHttp.java
│ │ │ │ └── server
│ │ │ │ ├── convert
│ │ │ │ ├── ApiConvert.java
│ │ │ │ └── HttpTreeNodeConvert.java
│ │ │ │ ├── domain
│ │ │ │ ├── HttpContext.java
│ │ │ │ └── service
│ │ │ │ │ ├── HttpTreeService.java
│ │ │ │ │ └── impl
│ │ │ │ │ └── HttpTreeServiceImpl.java
│ │ │ │ ├── dto
│ │ │ │ ├── HttpApiReqDto.java
│ │ │ │ ├── HttpApiResDto.java
│ │ │ │ ├── HttpApiSendResDto.java
│ │ │ │ ├── HttpDirDto.java
│ │ │ │ └── HttpRenameDto.java
│ │ │ │ ├── repository
│ │ │ │ ├── dao
│ │ │ │ │ └── HttpTreeNodeMapper.java
│ │ │ │ └── po
│ │ │ │ │ └── HttpTreeNodePo.java
│ │ │ │ ├── rest
│ │ │ │ └── HttpController.java
│ │ │ │ └── util
│ │ │ │ └── TreeUtil.java
│ │ │ └── resources
│ │ │ ├── META-INF
│ │ │ └── services
│ │ │ │ └── org.dromara.testhub.sdk.action.Plugin
│ │ │ ├── config
│ │ │ └── migration
│ │ │ │ ├── h2
│ │ │ │ └── V1_0_4__初始化HTTP.sql
│ │ │ │ └── pgsql
│ │ │ │ └── V1_0_4__初始化HTTP.sql
│ │ │ └── mapper
│ │ │ └── HttpTreeNodeMapper.xml
│ ├── plugins-sleep
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ ├── java
│ │ │ └── org
│ │ │ │ └── dromara
│ │ │ │ └── testhub
│ │ │ │ └── plugins
│ │ │ │ └── sleep
│ │ │ │ └── actions
│ │ │ │ ├── SleepDTOConvertor.java
│ │ │ │ ├── SleepJsonExecuteParser.java
│ │ │ │ ├── SleepPlugin.java
│ │ │ │ ├── SleepXMLExecuteParser.java
│ │ │ │ └── model
│ │ │ │ └── TestHubExecuteSleep.java
│ │ │ └── resources
│ │ │ └── META-INF
│ │ │ └── services
│ │ │ └── org.dromara.testhub.sdk.action.Plugin
│ ├── plugins-sql
│ │ ├── pom.xml
│ │ └── src
│ │ │ └── main
│ │ │ ├── java
│ │ │ └── org
│ │ │ │ └── dromara
│ │ │ │ └── testhub
│ │ │ │ └── plugins
│ │ │ │ └── sql
│ │ │ │ └── actions
│ │ │ │ ├── SqlBeginPlugin.java
│ │ │ │ ├── SqlCommitPlugin.java
│ │ │ │ ├── SqlDTOConvertor.java
│ │ │ │ ├── SqlJsonActionParser.java
│ │ │ │ ├── SqlJsonExecuteParser.java
│ │ │ │ ├── SqlPlugin.java
│ │ │ │ ├── SqlXMLActionParser.java
│ │ │ │ ├── SqlXMLExecuteParser.java
│ │ │ │ ├── core
│ │ │ │ └── ConnectionManager.java
│ │ │ │ └── model
│ │ │ │ ├── TestHubActionSql.java
│ │ │ │ └── TestHubExecuteSql.java
│ │ │ └── resources
│ │ │ └── META-INF
│ │ │ └── services
│ │ │ └── org.dromara.testhub.sdk.action.Plugin
│ └── pom.xml
├── testhub-sdk
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── org
│ │ └── dromara
│ │ └── testhub
│ │ └── sdk
│ │ └── action
│ │ ├── BaseActionExecute.java
│ │ ├── BaseDTOConvertor.java
│ │ ├── BaseExecuteResultHandler.java
│ │ ├── BaseJsonActionParser.java
│ │ ├── BaseJsonExecuteParser.java
│ │ ├── BaseRuleEndHandler.java
│ │ ├── BaseXMLActionParser.java
│ │ ├── BaseXMLExecuteParser.java
│ │ ├── ExpressionConvertor.java
│ │ ├── Plugin.java
│ │ ├── PluginClassLoader.java
│ │ ├── PluginFactory.java
│ │ ├── convert
│ │ └── BaseConvert.java
│ │ ├── dto
│ │ ├── ExecuteResult.java
│ │ ├── RuleParamReqDto.java
│ │ ├── req
│ │ │ └── TreeDirDto.java
│ │ └── res
│ │ │ ├── RuleExpressionResDto.java
│ │ │ ├── RuleParamEffectiveResDto.java
│ │ │ ├── RuleParamResDto.java
│ │ │ ├── TreeNodeDataResDto.java
│ │ │ ├── TreeNodeResDto.java
│ │ │ └── TreeNodeResDto2.java
│ │ ├── model
│ │ ├── HandlerResult.java
│ │ └── rule
│ │ │ ├── TestHubAction.java
│ │ │ └── TestHubExecute.java
│ │ └── parser
│ │ ├── TestHubActionParser.java
│ │ └── TestHubExecuteParser.java
└── testhub-server
│ ├── pom.xml
│ └── src
│ └── main
│ ├── java
│ └── org
│ │ └── dromara
│ │ └── testhub
│ │ └── server
│ │ ├── TestHubApplication.java
│ │ ├── core
│ │ ├── EventObserver.java
│ │ ├── config
│ │ │ ├── RuleConfiguration.java
│ │ │ └── SchedulingConfig.java
│ │ ├── rule
│ │ │ ├── CacheManager.java
│ │ │ ├── CodeGenerateManager.java
│ │ │ ├── Constant.java
│ │ │ ├── DbManager.java
│ │ │ ├── DbRuleConfigBuilder.java
│ │ │ └── DbRuleManager.java
│ │ └── util
│ │ │ ├── CacheUtil.java
│ │ │ └── TreeUtil.java
│ │ ├── domain
│ │ ├── convert
│ │ │ ├── DbInfoConvert.java
│ │ │ ├── DbRuleConvert.java
│ │ │ ├── RuleConvertor.java
│ │ │ ├── RuleReq2Dom.java
│ │ │ ├── RuleReqConvertor.java
│ │ │ ├── TreeInfoConvert.java
│ │ │ └── VersionConvert.java
│ │ ├── dto
│ │ │ ├── all
│ │ │ │ └── http
│ │ │ │ │ ├── BodyReqDto.java
│ │ │ │ │ ├── HttpReqDto.java
│ │ │ │ │ └── edit
│ │ │ │ │ ├── HttpInfoBaseDto.java
│ │ │ │ │ ├── HttpInfoBodyDto.java
│ │ │ │ │ ├── HttpInfoKVDto.java
│ │ │ │ │ ├── HttpInfoRequestDto.java
│ │ │ │ │ ├── HttpInfoResponseDto.java
│ │ │ │ │ └── HttpInfoTreeDto.java
│ │ │ ├── req
│ │ │ │ ├── other
│ │ │ │ │ ├── InfoReqDto.java
│ │ │ │ │ ├── LoginReqDto.java
│ │ │ │ │ ├── RenameDto.java
│ │ │ │ │ ├── RuleTreeReqDto.java
│ │ │ │ │ └── TreeInfoReqDto.java
│ │ │ │ └── rule
│ │ │ │ │ ├── ExecutionXmlReqDto.java
│ │ │ │ │ ├── RuleActionReqDto.java
│ │ │ │ │ ├── RuleCheckItemReqDto.java
│ │ │ │ │ ├── RuleDelEnvironmentReqDto.java
│ │ │ │ │ ├── RuleDocumentReqDto.java
│ │ │ │ │ ├── RuleEnvironmentReqDto.java
│ │ │ │ │ ├── RuleExecuteReqDto.java
│ │ │ │ │ ├── RuleExpressionReqDto.java
│ │ │ │ │ ├── RuleFlowReqDto.java
│ │ │ │ │ ├── RuleInjectReqDto.java
│ │ │ │ │ ├── RuleMetaClassReqDto.java
│ │ │ │ │ ├── RuleMetaEnumReqDto.java
│ │ │ │ │ ├── RulePropertyReqDto.java
│ │ │ │ │ └── RuleReqDto.java
│ │ │ └── res
│ │ │ │ ├── ExecuteResult
│ │ │ │ ├── ExecutionResult.java
│ │ │ │ └── FlowResult.java
│ │ │ │ ├── other
│ │ │ │ ├── CurrentUserResDto.java
│ │ │ │ ├── LoginResDto.java
│ │ │ │ ├── UploadResDto.java
│ │ │ │ ├── UserResDto.java
│ │ │ │ └── VersionResDto.java
│ │ │ │ └── rule
│ │ │ │ ├── RuleActionResDto.java
│ │ │ │ ├── RuleCodeResDto.java
│ │ │ │ ├── RuleEnvironmentResDto.java
│ │ │ │ ├── RuleExecuteResDto.java
│ │ │ │ ├── RuleFlowResDto.java
│ │ │ │ ├── RuleInjectResDto.java
│ │ │ │ ├── RuleMappingResDto.java
│ │ │ │ ├── RuleMetaClassResDto.java
│ │ │ │ ├── RuleMetaEnumResDto.java
│ │ │ │ ├── RuleProjectResDto.java
│ │ │ │ ├── RuleProjectSimpleResDto.java
│ │ │ │ ├── RulePropertyResDto.java
│ │ │ │ └── RuleResDto.java
│ │ ├── service
│ │ │ ├── CaseService.java
│ │ │ ├── ExecutionService.java
│ │ │ ├── ProjectService.java
│ │ │ ├── SettingService.java
│ │ │ ├── SystemService.java
│ │ │ ├── TreeService.java
│ │ │ ├── UserService.java
│ │ │ └── impl
│ │ │ │ ├── CaseServiceImpl.java
│ │ │ │ ├── ExecutionServiceImpl.java
│ │ │ │ ├── ProjectServiceImpl.java
│ │ │ │ ├── SettingServiceImpl.java
│ │ │ │ ├── StpInterfaceImpl.java
│ │ │ │ ├── SystemServiceImpl.java
│ │ │ │ ├── TreeServiceImpl.java
│ │ │ │ └── UserServiceImpl.java
│ │ └── util
│ │ │ ├── BaseTreeUtil.java
│ │ │ ├── CaseTreeUtil.java
│ │ │ ├── CaseUtil.java
│ │ │ └── tree
│ │ │ └── TreeItem.java
│ │ ├── infrastructure
│ │ └── repository
│ │ │ ├── dao
│ │ │ ├── ActionMapper.java
│ │ │ ├── CodeGenerateMapper.java
│ │ │ ├── EnvironmentMapper.java
│ │ │ ├── ExecuteMapper.java
│ │ │ ├── FlowMapper.java
│ │ │ ├── InjectMapper.java
│ │ │ ├── MappingMapper.java
│ │ │ ├── MetaClassMapper.java
│ │ │ ├── MetaEnumMapper.java
│ │ │ ├── MetaPropertyMapper.java
│ │ │ ├── ParamMapper.java
│ │ │ ├── ProjectMapper.java
│ │ │ ├── RuleMapper.java
│ │ │ ├── TreeInfoMapper.java
│ │ │ ├── UserMapper.java
│ │ │ └── VersionMapper.java
│ │ │ └── po
│ │ │ ├── ActionPo.java
│ │ │ ├── CodeGeneratePo.java
│ │ │ ├── EnvironmentPo.java
│ │ │ ├── ExecutePo.java
│ │ │ ├── FlowPo.java
│ │ │ ├── InjectPo.java
│ │ │ ├── MappingPo.java
│ │ │ ├── MetaClassPo.java
│ │ │ ├── MetaEnumPo.java
│ │ │ ├── MetaPropertyPo.java
│ │ │ ├── ParamPo.java
│ │ │ ├── ProjectPo.java
│ │ │ ├── RulePo.java
│ │ │ ├── TreeInfoPo.java
│ │ │ ├── UserPo.java
│ │ │ └── VersionPo.java
│ │ ├── interfaces
│ │ ├── api
│ │ │ ├── CaseController.java
│ │ │ ├── ProjectController.java
│ │ │ ├── SystemController.java
│ │ │ ├── TreeController.java
│ │ │ └── UserController.java
│ │ └── ws
│ │ │ └── WebSocketController.java
│ │ └── startup
│ │ └── ApplicationStartup.java
│ └── resources
│ ├── application-actuator.yml
│ ├── application-h2.yml
│ ├── application-mybatisplus.yml
│ ├── application-pgsql.yml
│ ├── application-testhub.yml
│ ├── application-web.yml
│ ├── application.yml
│ ├── banner.txt
│ ├── config
│ ├── logback-spring.xml
│ └── migration
│ │ ├── h2
│ │ ├── V1_0_0__初始化.sql
│ │ ├── V1_0_1__初始化.sql
│ │ └── V1_0_2__初始化.sql
│ │ └── pgsql
│ │ ├── V1_0_0__初始化.sql
│ │ ├── V1_0_1__初始化.sql
│ │ └── V1_0_2__初始化.sql
│ └── mapper
│ ├── ActionMapper.xml
│ ├── CodeGenerateMapper.xml
│ ├── EnvironmentMapper.xml
│ ├── ExecuteMapper.xml
│ ├── FlowMapper.xml
│ ├── InjectMapper.xml
│ ├── MappingMapper.xml
│ ├── MetaClassMapper.xml
│ ├── MetaEnumMapper.xml
│ ├── MetaPropertyMapper.xml
│ ├── ParamMapper.xml
│ ├── ProjectMapper.xml
│ ├── RuleMapper.xml
│ ├── TreeInfoMapper.xml
│ ├── UserMapper.xml
│ └── VersionMapper.xml
└── TestHub-static
├── contact.jpeg
└── img
├── check.png
├── check_loop.png
├── check_obj.png
├── convert.png
├── http.png
├── logo.png
├── sql.png
├── 全局行为.jpg
├── 概览.jpg
└── 环境级参数.jpg
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | electron-egg/build/jre
3 | target/
4 | .idea
5 | server/data
6 | client/src/.umi
7 | client/node_modules
8 | electron-egg/node_modules
9 | electron-egg/out
10 | **/.flattened-pom.xml
11 | client/dist
12 | electron-egg/logs
13 | electron-egg/build/extraResources/jdk-17.0.6
14 | electron-egg/build/extraResources/TestHub.jar
15 | electron-egg/public/dist/*
16 | electron-egg/public/!dist/
17 | electron-egg/build/extraResources/data
18 | client/.vscode
19 | docker/frontend
20 | TestHub-electron/build/jre/win_jre
21 | TestHub-electron/build/jre/mac_jre
22 | TestHub-docker/frontend
23 | TestHub-electron/out
24 | TestHub-electron/node_modules
25 |
--------------------------------------------------------------------------------
/TestHub-client/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules
2 | /.env.local
3 | /.umirc.local.ts
4 | /config/config.local.ts
5 | /src/.umi
6 | /src/.umi-production
7 | /src/.umi-test
8 | /dist
9 | .swc
10 | ./yarn-error.log
11 |
12 |
13 | /release
14 | /static
15 | /versions
--------------------------------------------------------------------------------
/TestHub-client/.npmrc:
--------------------------------------------------------------------------------
1 | registry=https://registry.npmmirror.com/
2 |
3 |
--------------------------------------------------------------------------------
/TestHub-client/.prettierignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .umi
3 | .umi-production
4 |
--------------------------------------------------------------------------------
/TestHub-client/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "printWidth": 120,
3 | "singleQuote": true,
4 | "trailingComma": "all",
5 | "proseWrap": "never",
6 | "overrides": [{ "files": ".prettierrc", "options": { "parser": "json" } }],
7 | "plugins": ["prettier-plugin-organize-imports", "prettier-plugin-packagejson"]
8 | }
--------------------------------------------------------------------------------
/TestHub-client/.umirc.desktop.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'umi';
2 | import { transitionTimezoneTimestamp } from './src/utils/webpack';
3 |
4 | export default defineConfig({
5 | publicPath: './',
6 | history: {
7 | type: 'hash',
8 | },
9 | define: {
10 | __UMI_ENV__: process.env.UMI_ENV,
11 | __ENV__: process.env.UMI_ENV,
12 | __BUILD_TIME__: transitionTimezoneTimestamp(new Date().getTime()),
13 | __APP_NAME__: process.env.APP_NAME,
14 | __DOC_URL__: "http://www.nsrule.com",
15 | __APP_VERSION__: process.env.APP_VERSION,
16 | __APP_PORT__: process.env.APP_PORT,
17 | },
18 | headScripts: [
19 | `window.dataLayer = window.dataLayer || [];
20 | function gtag() {
21 | window.dataLayer.push(arguments);
22 | }
23 | gtag('js', new Date());
24 | gtag('config', 'G-V8M4E5SF61', {
25 | platform: 'DESKTOP',
26 | version: '${process.env.APP_VERSION}'
27 | });`,
28 | ],
29 | });
30 |
--------------------------------------------------------------------------------
/TestHub-client/public/logo.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-client/public/logo.ico
--------------------------------------------------------------------------------
/TestHub-client/src/assets/font/iconfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-client/src/assets/font/iconfont.ttf
--------------------------------------------------------------------------------
/TestHub-client/src/assets/font/iconfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-client/src/assets/font/iconfont.woff
--------------------------------------------------------------------------------
/TestHub-client/src/assets/font/iconfont.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-client/src/assets/font/iconfont.woff2
--------------------------------------------------------------------------------
/TestHub-client/src/assets/img/contact.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-client/src/assets/img/contact.jpeg
--------------------------------------------------------------------------------
/TestHub-client/src/assets/img/theme-auto.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-client/src/assets/img/theme-auto.png
--------------------------------------------------------------------------------
/TestHub-client/src/assets/img/theme-dark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-client/src/assets/img/theme-dark.png
--------------------------------------------------------------------------------
/TestHub-client/src/assets/img/theme-light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-client/src/assets/img/theme-light.png
--------------------------------------------------------------------------------
/TestHub-client/src/assets/logo/logo.icns:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-client/src/assets/logo/logo.icns
--------------------------------------------------------------------------------
/TestHub-client/src/assets/logo/logo.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-client/src/assets/logo/logo.ico
--------------------------------------------------------------------------------
/TestHub-client/src/assets/logo/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-client/src/assets/logo/logo.png
--------------------------------------------------------------------------------
/TestHub-client/src/assets/logo/logo.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-client/src/assets/logo/logo.webp
--------------------------------------------------------------------------------
/TestHub-client/src/blocks/Setting/User/index.less:
--------------------------------------------------------------------------------
1 | .user {
2 | display: flex;
3 | flex-direction: column;
4 | align-items: center;
5 | }
6 |
--------------------------------------------------------------------------------
/TestHub-client/src/blocks/Setting/User/index.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import styles from './index.less';
3 | import i18n from '@/i18n';
4 | import { Button } from 'antd';
5 | import { getUserInfo, setSatoken } from '@/utils/localStorage';
6 | import { loginOut } from '@/utils';
7 |
8 | // User 用户信息
9 | export default function User() {
10 | return (
11 | <>
12 |
13 |
21 |
22 | >
23 | );
24 | }
25 |
--------------------------------------------------------------------------------
/TestHub-client/src/components/TestHub/MonacoEditor/MyMonacoEditor/index.less:
--------------------------------------------------------------------------------
1 | .editorContainer {
2 | width: 100%;
3 | height: 100%;
4 | }
5 |
--------------------------------------------------------------------------------
/TestHub-client/src/components/TestHub/MonacoEditor/initMonaco.tsx:
--------------------------------------------------------------------------------
1 | import { EditorThemeType } from '@/constants';
2 | import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
3 |
4 | const initMonacoTheme = () => {
5 | monaco.editor.defineTheme(EditorThemeType.DashboardLightTheme, {
6 | base: 'vs',
7 | inherit: true,
8 | rules: [{ background: '#f8f9fa' }] as any,
9 | colors: {
10 | 'editor.foreground': '#000000',
11 | 'editor.background': '#f8f9fa', //背景色
12 | },
13 | });
14 | monaco.editor.defineTheme(EditorThemeType.DashboardBlackTheme, {
15 | base: 'vs-dark',
16 | inherit: true,
17 | rules: [{ background: '#131418' }] as any,
18 | colors: {
19 | 'editor.foreground': '#ffffff',
20 | 'editor.background': '#131418', //背景色
21 | },
22 | });
23 | };
24 |
25 | export default initMonacoTheme;
26 |
--------------------------------------------------------------------------------
/TestHub-client/src/components/TestHub/assembly/params/index.less:
--------------------------------------------------------------------------------
1 | .effective {
2 | color: var(--color-primary);
3 | }
4 |
--------------------------------------------------------------------------------
/TestHub-client/src/components/TestHub/errorBoundary/index.less:
--------------------------------------------------------------------------------
1 | .contentStyle {
2 | margin-top: 16px;
3 | padding: 15px;
4 | // color: rgba(0, 0, 0, 0.45);
5 | font-size: 15px;
6 | // text-align: center;
7 | // background-color: rgba(0, 0, 0, 0.02);
8 | // border: 1px dashed rgb(217, 217, 217);
9 | // border-radius: 8px;
10 | }
11 |
--------------------------------------------------------------------------------
/TestHub-client/src/components/TestHub/formulaLog/index.less:
--------------------------------------------------------------------------------
1 | .row_border {
2 | padding: 10px;
3 | border: 1px solid var(--color-border);
4 | }
5 |
--------------------------------------------------------------------------------
/TestHub-client/src/components/TestHub/http/ResponseView/index.less:
--------------------------------------------------------------------------------
1 | .responseViewContainer {
2 | width: 100%;
3 | height: 100%;
4 | }
5 |
6 | .responseViewContainerTabs {
7 | width: 100%;
8 | height: 100%;
9 |
10 | .ant-tabs {
11 | height: 100%;
12 | display: flex;
13 | flex-direction: column;
14 |
15 | .ant-tabs-nav {
16 | height: auto;
17 | }
18 |
19 | .ant-tabs-content-holder {
20 | flex: 1;
21 | overflow: scroll;
22 |
23 | .ant-tabs-content {
24 | height: 100%;
25 | .ant-tabs-tabpane-active {
26 | height: 100%;
27 | }
28 | }
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/TestHub-client/src/components/TestHub/http/i18n/en-us/index.ts:
--------------------------------------------------------------------------------
1 | export default {
2 | 'http.text.url': 'URL',
3 | 'http.text.method': 'Method',
4 | 'http.text.status': 'Status',
5 | 'http.text.statusDesc': 'Status Desc',
6 | 'http.text.error': 'erroe',
7 | 'http.text.pass': 'Pass',
8 | 'http.text.fail': 'Fail',
9 | 'http.columns.param': 'Parameter',
10 | 'http.columns.val': 'Value',
11 | 'http.data.params': 'Params',
12 | 'http.data.rests': 'Rests',
13 | 'http.data.headers': 'Request Headers',
14 | 'http.data.body': 'Request Body',
15 | 'http.data.resbody': 'Response Body',
16 | 'http.data.resheaders': 'Response Headers',
17 | 'http.data.cookies': 'Cookie',
18 | 'http.data.recookies': 'Response Cookie',
19 | 'http.data.req': 'Actual request',
20 | };
21 |
--------------------------------------------------------------------------------
/TestHub-client/src/components/TestHub/http/i18n/zh-cn/index.ts:
--------------------------------------------------------------------------------
1 | export default {
2 | 'http.text.url': '请求路径',
3 | 'http.text.method': '请求方式',
4 | 'http.text.status': '状态码',
5 | 'http.text.statusDesc': '状态说明',
6 | 'http.text.error': '异常',
7 | 'http.text.pass': '通过',
8 | 'http.text.fail': '失败',
9 | 'http.columns.param': '参数',
10 | 'http.columns.val': '参数值',
11 | 'http.data.params': 'Query参数',
12 | 'http.data.rests': 'Rest参数',
13 | 'http.data.headers': '请求头',
14 | 'http.data.body': '请求体',
15 | 'http.data.resbody': '响应体',
16 | 'http.data.resheaders': '响应头',
17 | 'http.data.cookies': 'Cookie参数',
18 | 'http.data.recookies': '响应Cookie',
19 | 'http.data.req': '实际请求',
20 | }
--------------------------------------------------------------------------------
/TestHub-client/src/components/TestHub/plugins/i18n/plugin-en-us.ts:
--------------------------------------------------------------------------------
1 | import checkEnUs from "../item/check/i18n/check-en-us";
2 | import checkObjEnUs from "../item/checkObj/i18n/checkObj-en-us";
3 | import httpEnUs from "../item/http/i18n/http-en-us";
4 | import sleepEnUs from "../item/sleep/i18n/sleep-en-us";
5 | import sqlEnUs from "../item/sql/i18n/sql-en-us";
6 | import appEnUs from "../item/app/i18n/app-en-us";
7 |
8 | export default {
9 | ...appEnUs,
10 | ...httpEnUs,
11 | ...sqlEnUs,
12 | ...checkObjEnUs,
13 | ...checkEnUs,
14 | ...sleepEnUs
15 | }
--------------------------------------------------------------------------------
/TestHub-client/src/components/TestHub/plugins/i18n/plugin-zh-cn.ts:
--------------------------------------------------------------------------------
1 | import checkZhCn from "../item/check/i18n/check-zh-cn";
2 | import checkObjZhCn from "../item/checkObj/i18n/checkObj-zh-cn";
3 | import httpZhCn from "../item/http/i18n/http-zh-cn";
4 | import sleepZhCn from "../item/sleep/i18n/sleep-zh-cn";
5 | import sqlZhCn from "../item/sql/i18n/sql-zh-cn";
6 | import appZhCn from "../item/app/i18n/app-zh-cn";
7 |
8 | export default {
9 | ...appZhCn,
10 | ...httpZhCn,
11 | ...sqlZhCn,
12 | ...checkObjZhCn,
13 | ...checkZhCn,
14 | ...sleepZhCn
15 | }
--------------------------------------------------------------------------------
/TestHub-client/src/components/TestHub/plugins/item/app/i18n/app-en-us.ts:
--------------------------------------------------------------------------------
1 | export default {
2 | 'app.text.ip': 'Ip',
3 | 'app.text.appPort': 'Port',
4 | 'app.text.appTimeout': 'Timeout',
5 | 'app.text.errorCode': 'errorCode',
6 | 'app.text.reallyErrorCode': 'reallyError',
7 | 'app.text.request': 'request',
8 | 'app.text.response': 'response',
9 | }
--------------------------------------------------------------------------------
/TestHub-client/src/components/TestHub/plugins/item/app/i18n/app-zh-cn.ts:
--------------------------------------------------------------------------------
1 | export default {
2 | 'app.text.ip': '地址',
3 | 'app.text.appPort': '端口',
4 | 'app.text.appTimeout': '超时时间',
5 | 'app.text.errorCode': '预期错误',
6 | 'app.text.reallyErrorCode': '实际错误',
7 | 'app.text.request': '请求',
8 | 'app.text.response': '响应',
9 | }
--------------------------------------------------------------------------------
/TestHub-client/src/components/TestHub/plugins/item/check/entry/index.tsx:
--------------------------------------------------------------------------------
1 | import React, { forwardRef, useImperativeHandle } from 'react';
2 |
3 | import { RuleActionResDto } from '@/typings';
4 | interface IProps {
5 | data: RuleActionResDto;
6 | }
7 |
8 | function Check(props: IProps, ref) {
9 | useImperativeHandle(ref, () => ({
10 | getData: async () => {
11 | return { flag: true, data: { code: 'Check' } };
12 | },
13 | }));
14 |
15 | return <>>;
16 | }
17 |
18 | export default forwardRef(Check);
19 |
--------------------------------------------------------------------------------
/TestHub-client/src/components/TestHub/plugins/item/check/i18n/check-en-us.ts:
--------------------------------------------------------------------------------
1 | export default {
2 | 'check.text.pass': 'pass',
3 | 'check.text.fail': 'fail',
4 | 'check.text.cover': 'cover',
5 | 'check.text.threshold': 'threshold',
6 | }
--------------------------------------------------------------------------------
/TestHub-client/src/components/TestHub/plugins/item/check/i18n/check-zh-cn.ts:
--------------------------------------------------------------------------------
1 | export default {
2 | 'check.text.pass': '通过',
3 | 'check.text.fail': '失败',
4 | 'check.text.cover': '被阈值',
5 | 'check.text.threshold': '阈值',
6 | }
--------------------------------------------------------------------------------
/TestHub-client/src/components/TestHub/plugins/item/checkObj/entry/index.tsx:
--------------------------------------------------------------------------------
1 | import React, { forwardRef, useImperativeHandle, useState } from 'react';
2 |
3 | import { RuleActionResDto } from '@/typings';
4 | import { ProForm, ProFormText } from '@ant-design/pro-components';
5 | import { Col, Form, Row } from 'antd';
6 | import i18n from '@/i18n';
7 | interface IProps {
8 | data: RuleActionResDto;
9 | }
10 |
11 | const CheckObj = forwardRef((props: IProps, ref) => {
12 | useImperativeHandle(ref, () => ({
13 | getData: async () => {
14 | return { flag: true, data: { code: "CheckObj" } };
15 | },
16 | }));
17 |
18 | return <> >;
19 | });
20 |
21 | export default CheckObj;
--------------------------------------------------------------------------------
/TestHub-client/src/components/TestHub/plugins/item/checkObj/i18n/checkObj-en-us.ts:
--------------------------------------------------------------------------------
1 | export default {
2 | 'checkObj.text.pass': 'pass',
3 | 'checkObj.text.fail': 'fail',
4 | 'checkObj.text.cover': 'cover',
5 | 'checkObj.text.threshold': 'threshold',
6 | }
--------------------------------------------------------------------------------
/TestHub-client/src/components/TestHub/plugins/item/checkObj/i18n/checkObj-zh-cn.ts:
--------------------------------------------------------------------------------
1 | export default {
2 | 'checkObj.text.pass': '通过',
3 | 'checkObj.text.fail': '失败',
4 | 'checkObj.text.cover': '被阈值',
5 | 'checkObj.text.threshold': '阈值',
6 | }
--------------------------------------------------------------------------------
/TestHub-client/src/components/TestHub/plugins/item/http/i18n/http-en-us.ts:
--------------------------------------------------------------------------------
1 | export default {
2 | 'http.text.url': 'URL',
3 | 'http.text.method': 'Method',
4 | 'http.text.status': 'Status',
5 | 'http.text.statusDesc': 'Status Desc',
6 | 'http.text.error': 'erroe',
7 | 'http.text.pass': 'Pass',
8 | 'http.text.fail': 'Fail',
9 | 'http.columns.param': 'Parameter',
10 | 'http.columns.val': 'Value',
11 | 'http.data.params': 'Params',
12 | 'http.data.rests': 'Rests',
13 | 'http.data.headers': 'Request Headers',
14 | 'http.data.body': 'Request Body',
15 | 'http.data.resbody': 'Response Body',
16 | 'http.data.resheaders': 'Response Headers',
17 | 'http.data.cookies': 'Cookie',
18 | 'http.data.recookies': 'Response Cookie',
19 | 'http.data.req': 'Actual request',
20 | };
21 |
--------------------------------------------------------------------------------
/TestHub-client/src/components/TestHub/plugins/item/http/i18n/http-zh-cn.ts:
--------------------------------------------------------------------------------
1 | export default {
2 | 'http.text.url': '请求路径',
3 | 'http.text.method': '请求方式',
4 | 'http.text.status': '状态码',
5 | 'http.text.statusDesc': '状态说明',
6 | 'http.text.error': '异常',
7 | 'http.text.pass': '通过',
8 | 'http.text.fail': '失败',
9 | 'http.columns.param': '参数',
10 | 'http.columns.val': '参数值',
11 | 'http.data.params': 'Params参数',
12 | 'http.data.rests': 'Rests参数',
13 | 'http.data.headers': '请求头',
14 | 'http.data.body': '请求体',
15 | 'http.data.resbody': '响应体',
16 | 'http.data.resheaders': '响应头',
17 | 'http.data.cookies': 'Cookie',
18 | 'http.data.recookies': '响应Cookie',
19 | 'http.data.req': '实际请求',
20 | }
--------------------------------------------------------------------------------
/TestHub-client/src/components/TestHub/plugins/item/sleep/entry/index.tsx:
--------------------------------------------------------------------------------
1 | import React, { useImperativeHandle } from 'react';
2 |
3 | import { RuleActionResDto } from '@/typings';
4 | interface IProps {
5 | data: RuleActionResDto;
6 | }
7 |
8 | const Sleep = (props: IProps, ref) => {
9 | useImperativeHandle(ref, () => ({
10 | getData: async () => {
11 | return { flag: true, data: {} };
12 | },
13 | }));
14 |
15 | return <>>;
16 | };
17 |
18 | export default Sleep;
19 |
--------------------------------------------------------------------------------
/TestHub-client/src/components/TestHub/plugins/item/sleep/i18n/sleep-en-us.ts:
--------------------------------------------------------------------------------
1 | export default {
2 | 'sleep.text.sleepTime': 'Pause',
3 | 'sleep.text.time': 'millisecond',
4 | }
--------------------------------------------------------------------------------
/TestHub-client/src/components/TestHub/plugins/item/sleep/i18n/sleep-zh-cn.ts:
--------------------------------------------------------------------------------
1 | export default {
2 | 'sleep.text.sleepTime': '暂停时间',
3 | 'sleep.text.time': '毫秒',
4 | }
--------------------------------------------------------------------------------
/TestHub-client/src/components/TestHub/plugins/item/sleep/result/index.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Descriptions } from 'antd';
3 | import { ExecuteResult, ExecutionResult, FlowResult } from '@/typings/server/execution';
4 | import i18n from '@/i18n';
5 | interface IProps {
6 | className?: string;
7 | size: number;
8 | flowResult: FlowResult;
9 | executionResult: ExecutionResult;
10 | executeResult: ExecuteResult;
11 | }
12 |
13 | function Sleep(props: IProps) {
14 | const { executeResult } = props;
15 |
16 | return (
17 | <>
18 | {executeResult.runStateItem != undefined && (
19 |
20 | {i18n('sleep.text.sleepTime')}}>
21 | {executeResult.runStateItem.runParams['sleepTime']} {' '} {i18n('sleep.text.time')}
22 |
23 |
24 | )}
25 | >
26 | );
27 | }
28 |
29 | export default Sleep;
30 |
--------------------------------------------------------------------------------
/TestHub-client/src/components/TestHub/plugins/item/sql/i18n/sql-en-us.ts:
--------------------------------------------------------------------------------
1 | export default {
2 | 'sql.text.url': 'Url',
3 | 'sql.text.Driver': 'Driver',
4 | 'sql.text.User': 'User',
5 | 'sql.text.Password': 'Password',
6 | 'sql.text.timeout': 'Timeout',
7 | 'sql.text.timeouttip': 'millisecond',
8 | 'sql.text.query': 'Query',
9 | 'sql.text.yes': 'yes',
10 | 'sql.text.no': 'no',
11 | 'sql.text.conkey': 'Transaction',
12 | 'sql.text.commit': 'Auto Commit'
13 | }
--------------------------------------------------------------------------------
/TestHub-client/src/components/TestHub/plugins/item/sql/i18n/sql-zh-cn.ts:
--------------------------------------------------------------------------------
1 | export default {
2 | 'sql.text.url': '连接地址',
3 | 'sql.text.Driver': '驱动',
4 | 'sql.text.User': '用户',
5 | 'sql.text.Password': '密码',
6 | 'sql.text.timeout': '超时时间',
7 | 'sql.text.timeouttip': '毫秒',
8 | 'sql.text.query': '是否查询',
9 | 'sql.text.yes': '是',
10 | 'sql.text.no': '否',
11 | 'sql.text.conkey': '事务ID',
12 | 'sql.text.commit': '自动提交'
13 | }
--------------------------------------------------------------------------------
/TestHub-client/src/components/base/BrandLogo/index.less:
--------------------------------------------------------------------------------
1 | @import '../../../styles/var.less';
2 |
3 | .box {
4 | display: flex;
5 | justify-content: center;
6 | border-radius: 10%;
7 | overflow: hidden;
8 | img {
9 | display: block;
10 | height: 100%;
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/TestHub-client/src/components/base/BrandLogo/index.tsx:
--------------------------------------------------------------------------------
1 | import React, { memo } from 'react';
2 | import styles from './index.less';
3 | import classnames from 'classnames';
4 | import logo from '@/assets/logo/logo.webp';
5 |
6 | interface IProps extends React.DetailedHTMLProps, HTMLDivElement> {
7 | className?: any;
8 | size?: number;
9 | }
10 |
11 | export default memo(({ className, size = 48, ...res }) => {
12 | return (
13 |
14 |

15 |
16 | );
17 | });
18 |
--------------------------------------------------------------------------------
/TestHub-client/src/components/base/Contact/index.less:
--------------------------------------------------------------------------------
1 | .contact {
2 | display: flex;
3 | align-items: center;
4 | flex-direction: column;
5 | .icons {
6 | margin-top: 5px;
7 | .icon {
8 | font-size: 18px;
9 | cursor: pointer;
10 | }
11 | .notFirst {
12 | margin-left: 20px;
13 | }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/TestHub-client/src/components/base/Empty/index.less:
--------------------------------------------------------------------------------
1 | .empty {
2 | width: 100%;
3 | height: 100%;
4 | display: flex;
5 | justify-content: center;
6 | align-items: center;
7 | .ears {
8 | font-size: 120px;
9 | font-weight: 900;
10 | color: var(--color-text);
11 | opacity: 0.15;
12 | overflow: hidden;
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/TestHub-client/src/components/base/Empty/index.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import styles from './index.less';
3 | interface IProps {}
4 | function Empty(props: IProps) {
5 | return (
6 |
9 | );
10 | }
11 |
12 | export default Empty;
13 |
--------------------------------------------------------------------------------
/TestHub-client/src/components/base/Loading/LazyLoading/index.less:
--------------------------------------------------------------------------------
1 | @import '../../../styles/var.less';
2 | .box {
3 | .f-fill-absolute();
4 | display: flex;
5 | justify-content: center;
6 | align-items: center;
7 | background-color: var(--color-bg-100);
8 | }
9 |
--------------------------------------------------------------------------------
/TestHub-client/src/components/base/Loading/LazyLoading/index.tsx:
--------------------------------------------------------------------------------
1 | import React, { memo } from 'react';
2 | import styles from './index.less';
3 | import classnames from 'classnames';
4 | import Loading from '@/components/base/Loading/Loading';
5 |
6 | interface IProps {
7 | className?: string;
8 | }
9 |
10 | export default memo(({ className }) => {
11 | return (
12 |
13 |
14 |
15 | );
16 | });
17 |
--------------------------------------------------------------------------------
/TestHub-client/src/components/base/Loading/LoadingContent/index.less:
--------------------------------------------------------------------------------
1 | .loadingContent {
2 | position: relative;
3 | }
4 |
5 | .stateIndicator {
6 | width: 200px;
7 | height: 200px;
8 | }
9 |
10 | .empty {
11 | height: 100%;
12 | display: flex;
13 | justify-content: center;
14 | align-items: center;
15 | img {
16 | max-width: 100%;
17 | }
18 | }
19 |
20 | .coverLoading {
21 | position: absolute;
22 | inset: 0;
23 | background-color: rgba(0, 0, 0, 0.01);
24 | display: flex;
25 | justify-content: center;
26 | align-items: center;
27 | z-index: 999;
28 | }
29 |
--------------------------------------------------------------------------------
/TestHub-client/src/components/base/Loading/LoadingLiquid/index.less:
--------------------------------------------------------------------------------
1 | .box {
2 | svg {
3 | width: 0;
4 | height: 0;
5 | }
6 | }
7 |
8 | .loading {
9 | width: 200px;
10 | height: 200px;
11 | position: relative;
12 | filter: url(#gooey);
13 | }
14 |
15 | .loading span {
16 | position: absolute;
17 | top: 0;
18 | left: 0;
19 | width: 100%;
20 | height: 100%;
21 | display: block;
22 | animation: loading 4s ease-in-out infinite;
23 | /* var函数用来插入css变量的值,css变量名称以--开头 */
24 | animation-delay: calc(0.2s * var(--i));
25 | }
26 |
27 | .loading span::before {
28 | content: '';
29 | position: absolute;
30 | top: 0;
31 | left: calc(50% - 20px);
32 | width: 40px;
33 | height: 40px;
34 | background: linear-gradient(#fce4ec, #03a9f4);
35 | border-radius: 50%;
36 | box-shadow: 0 0 30px #03a9f4;
37 | }
38 |
39 | @keyframes loading {
40 | 0% {
41 | transform: rotate(0deg);
42 | }
43 |
44 | 50%,
45 | 100% {
46 | transform: rotate(360deg);
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/TestHub-client/src/components/base/MenuLabel/index.less:
--------------------------------------------------------------------------------
1 | @import '../../../styles/var.less';
2 |
3 | .menuLabel {
4 | display: flex;
5 | align-items: center;
6 | .menuLabelIconBox {
7 | width: 22px;
8 | display: flex;
9 | align-items: center;
10 | }
11 | // .menuLabelIcon {
12 | // }
13 | // .menuLabelTitle {
14 | // }
15 | .menuLabelIconBright {
16 | color: var(--color-primary);
17 | }
18 | :global {
19 | .ant-dropdown {
20 | z-index: 1080;
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/TestHub-client/src/components/base/MenuLabel/index.tsx:
--------------------------------------------------------------------------------
1 | import React, { memo } from 'react';
2 | import classnames from 'classnames';
3 | import Iconfont from '@/components/base/Iconfont';
4 | import styles from './index.less';
5 |
6 | interface IProps {
7 | className?: string;
8 | icon?: string;
9 | iconBright?: boolean;
10 | label: string;
11 | }
12 |
13 | export default memo((props) => {
14 | const { className, icon, label, iconBright } = props;
15 | return (
16 |
17 |
18 | {icon && (
19 |
23 | )}
24 |
25 |
{label}
26 |
27 | );
28 | });
29 |
--------------------------------------------------------------------------------
/TestHub-client/src/components/base/TextHighlighter/index.less:
--------------------------------------------------------------------------------
1 | .highlightStyle {
2 | color: var(--red);
3 | font-weight: 900;
4 | }
5 |
--------------------------------------------------------------------------------
/TestHub-client/src/components/base/TextHighlighter/index.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import Highlighter from 'react-highlight-words';
3 | import styles from './index.less';
4 | interface IProps {
5 | words: string[];
6 | text: string;
7 | className?: string;
8 | }
9 | function TextHighlighter(props: IProps) {
10 | const highlightStyle = {
11 | color: 'red', // 设置高亮文本的颜色为红色
12 | fontWeight: 'bold', // 可以根据需要设置其他样式,比如加粗
13 | };
14 | const { className, words, text } = props;
15 | return (
16 |
23 | );
24 | }
25 |
26 | export default TextHighlighter;
27 |
--------------------------------------------------------------------------------
/TestHub-client/src/constants/common.ts:
--------------------------------------------------------------------------------
1 | export enum ConsoleStatus {
2 | DRAFT = 'DRAFT',
3 | RELEASE = 'RELEASE',
4 | }
5 |
6 | export enum OSType {
7 | WIN = 'Win',
8 | MAC = 'Mac',
9 | RESTS = 'rests',
10 | }
11 |
12 | export enum ConnectionKind {
13 | Private = 'PRIVATE',
14 | Shared = 'SHARED'
15 | }
16 |
--------------------------------------------------------------------------------
/TestHub-client/src/constants/console.ts:
--------------------------------------------------------------------------------
1 |
2 | export enum ConsoleOpenedStatus {
3 | IS_OPEN = 'y',
4 | NOT_OPEN = 'n',
5 | }
6 |
--------------------------------------------------------------------------------
/TestHub-client/src/constants/index.ts:
--------------------------------------------------------------------------------
1 | export * from './common';
2 | export * from './table';
3 | export * from './theme';
4 | export * from './console';
5 |
6 |
--------------------------------------------------------------------------------
/TestHub-client/src/constants/table.ts:
--------------------------------------------------------------------------------
1 | export enum TableDataType {
2 | BOOLEAN = 'BOOLEAN',
3 | NUMERIC = 'NUMERIC',
4 | STRING = 'STRING',
5 | DATETIME = 'DATETIME',
6 | // 暂时不适配
7 | BINARY = 'BINARY',
8 | CONTENT = 'CONTENT',
9 | STRUCT = 'STRUCT',
10 | DOCUMENT = 'DOCUMENT',
11 | ARRAY = 'ARRAY',
12 | OBJECT = 'OBJECT',
13 | REFERENCE = 'REFERENCE',
14 | ROWID = 'ROWID',
15 | ANY = 'ANY',
16 | UNKNOWN = 'UNKNOWN',
17 | CHAT2DB_ROW_NUMBER = 'CHAT2DB_ROW_NUMBER',
18 | }
19 |
20 | export enum StatusType {
21 | SUCCESS = 'success',
22 | FAIL = 'fail',
23 | }
24 |
--------------------------------------------------------------------------------
/TestHub-client/src/constants/theme.ts:
--------------------------------------------------------------------------------
1 | export enum ThemeType {
2 | Light = 'light',
3 | Dark = 'dark',
4 | FollowOs = 'followOs',
5 | }
6 |
7 | export enum EditorThemeType {
8 | DashboardLightTheme = 'DashboardLightTheme',
9 | DashboardBlackTheme = 'DashboardBlackTheme',
10 | }
11 |
12 | export enum MyEditorThemeType {
13 | LightTheme = 'LightTheme',
14 | BlackTheme = 'BlackTheme',
15 | }
16 |
17 | export enum PrimaryColorType {
18 | Polar_Green = 'polar-green',
19 | Golden_Purple = 'golden-purple',
20 | Polar_Blue = 'polar-blue',
21 | Silver = 'silver',
22 | Red = 'red',
23 | Orange = 'orange',
24 | Blue2 = 'blue2',
25 | Gold = 'gold',
26 | }
27 |
28 | export enum LangType {
29 | EN_US = 'en-us',
30 | ZH_CN = 'zh-cn',
31 | // TR_TR = 'tr-tr',
32 | // JA_JP = 'ja-jp',
33 | }
34 |
--------------------------------------------------------------------------------
/TestHub-client/src/electron/main.js:
--------------------------------------------------------------------------------
1 |
2 | /**
3 | * 主进程与渲染进程通信频道定义
4 | * Definition of communication channels between main process and rendering process
5 | */
6 | const ipcApiRoute = {
7 | // framework
8 | javaServerStatus: 'controller.framework.runStatus',
9 | startJavaServer: 'controller.framework.startJavaServer',
10 | closeJavaServer: 'controller.framework.closeJavaServer',
11 |
12 | }
13 |
14 | export {
15 | ipcApiRoute
16 | }
17 |
18 |
--------------------------------------------------------------------------------
/TestHub-client/src/hooks/index.ts:
--------------------------------------------------------------------------------
1 | export * from './useTheme';
2 | export * from './useUpdateEffect';
3 | export * from './useEventSource';
4 |
--------------------------------------------------------------------------------
/TestHub-client/src/hooks/useUpdateEffect.ts:
--------------------------------------------------------------------------------
1 | import { useRef, useEffect } from 'react';
2 |
3 | /**
4 | * 第一次Effect更新不执行
5 | * @param fn
6 | * @param arr
7 | */
8 | export function useUpdateEffect(fn: Function, arr: any[]) {
9 | const first = useRef(true);
10 | useEffect(() => {
11 | if (first.current) {
12 | first.current = false;
13 | } else {
14 | fn();
15 | }
16 | }, arr);
17 | }
18 |
--------------------------------------------------------------------------------
/TestHub-client/src/i18n/en-us/index.ts:
--------------------------------------------------------------------------------
1 | import common from './common';
2 | import menu from './menu';
3 | import login from './login';
4 | import caseUS from './caseUS';
5 | import setting from './setting';
6 | import testhub from './testhub';
7 | import { LangType } from '@/constants';
8 | import httpEnUs from '@/components/TestHub/http/i18n/en-us';
9 | import pluginEnUs from '@/components/TestHub/plugins/i18n/plugin-en-us';
10 |
11 | export default {
12 | lang: LangType.EN_US,
13 | ...common,
14 | ...setting,
15 | ...testhub,
16 | ...menu,
17 | ...caseUS,
18 | ...login,
19 | ...httpEnUs,
20 | ...pluginEnUs
21 | };
22 |
--------------------------------------------------------------------------------
/TestHub-client/src/i18n/en-us/login.ts:
--------------------------------------------------------------------------------
1 | export default {
2 | 'login.text.logout': 'Logout',
3 | 'login.text.welcome': 'Welcome to Chat2DB',
4 | 'login.text.tips': 'The Chat2DB account is only for team collaboration management.',
5 | 'login.text.tips.title': 'Why need login?',
6 | 'login.text.setting': 'Setting',
7 | 'login.form.user': 'UserName',
8 | 'login.form.user.placeholder': 'Please enter your username',
9 | 'login.form.password': 'Password',
10 | 'login.form.password.placeholder': 'Please enter your password',
11 | 'login.button.login': 'Login',
12 | 'login.tips.defaultPassword': 'The default user name and password are: chat2db',
13 | };
14 |
--------------------------------------------------------------------------------
/TestHub-client/src/i18n/en-us/menu.ts:
--------------------------------------------------------------------------------
1 | export default {
2 | 'menu.file' : 'File'
3 | }
--------------------------------------------------------------------------------
/TestHub-client/src/i18n/zh-cn/index.ts:
--------------------------------------------------------------------------------
1 | import menu from './menu';
2 | import common from './common';
3 | import login from './login';
4 | import caseCN from './caseCN';
5 | import setting from './setting';
6 | import testhub from './testhub';
7 | import { LangType } from '@/constants'
8 | import httpEnUs from '@/components/TestHub/http/i18n/zh-cn';
9 | import pluginZhCn from '@/components/TestHub/plugins/i18n/plugin-zh-cn';
10 |
11 | export default {
12 | lang: LangType.ZH_CN,
13 | ...common,
14 | ...menu,
15 | ...login,
16 | ...caseCN,
17 | ...setting,
18 | ...testhub,
19 | ...httpEnUs,
20 | ...pluginZhCn
21 | };
22 |
--------------------------------------------------------------------------------
/TestHub-client/src/i18n/zh-cn/login.ts:
--------------------------------------------------------------------------------
1 | export default {
2 | 'login.text.logout': '退出登录',
3 | 'login.text.welcome': '欢迎使用 Chat2DB',
4 | 'login.text.tips': 'Chat2DB 账号仅用于团队协作管理',
5 | 'login.text.tips.title': '为什么需要登录?',
6 | 'login.text.setting': '设 置',
7 | 'login.form.user': '用户名',
8 | 'login.form.user.placeholder': '请输入用户名',
9 | 'login.form.password': '密码',
10 | 'login.form.password.placeholder': '请输入密码',
11 | 'login.button.login': '登 录',
12 | 'login.tips.defaultPassword': '默认用户名和密码均为: chat2db',
13 | };
14 |
--------------------------------------------------------------------------------
/TestHub-client/src/i18n/zh-cn/menu.ts:
--------------------------------------------------------------------------------
1 | export default {
2 | 'menu.file': 'File'
3 | }
4 |
--------------------------------------------------------------------------------
/TestHub-client/src/layouts/GlobalLayout/ServerLoading/index.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import './index.less';
3 |
4 | // TODO: 首屏以及懒加载Lodding效果
5 | const ServerLoading = () => {
6 | return (
7 |
18 | );
19 | };
20 |
21 | export default ServerLoading;
22 |
--------------------------------------------------------------------------------
/TestHub-client/src/layouts/init/GlobalComponent.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import MyNotification from '@/components/base/MyNotification';
3 | import Modal from '@/components/base/Modal/BaseModal';
4 |
5 | const GlobalComponent = () => {
6 | return (
7 | <>
8 |
9 |
10 | >
11 | );
12 | };
13 |
14 | export default GlobalComponent;
15 |
--------------------------------------------------------------------------------
/TestHub-client/src/layouts/init/registerMessage.ts:
--------------------------------------------------------------------------------
1 | import { message } from 'antd';
2 |
3 | export default () => {
4 | message.config({
5 | maxCount: 1,
6 | duration: 3,
7 | });
8 | };
9 |
--------------------------------------------------------------------------------
/TestHub-client/src/layouts/init/registerNotification.ts:
--------------------------------------------------------------------------------
1 | import { notification } from 'antd';
2 |
3 | export default () => {
4 | notification.config({
5 | placement: 'BottomRight',
6 | maxCount: 2,
7 | duration: null,
8 | });
9 | };
10 |
--------------------------------------------------------------------------------
/TestHub-client/src/pages/document.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | TestHub
9 |
10 |
11 |
12 |
13 |
15 |
16 |
17 |
18 |
19 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/TestHub-client/src/pages/main/case/components/CaseRight/index.less:
--------------------------------------------------------------------------------
1 | .casePageRight {
2 | height: 100%;
3 | display: flex;
4 | flex-direction: column;
5 | .casePageTabs {
6 | height: auto;
7 | }
8 | .casePageContent {
9 | flex: 1;
10 | position: relative;
11 |
12 | .windowContent {
13 | z-index: 2;
14 | position: absolute;
15 | left: 0;
16 | bottom: 0;
17 | height: 100%;
18 | width: 100%;
19 | }
20 |
21 | .concealTab {
22 | opacity: 0;
23 | z-index: 1;
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/TestHub-client/src/pages/main/case/components/caseResult/components/caseResultLeft/index.less:
--------------------------------------------------------------------------------
1 | // // @import '../../../../../../var.less';
2 |
3 | // .box {
4 | // padding: 20px 10px;
5 | // }
6 |
--------------------------------------------------------------------------------
/TestHub-client/src/pages/main/case/components/caseResult/index.less:
--------------------------------------------------------------------------------
1 | .caseResult {
2 | opacity: 1;
3 | height: 100%;
4 | display: flex;
5 | }
6 | .caseResultRight {
7 | width: 0px;
8 | flex: 1;
9 | overflow: auto;
10 | }
11 | .caseResultLeft {
12 | position: relative;
13 | width: 260px;
14 | min-width: 260px;
15 | max-width: 300px;
16 | overflow: hidden;
17 | transition: width 0.2s background 0.3s;
18 | }
19 |
--------------------------------------------------------------------------------
/TestHub-client/src/pages/main/case/components/caseRunParam/index.less:
--------------------------------------------------------------------------------
1 | @import '../../../../var.less';
2 |
3 | .stepContent{
4 |
5 | }
6 | .stepContentHide {
7 | // display: none;
8 | visibility: hidden;
9 | height: 0;
10 | width: 0;
11 | overflow: hidden;
12 | }
--------------------------------------------------------------------------------
/TestHub-client/src/pages/main/case/index.less:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-client/src/pages/main/case/index.less
--------------------------------------------------------------------------------
/TestHub-client/src/pages/main/http/components/HttpRigth/index.less:
--------------------------------------------------------------------------------
1 | .httpPageRight {
2 | height: 100%;
3 | display: flex;
4 | flex-direction: column;
5 | .httpPageTabs {
6 | height: auto;
7 | }
8 | .httpPageContent {
9 | flex: 1;
10 | position: relative;
11 |
12 | .windowContent {
13 | z-index: 2;
14 | position: absolute;
15 | left: 0;
16 | bottom: 0;
17 | height: 100%;
18 | width: 100%;
19 | }
20 |
21 | .concealTab {
22 | opacity: 0;
23 | z-index: 1;
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/TestHub-client/src/pages/main/http/index.less:
--------------------------------------------------------------------------------
1 | .httpPage {
2 | }
3 |
--------------------------------------------------------------------------------
/TestHub-client/src/pages/main/meta/components/MetaLeft/index.less:
--------------------------------------------------------------------------------
1 | .metaLeft {
2 | // color: var(--color-text-secondary);
3 | // padding-left: 5px;
4 |
5 |
6 | .dcardsec {
7 | background-color: var(--color-bg-base);
8 | display: flex;
9 | flex-flow: row nowrap;
10 | padding: 8px 12px;
11 | margin: 10px 16px;
12 | border-radius: 8px;
13 | cursor: pointer;
14 | font-size: 14px;
15 |
16 | .icon {
17 | width: 20px;
18 | padding: 0 5px;
19 | }
20 |
21 | .main {
22 | width: calc(100% - 30px);
23 | overflow: hidden;
24 | text-overflow: ellipsis;
25 | max-width: calc(100% - 30px);
26 | }
27 | }
28 |
29 | .dcardsec:hover {
30 | color: var(--color-primary-hover);
31 | // background-color: var(--color-hover-bg);
32 | }
33 |
34 | .activate {
35 | color: var(--color-primary-hover);
36 | background-color: var(--color-hover-bg);
37 | }
38 |
39 | }
--------------------------------------------------------------------------------
/TestHub-client/src/pages/main/meta/components/MetaRight/index.less:
--------------------------------------------------------------------------------
1 | .metaRight {
2 | padding: 10px 15px 0 15px;
3 | height: calc(100% - 10px);
4 | display: flex;
5 | flex-direction: column;
6 |
7 | .title {
8 | padding: 5px 0;
9 | height: 24px;
10 | border-bottom: 1px dashed var(--color-border);
11 |
12 | .titleName {
13 | text-overflow: ellipsis;
14 | color: rgba(0, 0, 0, 0.88);
15 | font-weight: 600;
16 | font-size: 16px;
17 | line-height: 1.5;
18 | }
19 | }
20 |
21 | .body {
22 | flex: 1;
23 | // padding: 0 10px;
24 | // overflow: scroll;
25 | // display: flex;
26 | // flex-direction: column;
27 | // overflow: hidden;
28 | }
29 | }
--------------------------------------------------------------------------------
/TestHub-client/src/pages/main/meta/index.less:
--------------------------------------------------------------------------------
1 | .metaPage {}
--------------------------------------------------------------------------------
/TestHub-client/src/pages/main/test/index.less:
--------------------------------------------------------------------------------
1 | .container {
2 | width: 100%;
3 | height: 100%;
4 | display: flex;
5 | }
6 |
--------------------------------------------------------------------------------
/TestHub-client/src/pages/main/tools/components/ToolsLeft/index.less:
--------------------------------------------------------------------------------
1 | .category {
2 | color: var(--color-text-secondary);
3 | padding-left: 5px;
4 | }
5 | .dcardsec {
6 | background-color: var(--color-bg-base);
7 | display: flex;
8 | flex-flow: row nowrap;
9 | padding: 5px 10px;
10 | margin: 8px 16px;
11 | border-radius: 5px;
12 | cursor: pointer;
13 | font-size: 14px;
14 |
15 | .icon {
16 | width: 20px;
17 | padding: 0 5px;
18 | }
19 |
20 | .main {
21 | width: calc(100% - 30px);
22 | overflow: hidden;
23 | text-overflow: ellipsis;
24 | max-width: calc(100% - 30px);
25 | }
26 | }
27 | .dcardsec:hover {
28 | color: var(--color-primary-hover);
29 | // background-color: var(--color-hover-bg);
30 | }
31 |
32 | .activate {
33 | color: var(--color-primary-hover);
34 | background-color: var(--color-hover-bg);
35 | }
36 |
--------------------------------------------------------------------------------
/TestHub-client/src/pages/main/tools/components/ToolsRight/index.less:
--------------------------------------------------------------------------------
1 | .toolsRight {
2 | padding: 10px 15px;
3 | flex: 1;
4 | height: calc(100% - 20px);
5 | display: flex;
6 | flex-direction: column;
7 |
8 | .title {
9 | padding: 5px 0;
10 | height: 24px;
11 | text-overflow: ellipsis;
12 | color: rgba(0, 0, 0, 0.88);
13 | font-weight: 600;
14 | font-size: 16px;
15 | line-height: 1.5;
16 | border-bottom: 1px dashed var(--color-border);
17 |
18 | }
19 |
20 | .body {
21 | flex: 1;
22 | padding: 0 10px;
23 | // display: flex;
24 | // flex-direction: column;
25 | // overflow: hidden;
26 | }
27 | }
--------------------------------------------------------------------------------
/TestHub-client/src/pages/main/tools/components/ToolsRight/index.tsx:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useState } from 'react';
2 | // import { PageContainer } from '@ant-design/pro-layout';
3 | import classnames from 'classnames';
4 | import styles from './index.less';
5 | interface IProps {
6 | toolCode: string | null;
7 | toolName: string | null;
8 | hidden: boolean;
9 | itemContainer?: React.ReactNode;
10 | }
11 |
12 | function ToolsRight(props: IProps) {
13 | // console.log(props.itemContainer);
14 | return (
15 | <>
16 |
17 |
{props.toolName}
18 |
19 | {props.itemContainer}
20 |
21 |
22 | >
23 | );
24 | }
25 |
26 | export default ToolsRight;
27 |
--------------------------------------------------------------------------------
/TestHub-client/src/pages/main/tools/index.less:
--------------------------------------------------------------------------------
1 | .httpPage {
2 | }
3 |
--------------------------------------------------------------------------------
/TestHub-client/src/store/common/components.ts:
--------------------------------------------------------------------------------
1 | import { useCommonStore } from './index';
2 | import { IModalData } from '@/components/base/Modal/BaseModal';
3 |
4 | export interface IComponentsContent {
5 | openModal: ((params: IModalData) => void) | null;
6 | }
7 |
8 | export const initComponentsContent = {
9 | openModal: null,
10 | };
11 |
12 | export const injectOpenModal = (openModal: IComponentsContent['openModal']) => {
13 | return useCommonStore.setState({ openModal });
14 | };
15 |
16 | export const openModal = (modal: IModalData) => {
17 | return useCommonStore.getState().openModal?.(modal);
18 | };
19 |
--------------------------------------------------------------------------------
/TestHub-client/src/store/common/copyFocusedContent.ts:
--------------------------------------------------------------------------------
1 | import {useCommonStore} from './index'
2 | export interface ICopyFocusedContent {
3 | focusedContent: any[][]| any[] | string | null;
4 | }
5 |
6 | export const initCopyFocusedContent = {
7 | focusedContent: null,
8 | }
9 |
10 | export const setFocusedContent: (content: any[][] | any[] | string | null) => void = (focusedContent) => {
11 | return useCommonStore.setState({focusedContent})
12 | }
13 |
--------------------------------------------------------------------------------
/TestHub-client/src/store/common/index.ts:
--------------------------------------------------------------------------------
1 | import { UseBoundStoreWithEqualityFn, createWithEqualityFn } from 'zustand/traditional';
2 | import { devtools } from 'zustand/middleware';
3 | import { shallow } from 'zustand/shallow';
4 | import { StoreApi } from 'zustand';
5 |
6 | import { initCopyFocusedContent, ICopyFocusedContent } from './copyFocusedContent';
7 | import { initComponentsContent, IComponentsContent } from './components';
8 |
9 | export type IStore = ICopyFocusedContent & IComponentsContent;
10 |
11 | export const useCommonStore: UseBoundStoreWithEqualityFn> = createWithEqualityFn(
12 | devtools(
13 | () => ({
14 | ...initCopyFocusedContent,
15 | ...initComponentsContent,
16 | }),
17 | ),
18 | shallow
19 | );
20 |
--------------------------------------------------------------------------------
/TestHub-client/src/styles/common.less:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-client/src/styles/common.less
--------------------------------------------------------------------------------
/TestHub-client/src/theme/common.ts:
--------------------------------------------------------------------------------
1 | export const commonToken = {
2 | fontSize: 14,
3 | wireframe: true,
4 | borderRadius: 4,
5 | borderRadiusLG: 8,
6 | };
7 |
--------------------------------------------------------------------------------
/TestHub-client/src/theme/custom/dark.less:
--------------------------------------------------------------------------------
1 | :root [theme='dark'] {
2 | --custom-color-icon: #5c5d5e;
3 | }
4 |
--------------------------------------------------------------------------------
/TestHub-client/src/theme/custom/light.less:
--------------------------------------------------------------------------------
1 | html[theme='light'] {
2 | --custom-color-icon: #383d4b;
3 | }
4 |
--------------------------------------------------------------------------------
/TestHub-client/src/typings/client/index.ts:
--------------------------------------------------------------------------------
1 | export * from './testHub';
2 |
3 | export enum ConsoleStatus {
4 | //参考 git status
5 | UNTRACKED = 'UNTRACKED', //草稿。 未跟踪Untracked
6 | SAVED = 'SAVED', //已保存。 已跟踪tracked
7 | CHANGE = 'CHANGE', //变更。 已修改Changes not staged for commit
8 | }
9 | export interface ConsoleInfo {
10 | name: string; // 名称
11 | id?: number;
12 | key: string; // key 唯一
13 | status: ConsoleStatus; //状态
14 | data: D; //节点 数据
15 | oldData: D; //旧节点 数据
16 | page: P; // 页面临时不需要保存的数据
17 | }
18 |
19 |
20 |
--------------------------------------------------------------------------------
/TestHub-client/src/typings/index.ts:
--------------------------------------------------------------------------------
1 | export * from './common';
2 | export * from './main';
3 | export * from './theme';
4 | export * from './tree';
5 |
6 | export * from './client';
7 | export * from './server';
8 |
--------------------------------------------------------------------------------
/TestHub-client/src/typings/main.ts:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | export interface INavItem {
4 | key: string;
5 | icon: string;
6 | component?: React.ReactNode;
7 | openBrowser?: string;
8 | iconFontSize?: number;
9 | isLoad: boolean;
10 | name: string;
11 | }
12 |
--------------------------------------------------------------------------------
/TestHub-client/src/typings/server/base.ts:
--------------------------------------------------------------------------------
1 | export interface TreeNodeResDto {
2 | /** key */
3 | index: string;
4 | /** 是否是文件夹 */
5 | isFolder: boolean;
6 | /** 子节点列表 */
7 | children: string[],
8 | /** 内容 */
9 | data: TreeNodeDataResDto,
10 | /** 是否可以重命名 */
11 | canRename: boolean;
12 | /** 是否可以移动 */
13 | canMove: boolean;
14 | }
15 | export interface TreeNodeDataResDto {
16 | /** key */
17 | key: string;
18 | /** key */
19 | parentKey: string;
20 | /** name */
21 | name: string;
22 | /** 节点类型 */
23 | nodeType: string;
24 | /** 内容 */
25 | info?: D;
26 | }
27 |
28 |
29 |
--------------------------------------------------------------------------------
/TestHub-client/src/typings/server/index.ts:
--------------------------------------------------------------------------------
1 | export * from './base';
2 | export * from './user';
3 | export * from './case';
4 | export * from './project';
5 | export * from './plugins';
6 | export * from './execution';
7 |
--------------------------------------------------------------------------------
/TestHub-client/src/typings/server/plugins/app.ts:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-client/src/typings/server/plugins/app.ts
--------------------------------------------------------------------------------
/TestHub-client/src/typings/server/plugins/http.ts:
--------------------------------------------------------------------------------
1 | export interface HttpDirDto {
2 |
3 | /** 项目 */
4 | projectCode: string;
5 |
6 | /** 父节点key */
7 | parentId: number;
8 | id: number;
9 | /** 名称 */
10 | name: string;
11 | }
12 | export interface HttpRenameDto {
13 | id: number;
14 | /** 名称 */
15 | name: string;
16 | }
17 |
18 |
19 | export interface HttpApiSendResDto {
20 | uuid: string;
21 | timeout?: number;
22 | reqType?: string;
23 | method?: string;
24 | url?: string;
25 |
26 | rests?: Record;
27 | params?: Record;
28 | headers?: Record;
29 | cookies?: Record;
30 | body?: string;
31 |
32 | reHeaders?: Record;
33 | reCookies?: Record;
34 | reType?: string;
35 | resData?: string;
36 | error?: string;
37 | statusCode?: string;
38 | statusName?: string;
39 | }
40 |
--------------------------------------------------------------------------------
/TestHub-client/src/typings/server/plugins/index.ts:
--------------------------------------------------------------------------------
1 | export * from './app';
2 | export * from './http';
--------------------------------------------------------------------------------
/TestHub-client/src/typings/theme.ts:
--------------------------------------------------------------------------------
1 | import { ThemeType, PrimaryColorType } from '@/constants';
2 |
3 | export interface ITheme {
4 | backgroundColor: ThemeType;
5 | primaryColor: PrimaryColorType;
6 | }
7 |
--------------------------------------------------------------------------------
/TestHub-client/src/typings/tree.ts:
--------------------------------------------------------------------------------
1 | export interface RenameDto {
2 | key: string;
3 | /** 名称 */
4 | name: string;
5 |
6 | }
--------------------------------------------------------------------------------
/TestHub-client/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "./src/.umi/tsconfig.json",
3 | "compilerOptions": {
4 | "moduleResolution": "node",
5 | "jsx": "react-jsx",
6 | "noImplicitAny": false
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/TestHub-demo/TestHubDemo/demo备份/h2db.mv.db:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-demo/TestHubDemo/demo备份/h2db.mv.db
--------------------------------------------------------------------------------
/TestHub-demo/TestHubDemo/env/pgsql/init.sql:
--------------------------------------------------------------------------------
1 | CREATE TABLE "public"."test_order" (
2 | "id" int8 NOT NULL,
3 | "code" varchar(255) COLLATE "pg_catalog"."default",
4 | "acct_id" int4,
5 | "order_price" numeric(10,2),
6 | "order_qty" int4,
7 | "order_amt" numeric(10,2),
8 | CONSTRAINT "test_order_pkey" PRIMARY KEY ("id")
9 | )
10 | ;
11 |
12 | ALTER TABLE "public"."test_order"
13 | OWNER TO "postgres";
14 |
15 |
16 | CREATE TABLE "public"."test_account" (
17 | "id" int4 NOT NULL,
18 | "usable_amt" numeric(10,2) NOT NULL,
19 | CONSTRAINT "test_account_pkey" PRIMARY KEY ("id")
20 | )
21 | ;
22 |
23 | ALTER TABLE "public"."test_account"
24 | OWNER TO "postgres";
25 |
26 |
27 | INSERT INTO "public"."test_account" ("id", "usable_amt") VALUES (960307, '100000.00');
--------------------------------------------------------------------------------
/TestHub-demo/TestHubDemo/env/testhub/data/db/data/h2db.mv.db:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-demo/TestHubDemo/env/testhub/data/db/data/h2db.mv.db
--------------------------------------------------------------------------------
/TestHub-demo/server/src/main/java/com/goddess/server/SpringbootMybatisplusApplication.java:
--------------------------------------------------------------------------------
1 | package com.goddess.server;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class SpringbootMybatisplusApplication {
8 |
9 | public static void main(String[] args) {
10 | SpringApplication.run(SpringbootMybatisplusApplication.class, args);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/TestHub-demo/server/src/main/java/com/goddess/server/dao/AccountMapper.java:
--------------------------------------------------------------------------------
1 | package com.goddess.server.dao;
2 |
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 | import com.goddess.server.entity.Account;
5 | import org.apache.ibatis.annotations.Mapper;
6 |
7 |
8 | @Mapper
9 | public interface AccountMapper extends BaseMapper {
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/TestHub-demo/server/src/main/java/com/goddess/server/dao/OrderMapper.java:
--------------------------------------------------------------------------------
1 | package com.goddess.server.dao;
2 |
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 | import com.goddess.server.entity.Order;
5 | import org.apache.ibatis.annotations.Mapper;
6 |
7 |
8 | @Mapper
9 | public interface OrderMapper extends BaseMapper {
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/TestHub-demo/server/src/main/java/com/goddess/server/dto/XmlData.java:
--------------------------------------------------------------------------------
1 | package com.goddess.server.dto;
2 | import javax.xml.bind.annotation.XmlElement;
3 | import javax.xml.bind.annotation.XmlRootElement;
4 |
5 | @XmlRootElement(name = "xmlData")
6 | public class XmlData {
7 |
8 | @XmlElement
9 | private String field1;
10 |
11 | @XmlElement
12 | private int field2;
13 |
14 | // Getter and Setter methods for field1 and field2
15 |
16 | public String toXmlString() {
17 | // 将对象转换为 XML 字符串的逻辑
18 | // 这里只是一个示例,你可以根据实际需求自行编写逻辑
19 | StringBuilder xmlBuilder = new StringBuilder();
20 | xmlBuilder.append("");
21 | xmlBuilder.append("").append(field1).append("");
22 | xmlBuilder.append("").append(field2).append("");
23 | xmlBuilder.append("");
24 | return xmlBuilder.toString();
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/TestHub-demo/server/src/main/java/com/goddess/server/entity/Account.java:
--------------------------------------------------------------------------------
1 | package com.goddess.server.entity;
2 |
3 | import com.baomidou.mybatisplus.annotation.TableName;
4 | import lombok.Data;
5 |
6 | import java.io.Serializable;
7 | import java.math.BigDecimal;
8 |
9 | @Data
10 | @TableName(value = "test_account", resultMap = "poMap")
11 | public class Account implements Serializable {
12 | private Long id;
13 | private BigDecimal usableAmt;
14 | }
15 |
--------------------------------------------------------------------------------
/TestHub-demo/server/src/main/java/com/goddess/server/entity/Order.java:
--------------------------------------------------------------------------------
1 | package com.goddess.server.entity;
2 |
3 | import com.baomidou.mybatisplus.annotation.TableName;
4 | import lombok.Data;
5 |
6 | import java.math.BigDecimal;
7 |
8 | @Data
9 | @TableName(value = "test_order", resultMap = "poMap")
10 | public class Order {
11 | private Long id;
12 | private String code;
13 | private Long acctId;
14 | private Integer orderQty;
15 | private BigDecimal orderPrice;
16 | private BigDecimal orderAmt;
17 |
18 |
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/TestHub-demo/server/src/main/resources/mapper/AccountMapper.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/TestHub-demo/server/src/main/resources/mapper/OrderMapper.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/TestHub-demo/serverDocker/build_and_push.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # 读取用户输入
4 | read -p "Docker Hub 用户名: " DOCKER_USERNAME
5 | read -s -p "Docker Hub 密码: " DOCKER_PASSWORD
6 | echo
7 | read -p "TAG 标签号: " DOCKER_IMAGE_TAG
8 |
9 | # 设置变量
10 | DOCKER_IMAGE_NAME="server"
11 | DOCKERHUB_REPO="vinc02131"
12 |
13 | # 构建镜像
14 | docker build -t $DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG .
15 |
16 | # 添加标签
17 | docker tag $DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG $DOCKERHUB_REPO/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG
18 |
19 | # 登录到 Docker Hub
20 | echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
21 |
22 | # 推送镜像到 Docker Hub
23 | docker push $DOCKERHUB_REPO/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG
24 |
25 | # 注销 Docker Hub
26 | docker logout
27 |
--------------------------------------------------------------------------------
/TestHub-demo/serverDocker/dockerfile:
--------------------------------------------------------------------------------
1 | # 使用 openjdk 17 作为基础镜像
2 | FROM openjdk:17-alpine
3 |
4 | # 将后台服务的可执行文件复制到容器中
5 | COPY /backend /backend
6 | # 设置工作目录
7 | WORKDIR /backend
8 | # 暴露后台服务和前端静态文件的端口
9 | EXPOSE 12004 12004
10 | # 启动后台服务
11 | CMD java -jar server-1.0-SNAPSHOT.jar
--------------------------------------------------------------------------------
/TestHub-doc/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | node_modules/
3 | src/.vuepress/.cache/
4 | src/.vuepress/.temp/
5 | src/.vuepress/dist/
6 |
--------------------------------------------------------------------------------
/TestHub-doc/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "testhub_doc",
3 | "version": "1.0.4",
4 | "description": "流程编排,插件驱动,测试无限可能",
5 | "license": "Apache License 2.0",
6 | "type": "module",
7 | "scripts": {
8 | "docs:build": "vuepress build src",
9 | "docs:clean-dev": "vuepress dev src --clean-cache",
10 | "docs:dev": "vuepress dev src",
11 | "docs:update-package": "pnpm dlx vp-update"
12 | },
13 | "devDependencies": {
14 | "@vuepress/client": "2.0.0-beta.66",
15 | "vue": "^3.3.4",
16 | "vuepress": "2.0.0-beta.66",
17 | "vuepress-theme-hope": "2.0.0-beta.235"
18 | }
19 | }
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/build_and_push.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # 读取用户输入
4 | read -s -p "Docker Hub 密码: " DOCKER_PASSWORD
5 | echo
6 | read -p "TAG 标签号: " DOCKER_IMAGE_TAG
7 |
8 | # 设置变量
9 | DOCKER_IMAGE_NAME="testhub_doc"
10 | DOCKER_USERNAME="vinc02131"
11 | DOCKERHUB_REPO="vinc02131"
12 | cd ../..
13 | pwd
14 | yarn docs:build
15 | cd ./src/.vuepress
16 | pwd
17 |
18 | # 构建镜像
19 | docker build -t $DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG .
20 |
21 | # 添加标签
22 | docker tag $DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG $DOCKERHUB_REPO/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG
23 |
24 | # 登录到 Docker Hub
25 | echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
26 |
27 | # 推送镜像到 Docker Hub
28 | docker push $DOCKERHUB_REPO/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG
29 |
30 | # 注销 Docker Hub
31 | docker logout
32 |
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/config.ts:
--------------------------------------------------------------------------------
1 | import { defineUserConfig } from "vuepress";
2 | import theme from "./theme.js";
3 |
4 | export default defineUserConfig({
5 | base: "/",
6 |
7 | lang: "zh-CN",
8 | title: "TestHub",
9 | description: "TestHub 的文档演示",
10 |
11 | theme,
12 |
13 | // Enable it with pwa
14 | // shouldPrefetch: false,
15 | });
16 |
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/dockerfile:
--------------------------------------------------------------------------------
1 | # 使用 Nginx 作为基础镜像
2 | FROM nginx:latest
3 |
4 | # 将静态 HTML 文件复制到容器中的指定路径
5 | COPY ./dist /usr/share/nginx/html
6 |
7 | # 暴露 Nginx 的默认 HTTP 端口(一般为 80)
8 | EXPOSE 80
9 |
10 | # 启动 Nginx 服务器
11 | CMD ["nginx", "-g", "daemon off;"]
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/navbar.ts:
--------------------------------------------------------------------------------
1 | import { navbar } from "vuepress-theme-hope";
2 |
3 | export default navbar([
4 | {
5 | text: "🏡首页",
6 | link: "/README.md",
7 | // // 仅在 `/zh/guide/` 激活
8 | // activeMatch: "^/zh/guide/$",
9 | },
10 | { text: "📖使用文档", link: "/ability/README.md" },
11 | // {
12 | // text: "📒javaDoc",
13 | // link: "https://apidoc.gitee.com/dromara/sms4j"
14 | // },
15 | { text: "🏮gitee", link: "https://gitee.com/dromara/TestHub" },
16 | { text: "🪀github", link: "https://github.com/dromara/TestHub" },
17 | { text: "🤝Dromara组织", link: "https://dromara.org/zh/" },
18 | { text: "🔍常见问题", link: "/issue" },
19 | { text: "💡更新日志", link: "/log" },
20 | // { text: "🎎贡献者", link: "/doc/developer.md" },
21 | { text: "👪加入交流群", link: "/group", },
22 |
23 | ]);
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/assets/icon/apple-icon-152.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/assets/icon/apple-icon-152.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/assets/icon/chrome-192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/assets/icon/chrome-192.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/assets/icon/chrome-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/assets/icon/chrome-512.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/assets/icon/chrome-mask-192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/assets/icon/chrome-mask-192.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/assets/icon/chrome-mask-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/assets/icon/chrome-mask-512.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/assets/icon/guide-maskable.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/assets/icon/guide-maskable.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/assets/icon/ms-icon-144.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/assets/icon/ms-icon-144.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/assets/image/box.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/assets/image/github-dark.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/assets/image/github-light.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/assets/image/markdown.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/contact.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/contact.jpeg
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/demo/antiocn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/demo/antiocn.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/demo/check.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/demo/check.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/demo/check_loop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/demo/check_loop.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/demo/check_obj.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/demo/check_obj.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/demo/const.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/demo/const.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/demo/convert.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/demo/convert.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/demo/cutoff.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/demo/cutoff.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/demo/demo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/demo/demo.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/demo/http.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/demo/http.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/demo/sleep.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/demo/sleep.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/demo/sql.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/demo/sql.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/demo/sqldmi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/demo/sqldmi.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/favicon.ico
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/build/表达式.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/build/表达式.jpg
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/Binlog4j.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/Binlog4j.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/Disjob.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/Disjob.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/cloudeon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/cloudeon.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/cubic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/cubic.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/dantecloud-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/dantecloud-logo.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/disjob-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/disjob-2.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/dromara.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/dromara.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/dynamic-tp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/dynamic-tp.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/easy-es2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/easy-es2.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/fast-request.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/fast-request.gif
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/fast-request.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/fast-request.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/file4j.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/file4j.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/forest-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/forest-logo.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/gobrsasync-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/gobrsasync-logo.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/goview-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/goview-logo.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/hertzbeat-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/hertzbeat-logo.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/hmily.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/hmily.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/hodor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/hodor.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/hutool2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/hutool2.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/imagecombiner-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/imagecombiner-logo.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/jpom.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/jpom.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/koalas-rpc2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/koalas-rpc2.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/liteflow2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/liteflow2.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/maxkey.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/maxkey.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/maxkey3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/maxkey3.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/mayfly-go.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/mayfly-go.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/mendmix.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/mendmix.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/myth.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/myth.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/northstar_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/northstar_logo.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/raincat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/raincat.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/ruoyi-plus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/ruoyi-plus.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/sa-token.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/sa-token.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/sms4j.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/sms4j.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/sureness.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/sureness.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/test-hub-heng.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/test-hub-heng.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/tlog2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/tlog2.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/wemq.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/wemq.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/wiki-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/wiki-logo.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/xeasypdf-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/xeasypdf-logo.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/friends/link/yft-design.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/friends/link/yft-design.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/global/参数覆盖规则.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/global/参数覆盖规则.jpg
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/global/行为覆盖规则.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/global/行为覆盖规则.jpg
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/logDesc/1_0_2/全局行为.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/logDesc/1_0_2/全局行为.jpg
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/logDesc/1_0_2/环境级参数.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/logDesc/1_0_2/环境级参数.jpg
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/logDesc/1_0_2/退出登陆.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/logDesc/1_0_2/退出登陆.jpg
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/logDesc/1_0_2/选择环境.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/logDesc/1_0_2/选择环境.jpg
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/logDesc/1_0_4/jiansuo.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/logDesc/1_0_4/jiansuo.jpg
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/logDesc/1_0_4/tabs.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/logDesc/1_0_4/tabs.jpg
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/images/logDesc/1_0_4/yidong.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/images/logDesc/1_0_4/yidong.jpg
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/public/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-doc/src/.vuepress/public/logo.png
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/sidebar.ts:
--------------------------------------------------------------------------------
1 | import { sidebar } from "vuepress-theme-hope";
2 |
3 | export default sidebar({
4 | "/": [
5 | "",
6 | {
7 | text: "可以干什么",
8 | icon: "laptop-code",
9 | prefix: "ability/",
10 | link: "ability/",
11 | children: "structure",
12 | },
13 | {
14 | text: "灵活定制",
15 | icon: "code",
16 | prefix: "custom/",
17 | link: "custom/",
18 | children: "structure",
19 | },
20 | {
21 | text: "原理介绍",
22 | icon: "book",
23 | prefix: "principle/",
24 | link: "principle/",
25 | children: "structure",
26 | },
27 | {
28 | text: "全局配置",
29 | icon: "gears",
30 | prefix: "global/",
31 | link: "global/",
32 | children: "structure",
33 | },
34 | ],
35 | });
36 |
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/styles/config.scss:
--------------------------------------------------------------------------------
1 | // you can change config here
2 | $colors: #c0392b, #d35400, #f39c12, #27ae60, #16a085, #2980b9, #8e44ad, #2c3e50,
3 | #7f8c8d !default;
4 |
5 | #friends-item {
6 | width: 300px;
7 | height: 150px;
8 | }
9 |
10 | #no-zoom friends-item-img {
11 | width: 300px;
12 | height: 150px;
13 | }
14 |
15 | .centerDiv {
16 | width: 100%;
17 | display: flex;
18 | justify-content: center;
19 | align-items: center;
20 | }
--------------------------------------------------------------------------------
/TestHub-doc/src/.vuepress/styles/palette.scss:
--------------------------------------------------------------------------------
1 | // you can change colors here
2 | $theme-color: #096dd9;
3 |
--------------------------------------------------------------------------------
/TestHub-doc/src/ability/sleep.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 🍉 sleep 暂停休息
3 | order: 90
4 | editLink: false
5 | category:
6 | - 能力
7 | ---
8 |
9 | ## SLEEP
10 |
11 | 在自动化测试中,有些接口需要进行异步落库操作。为了确保测试程序在进行后续步骤之前等待足够的时间,我们需要添加一个延时机制。这样,测试程序将在适当的时间间隔后继续执行,以便正确处理异步落库操作。通过这个延时机制,我们可以确保测试的准确性和可靠性。
12 |
13 | ::: tip 特殊提示
14 |
15 | sleep 已经是全局的配置,不需要单独定义 action
16 |
17 | :::
18 |
19 | ```xml copy
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | ```
30 |
31 |
32 |
--------------------------------------------------------------------------------
/TestHub-doc/src/custom/README.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: 灵活定制
3 | index: false
4 | icon: laptop-code
5 | editLink: false
6 | category:
7 | - 使用指南
8 | ---
9 |
10 | ::: danger 为客官老爷们画堆 🧇🍕🥮🌮
11 | **目前针对测试用例的编写我们只提供 `xml` 模式,页面`拖拉拽`的编辑后续提供。**
12 | :::
13 |
14 | 每一个测试用例都是一个 xml 的文件,每一段 xml 都是一个组件,组件参数部分重点介绍用例文件中各个组件的DOM应该如何编写。
15 | 学习完本章你可以灵活配置你的测试用例流程
16 |
17 | ::: info
18 | 组件参数部分各部分的介绍都会按照 [rule-用例 ](../custom/base.md#rule用例)。的方式介绍请必读必读
19 | :::
20 |
--------------------------------------------------------------------------------
/TestHub-docker/backend/application.yml:
--------------------------------------------------------------------------------
1 | server:
2 | #服务端口
3 | port: 12003
4 | servlet:
5 | context-path: /api
6 |
7 |
8 |
9 | spring:
10 | mvc:
11 | pathmatch:
12 | matching-strategy: ANT_PATH_MATCHER
13 | application:
14 | #服务名称
15 | name: TestHub
16 | servlet:
17 | multipart:
18 | max-file-size: 50MB #单个文件大小
19 | max-request-size: 500MB # 一个次请求中上传文件的总容量的限制
20 | profiles:
21 | #指明使用的数据库
22 | active: h2
23 | # active: pgsql
24 | #导入其他yml文件
25 | include: testhub,actuator,mybatisplus
26 | logging:
27 | config: classpath:config/logback-spring.xml
28 |
29 |
30 |
--------------------------------------------------------------------------------
/TestHub-docker/backend/config/logback-spring.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | ${pattern}
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
22 |
--------------------------------------------------------------------------------
/TestHub-docker/dockerfile:
--------------------------------------------------------------------------------
1 | # 使用 openjdk 17 作为基础镜像
2 | FROM openjdk:17-alpine
3 | # 修改软件源安装 Nginx
4 | RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tencent.com/g' /etc/apk/repositories \
5 | && apk add --update --no-cache nginx \
6 | && rm -f /var/cache/apk/*
7 |
8 | COPY frontend /frontend
9 | # 将后台服务的可执行文件复制到容器中
10 | COPY /backend /backend
11 | # 配置 Nginx
12 | COPY nginx.conf /etc/nginx/nginx.conf
13 | # 设置工作目录
14 | WORKDIR /backend
15 | # 暴露后台服务和前端静态文件的端口
16 | EXPOSE 12003 12003
17 | EXPOSE 11018 11018
18 | # 启动后台服务和 Nginx
19 | CMD java -jar TestHub.jar & nginx -g "daemon off;"
--------------------------------------------------------------------------------
/TestHub-docker/frontend/logo.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-docker/frontend/logo.ico
--------------------------------------------------------------------------------
/TestHub-docker/frontend/static/codicon.ecfbfe4b.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-docker/frontend/static/codicon.ecfbfe4b.ttf
--------------------------------------------------------------------------------
/TestHub-docker/frontend/static/contact.6e1d01ef.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-docker/frontend/static/contact.6e1d01ef.jpeg
--------------------------------------------------------------------------------
/TestHub-docker/frontend/static/iconfont.302ebffe.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-docker/frontend/static/iconfont.302ebffe.woff
--------------------------------------------------------------------------------
/TestHub-docker/frontend/static/iconfont.8290aa03.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-docker/frontend/static/iconfont.8290aa03.ttf
--------------------------------------------------------------------------------
/TestHub-docker/frontend/static/iconfont.ae8e71c5.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-docker/frontend/static/iconfont.ae8e71c5.woff2
--------------------------------------------------------------------------------
/TestHub-docker/frontend/static/logo.5eb2613d.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-docker/frontend/static/logo.5eb2613d.webp
--------------------------------------------------------------------------------
/TestHub-electron/build/icons/256x256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-electron/build/icons/256x256.png
--------------------------------------------------------------------------------
/TestHub-electron/build/icons/32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-electron/build/icons/32x32.png
--------------------------------------------------------------------------------
/TestHub-electron/build/icons/512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-electron/build/icons/512x512.png
--------------------------------------------------------------------------------
/TestHub-electron/build/icons/64x64.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-electron/build/icons/64x64.png
--------------------------------------------------------------------------------
/TestHub-electron/build/icons/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-electron/build/icons/icon.png
--------------------------------------------------------------------------------
/TestHub-electron/build/script/installer.nsh:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-electron/build/script/installer.nsh
--------------------------------------------------------------------------------
/TestHub-electron/electron/addon/security/index.js:
--------------------------------------------------------------------------------
1 | const Log = require('ee-core/log');
2 | const EE = require('ee-core/ee');
3 |
4 | /**
5 | * 安全插件
6 | * @class
7 | */
8 | class SecurityAddon {
9 |
10 | constructor() {
11 | }
12 |
13 | /**
14 | * 创建
15 | */
16 | create () {
17 | Log.info('[addon:security] load');
18 | const { CoreApp } = EE;
19 | const runWithDebug = process.argv.find(function(e){
20 | let isHasDebug = e.includes("--inspect") || e.includes("--inspect-brk") || e.includes("--remote-debugging-port");
21 | return isHasDebug;
22 | })
23 |
24 | // 不允许远程调试
25 | if (runWithDebug) {
26 | Log.error('[error] Remote debugging is not allowed, runWithDebug:', runWithDebug);
27 | CoreApp.appQuit();
28 | }
29 | }
30 | }
31 |
32 | SecurityAddon.toString = () => '[class SecurityAddon]';
33 | module.exports = SecurityAddon;
--------------------------------------------------------------------------------
/TestHub-electron/electron/config/config.local.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | /*
4 | * test
5 | */
6 | exports.testConfig = {
7 | login: 'http://local.com/api/login',
8 | };
9 |
--------------------------------------------------------------------------------
/TestHub-electron/electron/config/config.prod.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | /*
4 | * test
5 | */
6 | exports.testConfig = {
7 | login: 'http://prod.com/api/login',
8 | };
9 |
--------------------------------------------------------------------------------
/TestHub-electron/electron/config/encrypt.js:
--------------------------------------------------------------------------------
1 | /**
2 | * 加密配置
3 | * @param type - confusion | bytecode | strict
4 | */
5 | module.exports = {
6 | type: 'confusion',
7 | files: [
8 | 'electron/**/*.(js|json)',
9 | '!electron/config/encrypt.js',
10 | '!electron/config/nodemon.json',
11 | '!electron/config/builder.json',
12 | ],
13 | fileExt: ['.js'],
14 | confusionOptions: {
15 | compact: true,
16 | stringArray: true,
17 | stringArrayEncoding: ['none'],
18 | deadCodeInjection: false,
19 | }
20 | };
--------------------------------------------------------------------------------
/TestHub-electron/electron/config/nodemon.json:
--------------------------------------------------------------------------------
1 | {
2 | "watch": [
3 | "electron/",
4 | "main.js"
5 | ],
6 | "ignore": [],
7 | "ext": "js,json",
8 | "verbose": true,
9 | "exec": "electron . --env=local --hot-reload=1",
10 | "restartable": "hr",
11 | "colours": true,
12 | "events": {}
13 | }
--------------------------------------------------------------------------------
/TestHub-electron/electron/controller/example.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const { Controller } = require('ee-core');
4 | const Log = require('ee-core/log');
5 | const Services = require('ee-core/services');
6 |
7 | /**
8 | * example
9 | * @class
10 | */
11 | class ExampleController extends Controller {
12 |
13 | constructor(ctx) {
14 | super(ctx);
15 | }
16 |
17 |
18 | /**
19 | * 所有方法接收两个参数
20 | * @param args 前端传的参数
21 | * @param event - ipc通信时才有值。详情见:控制器文档
22 | */
23 |
24 | /**
25 | * test
26 | */
27 | async test () {
28 | const result = await Services.get('example').test('electron');
29 | Log.info('service result:', result);
30 |
31 | return 'hello electron-egg';
32 | }
33 | }
34 |
35 | ExampleController.toString = () => '[class ExampleController]';
36 | module.exports = ExampleController;
--------------------------------------------------------------------------------
/TestHub-electron/electron/jobs/example/hello.js:
--------------------------------------------------------------------------------
1 | const Log = require('ee-core/log');
2 |
3 | exports.welcome = function () {
4 | Log.info('[child-process] [jobs/example/hello] welcome ! ');
5 | }
--------------------------------------------------------------------------------
/TestHub-electron/electron/jobs/example/timer.js:
--------------------------------------------------------------------------------
1 | const Job = require('ee-core/jobs/baseJobClass');
2 | const Log = require('ee-core/log');
3 | const Ps = require('ee-core/ps');
4 |
5 | /**
6 | * example - TimerJob
7 | * @class
8 | */
9 | class TimerJob extends Job {
10 |
11 | constructor(params) {
12 | super();
13 | this.params = params;
14 | }
15 |
16 | /**
17 | * handle()方法是必要的,且会被自动调用
18 | */
19 | async handle () {
20 | Log.info("[child-process] TimerJob params: ", this.params);
21 |
22 | if (Ps.isChildJob()) {
23 | Ps.exit();
24 | }
25 | }
26 | }
27 |
28 | TimerJob.toString = () => '[class TimerJob]';
29 | module.exports = TimerJob;
30 |
--------------------------------------------------------------------------------
/TestHub-electron/electron/preload/bridge.js:
--------------------------------------------------------------------------------
1 | /*
2 | * 如果启用了上下文隔离,渲染进程无法使用electron的api,
3 | * 可通过contextBridge 导出api给渲染进程使用
4 | */
5 |
6 | const { contextBridge, ipcRenderer } = require('electron')
7 |
8 | contextBridge.exposeInMainWorld('electron', {
9 | ipcRenderer: ipcRenderer,
10 | })
--------------------------------------------------------------------------------
/TestHub-electron/electron/preload/index.js:
--------------------------------------------------------------------------------
1 | /*************************************************
2 | ** preload为预加载模块,该文件将会在程序启动时加载 **
3 | *************************************************/
4 | const Addon = require('ee-core/addon');
5 |
6 | /**
7 | * 预加载模块入口
8 | */
9 | module.exports = async () => {
10 | // Addon.get('javaServer').create();
11 | // 示例功能模块,可选择性使用和修改
12 | Addon.get('tray').create();
13 | Addon.get('security').create();
14 | Addon.get('awaken').create();
15 |
16 | // Addon.get('autoUpdater').create();
17 | }
--------------------------------------------------------------------------------
/TestHub-electron/electron/service/example.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const { Service } = require('ee-core');
4 |
5 | /**
6 | * 示例服务(service层为单例)
7 | * @class
8 | */
9 | class ExampleService extends Service {
10 |
11 | constructor(ctx) {
12 | super(ctx);
13 | }
14 |
15 | /**
16 | * test
17 | */
18 | async test(args) {
19 | let obj = {
20 | status:'ok',
21 | params: args
22 | }
23 |
24 | return obj;
25 | }
26 | }
27 |
28 | ExampleService.toString = () => '[class ExampleService]';
29 | module.exports = ExampleService;
--------------------------------------------------------------------------------
/TestHub-electron/main.js:
--------------------------------------------------------------------------------
1 | const { ElectronEgg } = require('ee-core');
2 | new ElectronEgg();
--------------------------------------------------------------------------------
/TestHub-electron/public/html/view_example.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
15 |
16 |
17 |
18 |
19 | 这是一个html页面
20 |
21 |
22 |
--------------------------------------------------------------------------------
/TestHub-electron/public/images/1tray.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-electron/public/images/1tray.png
--------------------------------------------------------------------------------
/TestHub-electron/public/images/logo-32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-electron/public/images/logo-32.png
--------------------------------------------------------------------------------
/TestHub-electron/public/images/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-electron/public/images/logo.png
--------------------------------------------------------------------------------
/TestHub-electron/public/images/tray.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dromara/TestHub/0d77170022e6b7d9d86ea63fd61906e4525f825a/TestHub-electron/public/images/tray.png
--------------------------------------------------------------------------------
/TestHub-electron/test.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | read -p "版本号: " DOCKER_IMAGE_TAG
4 |
5 | # # build前端
6 | cd ../client/
7 | yarn build:desktop
8 |
9 | # pwd
10 |
11 | # # 拷贝前端
12 | cd ../electron-egg
13 | # pwd
14 | cp -r ../client/dist/* ./public/dist
15 |
16 | cp ../server/testhub-server/target/testhub-server-$DOCKER_IMAGE_TAG-SNAPSHOT.jar ./build/extraResources/TestHub.jar
17 |
18 | cp -r ./build/jre/mac_jre/* ./build/extraResources/jdk-17.0.6/
19 |
20 |
21 |
--------------------------------------------------------------------------------
/TestHub-server/.gitignore:
--------------------------------------------------------------------------------
1 | target/
2 | !.mvn/wrapper/maven-wrapper.jar
3 | !**/src/main/**/target/
4 | !**/src/test/**/target/
5 |
6 | ### IntelliJ IDEA ###
7 | .idea/modules.xml
8 | .idea/jarRepositories.xml
9 | .idea/compiler.xml
10 | .idea/libraries/
11 | *.iws
12 | *.iml
13 | *.ipr
14 |
15 | ### Eclipse ###
16 | .apt_generated
17 | .classpath
18 | .factorypath
19 | .project
20 | .settings
21 | .springBeans
22 | .sts4-cache
23 |
24 | ### NetBeans ###
25 | /nbproject/private/
26 | /nbbuild/
27 | /dist/
28 | /nbdist/
29 | /.nb-gradle/
30 | build/
31 | !**/src/main/**/build/
32 | !**/src/test/**/build/
33 |
34 | ### VS Code ###
35 | .vscode/
36 |
37 | ### Mac OS ###
38 | .DS_Store
--------------------------------------------------------------------------------
/TestHub-server/testhub-framework/src/main/java/org/dromara/testhub/framework/config/WebDataConfigurer.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.framework.config;
2 |
3 | import org.springframework.context.annotation.Configuration;
4 | import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
5 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
6 |
7 | @Configuration
8 | public class WebDataConfigurer implements WebMvcConfigurer {
9 | @Override
10 | public void addResourceHandlers(ResourceHandlerRegistry registry) {
11 | registry.addResourceHandler("/data/**").addResourceLocations("classpath:/data/");
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-framework/src/main/java/org/dromara/testhub/framework/config/WebInterceptorConfig.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.framework.config;
2 |
3 | import org.dromara.testhub.framework.interceptor.ExtraParamInterceptor;
4 | import org.springframework.context.annotation.Configuration;
5 | import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
6 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
7 |
8 | @Configuration
9 | public class WebInterceptorConfig implements WebMvcConfigurer {
10 |
11 | @Override
12 | public void addInterceptors(InterceptorRegistry registry) {
13 | // 加入框架的拦截器,用于处理header中的公共参数
14 | registry.addInterceptor(new ExtraParamInterceptor()).addPathPatterns("/**");
15 | }
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-framework/src/main/java/org/dromara/testhub/framework/config/WebViewConfig.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.framework.config;
2 |
3 | import org.springframework.context.annotation.Configuration;
4 | import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
5 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
6 |
7 | @Configuration
8 | public class WebViewConfig implements WebMvcConfigurer {
9 | @Override
10 | public void addViewControllers(ViewControllerRegistry registry) {
11 | registry.addRedirectViewController("/", "/swagger-ui/index.html");
12 | }
13 | }
14 |
15 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-framework/src/main/java/org/dromara/testhub/framework/exceptionHandler/ValidMsg.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.framework.exceptionHandler;
2 |
3 | import lombok.Data;
4 |
5 | import java.io.Serializable;
6 |
7 | /**
8 | * @author 失败女神
9 | * @email: 18733123202@163.com
10 | * @date 2023/7/1 上午9:35
11 | */
12 | @Data
13 | public class ValidMsg implements Serializable {
14 | private static final long serialVersionUID = 1L;
15 |
16 | private String object;
17 |
18 | private String field;
19 |
20 | private String msg;
21 |
22 | public ValidMsg(String object, String field, String msg) {
23 | this.object = object;
24 | this.field = field;
25 | this.msg = msg;
26 | }
27 |
28 | }
29 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-framework/src/main/java/org/dromara/testhub/framework/interceptor/ExtraParam.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.framework.interceptor;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Data;
5 | import lombok.NoArgsConstructor;
6 |
7 | import java.io.Serializable;
8 |
9 | @Data
10 | @AllArgsConstructor
11 | @NoArgsConstructor
12 | public class ExtraParam implements Serializable {
13 |
14 | private static final long serialVersionUID = 1L;
15 |
16 | String saToken;
17 |
18 | String traceId;
19 |
20 | Long userId = -1l;
21 |
22 | }
23 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-framework/src/main/java/org/dromara/testhub/framework/mybatis/IBaseMapper.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.framework.mybatis;
2 |
3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 |
5 | public interface IBaseMapper extends BaseMapper {
6 | }
7 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-framework/src/main/java/org/dromara/testhub/framework/trace/WebConfig.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.framework.trace;
2 |
3 | import org.springframework.context.annotation.Configuration;
4 | import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
5 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
6 |
7 | import javax.annotation.Resource;
8 |
9 |
10 | @Configuration
11 | public class WebConfig implements WebMvcConfigurer {
12 | @Resource
13 | private TraceInterceptor traceInterceptor;
14 |
15 | @Override
16 | public void addInterceptors(InterceptorRegistry registry) {
17 | registry.addInterceptor(traceInterceptor)
18 | .addPathPatterns("/**");
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-framework/src/main/java/org/dromara/testhub/framework/util/DateUtil.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.framework.util;
2 |
3 | import java.time.Instant;
4 | import java.time.LocalDateTime;
5 | import java.time.ZoneId;
6 |
7 | public class DateUtil {
8 | public static LocalDateTime getDateTimeOfTimestamp(long timestamp) {
9 | Instant instant = Instant.ofEpochMilli(timestamp);
10 | ZoneId zone = ZoneId.systemDefault();
11 | return LocalDateTime.ofInstant(instant, zone);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-framework/src/main/java/org/dromara/testhub/framework/util/IdGenerator.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.framework.util;
2 |
3 | import lombok.extern.slf4j.Slf4j;
4 | import org.springframework.stereotype.Component;
5 |
6 | import javax.annotation.PostConstruct;
7 |
8 |
9 | @Slf4j
10 | @Component
11 | public class IdGenerator {
12 | private int nodeId = 1;
13 |
14 | private SnowFlakeGenerator snowFlakeGenerator = new SnowFlakeGenerator(nodeId);
15 |
16 |
17 | @PostConstruct
18 | public void init() {
19 | log.info("当前机器的nodeID:{}",nodeId);
20 | }
21 |
22 | /**
23 | * 使用默认的workId 和 datacenter
24 | *
25 | * @return
26 | */
27 | public synchronized long snowflakeId() {
28 | return snowFlakeGenerator.nextId();
29 | }
30 |
31 | public synchronized String snowflakeIdStr() {
32 | return snowFlakeGenerator.nextId() + "";
33 | }
34 |
35 |
36 |
37 | }
38 |
39 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-framework/src/main/java/org/dromara/testhub/framework/util/ListUtils.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.framework.util;
2 |
3 | import java.util.ArrayList;
4 |
5 | public class ListUtils extends ArrayList {
6 | public ListUtils add2(T value) {
7 | super.add( value);
8 | return this;
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-framework/src/main/java/org/dromara/testhub/framework/util/UserUtil.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.framework.util;
2 |
3 | import cn.dev33.satoken.stp.StpUtil;
4 |
5 | /**
6 | * @author yetier
7 | */
8 | public class UserUtil {
9 | public static final String USER_ID = "userId";
10 | public static final String ROLE_ADMIN = "admin";
11 | public static Long getCurrentUserId(){
12 | Long optId = ContextManager.getContextItem(USER_ID,Long.class);
13 | if(optId == null){
14 | return Long.parseLong(StpUtil.getLoginId().toString());
15 | }
16 | return optId;
17 | }
18 | public static boolean checkRole(String role){
19 | try {
20 | StpUtil.checkRole(role);
21 | return true;
22 | }catch (Exception e){
23 | return false;
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-framework/src/main/java/org/dromara/testhub/framework/web/dto/IRequestDto.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.framework.web.dto;
2 |
3 |
4 | import java.io.Serializable;
5 |
6 | /**
7 | * @author 失败女神
8 | * @email: 18733123202@163.com
9 | * @date 2021/4/7 上午10:22
10 | * @Copyright © 女神帮
11 | */
12 | public interface IRequestDto extends Serializable {
13 |
14 | }
15 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-framework/src/main/java/org/dromara/testhub/framework/web/dto/IResponseDto.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.framework.web.dto;
2 |
3 | import java.io.Serializable;
4 |
5 | /**
6 | * @author 失败女神
7 | * @email: 18733123202@163.com
8 | * @date 2021/4/7 上午10:22
9 | * @Copyright © 女神帮
10 | */
11 | public interface IResponseDto extends Serializable {
12 | }
13 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-nsrule/nsrule-core/src/main/java/org/dromara/testhub/nsrule/core/eventbus/AsyncEventBus.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.nsrule.core.eventbus;
2 |
3 | import java.util.concurrent.Executor;
4 |
5 |
6 | public class AsyncEventBus extends EventBus {
7 | public AsyncEventBus(Executor executor) {
8 | super(executor);
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-nsrule/nsrule-core/src/main/java/org/dromara/testhub/nsrule/core/eventbus/EventMessage.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.nsrule.core.eventbus;
2 |
3 | import org.dromara.testhub.nsrule.core.executer.context.Context;
4 |
5 |
6 | /**
7 | * @author: 失败女神-vinc
8 | * @email: 18733123202@163.com
9 | * @date: 2023/4/16 19:00
10 | */
11 | public class EventMessage {
12 |
13 | private Context context;
14 | private Object data;
15 |
16 | public EventMessage(Context context, Object data) {
17 | this.data = data;
18 | this.context = context;
19 | }
20 |
21 |
22 | public Object getData() {
23 | return data;
24 | }
25 |
26 | public Context getContext() {
27 | return context;
28 | }
29 |
30 | public void setContext(Context context) {
31 | this.context = context;
32 | }
33 |
34 | public void setData(Object data) {
35 | this.data = data;
36 | }
37 |
38 | }
39 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-nsrule/nsrule-core/src/main/java/org/dromara/testhub/nsrule/core/eventbus/ObserverAction.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.nsrule.core.eventbus;
2 |
3 | import java.lang.reflect.InvocationTargetException;
4 | import java.lang.reflect.Method;
5 |
6 |
7 | public class ObserverAction {
8 |
9 | private Object target;
10 | private Method method;
11 |
12 | public ObserverAction(Object target, Method method) {
13 | this.target = target;
14 | this.method = method;
15 | this.method.setAccessible(true);
16 | }
17 |
18 | public void execute(Object event) {
19 | try {
20 | method.invoke(target, event);
21 | } catch (IllegalAccessException | InvocationTargetException e) {
22 | e.printStackTrace();
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-nsrule/nsrule-core/src/main/java/org/dromara/testhub/nsrule/core/eventbus/Subscribe.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.nsrule.core.eventbus;
2 |
3 | import java.lang.annotation.ElementType;
4 | import java.lang.annotation.Retention;
5 | import java.lang.annotation.RetentionPolicy;
6 | import java.lang.annotation.Target;
7 |
8 |
9 | @Retention(RetentionPolicy.RUNTIME)
10 | @Target(ElementType.METHOD)
11 | public @interface Subscribe {
12 | EventType event();
13 | }
14 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-nsrule/nsrule-core/src/main/java/org/dromara/testhub/nsrule/core/executer/context/JudgeData.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.nsrule.core.executer.context;
2 |
3 | /**
4 | * @author: 失败女神-vinc
5 | * @email: 18733123202@163.com
6 | * @date: 2022/6/3 22:15
7 | */
8 | public class JudgeData {
9 | }
10 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-nsrule/nsrule-core/src/main/java/org/dromara/testhub/nsrule/core/executer/meta/MetaClass.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.nsrule.core.executer.meta;
2 |
3 | import org.dromara.testhub.nsrule.core.executer.mode.BasePo;
4 |
5 | import java.util.List;
6 |
7 | /**
8 | * 规则对象类
9 | *
10 | * @author: 失败女神-vinc
11 | * @email: 18733123202@163.com
12 | * @date: 2022/6/3 21:11
13 | */
14 | public class MetaClass extends BasePo {
15 |
16 | //加载器编码
17 | private String loaderCode;
18 |
19 | private List properties;
20 |
21 | public String getLoaderCode() {
22 | return loaderCode;
23 | }
24 |
25 | public void setLoaderCode(String loaderCode) {
26 | this.loaderCode = loaderCode;
27 | }
28 |
29 | public List getProperties() {
30 | return properties;
31 | }
32 |
33 | public void setProperties(List properties) {
34 | this.properties = properties;
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-nsrule/nsrule-core/src/main/java/org/dromara/testhub/nsrule/core/executer/mode/base/BaseLog.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.nsrule.core.executer.mode.base;
2 |
3 | /**
4 | * @author: 失败女神-vinc
5 | * @email: 18733123202@163.com
6 | * @date: 2023/1/18 10:28
7 | */
8 | public class BaseLog {
9 | }
10 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-nsrule/nsrule-core/src/main/java/org/dromara/testhub/nsrule/core/executer/mode/base/action/DoExecute.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.nsrule.core.executer.mode.base.action;
2 |
3 | import org.dromara.testhub.nsrule.core.executer.context.Context;
4 |
5 | public interface DoExecute {
6 |
7 | int getComplex();
8 |
9 | String getDataType();
10 |
11 | String getCode();
12 |
13 | Object exec(Context context);
14 | }
15 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-nsrule/nsrule-core/src/main/java/org/dromara/testhub/nsrule/core/executer/mode/base/action/Mapping.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.nsrule.core.executer.mode.base.action;
2 |
3 | import org.dromara.testhub.nsrule.core.executer.mode.BasePo;
4 |
5 |
6 | public class Mapping extends BasePo {
7 | private String result;
8 |
9 | public String getResult() {
10 | return result;
11 | }
12 |
13 | public void setResult(String result) {
14 | this.result = result;
15 | }
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-nsrule/nsrule-core/src/main/java/org/dromara/testhub/nsrule/core/executer/mode/base/bound/Bound.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.nsrule.core.executer.mode.base.bound;
2 |
3 | import org.dromara.testhub.nsrule.core.executer.context.Context;
4 |
5 | public abstract class Bound {
6 | protected String type;
7 |
8 |
9 | public String getType() {
10 | return type;
11 | }
12 |
13 | public void setType(String type) {
14 | this.type = type;
15 | }
16 |
17 | public abstract String build(Context context);
18 | }
19 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-nsrule/nsrule-core/src/main/java/org/dromara/testhub/nsrule/core/executer/mode/base/formula/ast/MyErrorListener.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.nsrule.core.executer.mode.base.formula.ast;
2 |
3 | import org.antlr.v4.runtime.*;
4 |
5 | public class MyErrorListener extends BaseErrorListener {
6 | @Override
7 | public void syntaxError(Recognizer, ?> recognizer, Object offendingSymbol,
8 | int line, int charPositionInLine, String msg, RecognitionException e) {
9 | throw new RuntimeException("line " + line + ":" + charPositionInLine + " " + msg,e);
10 | }
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-nsrule/nsrule-core/src/main/java/org/dromara/testhub/nsrule/core/executer/mode/base/formula/log/MinLog.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.nsrule.core.executer.mode.base.formula.log;
2 |
3 | import org.dromara.testhub.nsrule.core.executer.mode.base.formula.MixNode;
4 |
5 | import java.util.List;
6 |
7 | public class MinLog extends FormulaLog {
8 | public List nodes;
9 |
10 | public MinLog(MixNode node) {
11 | super(node);
12 | }
13 |
14 | public List getNodes() {
15 | return nodes;
16 | }
17 |
18 | public void setNodes(List nodes) {
19 | this.nodes = nodes;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-nsrule/nsrule-core/src/main/java/org/dromara/testhub/nsrule/core/executer/mode/base/formula/log/PathItemLog.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.nsrule.core.executer.mode.base.formula.log;
2 |
3 | import org.dromara.testhub.nsrule.core.executer.mode.base.formula.PathNode;
4 |
5 | import java.util.List;
6 |
7 | public class PathItemLog {
8 |
9 | public String attrName;
10 | public List nodes;
11 |
12 | public PathItemLog(){}
13 |
14 | public String getAttrName() {
15 | return attrName;
16 | }
17 |
18 | public void setAttrName(String attrName) {
19 | this.attrName = attrName;
20 | }
21 |
22 | public List getNodes() {
23 | return nodes;
24 | }
25 |
26 | public void setNodes(List nodes) {
27 | this.nodes = nodes;
28 | }
29 | }
--------------------------------------------------------------------------------
/TestHub-server/testhub-nsrule/nsrule-core/src/main/java/org/dromara/testhub/nsrule/core/executer/mode/base/formula/log/PathLog.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.nsrule.core.executer.mode.base.formula.log;
2 |
3 | import org.dromara.testhub.nsrule.core.executer.mode.base.formula.PathNode;
4 |
5 | import java.util.List;
6 |
7 | public class PathLog extends FormulaLog {
8 | public String path;
9 | public List itemLogs;
10 |
11 | public PathLog(PathNode node) {
12 | super(node);
13 | }
14 |
15 |
16 | public String getPath() {
17 | return path;
18 | }
19 |
20 | public void setPath(String path) {
21 | this.path = path;
22 | }
23 |
24 | public List getItemLogs() {
25 | return itemLogs;
26 | }
27 |
28 | public void setItemLogs(List itemLogs) {
29 | this.itemLogs = itemLogs;
30 | }
31 | }
--------------------------------------------------------------------------------
/TestHub-server/testhub-nsrule/nsrule-core/src/main/java/org/dromara/testhub/nsrule/core/executer/mode/base/function/FunctionHandler.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.nsrule.core.executer.mode.base.function;
2 |
3 | import com.alibaba.fastjson.JSONObject;
4 | import org.dromara.testhub.nsrule.core.executer.context.Context;
5 |
6 | public interface FunctionHandler {
7 | String getName();
8 |
9 | Object execute(Context context, JSONObject data);
10 | }
11 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-nsrule/nsrule-core/src/main/java/org/dromara/testhub/nsrule/core/executer/mode/base/function/impl/FunctionLength.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.nsrule.core.executer.mode.base.function.impl;
2 |
3 | import com.alibaba.fastjson.JSONObject;
4 | import org.dromara.testhub.nsrule.core.executer.context.Context;
5 | import org.dromara.testhub.nsrule.core.executer.mode.base.function.FunctionHandler;
6 |
7 | /**
8 | * @author: 失败女神-vinc
9 | * @email: 18733123202@163.com
10 | * @date: 2022/6/11 21:16
11 | */
12 | public class FunctionLength implements FunctionHandler {
13 | @Override
14 | public String getName() {
15 | return "length";
16 | }
17 |
18 | @Override
19 | public Object execute(Context context, JSONObject data) {
20 | if (data == null) {
21 | return null;
22 | }
23 | String attr1 = data.getString("attr1");
24 | return attr1.length();
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-nsrule/nsrule-core/src/main/java/org/dromara/testhub/nsrule/core/expand/FormulaBuilder.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.nsrule.core.expand;
2 |
3 | import org.dromara.testhub.nsrule.core.executer.mode.base.formula.FormulaNode;
4 |
5 | public interface FormulaBuilder {
6 | FormulaNode getFormulaNode(String text);
7 | }
8 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-nsrule/nsrule-core/src/main/java/org/dromara/testhub/nsrule/core/parser/ActionParser.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.nsrule.core.parser;
2 |
3 | import org.dromara.testhub.nsrule.core.executer.mode.base.action.Action;
4 |
5 | /**
6 | * 行为构建器
7 | */
8 | public interface ActionParser {
9 | Action parse(Object dataObj, Action action);
10 | }
11 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-nsrule/nsrule-core/src/main/java/org/dromara/testhub/nsrule/core/parser/BoundParser.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.nsrule.core.parser;
2 |
3 | import org.dromara.testhub.nsrule.core.executer.mode.base.bound.Bound;
4 |
5 | public interface BoundParser {
6 | B parser(T dataObj);
7 | }
8 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-nsrule/nsrule-core/src/main/java/org/dromara/testhub/nsrule/core/parser/RuleConfigBuilder.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.nsrule.core.parser;
2 |
3 | import org.dromara.testhub.nsrule.core.executer.context.RuleConfig;
4 |
5 | /**
6 | * @author: 失败女神-vinc
7 | * @email: 18733123202@163.com
8 | * @date: 2022/6/4 16:16
9 | */
10 | public interface RuleConfigBuilder {
11 | RuleConfig build(T data) throws Exception;
12 | }
13 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-nsrule/nsrule-core/src/main/java/org/dromara/testhub/nsrule/core/parser/RuleParser.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.nsrule.core.parser;
2 |
3 | import org.dromara.testhub.nsrule.core.executer.context.RuleConfig;
4 | import org.dromara.testhub.nsrule.core.executer.context.RuleProject;
5 | import org.dromara.testhub.nsrule.core.executer.mode.Rule;
6 |
7 | /**
8 | * @author: 失败女神-vinc
9 | * @email: 18733123202@163.com
10 | * @date: 2022/6/4 09:36
11 | */
12 | public interface RuleParser {
13 | Rule parse(T data, RuleConfig ruleConfig) throws Exception;
14 | }
15 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-nsrule/nsrule-core/src/main/resources/META-INF/services/org.dromara.testhub.nsrule.core.executer.mode.base.function.FunctionHandler:
--------------------------------------------------------------------------------
1 |
2 | org.dromara.testhub.nsrule.core.executer.mode.base.function.impl.FunctionAdd
3 | org.dromara.testhub.nsrule.core.executer.mode.base.function.impl.FunctionSub
4 | org.dromara.testhub.nsrule.core.executer.mode.base.function.impl.FunctionMult
5 | org.dromara.testhub.nsrule.core.executer.mode.base.function.impl.FunctionDiv
6 |
7 | org.dromara.testhub.nsrule.core.executer.mode.base.function.impl.FunctionSize
8 | org.dromara.testhub.nsrule.core.executer.mode.base.function.impl.FunctionLength
9 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-nsrule/nsrule-core/src/main/resources/demo/Demo.g4:
--------------------------------------------------------------------------------
1 | grammar Demo;
2 |
3 | parse : prog+ ;
4 |
5 | prog : 'Hello' ID
6 | | 'hello' ID
7 | ;
8 |
9 | ID : [a-z]+ ;
10 |
11 | WS : [ \t\n\r]+ -> skip ;
--------------------------------------------------------------------------------
/TestHub-server/testhub-nsrule/nsrule-core/src/main/resources/demo/Formula2.g4:
--------------------------------------------------------------------------------
1 | grammar Formula;
2 |
3 | formula: pathNode;
4 |
5 | pathNode:
6 | '${' jsonpath '}' # jsonPathExp
7 | ;
8 |
9 | jsonpath:
10 | identifier (subscript)*;
11 |
12 | subscript:
13 | dotIdentifier | arraySubscript;
14 |
15 | dotIdentifier:
16 | DOT identifier;
17 |
18 | arraySubscript:
19 | LBRACKET (asterisk | arrayIndex | pathNode) RBRACKET;
20 |
21 | arrayIndex:
22 | INT;
23 |
24 | asterisk:
25 | ASTERISK (dotIdentifier)?;
26 |
27 | identifier:
28 | Identifier;
29 |
30 | DOT:
31 | '.';
32 |
33 | DOLLAR:
34 | '$';
35 |
36 | LCURLY:
37 | '{';
38 |
39 | RCURLY:
40 | '}';
41 |
42 | LBRACKET:
43 | '[';
44 |
45 | RBRACKET:
46 | ']';
47 |
48 | ASTERISK:
49 | '*';
50 |
51 | INT:
52 | [0-9]+;
53 |
54 | Identifier:
55 | [a-zA-Z_] [a-zA-Z_0-9]*;
56 |
57 | Whitespace:
58 | [ \t\r\n]+ -> skip;
59 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-nsrule/nsrule-graph/src/main/java/org/dromara/testhub/nsrule/graph/constant/Constant.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.nsrule.graph.constant;
2 |
3 | import java.time.format.DateTimeFormatter;
4 |
5 | /**
6 | * 常量枚举类
7 | *
8 | * @author: 失败女神-vinc
9 | * @email: 18733123202@163.com
10 | * @date: 2023/5/21 21:29
11 | */
12 | public class Constant {
13 |
14 | /**
15 | * 下一跳类型
16 | */
17 | public class NextType {
18 | public static final String BRANCH = "BRANCH";//分支
19 | public static final String RESULT = "RESULT";//结果
20 | }
21 |
22 | }
23 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-nsrule/nsrule-graph/src/main/java/org/dromara/testhub/nsrule/graph/model/DecisionResult.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.nsrule.graph.model;
2 |
3 | /**
4 | * @author: 失败女神-vinc
5 | * @email: 18733123202@163.com
6 | * @date: 2022/6/4 16:47
7 | */
8 | public class DecisionResult {
9 | private Object content;
10 | private String dataType;
11 |
12 | public Object getContent() {
13 | return content;
14 | }
15 |
16 | public void setContent(Object content) {
17 | this.content = content;
18 | }
19 |
20 | public String getDataType() {
21 | return dataType;
22 | }
23 |
24 | public void setDataType(String dataType) {
25 | this.dataType = dataType;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-nsrule/nsrule-graph/src/main/java/org/dromara/testhub/nsrule/graph/model/Result.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.nsrule.graph.model;
2 |
3 | import org.dromara.testhub.nsrule.core.executer.context.Context;
4 | import org.dromara.testhub.nsrule.core.executer.mode.BaseDataPo;
5 |
6 | /**
7 | * 结果执行器
8 | *
9 | * @author: 失败女神-vinc
10 | * @email: 18733123202@163.com
11 | * @date: 2022/6/3 22:04
12 | */
13 | public class Result extends BaseDataPo {
14 |
15 |
16 | public Object decision(Context context) {
17 | return getDataFormulaNode().apply(context).getContent();
18 | }
19 |
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-plugins/plugins-check/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | org.dromara.testhub
8 | testhub-plugins
9 | ${revision}
10 | ../pom.xml
11 |
12 |
13 | org.dromara.testhub.plugins
14 | plugins-check
15 | ${revision}
16 |
17 | 17
18 | 17
19 | UTF-8
20 |
21 |
22 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-plugins/plugins-check/src/main/java/org/dromara/testhub/plugins/check/actions/dto/CheckExecuteResult.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.plugins.check.actions.dto;
2 |
3 | import org.dromara.testhub.sdk.action.dto.ExecuteResult;
4 | import org.dromara.testhub.sdk.action.model.rule.TestHubAction;
5 | import org.dromara.testhub.sdk.action.model.rule.TestHubExecute;
6 |
7 | import java.util.Map;
8 |
9 | public class CheckExecuteResult extends ExecuteResult {
10 |
11 | private Map reData;
12 |
13 | public CheckExecuteResult(TestHubAction action, TestHubExecute execute) {
14 | super(action, execute);
15 | }
16 |
17 | public Map getReData() {
18 | return reData;
19 | }
20 |
21 | public void setReData(Map reData) {
22 | this.reData = reData;
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-plugins/plugins-check/src/main/java/org/dromara/testhub/plugins/check/actions/dto/CheckResultDto.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.plugins.check.actions.dto;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Data;
5 | import lombok.NoArgsConstructor;
6 |
7 | import java.util.List;
8 |
9 | @Data
10 | @AllArgsConstructor
11 | @NoArgsConstructor
12 | public class CheckResultDto {
13 | private Boolean flag;
14 | private List itemFlags;
15 | }
16 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-plugins/plugins-check/src/main/java/org/dromara/testhub/plugins/check/actions/model/CheckParamResult.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.plugins.check.actions.model;
2 |
3 | import org.dromara.testhub.nsrule.core.executer.mode.ruleLine.JavaActuator;
4 | import lombok.Data;
5 |
6 | @Data
7 | public class CheckParamResult {
8 | private boolean flag;
9 | private String msg;
10 | private JavaActuator.Log log;
11 | }
--------------------------------------------------------------------------------
/TestHub-server/testhub-plugins/plugins-check/src/main/java/org/dromara/testhub/plugins/check/actions/model/TestHubExecuteCheck.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.plugins.check.actions.model;
2 |
3 | import org.dromara.testhub.nsrule.core.executer.mode.base.action.Execute;
4 | import org.dromara.testhub.nsrule.core.executer.mode.ruleLine.RuleLine;
5 | import org.dromara.testhub.sdk.action.model.rule.TestHubExecute;
6 |
7 | import java.util.List;
8 |
9 | public class TestHubExecuteCheck extends TestHubExecute {
10 | private List> ruleLines;
11 |
12 | public List> getRuleLines() {
13 | return ruleLines;
14 | }
15 |
16 | public void setRuleLines(List> ruleLines) {
17 | this.ruleLines = ruleLines;
18 | }
19 |
20 | public TestHubExecuteCheck(Execute execute) {
21 | super(execute);
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-plugins/plugins-check/src/main/resources/META-INF/services/org.dromara.testhub.sdk.action.Plugin:
--------------------------------------------------------------------------------
1 | org.dromara.testhub.plugins.check.actions.CheckPlugin
--------------------------------------------------------------------------------
/TestHub-server/testhub-plugins/plugins-compare/src/main/java/org/dromara/testhub/plugins/compare/actions/dto/CheckObjExecuteResult.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.plugins.compare.actions.dto;
2 |
3 | import org.dromara.testhub.sdk.action.dto.ExecuteResult;
4 | import org.dromara.testhub.sdk.action.model.rule.TestHubAction;
5 | import org.dromara.testhub.sdk.action.model.rule.TestHubExecute;
6 |
7 | import java.util.Map;
8 |
9 | public class CheckObjExecuteResult extends ExecuteResult {
10 |
11 | private Map checkObjResult;
12 |
13 | public CheckObjExecuteResult(TestHubAction action, TestHubExecute execute) {
14 | super(action, execute);
15 | }
16 |
17 |
18 | public Map getCheckObjResult() {
19 | return checkObjResult;
20 | }
21 |
22 | public void setCheckObjResult(Map checkObjResult) {
23 | this.checkObjResult = checkObjResult;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-plugins/plugins-compare/src/main/java/org/dromara/testhub/plugins/compare/actions/model/CheckResultObj.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.plugins.compare.actions.model;
2 |
3 | import lombok.Data;
4 |
5 | @Data
6 | public class CheckResultObj {
7 |
8 | private CheckObj checkObj;
9 | private Boolean flag;
10 | private String msg;
11 | private Object threshold;
12 | private Object cover;
13 |
14 | }
--------------------------------------------------------------------------------
/TestHub-server/testhub-plugins/plugins-compare/src/main/java/org/dromara/testhub/plugins/compare/actions/model/TestHubExecuteCheckObj.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.plugins.compare.actions.model;
2 |
3 | import org.dromara.testhub.nsrule.core.executer.mode.base.action.Execute;
4 | import org.dromara.testhub.sdk.action.model.rule.TestHubExecute;
5 |
6 | import java.util.List;
7 |
8 | public class TestHubExecuteCheckObj extends TestHubExecute {
9 | private List checkObjs;
10 |
11 | public List getCheckObjs() {
12 | return checkObjs;
13 | }
14 |
15 | public void setCheckObjs(List checkObjs) {
16 | this.checkObjs = checkObjs;
17 | }
18 |
19 | public TestHubExecuteCheckObj(Execute execute) {
20 | super(execute);
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-plugins/plugins-compare/src/main/resources/META-INF/services/org.dromara.testhub.sdk.action.Plugin:
--------------------------------------------------------------------------------
1 | org.dromara.testhub.plugins.compare.actions.CheckObjPlugin
--------------------------------------------------------------------------------
/TestHub-server/testhub-plugins/plugins-constant/src/main/resources/META-INF/services/org.dromara.testhub.sdk.action.Plugin:
--------------------------------------------------------------------------------
1 | org.dromara.testhub.plugins.constant.actions.ConstPlugin
--------------------------------------------------------------------------------
/TestHub-server/testhub-plugins/plugins-convert/src/main/java/org/dromara/testhub/plugins/convert/actions/model/TestHubActionConvert.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.plugins.convert.actions.model;
2 |
3 | import org.dromara.testhub.sdk.action.model.rule.TestHubAction;
4 | import lombok.Data;
5 |
6 | import java.util.List;
7 |
8 | @Data
9 | public class TestHubActionConvert extends TestHubAction {
10 |
11 | private List converts;
12 |
13 | public TestHubActionConvert(TestHubAction action){
14 | super();
15 | super.setCode(action.getCode());
16 | super.setName(action.getName());
17 | super.setRemark(action.getRemark());
18 | super.setParams(action.getParams());
19 | super.setMappings(action.getMappings());
20 | super.setDataType(action.getDataType());
21 | super.setComplex(action.getComplex());
22 | super.setType(action.getType());
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-plugins/plugins-convert/src/main/resources/META-INF/services/org.dromara.testhub.sdk.action.Plugin:
--------------------------------------------------------------------------------
1 | org.dromara.testhub.plugins.convert.actions.ConvertPlugin
--------------------------------------------------------------------------------
/TestHub-server/testhub-plugins/plugins-http/src/main/java/org/dromara/testhub/plugins/http/HttpConstant.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.plugins.http;
2 |
3 | public class HttpConstant {
4 | public static String TREE_NODE_TYPE_DIR="DIR";
5 | public static String TREE_NODE_TYPE_API="API";
6 | public static String TREE_NODE_TYPE_CASE="CASE";
7 | }
8 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-plugins/plugins-http/src/main/java/org/dromara/testhub/plugins/http/actions/model/TestHubExecuteHttp.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.plugins.http.actions.model;
2 |
3 | import org.dromara.testhub.nsrule.core.executer.mode.base.action.Execute;
4 | import org.dromara.testhub.nsrule.core.executer.mode.ruleLine.Expression;
5 | import org.dromara.testhub.sdk.action.model.rule.TestHubExecute;
6 |
7 | public class TestHubExecuteHttp extends TestHubExecute {
8 | private Expression expression;
9 |
10 | public TestHubExecuteHttp(Execute execute) {
11 | super(execute);
12 | }
13 |
14 | public Expression getExpression() {
15 | return expression;
16 | }
17 |
18 | public void setExpression(Expression expression) {
19 | this.expression = expression;
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/TestHub-server/testhub-plugins/plugins-http/src/main/java/org/dromara/testhub/plugins/http/server/domain/HttpContext.java:
--------------------------------------------------------------------------------
1 | package org.dromara.testhub.plugins.http.server.domain;
2 |
3 | import org.dromara.testhub.nsrule.core.executer.context.Context;
4 | import org.dromara.testhub.nsrule.core.executer.context.RuleProject;
5 |
6 | import java.util.Map;
7 |
8 | public class HttpContext extends Context