diff --git a/catch/apimanager/README.md b/catch/apimanager/README.md
new file mode 100644
index 0000000..59a4f0f
--- /dev/null
+++ b/catch/apimanager/README.md
@@ -0,0 +1,95 @@
+apitester 模块是一个用于API管理、测试的模块。
+
+# 概述
+
+ 本模块的设计目标是提供开发人员、产品人员等相关角色,可以管理和测试API,可以将系统内部或外部API信息保存在系统内,使得产品具有自完备的特性和持续交付的特性,并可进行灵活的二次开发。
+
+## 主要特性
+
+1. 支持API分类管理,支持自定义用户环境变量,支持API测试用例管理。
+2. 支持HTTP、HTTPS接口测试用例的在线运行。(更多协议支持规划在模块roadmap中)
+3. 支持接口文档管理。
+4. 已集成微信第三方平台相关接口测试用例,开发者可快速进行第三方平台应用开发。
+5. 支持多帐号多应用使用环境,易于团队协作,不限制接口数量、用户数量、请求数量。
+6. 基于catchadmin开发,模块安装简单,使用便捷,支持模块数据导入导出。
+7. 开源开放易于二次开发,测试用例可共享,形成产品API知识库。
+8. 支持私有化部署、云原生部署。
+
+ 演示地址:www.uctoo.com 控制台使用demo帐号登录
+ 模块使用界面截图:
+
+
+  |
+
+
+  |
+
+
+  |
+
+
+  |
+
+
+  |
+
+
+  |
+
+
+  |
+
+
+
+## 产品架构
+1. 基于catchadmin标准模块开发方式开发,可在管理后台一键安装模块和初始化模块数据。
+2. 前端采用axios技术选型,前端可形成标准客户端接口库。
+3. 本地接口(数据源类型local)主要沿用catchadmin基于用户身份的接口鉴权方案,需在API测试用例header添加authorization参数,其值为登录接口返回的值。
+4. 在扫码登录后注册用户帐号接口测试用例,演示了采用微信扫码登录后获取到的用户access_token进行接口鉴权的示例。
+5. 微信相关开发使用了[uctoo/think-easywechat SDK](https://gitee.com/UCT/think-easywechat) 集成catchadmin (TP6+VUE) 和 easywechat 4,支持微信第三方平台、微信小程序云开发、微信支付服务商等特性。
+
+## 安装教程
+
+### 运行环境依赖
+
+ PHP >= 7.1.0
+ Mysql >= 5.5.0 (需支持innodb引擎)
+ PDO PHP Extension
+ MBstring PHP Extension
+ CURL PHP Extension
+ ZIP Extension
+ Composer
+ catchadmin
+
+### 分步骤安装
+1. 从https://gitee.com/jaguarjack/catchAdmin 或 https://gitee.com/uctoo/uctoo 下载https://gitee.com/uctoo/uctoo/tree/master/catch/apimanager 目录模块,复制到catchadmin对应目录
+2. apimanager/catch-admin-vue 目录内是模块前端vue项目代码,复制到前端VUE项目对应目录,注意如和原前端vue项目目录的文件有冲突,需自行合并代码版本。如模块新依赖了第三方组件,需要在前端项目目录重新运行 yarn install 命令。
+3. 登录管理后台,在系统管理->模块管理启用API管理模块,即可安装模块和初始化模块数据。
+
+### 云原生安装
+1. 可在 https://www.uctoo.com 注册开发者帐号,登录管理后台,通过云开发功能模块,即可采用云原生方式开通和部署一套独立的UCToo运行实例。(开发中)
+
+### docker安装
+ 可参考uctoo-docker项目 https://gitee.com/UCT/uctoo-docker
+
+## 使用手册
+1. 可以通过API管理->API分类功能增删改查API分类。
+2. 可以通过API环境变量功能增删改查用户环境变量。环境变量的key值以{{key}}方式定义,在API测试用例中对应的{{key}}值将替换为环境变量的value值。每个用户可以创建多组环境变量,可以切换当前选中的环境变量组。
+3. 可以通过API列表功能增删改查API测试用例。api_url、header、body、query、auth字段支持环境变量。
+4. 可以对已添加的API测试用例执行测试操作,在API测试界面,可以对api_url、header、body、query、auth等字段进行自定义编辑。发送按钮可以实际执行API测试用例,获得接口返回值。
+
+ 具体请参考 https://www.kancloud.cn/doc_uctoo/manual
+
+## 开发说明
+### 模块roadmap
+
+1. 通过解析路由文件router.php中的数据,自动生成系统接口(system类型)的所有测试用例。即实现系统接口的可视化测试。
+2. 实现API管理功能,即可通过界面配置进行基于appid的接口权限管理,OAUTH2接口鉴权方案。
+3. 实现API测试用例中API文档字段支持markdown编辑和展示。
+4. 实现除POST、GET、PUT、DELETE之外的其他接口请求方式。
+5. 实现全部content-type类型的支持。
+6. 实现测试数据的保存、历史记录等功能。
+7. 实现notify类型接口的测试,目前还没有在市面上见过类似功能的产品,但是实际开发中notify类型的接口在微信第三方平台、各种支付回调、硬件数据上传等很多场景都有遇到。
+8. 实现API测试用例的公开(共享)、私有、保护(有偿获取)等特性。
+
+ 具体请参考开源版开发手册 https://www.kancloud.cn/doc_uctoo/uctoo_dev 及 本开源项目示例
\ No newline at end of file
diff --git a/catch/apimanager/catch-admin-vue/package.json b/catch/apimanager/catch-admin-vue/package.json
new file mode 100644
index 0000000..37d0ef3
--- /dev/null
+++ b/catch/apimanager/catch-admin-vue/package.json
@@ -0,0 +1,116 @@
+{
+ "name": "catch-admin",
+ "version": "4.4.0",
+ "description": "catch-admin manage system on element-admin-vue",
+ "author": "JaguarJack ",
+ "scripts": {
+ "dev": "vue-cli-service serve",
+ "lint": "eslint --ext .js,.vue src",
+ "build:prod": "vue-cli-service build",
+ "build:stage": "vue-cli-service build --mode staging",
+ "preview": "node build/index.js --preview",
+ "new": "plop",
+ "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml",
+ "test:unit": "jest --clearCache && vue-cli-service test:unit",
+ "test:ci": "npm run lint && npm run test:unit"
+ },
+ "dependencies": {
+ "@form-create/element-ui": "^2.5.4",
+ "axios": "0.18.1",
+ "clipboard": "2.0.4",
+ "codemirror": "5.45.0",
+ "core-js": "3.6.5",
+ "driver.js": "0.9.5",
+ "dropzone": "5.5.1",
+ "echarts": "4.2.1",
+ "element-ui": "2.13.2",
+ "file-saver": "2.0.1",
+ "fuse.js": "3.4.4",
+ "js-cookie": "2.2.0",
+ "jsonlint": "1.6.3",
+ "jszip": "3.2.1",
+ "normalize.css": "7.0.0",
+ "nprogress": "0.2.0",
+ "path-to-regexp": "2.4.0",
+ "screenfull": "4.2.0",
+ "script-loader": "0.7.2",
+ "sortablejs": "1.8.4",
+ "vue": "2.6.10",
+ "vue-count-to": "1.0.13",
+ "vue-highlightjs": "^1.3.3",
+ "vue-router": "3.0.2",
+ "vue-splitpane": "1.0.4",
+ "vuedraggable": "2.20.0",
+ "vuex": "3.1.0",
+ "xlsx": "0.14.1"
+ },
+ "devDependencies": {
+ "@smallwei/avue": "^2.8.17",
+ "@vue/cli-plugin-babel": "4.4.4",
+ "@vue/cli-plugin-eslint": "4.4.4",
+ "@vue/cli-plugin-unit-jest": "4.4.4",
+ "@vue/cli-service": "4.4.4",
+ "@vue/test-utils": "1.0.0-beta.29",
+ "autoprefixer": "9.5.1",
+ "babel-eslint": "10.1.0",
+ "babel-jest": "^26.3.0",
+ "babel-plugin-dynamic-import-node": "2.3.3",
+ "chalk": "2.4.2",
+ "chokidar": "2.1.5",
+ "connect": "3.6.6",
+ "eslint": "6.7.2",
+ "eslint-plugin-vue": "6.2.2",
+ "highlight.js": "^10.2.0",
+ "html-webpack-plugin": "3.2.0",
+ "husky": "1.3.1",
+ "lint-staged": "8.1.5",
+ "lodash": "^4.17.20",
+ "mockjs": "1.0.1-beta3",
+ "plop": "2.3.0",
+ "runjs": "4.3.2",
+ "sass": "1.26.2",
+ "sass-loader": "8.0.2",
+ "script-ext-html-webpack-plugin": "2.1.3",
+ "serve-static": "1.13.2",
+ "svg-sprite-loader": "4.1.3",
+ "svgo": "1.2.0",
+ "vue-highlight.js": "^3.1.0",
+ "vue-json-editor": "^1.4.3",
+ "vue-json-views": "^1.3.0",
+ "vue-template-compiler": "2.6.10"
+ },
+ "browserslist": [
+ "> 1%",
+ "last 2 versions"
+ ],
+ "bugs": {
+ "url": "https://github.com/JaguarJack/catch-admin-vue/issues"
+ },
+ "engines": {
+ "node": ">=8.9",
+ "npm": ">= 3.0.0"
+ },
+ "keywords": [
+ "vue",
+ "admin",
+ "dashboard",
+ "element-ui",
+ "boilerplate",
+ "admin-template",
+ "management-system"
+ ],
+ "license": "MIT",
+ "lint-staged": {
+ "src/**/*.{js,vue}": [
+ "eslint --fix",
+ "git add"
+ ]
+ },
+ "husky": {
+ "hooks": {}
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/JaguarJack/catch-admin-vue"
+ }
+}
diff --git a/catch/apimanager/catch-admin-vue/src/api/userenv.js b/catch/apimanager/catch-admin-vue/src/api/userenv.js
new file mode 100644
index 0000000..0679ef0
--- /dev/null
+++ b/catch/apimanager/catch-admin-vue/src/api/userenv.js
@@ -0,0 +1,7 @@
+import request from "@/utils/request";
+export function userenvList() {
+ return request({
+ url: "/apiTesterUserenv",
+ method: "get"
+ });
+}
diff --git a/catch/apimanager/catch-admin-vue/src/main.js b/catch/apimanager/catch-admin-vue/src/main.js
new file mode 100644
index 0000000..30784ad
--- /dev/null
+++ b/catch/apimanager/catch-admin-vue/src/main.js
@@ -0,0 +1,48 @@
+import Vue from 'vue'
+
+import 'normalize.css/normalize.css' // a modern alternative to CSS resets
+
+import Element from 'element-ui'
+import Avue from '@smallwei/avue'
+import 'element-ui/lib/theme-chalk/index.css'
+import './styles/element-variables.scss'
+
+// import enLang from 'element-ui/lib/locale/lang/en'// 如果使用中文语言包请默认支持,无需额外引入,请删除该依赖
+
+import '@/styles/index.scss' // global css
+
+import App from './App'
+import store from './store'
+import router from './router'
+
+import './icons' // icon
+import './permission' // permission control
+import './utils/error-log' // error log
+import request from '@/utils/request'
+import * as filters from './filters' // global filters
+import catchAdmin from '@/components/Catch'
+
+Vue.use(Element, {
+ size: 'small'// set element-ui default size
+ // locale: enLang // 如果使用中文,无需设置,请删除
+})
+window.axios = request;
+Vue.use(Avue, { request });
+// register global utility filters
+Object.keys(filters).forEach(key => {
+ Vue.filter(key, filters[key])
+})
+
+// 后台启动
+catchAdmin.boot()
+
+Vue.config.productionTip = false
+Vue.prototype.$http = request
+Vue.prototype.admin = catchAdmin
+
+new Vue({
+ el: '#app',
+ router,
+ store,
+ render: h => h(App)
+})
diff --git a/catch/apimanager/catch-admin-vue/src/views/apimanager/apicategory/index.vue b/catch/apimanager/catch-admin-vue/src/views/apimanager/apicategory/index.vue
new file mode 100644
index 0000000..54ce67f
--- /dev/null
+++ b/catch/apimanager/catch-admin-vue/src/views/apimanager/apicategory/index.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
diff --git a/catch/apimanager/catch-admin-vue/src/views/apimanager/apienv/index.vue b/catch/apimanager/catch-admin-vue/src/views/apimanager/apienv/index.vue
new file mode 100644
index 0000000..f80a3d0
--- /dev/null
+++ b/catch/apimanager/catch-admin-vue/src/views/apimanager/apienv/index.vue
@@ -0,0 +1,270 @@
+
+
+
+
+
+ 搜索
+
+
+ 重置
+
+
+ 新增
+
+
+
+
+
+
+
+
+
+
+
+ 切换
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.$cellEdit ? "自定义保存" : "自定义修改" }}
+
+
+
+
+
+
+
+
+
diff --git a/catch/apimanager/catch-admin-vue/src/views/apimanager/apirun/index.vue b/catch/apimanager/catch-admin-vue/src/views/apimanager/apirun/index.vue
new file mode 100644
index 0000000..addbf8a
--- /dev/null
+++ b/catch/apimanager/catch-admin-vue/src/views/apimanager/apirun/index.vue
@@ -0,0 +1,659 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 发送
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ none
+ form-data
+ x-www-form-urlencoded
+ json
+ raw(json)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/catch/apimanager/catch-admin-vue/src/views/apimanager/apirun/itemBtn.vue b/catch/apimanager/catch-admin-vue/src/views/apimanager/apirun/itemBtn.vue
new file mode 100644
index 0000000..29f45d1
--- /dev/null
+++ b/catch/apimanager/catch-admin-vue/src/views/apimanager/apirun/itemBtn.vue
@@ -0,0 +1,114 @@
+
+
+
+
+ {{ value }}
+ this.$emit('input', value)"
+ >
+
+
+ {{
+ filename
+ }}
+
+ 点击上传
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/catch/apimanager/catch-admin-vue/src/views/apimanager/apitester/index.vue b/catch/apimanager/catch-admin-vue/src/views/apimanager/apitester/index.vue
new file mode 100644
index 0000000..e1a8153
--- /dev/null
+++ b/catch/apimanager/catch-admin-vue/src/views/apimanager/apitester/index.vue
@@ -0,0 +1,816 @@
+
+
+
+
+
+
+ 分类
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 重置
+
+
+ 搜索
+
+
+
+
+
+
+
+ 新增
+
+
+
+
+ 批量删除
+
+
+
+
+ {{ api.row.api_title }}
+
+
+
+
+
+
+ remote
+ local
+
+
+
+
+
+ 测试
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.$cellEdit ? "自定义保存" : "自定义修改" }}
+
+
+
+
+
+
+ {{ row.$cellEdit ? "自定义保存" : "自定义修改" }}
+
+
+
+
+
+
+ {{ row.$cellEdit ? "自定义保存" : "自定义修改" }}
+
+
+
+
+
+
+ {{ row.$cellEdit ? "自定义保存" : "自定义修改" }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 已完成
+ 待开发
+ 开发中
+ 已废弃
+
+
+
+
+
+
+
+
+
diff --git a/catch/apimanager/catch-admin-vue/src/views/apimanager/router.js b/catch/apimanager/catch-admin-vue/src/views/apimanager/router.js
new file mode 100644
index 0000000..554a808
--- /dev/null
+++ b/catch/apimanager/catch-admin-vue/src/views/apimanager/router.js
@@ -0,0 +1,8 @@
+export default {
+ // api分类
+ apicategory: () => import('@/views/apimanager/apicategory'),
+ // api测试
+ apitester: () => import('@/views/apimanager/apitester'),
+ apirun: () => import('@/views/apimanager/apirun'),
+ apienv: () => import('@/views/apimanager/apienv')
+}