├── .DS_Store ├── .gitignore ├── ApiTest ├── __init__.py ├── settings.py ├── test.py ├── urls.py └── wsgi.py ├── MyApp ├── .DS_Store ├── A_WQRFhtmlRunner.py ├── __init__.py ├── admin.py ├── apps.py ├── global_def.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_auto_20200721_0219.py │ ├── 0003_auto_20200721_0219.py │ ├── 0004_remove_db_tucao_ss.py │ ├── 0005_auto_20200721_0220.py │ ├── 0006_remove_db_tucao_ctime.py │ ├── 0007_db_tucao_ctime.py │ ├── 0008_db_home_href.py │ ├── 0009_db_project.py │ ├── 0010_db_apis.py │ ├── 0011_auto_20200813_0212.py │ ├── 0012_auto_20200908_0812.py │ ├── 0013_db_apis_log.py │ ├── 0014_remove_db_apis_log_name.py │ ├── 0015_auto_20201029_1056.py │ ├── 0016_db_step.py │ ├── 0017_auto_20201102_1114.py │ ├── 0018_db_step_mock_res.py │ ├── 0019_db_project_header.py │ ├── 0020_db_step_public_header.py │ ├── 0021_db_host.py │ ├── 0022_db_project_host.py │ ├── 0023_db_login.py │ ├── 0024_db_step_api_login.py │ ├── 0025_db_global_data.py │ ├── 0026_auto_20210303_1031.py │ ├── 0027_db_project_user_id.py │ ├── 0028_db_project_global_datas.py │ ├── 0029_db_project_encryption.py │ ├── 0030_auto_20210625_1749.py │ ├── 0031_auto_20210706_1112.py │ ├── 0032_auto_20210706_1204.py │ ├── 0033_auto_20210706_1205.py │ ├── 0034_db_project_cert.py │ ├── 0035_auto_20210819_1035.py │ ├── 0036_auto_20210819_1321.py │ ├── 0037_db_cases_concurrent.py │ ├── 0038_db_wqrf_step_report.py │ └── __init__.py ├── models.py ├── run_case.py ├── static │ ├── 201801271505 │ │ ├── css │ │ │ ├── htmleaf-demo.css │ │ │ └── normalize.css │ │ ├── fonts │ │ │ ├── icomoon.eot │ │ │ ├── icomoon.svg │ │ │ ├── icomoon.ttf │ │ │ └── icomoon.woff │ │ ├── index.html │ │ ├── jQuery之家.url │ │ ├── js │ │ │ ├── bootstable.js │ │ │ └── jquery-1.11.0.min.js │ │ ├── readme.html │ │ └── related │ │ │ ├── 1.jpg │ │ │ └── 2.jpg │ ├── 201908059658 │ │ ├── assets │ │ │ ├── css │ │ │ │ ├── font-awesome.css │ │ │ │ └── font-awesome.min.css │ │ │ └── fonts │ │ │ │ ├── FontAwesome.otf │ │ │ │ ├── fontawesome-webfont.eot │ │ │ │ ├── fontawesome-webfont.svg │ │ │ │ ├── fontawesome-webfont.ttf │ │ │ │ ├── fontawesome-webfont.woff │ │ │ │ └── fontawesome-webfont.woff2 │ │ ├── css │ │ │ ├── htmleaf-demo.css │ │ │ └── normalize.css │ │ ├── dist │ │ │ ├── jquery-rvnm-rtl.min.css │ │ │ ├── jquery-rvnm.min.css │ │ │ ├── rvnm.css │ │ │ ├── rvnm.js │ │ │ └── rvnm.min.js │ │ ├── fonts │ │ │ ├── icomoon.eot │ │ │ ├── icomoon.svg │ │ │ ├── icomoon.ttf │ │ │ └── icomoon.woff │ │ ├── index-rtl.html │ │ ├── index.html │ │ ├── jQuery之家.url │ │ ├── js │ │ │ └── jquery-1.11.0.min.js │ │ ├── readme.html │ │ ├── related │ │ │ ├── 1.jpg │ │ │ └── 2.jpg │ │ └── src │ │ │ ├── img │ │ │ ├── cb.png │ │ │ ├── cw.png │ │ │ ├── db.png │ │ │ ├── dw.png │ │ │ ├── lb.png │ │ │ ├── lw.png │ │ │ ├── mb.png │ │ │ ├── mw.png │ │ │ ├── rb.png │ │ │ └── rw.png │ │ │ ├── jquery-rvnm-rtl.css │ │ │ ├── jquery-rvnm.css │ │ │ └── jquery-rvnm.js │ ├── Certs │ │ └── CERT_13_client.pem │ ├── WX20200708-115503@2x.png │ ├── __init__.py │ ├── bingxingtu │ │ ├── css │ │ │ ├── htmleaf-demo.css │ │ │ ├── normalize.css │ │ │ └── progresscircle.css │ │ ├── fonts │ │ │ ├── icomoon.eot │ │ │ ├── icomoon.svg │ │ │ ├── icomoon.ttf │ │ │ └── icomoon.woff │ │ ├── index.html │ │ ├── jQuery之家.url │ │ ├── js │ │ │ ├── jquery-1.11.0.min.js │ │ │ └── progresscircle.js │ │ ├── readme.html │ │ └── related │ │ │ ├── 1.jpg │ │ │ └── 2.jpg │ ├── bitbug_favicon.ico │ ├── bootstrap-3.3.7-dist │ │ ├── css │ │ │ ├── bootstrap-theme.css │ │ │ ├── bootstrap-theme.css.map │ │ │ ├── bootstrap-theme.min.css │ │ │ ├── bootstrap-theme.min.css.map │ │ │ ├── bootstrap.css │ │ │ ├── bootstrap.css.map │ │ │ ├── bootstrap.min.css │ │ │ └── bootstrap.min.css.map │ │ ├── fonts │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ ├── glyphicons-halflings-regular.woff │ │ │ └── glyphicons-halflings-regular.woff2 │ │ └── js │ │ │ ├── bootstrap.js │ │ │ ├── bootstrap.min.js │ │ │ └── npm.js │ ├── home.jpg │ ├── login.jpg │ ├── logo_hw.png │ ├── tmp_zhengjiao.xls │ ├── user_img │ │ ├── 1.png │ │ ├── 3.png │ │ ├── 4.png │ │ └── __init__.py │ └── z.jpg ├── templates │ ├── Home.html │ ├── P_apis.html │ ├── P_cases.html │ ├── P_global_data.html │ ├── P_project_set.html │ ├── Reports │ │ ├── 18.html │ │ ├── 19.html │ │ ├── 21.html │ │ ├── 22.html │ │ └── __init__.py │ ├── concurrent_report.html │ ├── help.html │ ├── login.html │ ├── project_list.html │ ├── test.html │ ├── welcome.html │ └── zhengjiao.html ├── test.py ├── tests.py ├── views.py ├── views_test.py ├── views_tools.py └── wqrf_run_case.py ├── README.md └── manage.py /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/.DS_Store -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ##ignore this file## 2 | *.sqlite3 3 | ##*.log 4 | ##*.txt 5 | .idea 6 | *.pyc 7 | -------------------------------------------------------------------------------- /ApiTest/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/ApiTest/__init__.py -------------------------------------------------------------------------------- /ApiTest/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for ApiTest project. 3 | 4 | Generated by 'django-admin startproject' using Django 1.11.22. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/1.11/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/1.11/ref/settings/ 11 | """ 12 | 13 | import os 14 | 15 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 16 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 17 | 18 | 19 | # Quick-start development settings - unsuitable for production 20 | # See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/ 21 | 22 | # SECURITY WARNING: keep the secret key used in production secret! 23 | SECRET_KEY = 'hc6_9&f-#1tmc9%a&k__25e@=t%mrzcn)^!w&q=%gs0a5$5s@h' 24 | 25 | # SECURITY WARNING: don't run with debug turned on in production! 26 | DEBUG = True 27 | 28 | ALLOWED_HOSTS = ['*',] 29 | 30 | 31 | # Application definition 32 | 33 | INSTALLED_APPS = [ 34 | 'django.contrib.admin', 35 | 'django.contrib.auth', 36 | 'django.contrib.contenttypes', 37 | 'django.contrib.sessions', 38 | 'django.contrib.messages', 39 | 'django.contrib.staticfiles', 40 | 'MyApp', 41 | 42 | 43 | ] 44 | 45 | MIDDLEWARE = [ 46 | 'django.middleware.security.SecurityMiddleware', 47 | 'django.contrib.sessions.middleware.SessionMiddleware', 48 | 'django.middleware.common.CommonMiddleware', 49 | # 'django.middleware.csrf.CsrfViewMiddleware', 50 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 51 | 'django.contrib.messages.middleware.MessageMiddleware', 52 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 53 | ] 54 | 55 | ROOT_URLCONF = 'ApiTest.urls' 56 | 57 | TEMPLATES = [ 58 | { 59 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 60 | 'DIRS': [], 61 | 'APP_DIRS': True, 62 | 'OPTIONS': { 63 | 'context_processors': [ 64 | 'django.template.context_processors.debug', 65 | 'django.template.context_processors.request', 66 | 'django.contrib.auth.context_processors.auth', 67 | 'django.contrib.messages.context_processors.messages', 68 | ], 69 | }, 70 | }, 71 | ] 72 | 73 | WSGI_APPLICATION = 'ApiTest.wsgi.application' 74 | 75 | 76 | # Database 77 | # https://docs.djangoproject.com/en/1.11/ref/settings/#databases 78 | 79 | DATABASES = { 80 | 'default': { 81 | 'ENGINE': 'django.db.backends.sqlite3', 82 | 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 83 | } 84 | } 85 | 86 | 87 | # Password validation 88 | # https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators 89 | 90 | AUTH_PASSWORD_VALIDATORS = [ 91 | { 92 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 93 | }, 94 | { 95 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 96 | }, 97 | { 98 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 99 | }, 100 | { 101 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 102 | }, 103 | ] 104 | 105 | 106 | # Internationalization 107 | # https://docs.djangoproject.com/en/1.11/topics/i18n/ 108 | 109 | LANGUAGE_CODE = "zh-hans" 110 | TIME_ZONE = "Asia/Shanghai" 111 | 112 | USE_I18N = True 113 | 114 | USE_L10N = True 115 | 116 | USE_TZ = True 117 | 118 | 119 | # Static files (CSS, JavaScript, Images) 120 | # https://docs.djangoproject.com/en/1.11/howto/static-files/ 121 | 122 | STATIC_URL = '/static/' 123 | 124 | -------------------------------------------------------------------------------- /ApiTest/test.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | a = "abc" # a是临时变量 7 | 8 | d = '{"key": "##a##" }' #d 是刚从数据库取出来的header 的json 9 | 10 | new_d = d.replace("##a##",repr(str(a))) 11 | 12 | print(new_d) -------------------------------------------------------------------------------- /ApiTest/urls.py: -------------------------------------------------------------------------------- 1 | """ApiTest URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/1.11/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') 12 | Including another URLtconf 13 | 1. Import the include() function: from django.conf.urls import url, include 14 | 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) 15 | """ 16 | from django.conf.urls import url 17 | from django.contrib import admin 18 | from MyApp.views import * 19 | from MyApp.views_tools import * 20 | from MyApp.views_test import * 21 | urlpatterns = [ 22 | url(r'^admin/', admin.site.urls), 23 | url(r'^welcome/$',welcome) , #获取菜单 24 | url(r'^$',home), 25 | url(r'^home/$', home), # 进入首页 26 | url(r"^child/(?P.+)/(?P.*)/(?P.*)/$",child), # 返回子页面 27 | url(r'^login/$', login), # 进入登陆页面 28 | url(r'^login_action/$', login_action), # 登陆 29 | url(r'^register_action/$', register_action), # 注册 30 | url(r'^accounts/login/$', login), # 非登陆状态自动跳回登陆页面 31 | url(r'^logout/$', logout), # 退出 32 | url(r'^pei/$', pei), # 匿名吐槽 33 | url(r'^help/$', api_help), # 进入到帮助文档 34 | url(r'^project_list/$', project_list), # 进入项目列表 35 | url(r'^delete_project/$', delete_project), # 删除项目 36 | url(r'^add_project/$', add_project), #新增项目 37 | url(r'^apis/(?P.*)/$', open_apis), # 进入接口库 38 | url(r'^cases/(?P.*)/$', open_cases), # 进入用例设置 39 | url(r'^project_set/(?P.*)/$', open_project_set), # 进入项目设置 40 | url(r'^save_project_set/(?P.*)/$', save_project_set), # 保存项目设置 41 | url(r'^project_api_add/(?P.*)/$', project_api_add), # 新增接口 42 | url(r'^project_api_del/(?P.*)/$', project_api_del), # 删除接口 43 | url(r'^save_bz/$', save_bz), # 保存备注 44 | url(r'^get_bz/$', get_bz), # 获取备注 45 | url(r'^Api_save/$', Api_save), # 保存接口 46 | url(r'^get_api_data/$', get_api_data), # 获取接口数据 47 | url(r'^Api_send/$', Api_send), # 调试层发送请求 48 | url(r'^copy_api/$', copy_api), # 复制接口 49 | url(r'^error_request/$', error_request), # 调用异常测试接口 50 | url(r'^Api_send_home/$', Api_send_home), # 首页发送请求 51 | url(r'^get_home_log/$', get_home_log), # 获取最新请求记录 52 | url(r'^get_api_log_home/$', get_api_log_home), # 获取完整的单一的请求记录数据 53 | url(r'^home_log/(?P.*)/$', home), # 再次进入首页,这次要带着请求记录 54 | url(r'^add_case/(?P.*)/$', add_case), # 增加用例 55 | url(r'^del_case/(?P.*)/(?P.*)/$', del_case), # 删除用例 56 | url(r'^copy_case/(?P.*)/(?P.*)/$', copy_case), # 复制用例 57 | url(r'^save_case_concurrent/$',save_case_concurrent),# 保存用例并发设置 58 | 59 | url(r'^concurrent_cases/(?P.*)/$', concurrent_cases), # 用例并发 60 | url(r'^look_concurrent_report/(?P.*)/$', look_concurrent_report), # 查看用例并发报告 61 | url(r'^get_step_report/$',get_step_report), #获取具体step数据 62 | 63 | url(r'^get_small/$', get_small), # 获取小用例步骤的列表数据 64 | url(r'^user_upload/$', user_upload), # 上传头像 65 | url(r'^add_new_step/$', add_new_step), # 新增小步骤接口 66 | url(r'^delete_step/(?P.*)/$', delete_step), # 删除小步骤接口 67 | url(r'^get_step/$', get_step), #获取小步骤 68 | url(r'^save_step/$', save_step), # 保存小步骤 69 | url(r'^step_get_api/$', step_get_api), # 步骤详情页获取接口数据 70 | url(r'^Run_Case/$', Run_Case), # 运行大用例 71 | url(r'^look_report/(?P.*)/$', look_report), # 查看报告 72 | url(r'^save_project_header/$', save_project_header), # 保存项目公共请求头 73 | url(r'^save_caes_name/$', save_caes_name), # 保存用例名字 74 | url(r'^save_project_host/$', save_project_host), # 保存项目公域名 75 | url(r'^project_get_login/$', project_get_login), # 获取项目登陆态接口 76 | url(r'^project_login_save/$', project_login_save), # 保存项目登陆态接口 77 | url(r'^project_login_send/$', project_login_send), # 调试请求登陆态接口 78 | url(r'^Home_save_api/$', Home_save_api), # 首页保存请求数据 79 | url(r'^search/$', search), # 首页搜索功能 80 | url(r'^global_data/(?P.*)/$', global_data), # 进入全局变量设页面 81 | 82 | url(r'^global_data_add/$', global_data_add), # 增加一个全局变量组 83 | url(r'^global_data_delete/$', global_data_delete), # 删除一个全局变量组 84 | url(r'^global_data_save/$', global_data_save), # 保存一个全局变量组 85 | url(r'^global_data_change_check/$', global_data_change_check), # 更改项目的生效变量组 86 | 87 | url(r'^encyption_save/$',encyption_save), #加密配置保存 88 | 89 | url(r'^cert_upload/(?P.*)/$', cert_upload), # 上传证书 90 | 91 | 92 | # ------------ 测试用接口 93 | url(r'^test_login_A/$', test_login_A), 94 | url(r'^test_login_B/$', test_login_B), 95 | url(r'^test_api_A/$', test_api_A), 96 | url(r'^test_api_B/$', test_api_B), 97 | 98 | # ------------ 小工具 --------------- # 99 | url(r'^tools_zhengjiao/$', zhengjiao), # 进入小公举页面 100 | url(r'^zhengjiao_play/$', zhengjiao_play), # 正交工具运行 101 | url(r'^zhengjiao_excel/$', zhengjiao_excel), # 正交工具导出 102 | 103 | ] 104 | 105 | -------------------------------------------------------------------------------- /ApiTest/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for ApiTest project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/1.11/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ApiTest.settings") 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /MyApp/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/.DS_Store -------------------------------------------------------------------------------- /MyApp/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/__init__.py -------------------------------------------------------------------------------- /MyApp/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | # Register your models here. 3 | from MyApp.models import * 4 | 5 | import inspect,sys 6 | 7 | clsmemebers = inspect.getmembers(sys.modules[__name__],inspect.isclass) 8 | for name,cls in clsmemebers: 9 | admin.site.register(cls) -------------------------------------------------------------------------------- /MyApp/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class MyappConfig(AppConfig): 5 | name = 'MyApp' 6 | -------------------------------------------------------------------------------- /MyApp/global_def.py: -------------------------------------------------------------------------------- 1 | # coding:utf-8 2 | 3 | # 本文件存储公共方法 4 | # 请按规则传入和接收 5 | from MyApp.models import * 6 | import re 7 | import ast #安全版eval求值 8 | 9 | # 替换全局变量 10 | def global_datas_replace(project_id:str,s:str) -> str : 11 | #根据项目变量去获得生效的变量组。 12 | try: 13 | global_data_ids = DB_project.objects.filter(id=project_id)[0].global_datas.split(',') #获取所有生效的变量组id 14 | except: 15 | return s 16 | 17 | if global_data_ids == ['']: 18 | return s 19 | 20 | global_datas = {} 21 | for i in global_data_ids: 22 | global_data = ast.literal_eval(list(DB_global_data.objects.filter(id=i).values())[0]['data']) 23 | global_datas.update(global_data) 24 | # 最终的gloabl_datas就是总变量池字典了 25 | #用正则找出所有需要替换的变量名称​。 26 | # 处理url/header/data 27 | list_data = re.findall(r'~(.*?)~',s) 28 | for i in list_data: 29 | s = s.replace('~'+i+'~',str(global_datas[i])) 30 | #返回结果。 31 | return s 32 | 33 | 34 | -------------------------------------------------------------------------------- /MyApp/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2020-07-21 01:57 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | initial = True 9 | 10 | dependencies = [ 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='DB_tucao', 16 | fields=[ 17 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('user', models.CharField(max_length=30, null=True)), 19 | ('text', models.CharField(max_length=1000, null=True)), 20 | ('ctime', models.DateTimeField(auto_now=True)), 21 | ], 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /MyApp/migrations/0002_auto_20200721_0219.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2020-07-21 02:19 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='db_tucao', 15 | name='ctime', 16 | field=models.DateTimeField(), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /MyApp/migrations/0003_auto_20200721_0219.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2020-07-21 02:19 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0002_auto_20200721_0219'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='db_tucao', 15 | name='ss', 16 | field=models.CharField(max_length=123, null=True), 17 | ), 18 | migrations.AlterField( 19 | model_name='db_tucao', 20 | name='ctime', 21 | field=models.DateTimeField(auto_now=True), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /MyApp/migrations/0004_remove_db_tucao_ss.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2020-07-21 02:19 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0003_auto_20200721_0219'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RemoveField( 14 | model_name='db_tucao', 15 | name='ss', 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /MyApp/migrations/0005_auto_20200721_0220.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2020-07-21 02:20 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0004_remove_db_tucao_ss'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='db_tucao', 15 | name='ctime', 16 | field=models.DateTimeField(null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /MyApp/migrations/0006_remove_db_tucao_ctime.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2020-07-21 02:20 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0005_auto_20200721_0220'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RemoveField( 14 | model_name='db_tucao', 15 | name='ctime', 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /MyApp/migrations/0007_db_tucao_ctime.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2020-07-21 02:24 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0006_remove_db_tucao_ctime'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='db_tucao', 15 | name='ctime', 16 | field=models.DateTimeField(auto_now=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /MyApp/migrations/0008_db_home_href.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2020-07-24 01:27 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0007_db_tucao_ctime'), 10 | ] 11 | 12 | operations = [ 13 | migrations.CreateModel( 14 | name='DB_home_href', 15 | fields=[ 16 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 17 | ('name', models.CharField(max_length=30, null=True)), 18 | ('href', models.CharField(max_length=2000, null=True)), 19 | ], 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /MyApp/migrations/0009_db_project.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2020-07-29 02:27 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0008_db_home_href'), 10 | ] 11 | 12 | operations = [ 13 | migrations.CreateModel( 14 | name='DB_project', 15 | fields=[ 16 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 17 | ('name', models.CharField(max_length=100, null=True)), 18 | ('remark', models.CharField(max_length=1000, null=True)), 19 | ('user', models.CharField(max_length=15, null=True)), 20 | ('other_user', models.CharField(max_length=200, null=True)), 21 | ], 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /MyApp/migrations/0010_db_apis.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2020-08-13 02:02 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0009_db_project'), 10 | ] 11 | 12 | operations = [ 13 | migrations.CreateModel( 14 | name='DB_apis', 15 | fields=[ 16 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 17 | ('project_id', models.CharField(max_length=10, null=True)), 18 | ('name', models.CharField(max_length=100, null=True)), 19 | ('api_method', models.CharField(max_length=10, null=True)), 20 | ('api_url', models.CharField(max_length=1000, null=True)), 21 | ('api_header', models.CharField(max_length=1000, null=True)), 22 | ('api_login', models.CharField(max_length=10, null=True)), 23 | ('api_host', models.CharField(max_length=10, null=True)), 24 | ('des', models.CharField(max_length=10, null=True)), 25 | ('body_method', models.CharField(max_length=10, null=True)), 26 | ('api_body', models.CharField(max_length=10, null=True)), 27 | ('result', models.TextField(null=True)), 28 | ('sign', models.CharField(max_length=10, null=True)), 29 | ('file_key', models.CharField(max_length=10, null=True)), 30 | ('file_name', models.CharField(max_length=10, null=True)), 31 | ('public_header', models.CharField(max_length=10, null=True)), 32 | ], 33 | ), 34 | ] 35 | -------------------------------------------------------------------------------- /MyApp/migrations/0011_auto_20200813_0212.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2020-08-13 02:12 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0010_db_apis'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='db_apis', 15 | name='api_body', 16 | field=models.CharField(max_length=1000, null=True), 17 | ), 18 | migrations.AlterField( 19 | model_name='db_apis', 20 | name='api_host', 21 | field=models.CharField(max_length=100, null=True), 22 | ), 23 | migrations.AlterField( 24 | model_name='db_apis', 25 | name='body_method', 26 | field=models.CharField(max_length=20, null=True), 27 | ), 28 | migrations.AlterField( 29 | model_name='db_apis', 30 | name='des', 31 | field=models.CharField(max_length=100, null=True), 32 | ), 33 | migrations.AlterField( 34 | model_name='db_apis', 35 | name='file_key', 36 | field=models.CharField(max_length=50, null=True), 37 | ), 38 | migrations.AlterField( 39 | model_name='db_apis', 40 | name='file_name', 41 | field=models.CharField(max_length=50, null=True), 42 | ), 43 | migrations.AlterField( 44 | model_name='db_apis', 45 | name='public_header', 46 | field=models.CharField(max_length=1000, null=True), 47 | ), 48 | ] 49 | -------------------------------------------------------------------------------- /MyApp/migrations/0012_auto_20200908_0812.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2020-09-08 08:12 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0011_auto_20200813_0212'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='db_apis', 15 | name='last_api_body', 16 | field=models.CharField(max_length=1000, null=True), 17 | ), 18 | migrations.AddField( 19 | model_name='db_apis', 20 | name='last_body_method', 21 | field=models.CharField(max_length=20, null=True), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /MyApp/migrations/0013_db_apis_log.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2020-10-09 01:43 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0012_auto_20200908_0812'), 10 | ] 11 | 12 | operations = [ 13 | migrations.CreateModel( 14 | name='DB_apis_log', 15 | fields=[ 16 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 17 | ('user_id', models.CharField(max_length=10, null=True)), 18 | ('name', models.CharField(max_length=100, null=True)), 19 | ('api_method', models.CharField(max_length=10, null=True)), 20 | ('api_url', models.CharField(max_length=1000, null=True)), 21 | ('api_header', models.CharField(max_length=1000, null=True)), 22 | ('api_login', models.CharField(max_length=10, null=True)), 23 | ('api_host', models.CharField(max_length=100, null=True)), 24 | ('des', models.CharField(max_length=100, null=True)), 25 | ('body_method', models.CharField(max_length=20, null=True)), 26 | ('api_body', models.CharField(max_length=1000, null=True)), 27 | ('sign', models.CharField(max_length=10, null=True)), 28 | ('file_key', models.CharField(max_length=50, null=True)), 29 | ('file_name', models.CharField(max_length=50, null=True)), 30 | ], 31 | ), 32 | ] 33 | -------------------------------------------------------------------------------- /MyApp/migrations/0014_remove_db_apis_log_name.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2020-10-09 01:51 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0013_db_apis_log'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RemoveField( 14 | model_name='db_apis_log', 15 | name='name', 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /MyApp/migrations/0015_auto_20201029_1056.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2020-10-29 10:56 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0014_remove_db_apis_log_name'), 10 | ] 11 | 12 | operations = [ 13 | migrations.CreateModel( 14 | name='DB_cases', 15 | fields=[ 16 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 17 | ('project_id', models.CharField(max_length=10, null=True)), 18 | ('name', models.CharField(max_length=50, null=True)), 19 | ], 20 | ), 21 | migrations.RemoveField( 22 | model_name='db_apis_log', 23 | name='des', 24 | ), 25 | ] 26 | -------------------------------------------------------------------------------- /MyApp/migrations/0016_db_step.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2020-11-02 11:14 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0015_auto_20201029_1056'), 10 | ] 11 | 12 | operations = [ 13 | migrations.CreateModel( 14 | name='DB_step', 15 | fields=[ 16 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 17 | ('Case_id', models.CharField(max_length=10, null=True)), 18 | ('name', models.CharField(max_length=50, null=True)), 19 | ('index', models.IntegerField(max_length=200, null=True)), 20 | ('api_method', models.CharField(max_length=10, null=True)), 21 | ('api_url', models.CharField(max_length=1000, null=True)), 22 | ('api_host', models.CharField(max_length=100, null=True)), 23 | ('api_header', models.CharField(max_length=1000, null=True)), 24 | ('api_body_method', models.CharField(max_length=10, null=True)), 25 | ('api_body', models.CharField(max_length=10, null=True)), 26 | ('get_path', models.CharField(max_length=500, null=True)), 27 | ('get_zz', models.CharField(max_length=500, null=True)), 28 | ('assert_zz', models.CharField(max_length=500, null=True)), 29 | ('assert_qz', models.CharField(max_length=500, null=True)), 30 | ('assert_path', models.CharField(max_length=500, null=True)), 31 | ], 32 | ), 33 | ] 34 | -------------------------------------------------------------------------------- /MyApp/migrations/0017_auto_20201102_1114.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2020-11-02 11:14 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0016_db_step'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='db_step', 15 | name='index', 16 | field=models.IntegerField(null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /MyApp/migrations/0018_db_step_mock_res.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2020-11-30 02:52 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0017_auto_20201102_1114'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='db_step', 15 | name='mock_res', 16 | field=models.CharField(max_length=1000, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /MyApp/migrations/0019_db_project_header.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2020-12-04 02:26 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0018_db_step_mock_res'), 10 | ] 11 | 12 | operations = [ 13 | migrations.CreateModel( 14 | name='DB_project_header', 15 | fields=[ 16 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 17 | ('project_id', models.CharField(max_length=10, null=True)), 18 | ('name', models.CharField(max_length=20, null=True)), 19 | ('key', models.CharField(max_length=20, null=True)), 20 | ('value', models.TextField(null=True)), 21 | ], 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /MyApp/migrations/0020_db_step_public_header.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2020-12-11 02:18 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0019_db_project_header'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='db_step', 15 | name='public_header', 16 | field=models.CharField(max_length=1000, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /MyApp/migrations/0021_db_host.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2020-12-14 11:21 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0020_db_step_public_header'), 10 | ] 11 | 12 | operations = [ 13 | migrations.CreateModel( 14 | name='DB_host', 15 | fields=[ 16 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 17 | ('host', models.CharField(max_length=100, null=True)), 18 | ('des', models.CharField(max_length=100, null=True)), 19 | ], 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /MyApp/migrations/0022_db_project_host.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2020-12-16 06:00 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0021_db_host'), 10 | ] 11 | 12 | operations = [ 13 | migrations.CreateModel( 14 | name='DB_project_host', 15 | fields=[ 16 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 17 | ('project_id', models.CharField(max_length=10, null=True)), 18 | ('name', models.CharField(max_length=20, null=True)), 19 | ('host', models.TextField(null=True)), 20 | ], 21 | ), 22 | ] 23 | -------------------------------------------------------------------------------- /MyApp/migrations/0023_db_login.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2020-12-28 09:09 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0022_db_project_host'), 10 | ] 11 | 12 | operations = [ 13 | migrations.CreateModel( 14 | name='DB_login', 15 | fields=[ 16 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 17 | ('project_id', models.CharField(max_length=10, null=True)), 18 | ('api_method', models.CharField(max_length=10, null=True)), 19 | ('api_url', models.CharField(max_length=1000, null=True)), 20 | ('api_header', models.CharField(max_length=1000, null=True)), 21 | ('api_host', models.CharField(max_length=100, null=True)), 22 | ('body_method', models.CharField(max_length=20, null=True)), 23 | ('api_body', models.CharField(max_length=1000, null=True)), 24 | ('sign', models.CharField(max_length=10, null=True)), 25 | ('set', models.CharField(max_length=300, null=True)), 26 | ], 27 | ), 28 | ] 29 | -------------------------------------------------------------------------------- /MyApp/migrations/0024_db_step_api_login.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2021-01-19 02:39 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0023_db_login'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='db_step', 15 | name='api_login', 16 | field=models.CharField(max_length=10, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /MyApp/migrations/0025_db_global_data.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2021-03-03 02:27 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0024_db_step_api_login'), 10 | ] 11 | 12 | operations = [ 13 | migrations.CreateModel( 14 | name='DB_global_data', 15 | fields=[ 16 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 17 | ('name', models.TextField(max_length=20, null=True)), 18 | ('user_id', models.CharField(max_length=10, null=True)), 19 | ('data', models.TextField(null=True)), 20 | ], 21 | ), 22 | ] 23 | -------------------------------------------------------------------------------- /MyApp/migrations/0026_auto_20210303_1031.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2021-03-03 02:31 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0025_db_global_data'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='db_global_data', 15 | name='name', 16 | field=models.CharField(max_length=20, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /MyApp/migrations/0027_db_project_user_id.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2021-03-03 02:52 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0026_auto_20210303_1031'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='db_project', 15 | name='user_id', 16 | field=models.CharField(max_length=10, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /MyApp/migrations/0028_db_project_global_datas.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2021-03-29 05:59 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0027_db_project_user_id'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='db_project', 15 | name='global_datas', 16 | field=models.CharField(max_length=100, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /MyApp/migrations/0029_db_project_encryption.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2021-06-21 07:52 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0028_db_project_global_datas'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='db_project', 15 | name='encryption', 16 | field=models.CharField(max_length=500, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /MyApp/migrations/0030_auto_20210625_1749.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2021-06-25 09:49 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0029_db_project_encryption'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RenameField( 14 | model_name='db_project', 15 | old_name='encryption', 16 | new_name='encyption_input', 17 | ), 18 | migrations.AddField( 19 | model_name='db_project', 20 | name='encyption_insert', 21 | field=models.CharField(max_length=50, null=True), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /MyApp/migrations/0031_auto_20210706_1112.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2021-07-06 03:12 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0030_auto_20210625_1749'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='db_step', 15 | name='sign', 16 | field=models.BooleanField(default=False), 17 | ), 18 | migrations.AlterField( 19 | model_name='db_apis', 20 | name='sign', 21 | field=models.BooleanField(default=False), 22 | ), 23 | migrations.AlterField( 24 | model_name='db_login', 25 | name='sign', 26 | field=models.BooleanField(default=False), 27 | ), 28 | ] 29 | -------------------------------------------------------------------------------- /MyApp/migrations/0032_auto_20210706_1204.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2021-07-06 04:04 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0031_auto_20210706_1112'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='db_apis', 15 | name='sign', 16 | field=models.CharField(max_length=10, null=True), 17 | ), 18 | migrations.AlterField( 19 | model_name='db_login', 20 | name='sign', 21 | field=models.CharField(max_length=10, null=True), 22 | ), 23 | migrations.AlterField( 24 | model_name='db_step', 25 | name='sign', 26 | field=models.CharField(max_length=10, null=True), 27 | ), 28 | ] 29 | -------------------------------------------------------------------------------- /MyApp/migrations/0033_auto_20210706_1205.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2021-07-06 04:05 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0032_auto_20210706_1204'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='db_apis', 15 | name='sign', 16 | field=models.CharField(default='no', max_length=10, null=True), 17 | ), 18 | migrations.AlterField( 19 | model_name='db_login', 20 | name='sign', 21 | field=models.CharField(default='no', max_length=10, null=True), 22 | ), 23 | migrations.AlterField( 24 | model_name='db_step', 25 | name='sign', 26 | field=models.CharField(default='no', max_length=10, null=True), 27 | ), 28 | ] 29 | -------------------------------------------------------------------------------- /MyApp/migrations/0034_db_project_cert.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2021-08-18 10:46 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0033_auto_20210706_1205'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='db_project', 15 | name='cert', 16 | field=models.CharField(default='', max_length=200, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /MyApp/migrations/0035_auto_20210819_1035.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2021-08-19 02:35 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0034_db_project_cert'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='db_apis', 15 | name='api_cert', 16 | field=models.CharField(max_length=10, null=True), 17 | ), 18 | migrations.AddField( 19 | model_name='db_apis_log', 20 | name='api_cert', 21 | field=models.CharField(max_length=10, null=True), 22 | ), 23 | migrations.AddField( 24 | model_name='db_login', 25 | name='cert', 26 | field=models.CharField(default='no', max_length=10, null=True), 27 | ), 28 | migrations.AddField( 29 | model_name='db_step', 30 | name='api_cert', 31 | field=models.CharField(max_length=10, null=True), 32 | ), 33 | ] 34 | -------------------------------------------------------------------------------- /MyApp/migrations/0036_auto_20210819_1321.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2021-08-19 05:21 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0035_auto_20210819_1035'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RenameField( 14 | model_name='db_apis', 15 | old_name='api_cert', 16 | new_name='cert', 17 | ), 18 | migrations.RenameField( 19 | model_name='db_apis_log', 20 | old_name='api_cert', 21 | new_name='cert', 22 | ), 23 | migrations.RenameField( 24 | model_name='db_step', 25 | old_name='api_cert', 26 | new_name='cert', 27 | ), 28 | ] 29 | -------------------------------------------------------------------------------- /MyApp/migrations/0037_db_cases_concurrent.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2021-11-03 07:21 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0036_auto_20210819_1321'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='db_cases', 15 | name='concurrent', 16 | field=models.BooleanField(default=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /MyApp/migrations/0038_db_wqrf_step_report.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2022-03-25 16:26 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('MyApp', '0037_db_cases_concurrent'), 10 | ] 11 | 12 | operations = [ 13 | migrations.CreateModel( 14 | name='DB_wqrf_step_report', 15 | fields=[ 16 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 17 | ('step_id', models.CharField(default='', max_length=10)), 18 | ('request_data', models.TextField(default='{}')), 19 | ('response', models.TextField(default='')), 20 | ('assert_result', models.CharField(default='{}', max_length=500)), 21 | ], 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /MyApp/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/migrations/__init__.py -------------------------------------------------------------------------------- /MyApp/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | 5 | 6 | class DB_tucao(models.Model): 7 | user = models.CharField(max_length=30,null=True) #吐槽人名字 8 | text = models.CharField(max_length=1000,null=True) #吐槽内容 9 | ctime = models.DateTimeField(auto_now=True) #创建时间 10 | def __str__(self): 11 | return self.text+ str(self.ctime) 12 | 13 | 14 | class DB_home_href(models.Model): 15 | name = models.CharField(max_length=30,null=True) #超链接名字 16 | href = models.CharField(max_length=2000,null=True) #超链接内容 17 | def __str__(self): 18 | return self.name 19 | 20 | 21 | class DB_project(models.Model): 22 | name = models.CharField(max_length=100,null=True) #项目名字 23 | remark = models.CharField(max_length=1000,null=True) #项目备注 24 | user = models.CharField(max_length=15,null=True) #项目创建者名字 25 | user_id = models.CharField(max_length=10,null=True) #项目创建者id 26 | other_user = models.CharField(max_length=200,null=True) #项目其他创建者 27 | global_datas = models.CharField(max_length=100,null=True) #所生效的变量组的id列表 28 | encyption_insert = models.CharField(max_length=50,null=True) # 加密算法插入位置 29 | encyption_input = models.CharField(max_length=500,null=True) # 加密算法表达式 30 | cert = models.CharField(max_length=200,null=True,default='') # 证书相关 31 | def __str__(self): 32 | return str(self.name) 33 | 34 | 35 | class DB_apis(models.Model): 36 | project_id = models.CharField(max_length=10,null=True) #项目id 37 | name = models.CharField(max_length=100,null=True) #接口名字 38 | api_method = models.CharField(max_length=10,null=True) #请求方式 39 | api_url = models.CharField(max_length=1000,null=True) #url 40 | api_header = models.CharField(max_length=1000,null=True) #请求头 41 | api_login = models.CharField(max_length=10,null=True) #是否带登陆态 42 | cert = models.CharField(max_length=10,null=True) #是否带登陆态 43 | api_host = models.CharField(max_length=100,null=True) #域名 44 | des = models.CharField(max_length=100,null=True) #描述 45 | body_method = models.CharField(max_length=20,null=True) #请求体编码格式 46 | api_body = models.CharField(max_length=1000,null=True) #请求体 47 | result = models.TextField(null=True) #返回体 因为长度巨大,所以用大文本方式存储 48 | sign = models.CharField(max_length=10,null=True,default='no') #是否验签 49 | file_key = models.CharField(max_length=50,null=True) #文件key 50 | file_name = models.CharField(max_length=50,null=True) #文件名 51 | public_header = models.CharField(max_length=1000,null=True) #全局变量-请求头 52 | last_body_method = models.CharField(max_length=20,null=True) #上次请求体编码格式 53 | last_api_body = models.CharField(max_length=1000,null=True) #上次请求体 54 | 55 | def __str__(self): 56 | return str(self.id)+str(self.name) 57 | 58 | class DB_apis_log(models.Model): 59 | user_id = models.CharField(max_length=10,null=True) #所属用户id 60 | api_method = models.CharField(max_length=10,null=True) #请求方式 61 | api_url = models.CharField(max_length=1000,null=True) #url 62 | api_header = models.CharField(max_length=1000,null=True) #请求头 63 | api_login = models.CharField(max_length=10,null=True) #是否带登陆态 64 | cert = models.CharField(max_length=10,null=True) #是否带登证书 65 | api_host = models.CharField(max_length=100,null=True) #域名 66 | body_method = models.CharField(max_length=20,null=True) #请求体编码格式 67 | api_body = models.CharField(max_length=1000,null=True) #请求体 68 | sign = models.CharField(max_length=10,null=True) #是否验签 69 | file_key = models.CharField(max_length=50,null=True) #文件key 70 | file_name = models.CharField(max_length=50,null=True) #文件名 71 | 72 | def __str__(self): 73 | return self.api_url 74 | 75 | 76 | class DB_cases(models.Model): 77 | project_id = models.CharField(max_length=10,null=True) #所属项目id 78 | name = models.CharField(max_length=50,null=True) #用例名字 79 | concurrent = models.BooleanField(default=True) #是否并发 80 | def __str__(self): 81 | return self.name 82 | 83 | 84 | class DB_step(models.Model): 85 | Case_id = models.CharField(max_length=10,null=True) #所属大用例id 86 | name = models.CharField(max_length=50,null=True) #步骤名字 87 | index = models.IntegerField(null=True) #执行步骤 88 | api_method = models.CharField(max_length=10,null=True) # 请求方式 89 | api_url = models.CharField(max_length=1000,null=True) #url 90 | api_host = models.CharField(max_length=100,null=True) #host 91 | api_header = models.CharField(max_length=1000,null=True) #请求头 92 | api_body_method = models.CharField(max_length=10,null=True) #请求体编码类型 93 | api_body = models.CharField(max_length=10,null=True) #请求体 94 | get_path = models.CharField(max_length=500,null=True) #提取返回值-路径法 95 | get_zz = models.CharField(max_length=500,null=True) #提取返回值-正则 96 | assert_zz = models.CharField(max_length=500,null=True) #断言返回值-正则 97 | assert_qz = models.CharField(max_length=500,null=True) #断言返回值-全文检索存在 98 | assert_path = models.CharField(max_length=500,null=True) #断言返回值-路径法 99 | mock_res = models.CharField(max_length=1000,null=True) #mock返回值 100 | public_header = models.CharField(max_length=1000,null=True) #全局变量-请求头 101 | api_login = models.CharField(max_length=10,null=True) #是否带登陆态 102 | cert = models.CharField(max_length=10,null=True) #是否带证书 103 | sign = models.CharField(max_length=10,null=True,default='no') # 是否验签 104 | 105 | def __str__(self): 106 | return self.names 107 | 108 | class DB_project_header(models.Model): 109 | project_id = models.CharField(max_length=10,null=True) #所属项目id 110 | name = models.CharField(max_length=20,null=True) #请求头变量名字 111 | key = models.CharField(max_length=20,null=True) #请求头header的 key 112 | value = models.TextField(null=True) #请求头的value,因为有可能cookie较大,达到几千字符,所以采用大文本方式存储 113 | 114 | def __str__(self): 115 | return self.name 116 | 117 | 118 | class DB_host(models.Model): 119 | host = models.CharField(max_length=100,null=True) #域名内容 120 | des = models.CharField(max_length=100,null=True) #域名描述 121 | def __str__(self): 122 | return self.host 123 | 124 | class DB_project_host(models.Model): 125 | project_id = models.CharField(max_length=10,null=True) #所属项目id 126 | name = models.CharField(max_length=20,null=True) 127 | host = models.TextField(null=True) 128 | 129 | def __str__(self): 130 | return self.name 131 | 132 | 133 | class DB_login(models.Model): 134 | project_id = models.CharField(max_length=10,null=True) #项目id 135 | api_method = models.CharField(max_length=10,null=True) #请求方式 136 | api_url = models.CharField(max_length=1000,null=True) #url 137 | api_header = models.CharField(max_length=1000,null=True) #请求头 138 | api_host = models.CharField(max_length=100,null=True) #域名 139 | body_method = models.CharField(max_length=20,null=True) #请求体编码格式 140 | api_body = models.CharField(max_length=1000,null=True) #请求体 141 | sign = models.CharField(max_length=10,null=True,default='no') # 是否验签 142 | cert = models.CharField(max_length=10,null=True,default='no') # 是否带证书 143 | set = models.CharField(max_length=300,null=True) #提取设置 144 | 145 | def __str__(self): 146 | return str(self.id) 147 | 148 | class DB_global_data(models.Model): 149 | name = models.CharField(max_length=20,null=True) #名字 150 | user_id = models.CharField(max_length=10,null=True) #所属用户id 151 | data = models.TextField(null=True) #存储的所有数据 152 | 153 | def __str__(self): 154 | return self.name 155 | 156 | class DB_wqrf_step_report(models.Model): 157 | step_id = models.CharField(max_length=10,default='') #步骤id 158 | request_data = models.TextField(default='{}') #请求数据 159 | response = models.TextField(default='') #返回结果 160 | assert_result = models.CharField(max_length=500,default='{}') #断言结果 161 | 162 | def __str__(self): 163 | return self.step_id 164 | -------------------------------------------------------------------------------- /MyApp/static/201801271505/css/htmleaf-demo.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'icomoon'; 3 | src:url('../fonts/icomoon.eot?rretjt'); 4 | src:url('../fonts/icomoon.eot?#iefixrretjt') format('embedded-opentype'), 5 | url('../fonts/icomoon.woff?rretjt') format('woff'), 6 | url('../fonts/icomoon.ttf?rretjt') format('truetype'), 7 | url('../fonts/icomoon.svg?rretjt#icomoon') format('svg'); 8 | font-weight: normal; 9 | font-style: normal; 10 | } 11 | 12 | [class^="icon-"], [class*=" icon-"] { 13 | font-family: 'icomoon'; 14 | speak: none; 15 | font-style: normal; 16 | font-weight: normal; 17 | font-variant: normal; 18 | text-transform: none; 19 | line-height: 1; 20 | 21 | /* Better Font Rendering =========== */ 22 | -webkit-font-smoothing: antialiased; 23 | -moz-osx-font-smoothing: grayscale; 24 | } 25 | 26 | body, html { font-size: 100%; padding: 0; margin: 0;} 27 | 28 | /* Reset */ 29 | *, 30 | *:after, 31 | *:before { 32 | -webkit-box-sizing: border-box; 33 | -moz-box-sizing: border-box; 34 | box-sizing: border-box; 35 | } 36 | 37 | /* Clearfix hack by Nicolas Gallagher: http://nicolasgallagher.com/micro-clearfix-hack/ */ 38 | .clearfix:before, 39 | .clearfix:after { 40 | content: " "; 41 | display: table; 42 | } 43 | 44 | .clearfix:after { 45 | clear: both; 46 | } 47 | 48 | body{ 49 | font-family: "Microsoft YaHei","Segoe UI", "Lucida Grande", Helvetica, Arial,sans-serif; 50 | } 51 | .htmleaf-links a{ color: rgba(255, 255, 255, 0.6);outline: none;text-decoration: none;-webkit-transition: 0.2s;transition: 0.2s;} 52 | .htmleaf-links a:hover,.htmleaf-links a:focus{color:#74777b;text-decoration: none;} 53 | .htmleaf-container{ 54 | margin: 0 auto; 55 | } 56 | 57 | .bgcolor-1 { background: #f0efee; } 58 | .bgcolor-2 { background: #f9f9f9; } 59 | .bgcolor-3 { background: #e8e8e8; }/*light grey*/ 60 | .bgcolor-4 { background: #2f3238; color: #fff; }/*Dark grey*/ 61 | .bgcolor-5 { background: #df6659; color: #521e18; }/*pink1*/ 62 | .bgcolor-6 { background: #2fa8ec; }/*sky blue*/ 63 | .bgcolor-7 { background: #d0d6d6; }/*White tea*/ 64 | .bgcolor-8 { background: #3d4444; color: #fff; }/*Dark grey2*/ 65 | .bgcolor-9 { background: #ef3f52; color: #fff;}/*pink2*/ 66 | .bgcolor-10{ background: #64448f; color: #fff;}/*Violet*/ 67 | .bgcolor-11{ background: #3755ad; color: #fff;}/*dark blue*/ 68 | .bgcolor-12{ background: #3498DB; color: #fff;}/*light blue*/ 69 | .bgcolor-20{ background: #494A5F;color: #D5D6E2;} 70 | /* Header */ 71 | .htmleaf-header{ 72 | padding: 1em 190px 1em; 73 | letter-spacing: -1px; 74 | text-align: center; 75 | background: #66677c; 76 | } 77 | .htmleaf-header h1 { 78 | color: #D5D6E2; 79 | font-weight: 600; 80 | font-size: 2em; 81 | line-height: 1; 82 | margin-bottom: 0; 83 | } 84 | .htmleaf-header h1 span { 85 | display: block; 86 | font-size: 60%; 87 | font-weight: 400; 88 | padding: 0.8em 0 0.5em 0; 89 | color: #c3c8cd; 90 | } 91 | /*nav*/ 92 | .htmleaf-demo a{color: #fff;text-decoration: none;} 93 | .htmleaf-demo{width: 100%;padding-bottom: 1.2em;} 94 | .htmleaf-demo a{display: inline-block;margin: 0.5em;padding: 0.6em 1em;border: 3px solid #fff;font-weight: 700;} 95 | .htmleaf-demo a:hover{opacity: 0.6;} 96 | .htmleaf-demo a.current{background:#1d7db1;color: #fff; } 97 | /* Top Navigation Style */ 98 | .htmleaf-links { 99 | position: relative; 100 | display: inline-block; 101 | white-space: nowrap; 102 | font-size: 1.5em; 103 | text-align: center; 104 | } 105 | 106 | .htmleaf-links::after { 107 | position: absolute; 108 | top: 0; 109 | left: 50%; 110 | margin-left: -1px; 111 | width: 2px; 112 | height: 100%; 113 | background: #dbdbdb; 114 | content: ''; 115 | -webkit-transform: rotate3d(0,0,1,22.5deg); 116 | transform: rotate3d(0,0,1,22.5deg); 117 | } 118 | 119 | .htmleaf-icon { 120 | display: inline-block; 121 | margin: 0.5em; 122 | padding: 0em 0; 123 | width: 1.5em; 124 | text-decoration: none; 125 | } 126 | 127 | .htmleaf-icon span { 128 | display: none; 129 | } 130 | 131 | .htmleaf-icon:before { 132 | margin: 0 5px; 133 | text-transform: none; 134 | font-weight: normal; 135 | font-style: normal; 136 | font-variant: normal; 137 | font-family: 'icomoon'; 138 | line-height: 1; 139 | speak: none; 140 | -webkit-font-smoothing: antialiased; 141 | } 142 | /* footer */ 143 | .htmleaf-footer{width: 100%;padding-top: 10px;} 144 | .htmleaf-small{font-size: 0.8em;} 145 | .center{text-align: center;} 146 | /****/ 147 | .related { 148 | color: #fff; 149 | background: #494A5F; 150 | text-align: center; 151 | font-size: 1.25em; 152 | padding: 0.5em 0; 153 | overflow: hidden; 154 | } 155 | 156 | .related > a { 157 | vertical-align: top; 158 | width: calc(100% - 20px); 159 | max-width: 340px; 160 | display: inline-block; 161 | text-align: center; 162 | margin: 20px 10px; 163 | padding: 25px; 164 | font-family: "Microsoft YaHei","宋体","Segoe UI", "Lucida Grande", Helvetica, Arial,sans-serif, FreeSans, Arimo; 165 | } 166 | .related a { 167 | display: inline-block; 168 | text-align: left; 169 | margin: 20px auto; 170 | padding: 10px 20px; 171 | opacity: 0.8; 172 | -webkit-transition: opacity 0.3s; 173 | transition: opacity 0.3s; 174 | -webkit-backface-visibility: hidden; 175 | text-decoration: none; 176 | } 177 | 178 | .related a:hover, 179 | .related a:active { 180 | opacity: 1; 181 | } 182 | 183 | .related a img { 184 | max-width: 100%; 185 | opacity: 0.8; 186 | border-radius: 4px; 187 | } 188 | .related a:hover img, 189 | .related a:active img { 190 | opacity: 1; 191 | } 192 | .related h3{font-family: "Microsoft YaHei", sans-serif;font-size: 1.2em} 193 | .related a h3 { 194 | font-size: 0.85em; 195 | font-weight: 300; 196 | margin-top: 0.15em; 197 | color: #fff; 198 | } 199 | /* icomoon */ 200 | .icon-htmleaf-home-outline:before { 201 | content: "\e5000"; 202 | } 203 | 204 | .icon-htmleaf-arrow-forward-outline:before { 205 | content: "\e5001"; 206 | } 207 | 208 | @media screen and (max-width: 1024px) { 209 | .htmleaf-header { 210 | padding: 2em 10% 2em; 211 | } 212 | .htmleaf-header h1 { 213 | font-size:1.4em; 214 | } 215 | .htmleaf-links{font-size: 1.4em} 216 | } 217 | 218 | @media screen and (max-width: 960px) { 219 | .htmleaf-header { 220 | padding: 2em 10% 2em; 221 | } 222 | .htmleaf-header h1 { 223 | font-size:1.2em; 224 | } 225 | .htmleaf-links{font-size: 1.2em} 226 | .related h3{font-size: 1em;} 227 | .related a h3 { 228 | font-size: 0.8em; 229 | } 230 | } 231 | 232 | @media screen and (max-width: 766px) { 233 | .htmleaf-header h1 { 234 | font-size:1.3em; 235 | } 236 | .htmleaf-links{font-size: 1.3em} 237 | } 238 | 239 | @media screen and (max-width: 640px) { 240 | .htmleaf-header { 241 | padding: 2em 10% 2em; 242 | } 243 | .htmleaf-header h1 { 244 | font-size:1em; 245 | } 246 | .htmleaf-links{font-size: 1em} 247 | .related h3{font-size: 0.8em;} 248 | .related a h3 { 249 | font-size: 0.6em; 250 | } 251 | } -------------------------------------------------------------------------------- /MyApp/static/201801271505/css/normalize.css: -------------------------------------------------------------------------------- 1 | article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block;}audio,canvas,video{display:inline-block;}audio:not([controls]){display:none;height:0;}[hidden]{display:none;}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;}body{margin:0;}a:focus{outline:thin dotted;}a:active,a:hover{outline:0;}h1{font-size:2em;margin:0.67em 0;}abbr[title]{border-bottom:1px dotted;}b,strong{font-weight:bold;}dfn{font-style:italic;}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0;}mark{background:#ff0;color:#000;}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em;}pre{white-space:pre-wrap;}q{quotes:"\201C" "\201D" "\2018" "\2019";}small{font-size:80%;}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;}sup{top:-0.5em;}sub{bottom:-0.25em;}img{border:0;}svg:not(:root){overflow:hidden;}figure{margin:0;}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em;}legend{border:0;padding:0;}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0;}button,input{line-height:normal;}button,select{text-transform:none;}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;}button[disabled],html input[disabled]{cursor:default;}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none;}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0;}textarea{overflow:auto;vertical-align:top;}table{border-collapse:collapse;border-spacing:0;} -------------------------------------------------------------------------------- /MyApp/static/201801271505/fonts/icomoon.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/201801271505/fonts/icomoon.eot -------------------------------------------------------------------------------- /MyApp/static/201801271505/fonts/icomoon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Generated by IcoMoon 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /MyApp/static/201801271505/fonts/icomoon.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/201801271505/fonts/icomoon.ttf -------------------------------------------------------------------------------- /MyApp/static/201801271505/fonts/icomoon.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/201801271505/fonts/icomoon.woff -------------------------------------------------------------------------------- /MyApp/static/201801271505/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 基于Bootstrap可编辑的HTML表格jquery插件|DEMO_jQuery之家-自由分享jQuery、html5、css3的插件库 8 | 9 | 10 | 11 | 20 | 21 | 22 |
23 |
24 |

基于Bootstrap可编辑的HTML表格jquery插件 Javascript library to make HMTL tables editable, using Bootstrap

25 | 29 |
30 |
31 |
32 |
33 |

点击 按钮可以对表格进行编辑,点击 按钮可以将该表格行删除。

34 |
35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 |
姓名年龄email
张三25zs@163.com
李四23lisi@qq.com
王五24ww@126.com
61 |
62 |
63 |
64 | 65 |
66 |
67 |
68 | 69 | 80 |
81 | 82 | 83 | 84 | 85 | 90 | 91 | -------------------------------------------------------------------------------- /MyApp/static/201801271505/jQuery之家.url: -------------------------------------------------------------------------------- 1 | [{000214A0-0000-0000-C000-000000000046}] 2 | Prop3=19,2 3 | [InternetShortcut] 4 | URL=http://www.htmleaf.com/ 5 | IDList= 6 | HotKey=0 7 | IconFile=C:\Windows\system32\SHELL32.dll 8 | IconIndex=220 9 | [InternetShortcut.A] 10 | [InternetShortcut.W] 11 | IconFile=F:+AFx/UVP2-jQuery+AFw-favicon.ico 12 | -------------------------------------------------------------------------------- /MyApp/static/201801271505/js/bootstable.js: -------------------------------------------------------------------------------- 1 | /* 2 | Bootstable 3 | @description Javascript library to make HMTL tables editable, using Bootstrap 4 | @version 1.1 5 | @autor Tito Hinostroza 6 | */ 7 | //Global variables 8 | 9 | var params = null; //Parameters 10 | var colsEdi =null; 11 | var newColHtml = '
'+ 12 | ''+ 15 | ''+ 18 | ''+ 21 | ''+ 24 | '
'; 25 | var colEdicHtml = ''+newColHtml+''; 26 | 27 | $.fn.SetEditable = function (options) { 28 | var c = 0; 29 | var defaults = { 30 | columnsEd: null, //Index to editable columns. If null all td editables. Ex.: "1,2,3,4,5" 31 | $addButton: null, //Jquery object of "Add" button 32 | onEdit: function() {}, //Called after edition 33 | onBeforeDelete: function() {}, //Called before deletion 34 | onDelete: function() {}, //Called after deletion 35 | onAdd: function() {} //Called when added a new row 36 | }; 37 | params = $.extend(defaults, options); 38 | this.find('thead tr').append(''); //encabezado vacío 39 | this.find('tbody tr').append(colEdicHtml); 40 | var $tabedi = this; //Read reference to the current table, to resolve "this" here. 41 | //Process "addButton" parameter 42 | if (params.$addButton != null) { 43 | //Se proporcionó parámetro 44 | console.log(c); 45 | params.$addButton.click(function() { 46 | console.log('运行了') 47 | rowAddNew($tabedi.attr("id")); 48 | }); 49 | } 50 | //Process "columnsEd" parameter 51 | if (params.columnsEd != null) { 52 | //Extract felds 53 | colsEdi = params.columnsEd.split(','); 54 | } 55 | }; 56 | function IterarCamposEdit($cols, tarea) { 57 | //Itera por los campos editables de una fila 58 | var n = 0; 59 | $cols.each(function() { 60 | n++; 61 | if ($(this).attr('name')=='buttons') return; //excluye columna de botones 62 | if (!EsEditable(n-1)) return; //noe s campo editable 63 | tarea($(this)); 64 | }); 65 | 66 | function EsEditable(idx) { 67 | //Indica si la columna pasada está configurada para ser editable 68 | if (colsEdi==null) { //no se definió 69 | return true; //todas son editable 70 | } else { //hay filtro de campos 71 | //alert('verificando: ' + idx); 72 | for (var i = 0; i < colsEdi.length; i++) { 73 | if (idx == colsEdi[i]) return true; 74 | } 75 | return false; //no se encontró 76 | } 77 | } 78 | } 79 | function FijModoNormal(but) { 80 | $(but).parent().find('#bAcep').hide(); 81 | $(but).parent().find('#bCanc').hide(); 82 | $(but).parent().find('#bEdit').show(); 83 | $(but).parent().find('#bElim').show(); 84 | var $row = $(but).parents('tr'); //accede a la fila 85 | $row.attr('id', ''); //quita marca 86 | } 87 | function FijModoEdit(but) { 88 | $(but).parent().find('#bAcep').show(); 89 | $(but).parent().find('#bCanc').show(); 90 | $(but).parent().find('#bEdit').hide(); 91 | $(but).parent().find('#bElim').hide(); 92 | var $row = $(but).parents('tr'); //accede a la fila 93 | $row.attr('id', 'editing'); //indica que está en edición 94 | } 95 | function ModoEdicion($row) { 96 | if ($row.attr('id')=='editing') { 97 | return true; 98 | } else { 99 | return false; 100 | } 101 | } 102 | function rowAcep(but) { 103 | //Acepta los cambios de la edición 104 | var $row = $(but).parents('tr'); //accede a la fila 105 | var $cols = $row.find('td'); //lee campos 106 | if (!ModoEdicion($row)) return; //Ya está en edición 107 | //Está en edición. Hay que finalizar la edición 108 | IterarCamposEdit($cols, function($td) { //itera por la columnas 109 | var cont = $td.find('input').val(); //lee contenido del input 110 | $td.html(cont); //fija contenido y elimina controles 111 | }); 112 | FijModoNormal(but); 113 | params.onEdit($row); 114 | } 115 | function rowCancel(but) { 116 | //Rechaza los cambios de la edición 117 | var $row = $(but).parents('tr'); //accede a la fila 118 | var $cols = $row.find('td'); //lee campos 119 | if (!ModoEdicion($row)) return; //Ya está en edición 120 | //Está en edición. Hay que finalizar la edición 121 | IterarCamposEdit($cols, function($td) { //itera por la columnas 122 | var cont = $td.find('div').html(); //lee contenido del div 123 | $td.html(cont); //fija contenido y elimina controles 124 | }); 125 | FijModoNormal(but); 126 | } 127 | function rowEdit(but) { //Inicia la edición de una fila 128 | var $row = $(but).parents('tr'); //accede a la fila 129 | var $cols = $row.find('td'); //lee campos 130 | if (ModoEdicion($row)) return; //Ya está en edición 131 | //Pone en modo de edición 132 | IterarCamposEdit($cols, function($td) { //itera por la columnas 133 | var cont = $td.html(); //lee contenido 134 | var div = '
' + cont + '
'; //guarda contenido 135 | var input = ''; 136 | $td.html(div + input); //fija contenido 137 | }); 138 | FijModoEdit(but); 139 | } 140 | function rowElim(but) { //Elimina la fila actual 141 | var $row = $(but).parents('tr'); //accede a la fila 142 | params.onBeforeDelete($row); 143 | $row.remove(); 144 | params.onDelete(); 145 | } 146 | function rowAddNew(tabId) { //Agrega fila a la tabla indicada. 147 | var $tab_en_edic = $("#" + tabId); //Table to edit 148 | var $filas = $tab_en_edic.find('tbody tr'); 149 | if ($filas.length==0) { 150 | //No hay filas de datos. Hay que crearlas completas 151 | var $row = $tab_en_edic.find('thead tr'); //encabezado 152 | var $cols = $row.find('th'); //lee campos 153 | //construye html 154 | var htmlDat = ''; 155 | $cols.each(function() { 156 | if ($(this).attr('name')=='buttons') { 157 | //Es columna de botones 158 | htmlDat = htmlDat + colEdicHtml; //agrega botones 159 | } else { 160 | htmlDat = htmlDat + ''; 161 | } 162 | }); 163 | $tab_en_edic.find('tbody').append(''+htmlDat+''); 164 | } else { 165 | //Hay otras filas, podemos clonar la última fila, para copiar los botones 166 | var $ultFila = $tab_en_edic.find('tr:last'); 167 | $ultFila.clone().appendTo($ultFila.parent()); 168 | $ultFila = $tab_en_edic.find('tr:last'); 169 | var $cols = $ultFila.find('td'); //lee campos 170 | $cols.each(function() { 171 | if ($(this).attr('name')=='buttons') { 172 | //Es columna de botones 173 | } else { 174 | $(this).html(''); //limpia contenido 175 | } 176 | }); 177 | } 178 | params.onAdd(); 179 | } 180 | function TableToCSV(tabId, separator) { //Convierte tabla a CSV 181 | var datFil = ''; 182 | var tmp = ''; 183 | var $tab_en_edic = $("#" + tabId); //Table source 184 | $tab_en_edic.find('tbody tr').each(function() { 185 | //Termina la edición si es que existe 186 | if (ModoEdicion($(this))) { 187 | $(this).find('#bAcep').click(); //acepta edición 188 | } 189 | var $cols = $(this).find('td'); //lee campos 190 | datFil = ''; 191 | $cols.each(function() { 192 | if ($(this).attr('name')=='buttons') { 193 | //Es columna de botones 194 | } else { 195 | datFil = datFil + $(this).html() + separator; 196 | } 197 | }); 198 | if (datFil!='') { 199 | datFil = datFil.substr(0, datFil.length-separator.length); 200 | } 201 | tmp = tmp + datFil + '\n'; 202 | }); 203 | return tmp; 204 | } 205 | -------------------------------------------------------------------------------- /MyApp/static/201801271505/readme.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | jQuery之家 6 | 13 | 14 | 15 |

欢迎访问jQuery之家

16 |
17 |

更多精彩内容请访问jQuery之家:http://www.htmleaf.com

18 |

jQuery之家致力于搜集和整理各种jQuery插件,jQuery特效,jquery ui,jQuery 教程,JS特效,网页特效,以及各种html5,css3动画和效果。

19 |

为前端开发者提供最全面的网页开发素材。

20 |
21 | 22 | -------------------------------------------------------------------------------- /MyApp/static/201801271505/related/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/201801271505/related/1.jpg -------------------------------------------------------------------------------- /MyApp/static/201801271505/related/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/201801271505/related/2.jpg -------------------------------------------------------------------------------- /MyApp/static/201908059658/assets/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/201908059658/assets/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /MyApp/static/201908059658/assets/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/201908059658/assets/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /MyApp/static/201908059658/assets/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/201908059658/assets/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /MyApp/static/201908059658/assets/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/201908059658/assets/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /MyApp/static/201908059658/assets/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/201908059658/assets/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /MyApp/static/201908059658/css/htmleaf-demo.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'icomoon'; 3 | src:url('../fonts/icomoon.eot?rretjt'); 4 | src:url('../fonts/icomoon.eot?#iefixrretjt') format('embedded-opentype'), 5 | url('../fonts/icomoon.woff?rretjt') format('woff'), 6 | url('../fonts/icomoon.ttf?rretjt') format('truetype'), 7 | url('../fonts/icomoon.svg?rretjt#icomoon') format('svg'); 8 | font-weight: normal; 9 | font-style: normal; 10 | } 11 | 12 | [class^="icon-"], [class*=" icon-"] { 13 | font-family: 'icomoon'; 14 | speak: none; 15 | font-style: normal; 16 | font-weight: normal; 17 | font-variant: normal; 18 | text-transform: none; 19 | line-height: 1; 20 | 21 | /* Better Font Rendering =========== */ 22 | -webkit-font-smoothing: antialiased; 23 | -moz-osx-font-smoothing: grayscale; 24 | } 25 | 26 | body, html { font-size: 100%; padding: 0; margin: 0;} 27 | 28 | /* Reset */ 29 | *, 30 | *:after, 31 | *:before { 32 | -webkit-box-sizing: border-box; 33 | -moz-box-sizing: border-box; 34 | box-sizing: border-box; 35 | } 36 | 37 | /* Clearfix hack by Nicolas Gallagher: http://nicolasgallagher.com/micro-clearfix-hack/ */ 38 | .clearfix:before, 39 | .clearfix:after { 40 | content: " "; 41 | display: table; 42 | } 43 | 44 | .clearfix:after { 45 | clear: both; 46 | } 47 | 48 | body{ 49 | background: #494A5F; 50 | color: #D5D6E2; 51 | font-weight: 500; 52 | font-size: 1.05em; 53 | font-family: "Microsoft YaHei","Segoe UI", "Lucida Grande", Helvetica, Arial,sans-serif; 54 | } 55 | .htmleaf-links a{ color: rgba(255, 255, 255, 0.6);outline: none;text-decoration: none;-webkit-transition: 0.2s;transition: 0.2s;} 56 | .htmleaf-links a:hover,.htmleaf-links a:focus{color:#74777b;text-decoration: none;} 57 | .htmleaf-container{ 58 | margin: 0 auto; 59 | } 60 | 61 | .bgcolor-1 { background: #f0efee; } 62 | .bgcolor-2 { background: #f9f9f9; } 63 | .bgcolor-3 { background: #e8e8e8; }/*light grey*/ 64 | .bgcolor-4 { background: #2f3238; color: #fff; }/*Dark grey*/ 65 | .bgcolor-5 { background: #df6659; color: #521e18; }/*pink1*/ 66 | .bgcolor-6 { background: #2fa8ec; }/*sky blue*/ 67 | .bgcolor-7 { background: #d0d6d6; }/*White tea*/ 68 | .bgcolor-8 { background: #3d4444; color: #fff; }/*Dark grey2*/ 69 | .bgcolor-9 { background: #ef3f52; color: #fff;}/*pink2*/ 70 | .bgcolor-10{ background: #64448f; color: #fff;}/*Violet*/ 71 | .bgcolor-11{ background: #3755ad; color: #fff;}/*dark blue*/ 72 | .bgcolor-12{ background: #3498DB; color: #fff;}/*light blue*/ 73 | .bgcolor-20{ background: #494A5F;color: #D5D6E2;} 74 | /* Header */ 75 | .htmleaf-header{ 76 | padding: 1em 190px 1em; 77 | letter-spacing: -1px; 78 | text-align: center; 79 | background: #66677c; 80 | } 81 | .htmleaf-header h1 { 82 | color: #D5D6E2; 83 | font-weight: 600; 84 | font-size: 2em; 85 | line-height: 1; 86 | margin-bottom: 0; 87 | } 88 | .htmleaf-header h1 span { 89 | display: block; 90 | font-size: 60%; 91 | font-weight: 400; 92 | padding: 0.8em 0 0.5em 0; 93 | color: #c3c8cd; 94 | } 95 | /*nav*/ 96 | .htmleaf-demo a{color: #fff;text-decoration: none;} 97 | .htmleaf-demo{width: 100%;padding-bottom: 1.2em;} 98 | .htmleaf-demo a{display: inline-block;margin: 0.5em;padding: 0.6em 1em;border: 3px solid #fff;font-weight: 700;} 99 | .htmleaf-demo a:hover{opacity: 0.6;} 100 | .htmleaf-demo a.current{background:#1d7db1;color: #fff; } 101 | /* Top Navigation Style */ 102 | .htmleaf-links { 103 | position: relative; 104 | display: inline-block; 105 | white-space: nowrap; 106 | font-size: 1.5em; 107 | text-align: center; 108 | } 109 | 110 | .htmleaf-links::after { 111 | position: absolute; 112 | top: 0; 113 | left: 50%; 114 | margin-left: -1px; 115 | width: 2px; 116 | height: 100%; 117 | background: #dbdbdb; 118 | content: ''; 119 | -webkit-transform: rotate3d(0,0,1,22.5deg); 120 | transform: rotate3d(0,0,1,22.5deg); 121 | } 122 | 123 | .htmleaf-icon { 124 | display: inline-block; 125 | margin: 0.5em; 126 | padding: 0em 0; 127 | width: 1.5em; 128 | text-decoration: none; 129 | } 130 | 131 | .htmleaf-icon span { 132 | display: none; 133 | } 134 | 135 | .htmleaf-icon:before { 136 | margin: 0 5px; 137 | text-transform: none; 138 | font-weight: normal; 139 | font-style: normal; 140 | font-variant: normal; 141 | font-family: 'icomoon'; 142 | line-height: 1; 143 | speak: none; 144 | -webkit-font-smoothing: antialiased; 145 | } 146 | /* footer */ 147 | .htmleaf-footer{width: 100%;padding-top: 10px;} 148 | .htmleaf-small{font-size: 0.8em;} 149 | .center{text-align: center;} 150 | /****/ 151 | .related { 152 | color: #fff; 153 | background: #494A5F; 154 | text-align: center; 155 | font-size: 1.25em; 156 | padding: 0.5em 0; 157 | overflow: hidden; 158 | } 159 | 160 | .related > a { 161 | vertical-align: top; 162 | width: calc(100% - 20px); 163 | max-width: 340px; 164 | display: inline-block; 165 | text-align: center; 166 | margin: 20px 10px; 167 | padding: 25px; 168 | font-family: "Microsoft YaHei","宋体","Segoe UI", "Lucida Grande", Helvetica, Arial,sans-serif, FreeSans, Arimo; 169 | } 170 | .related a { 171 | display: inline-block; 172 | text-align: left; 173 | margin: 20px auto; 174 | padding: 10px 20px; 175 | opacity: 0.8; 176 | -webkit-transition: opacity 0.3s; 177 | transition: opacity 0.3s; 178 | -webkit-backface-visibility: hidden; 179 | text-decoration: none; 180 | } 181 | 182 | .related a:hover, 183 | .related a:active { 184 | opacity: 1; 185 | } 186 | 187 | .related a img { 188 | max-width: 100%; 189 | opacity: 0.8; 190 | border-radius: 4px; 191 | } 192 | .related a:hover img, 193 | .related a:active img { 194 | opacity: 1; 195 | } 196 | .related h3{font-family: "Microsoft YaHei", sans-serif;font-size: 1.2em} 197 | .related a h3 { 198 | font-size: 0.85em; 199 | font-weight: 300; 200 | margin-top: 0.15em; 201 | color: #fff; 202 | } 203 | /* icomoon */ 204 | .icon-htmleaf-home-outline:before { 205 | content: "\e5000"; 206 | } 207 | 208 | .icon-htmleaf-arrow-forward-outline:before { 209 | content: "\e5001"; 210 | } 211 | 212 | @media screen and (max-width: 1024px) { 213 | .htmleaf-header { 214 | padding: 2em 10% 2em; 215 | } 216 | .htmleaf-header h1 { 217 | font-size:1.4em; 218 | } 219 | .htmleaf-links{font-size: 1.4em} 220 | } 221 | 222 | @media screen and (max-width: 960px) { 223 | .htmleaf-header { 224 | padding: 2em 10% 2em; 225 | } 226 | .htmleaf-header h1 { 227 | font-size:1.2em; 228 | } 229 | .htmleaf-links{font-size: 1.2em} 230 | .related h3{font-size: 1em;} 231 | .related a h3 { 232 | font-size: 0.8em; 233 | } 234 | } 235 | 236 | @media screen and (max-width: 766px) { 237 | .htmleaf-header h1 { 238 | font-size:1.3em; 239 | } 240 | .htmleaf-links{font-size: 1.3em} 241 | } 242 | 243 | @media screen and (max-width: 640px) { 244 | .htmleaf-header { 245 | padding: 2em 10% 2em; 246 | } 247 | .htmleaf-header h1 { 248 | font-size:1em; 249 | } 250 | .htmleaf-links{font-size: 1em} 251 | .related h3{font-size: 0.8em;} 252 | .related a h3 { 253 | font-size: 0.6em; 254 | } 255 | } -------------------------------------------------------------------------------- /MyApp/static/201908059658/css/normalize.css: -------------------------------------------------------------------------------- 1 | article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block;}audio,canvas,video{display:inline-block;}audio:not([controls]){display:none;height:0;}[hidden]{display:none;}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;}body{margin:0;}a:focus{outline:thin dotted;}a:active,a:hover{outline:0;}h1{font-size:2em;margin:0.67em 0;}abbr[title]{border-bottom:1px dotted;}b,strong{font-weight:bold;}dfn{font-style:italic;}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0;}mark{background:#ff0;color:#000;}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em;}pre{white-space:pre-wrap;}q{quotes:"\201C" "\201D" "\2018" "\2019";}small{font-size:80%;}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;}sup{top:-0.5em;}sub{bottom:-0.25em;}img{border:0;}svg:not(:root){overflow:hidden;}figure{margin:0;}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em;}legend{border:0;padding:0;}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0;}button,input{line-height:normal;}button,select{text-transform:none;}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;}button[disabled],html input[disabled]{cursor:default;}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none;}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0;}textarea{overflow:auto;vertical-align:top;}table{border-collapse:collapse;border-spacing:0;} -------------------------------------------------------------------------------- /MyApp/static/201908059658/dist/jquery-rvnm-rtl.min.css: -------------------------------------------------------------------------------- 1 | .rvnm-navbar-box{direction:rtl;left:auto;right:0}.rvnm-wrapper{margin-left:0;margin-right:220px}.rvnm-navbar-box ul li ul{padding-left:0;padding-right:10px}.rvnm-navbar-box li .fa{margin-right:0;margin-left:10px}.rvnm-navbar-box ul li.rvnm-expandable{background-image:url(img/lb.png);background-position:5% 10px}.rvnm-navbar-box ul li.rvnm-collapseable{background-position:5% 10px}.rvnm-wrapper.rvnm-minimal{margin-right:40px;margin-left:0}.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand .fa{margin-left:20px;margin-right:0}.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand>ul{left:auto;right:40px;padding-right:0;border-right:1px solid #e0e0e0;border-left:0}.rvnm-navbar-box.rvnm-mobile{right:0;left:auto}.rvnm-wrapper.rvnm-mobile{margin-right:0}.rvnm-navbar-box.rvnm-mobile.rvnm-mobile-expand{background-position:97% 5px}.rvnm-navbar-box.dark ul li.rvnm-expandable{background-image:url(img/lw.png);background-position:10px 15px}.rvnm-navbar-box.dark ul li.rvnm-collapseable{background-image:url(img/dw.png);background-position:10px 15px}.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand>ul{border-right:0}.rvnm-navbar-box.rvnm-mobile.dark.rvnm-mobile-expand{background-position:97% 5px}.rvnm-navbar-box.dark-ruby ul li.rvnm-expandable{background-image:url(img/lw.png);background-position:10px 15px}.rvnm-navbar-box.dark-ruby ul li.rvnm-collapseable{background-image:url(img/dw.png);background-position:10px 15px}.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand>ul{border-right:0}.rvnm-navbar-box.rvnm-mobile.dark-ruby.rvnm-mobile-expand{background-position:97% 5px}.rvnm-navbar-box.dark-beryl ul li.rvnm-expandable{background-image:url(img/lw.png);background-position:10px 15px}.rvnm-navbar-box.dark-beryl ul li.rvnm-collapseable{background-image:url(img/dw.png);background-position:10px 15px}.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand>ul{border-right:0}.rvnm-navbar-box.rvnm-mobile.dark-beryl.rvnm-mobile-expand{background-position:97% 5px}.rvnm-navbar-box.dark-doder ul li.rvnm-expandable{background-image:url(img/lw.png);background-position:10px 15px}.rvnm-navbar-box.dark-doder ul li.rvnm-collapseable{background-image:url(img/dw.png);background-position:10px 15px}.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand>ul{border-right:0}.rvnm-navbar-box.rvnm-mobile.dark-doder.rvnm-mobile-expand{background-position:97% 5px}.rvnm-navbar-box.dark-lesb ul li.rvnm-expandable{background-image:url(img/lw.png);background-position:10px 15px}.rvnm-navbar-box.dark-lesb ul li.rvnm-collapseable{background-image:url(img/dw.png);background-position:10px 15px}.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand>ul{border-right:0}.rvnm-navbar-box.rvnm-mobile.dark-lesb.rvnm-mobile-expand{background-position:97% 5px} -------------------------------------------------------------------------------- /MyApp/static/201908059658/dist/jquery-rvnm.min.css: -------------------------------------------------------------------------------- 1 | body,html{padding:0;margin:0;height:auto}.rvnm-ripple{width:0;height:0;border-radius:50%;background:rgba(0,0,0,.4);transform:scale(0);position:absolute;opacity:1}.rvnm-rippleEffect{animation:rvnm-rippleDrop .6s linear}@keyframes rvnm-rippleDrop{100%{transform:scale(2);opacity:0}}.rvnm-navbar-box{position:absolute;left:0;top:0;width:220px;background:#a0aec4;min-height:50vh;overflow-y:hidden;z-index:99}.rvnm-wrapper{margin-left:220px}.rvnm-navbar-box ul{list-style:none;padding:0;margin:0;position:relative}.rvnm-navbar-box ul li{background:#eee;border-bottom:1px solid #e0e0e0}.rvnm-navbar-box ul li:hover{background:#a0aec4}.rvnm-navbar-box ul li.rvnm-collapseable{background:#e1e1e1}.rvnm-navbar-box ul li ul{overflow:hidden;display:none;padding-left:10px}.rvnm-navbar-box .fa{font-size:16px}.rvnm-navbar-box a{text-decoration:none}.rvnm-navbar-box .search{padding:4px;height:25px;max-height:25px}.rvnm-navbar-box .search .fa{margin-left:7px;margin-right:3px!important;margin-top:4px}.rvnm-navbar-box .search input{padding:6px;background:0 0;border:none;width:calc(100% - 40px);outline:0;box-sizing:border-box}.rvnm-navbar-box ul li a,.rvnm-navbar-box ul li a:visited{display:block;padding:10px;font-size:14px;font-weight:100;color:#333;position:relative;overflow:hidden;height:45px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:1.75em;overflow:hidden;text-overflow:ellipsis}.rvnm-navbar-box ul li:hover a,.rvnm-navbar-box ul li:hover a:visited{color:#000}.rvnm-navbar-box ul li span.spliter{display:block;padding:10px;font-size:14px;font-weight:600;background:#eaeaea;color:#1d4686}.rvnm-navbar-box li .fa{margin-right:10px}.rvnm-navbar-box ul li.rvnm-expandable{background-image:url(img/rb.png);background-repeat:no-repeat;background-position:95% 10px}.rvnm-navbar-box ul li.rvnm-collapseable{background-image:url(img/db.png);background-repeat:no-repeat;background-position:95% 10px}.rvnm-minimal .search input{display:none}.rvnm-minimal .search:hover input{display:inline-block;width:calc(100% - 45px)}.rvnm-minimal .search input:focus{display:inline-block;width:calc(100% - 45px)}.rvnm-navbar-box.rvnm-minimal{width:40px;overflow:visible}.rvnm-wrapper.rvnm-minimal{margin-left:40px}.rvnm-navbar-box.rvnm-minimal>li{text-align:center}.rvnm-navbar-box.rvnm-minimal li>.spliter,.rvnm-navbar-box.rvnm-minimal li>a{font-size:0}.rvnm-navbar-box.rvnm-minimal>ul>li.rvnm-expandable{background-image:none}.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand{width:240px;height:36px;overflow:visible;position:relative}.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand .spliter,.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand a{font-size:14px}.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand>.spliter,.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand>a{background:rgba(0,0,0,.2)}.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand .fa{margin-right:20px}.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand>ul{display:block;z-index:9;position:absolute;left:40px;padding-left:0;top:100%;width:200px;padding-top:1px;border-left:1px solid #e0e0e0}.rvnm-navbar-box.rvnm-mobile{min-height:0;position:absolute;left:0;top:0;width:40px;height:35px;overflow:hidden;opacity:.6;-o-transition:.6s;-ms-transition:.6s;-moz-transition:.6s;-webkit-transition:.6s;transition:.6s;background:#fff url(img/mb.png) center no-repeat;z-index:9999}.rvnm-navbar-box.rvnm-mobile:hover{opacity:1}.rvnm-navbar-box.rvnm-mobile>ul{display:none}.rvnm-wrapper.rvnm-mobile{margin-left:0}.rvnm-navbar-box.rvnm-mobile.rvnm-mobile-expand{overflow:visible;background:#fff url(img/cb.png) no-repeat;background-position:5px 5px;opacity:1;padding-top:40px;width:100%}.rvnm-navbar-box.rvnm-mobile.rvnm-mobile-expand>ul{display:block}.rvnm-navbar-box.dark{background:#353c48}.rvnm-navbar-box.dark ul li{background:#353c48;border-bottom:0}.rvnm-navbar-box.dark .fa,.rvnm-navbar-box.dark .search input{color:#eee}.rvnm-navbar-box.dark ul li.rvnm-collapseable,.rvnm-navbar-box.dark ul li:hover{background-color:rgba(0,0,0,.07)}.rvnm-navbar-box.dark ul li a,.rvnm-navbar-box.dark ul li a:visited,.rvnm-navbar-box.dark ul li span.spliter{background:0 0;color:#96a2b4;padding-top:15px;padding-bottom:15px}.rvnm-navbar-box.dark ul li span.spliter{opacity:.6}.rvnm-navbar-box.dark ul li:hover a,.rvnm-navbar-box.dark ul li:hover a:visited{color:#96a2b4}.rvnm-navbar-box.dark ul li.rvnm-expandable{background-image:url(img/rw.png);background-repeat:no-repeat;background-position:95% 15px}.rvnm-navbar-box.dark ul li.rvnm-collapseable{background-image:url(img/dw.png);background-repeat:no-repeat;background-position:95% 15px}.rvnm-navbar-box.rvnm-minimal.dark .rvnm-minimal-expand{height:46px}.rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand>.spliter,.rvnm-navbar-box.rvnm-minimal.dark .rvnm-minimal-expand>a{background:rgba(0,0,0,.2)}.rvnm-navbar-box.rvnm-minimal ul li.rvnm-collapseable,.rvnm-navbar-box.rvnm-minimal.dark ul li:hover{background-color:#444859;border-bottom:0}.rvnm-navbar-box.rvnm-minimal.dark>ul>li{background-image:none!important}.rvnm-navbar-box.rvnm-minimal.dark .rvnm-minimal-expand>ul{top:100%;background-color:#444859;border-left:0;padding-top:0}.rvnm-navbar-box.rvnm-minimal.dark ul li ul li{background-color:#393a48}.rvnm-navbar-box.rvnm-minimal.dark ul li ul li:hover{background-color:rgba(0,0,0,.2)}.rvnm-navbar-box.rvnm-mobile.dark{background:#393a48 url(img/mw.png) center no-repeat}.rvnm-navbar-box.rvnm-mobile.dark.rvnm-mobile-expand{background:#393a48 url(img/cw.png) no-repeat;background-position:5px 5px}.rvnm-navbar-box.rvnm-mobile.dark.rvnm-mobile-expand ul{background-color:#393a48}.rvnm-navbar-box.dark-ruby{background:#353c48}.rvnm-navbar-box.dark-ruby ul li{background:#353c48;border-bottom:0}.rvnm-navbar-box.dark-ruby .fa,.rvnm-navbar-box.dark-ruby .search input{color:#eee}.rvnm-navbar-box.dark-ruby ul li.rvnm-collapseable,.rvnm-navbar-box.dark-ruby ul li:hover{background-color:#f0544c}.rvnm-navbar-box.dark-ruby ul li a,.rvnm-navbar-box.dark-ruby ul li a:visited,.rvnm-navbar-box.dark-ruby ul li span.spliter{background:0 0;color:#96a2b4;padding-top:15px;padding-bottom:15px;font-weight:700}.rvnm-navbar-box.dark-ruby ul li span.spliter{opacity:.6}.rvnm-navbar-box.dark-ruby ul li span.spliter:hover{color:#fff}.rvnm-navbar-box.dark-ruby ul li:hover a,.rvnm-navbar-box.dark-ruby ul li:hover a:visited{color:#fff}.rvnm-navbar-box.dark-ruby ul li.rvnm-expandable{background-image:url(img/rw.png);background-repeat:no-repeat;background-position:95% 15px}.rvnm-navbar-box.dark-ruby ul li.rvnm-collapseable{background-image:url(img/dw.png);background-repeat:no-repeat;background-position:95% 15px}.rvnm-navbar-box.rvnm-minimal.dark-ruby .rvnm-minimal-expand{height:46px}.rvnm-navbar-box.rvnm-minimal ul li.rvnm-collapseable,.rvnm-navbar-box.rvnm-minimal.dark-ruby ul li:hover{background-color:#f0544c;border-bottom:0}.rvnm-navbar-box.rvnm-minimal.dark-ruby>ul>li{background-image:none!important}.rvnm-navbar-box.rvnm-minimal.dark-ruby .rvnm-minimal-expand>ul{top:100%;background-color:#f0544c;border-left:0;padding-top:0}.rvnm-navbar-box.rvnm-minimal.dark-ruby ul li ul li{background-color:#393a48}.rvnm-navbar-box.rvnm-mobile.dark-ruby{background:#393a48 url(img/mw.png) center no-repeat}.rvnm-navbar-box.rvnm-mobile.dark-ruby.rvnm-mobile-expand{background:#393a48 url(img/cw.png) no-repeat;background-position:5px 5px}.rvnm-navbar-box.rvnm-mobile.dark-ruby.rvnm-mobile-expand ul{background-color:#393a48}.rvnm-navbar-box.dark-beryl{background:#353c48}.rvnm-navbar-box.dark-beryl ul li{background:#353c48;border-bottom:0}.rvnm-navbar-box.dark-beryl .fa,.rvnm-navbar-box.dark-beryl .search input{color:#eee}.rvnm-navbar-box.dark-beryl ul li.rvnm-collapseable,.rvnm-navbar-box.dark-beryl ul li:hover{background-color:#0fd1ab}.rvnm-navbar-box.dark-beryl ul li a,.rvnm-navbar-box.dark-beryl ul li a:visited,.rvnm-navbar-box.dark-beryl ul li span.spliter{background:0 0;color:#eee;padding-top:15px;padding-bottom:15px}.rvnm-navbar-box.dark-beryl ul li span.spliter{opacity:.6}.rvnm-navbar-box.dark-beryl ul li span.spliter:hover{color:#fff}.rvnm-navbar-box.dark-beryl ul li:hover a,.rvnm-navbar-box.dark-beryl ul li:hover a:visited{color:#fff}.rvnm-navbar-box.dark-beryl ul li.rvnm-expandable{background-image:url(img/rw.png);background-repeat:no-repeat;background-position:95% 15px}.rvnm-navbar-box.dark-beryl ul li.rvnm-collapseable{background-image:url(img/dw.png);background-repeat:no-repeat;background-position:95% 15px}.rvnm-navbar-box.rvnm-minimal.dark-beryl .rvnm-minimal-expand{height:46px}.rvnm-navbar-box.rvnm-minimal ul li.rvnm-collapseable,.rvnm-navbar-box.rvnm-minimal.dark-beryl ul li:hover{background-color:#0fd1ab;border-bottom:0}.rvnm-navbar-box.rvnm-minimal.dark-beryl>ul>li{background-image:none!important}.rvnm-navbar-box.rvnm-minimal.dark-beryl .rvnm-minimal-expand>ul{top:100%;background-color:#0fd1ab;border-left:0;padding-top:0}.rvnm-navbar-box.rvnm-minimal.dark-beryl ul li ul li{background-color:#393a48}.rvnm-navbar-box.rvnm-mobile.dark-beryl{background:#393a48 url(img/mw.png) center no-repeat}.rvnm-navbar-box.rvnm-mobile.dark-beryl.rvnm-mobile-expand{background:#393a48 url(img/cw.png) no-repeat;background-position:5px 5px}.rvnm-navbar-box.rvnm-mobile.dark-beryl.rvnm-mobile-expand ul{background-color:#393a48}.rvnm-navbar-box.dark-doder{background:#353c48}.rvnm-navbar-box.dark-doder ul li{background:#353c48;border-bottom:0}.rvnm-navbar-box.dark-doder .fa,.rvnm-navbar-box.dark-doder .search input{color:#eee}.rvnm-navbar-box.dark-doder ul li.rvnm-collapseable,.rvnm-navbar-box.dark-doder ul li:hover{background-color:#4285f4}.rvnm-navbar-box.dark-doder ul li a,.rvnm-navbar-box.dark-doder ul li a:visited,.rvnm-navbar-box.dark-doder ul li span.spliter{background:0 0;color:#eee;padding-top:15px;padding-bottom:15px}.rvnm-navbar-box.dark-doder ul li span.spliter{opacity:.6}.rvnm-navbar-box.dark-doder ul li span.spliter:hover{color:#fff}.rvnm-navbar-box.dark-doder ul li:hover a,.rvnm-navbar-box.dark-doder ul li:hover a:visited{color:#fff}.rvnm-navbar-box.dark-doder ul li.rvnm-expandable{background-image:url(img/rw.png);background-repeat:no-repeat;background-position:95% 15px}.rvnm-navbar-box.dark-doder ul li.rvnm-collapseable{background-image:url(img/dw.png);background-repeat:no-repeat;background-position:95% 15px}.rvnm-navbar-box.rvnm-minimal.dark-doder .rvnm-minimal-expand{height:46px}.rvnm-navbar-box.rvnm-minimal ul li.rvnm-collapseable,.rvnm-navbar-box.rvnm-minimal.dark-doder ul li:hover{background-color:#4285f4;border-bottom:0}.rvnm-navbar-box.rvnm-minimal.dark-doder>ul>li{background-image:none!important}.rvnm-navbar-box.rvnm-minimal.dark-doder .rvnm-minimal-expand>ul{top:100%;background-color:#4285f4;border-left:0;padding-top:0}.rvnm-navbar-box.rvnm-minimal.dark-doder ul li ul li{background-color:#393a48}.rvnm-navbar-box.rvnm-mobile.dark-doder{background:#393a48 url(img/mw.png) center no-repeat}.rvnm-navbar-box.rvnm-mobile.dark-doder.rvnm-mobile-expand{background:#393a48 url(img/cw.png) no-repeat;background-position:5px 5px}.rvnm-navbar-box.rvnm-mobile.dark-doder.rvnm-mobile-expand ul{background-color:#393a48}.rvnm-navbar-box.dark-lesb{background:#353c48}.rvnm-navbar-box.dark-lesb ul li{background:#353c48;border-bottom:0}.rvnm-navbar-box.dark-lesb .fa,.rvnm-navbar-box.dark-lesb .search input{color:#eee}.rvnm-navbar-box.dark-lesb ul li.rvnm-collapseable,.rvnm-navbar-box.dark-lesb ul li:hover{background-color:#f442b3}.rvnm-navbar-box.dark-lesb ul li a,.rvnm-navbar-box.dark-lesb ul li a:visited,.rvnm-navbar-box.dark-lesb ul li span.spliter{background:0 0;color:#eee;padding-top:15px;padding-bottom:15px}.rvnm-navbar-box.dark-lesb ul li span.spliter{opacity:.6}.rvnm-navbar-box.dark-lesb ul li span.spliter:hover{color:#fff}.rvnm-navbar-box.dark-lesb ul li:hover a,.rvnm-navbar-box.dark-lesb ul li:hover a:visited{color:#fff}.rvnm-navbar-box.dark-lesb ul li.rvnm-expandable{background-image:url(img/rw.png);background-repeat:no-repeat;background-position:95% 15px}.rvnm-navbar-box.dark-lesb ul li.rvnm-collapseable{background-image:url(img/dw.png);background-repeat:no-repeat;background-position:95% 15px}.rvnm-navbar-box.rvnm-minimal.dark-lesb .rvnm-minimal-expand{height:46px}.rvnm-navbar-box.rvnm-minimal ul li.rvnm-collapseable,.rvnm-navbar-box.rvnm-minimal.dark-lesb ul li:hover{background-color:#f442b3;border-bottom:0}.rvnm-navbar-box.rvnm-minimal.dark-lesb>ul>li{background-image:none!important}.rvnm-navbar-box.rvnm-minimal.dark-lesb .rvnm-minimal-expand>ul{top:100%;background-color:#f442b3;border-left:0;padding-top:0}.rvnm-navbar-box.rvnm-minimal.dark-lesb ul li ul li{background-color:#393a48}.rvnm-navbar-box.rvnm-mobile.dark-lesb{background:#393a48 url(img/mw.png) center no-repeat}.rvnm-navbar-box.rvnm-mobile.dark-lesb.rvnm-mobile-expand{background:#393a48 url(img/cw.png) no-repeat;background-position:5px 5px}.rvnm-navbar-box.rvnm-mobile.dark-lesb.rvnm-mobile-expand ul{background-color:#393a48} -------------------------------------------------------------------------------- /MyApp/static/201908059658/dist/rvnm.js: -------------------------------------------------------------------------------- 1 | /* 2 | * rvnm - v1.1.1 3 | * Responsive vertical navigation menu 4 | * https://github.com/4xmen/rvnm#readme 5 | * 6 | * Made by 7 | * Under GPL-3.0 License 8 | */ 9 | -------------------------------------------------------------------------------- /MyApp/static/201908059658/dist/rvnm.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * rvnm - v1.1.1 3 | * Responsive vertical navigation menu 4 | * https://github.com/4xmen/rvnm#readme 5 | * 6 | * Made by 7 | * Under GPL-3.0 License 8 | */ 9 | 10 | -------------------------------------------------------------------------------- /MyApp/static/201908059658/fonts/icomoon.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/201908059658/fonts/icomoon.eot -------------------------------------------------------------------------------- /MyApp/static/201908059658/fonts/icomoon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Generated by IcoMoon 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /MyApp/static/201908059658/fonts/icomoon.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/201908059658/fonts/icomoon.ttf -------------------------------------------------------------------------------- /MyApp/static/201908059658/fonts/icomoon.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/201908059658/fonts/icomoon.woff -------------------------------------------------------------------------------- /MyApp/static/201908059658/jQuery之家.url: -------------------------------------------------------------------------------- 1 | [{000214A0-0000-0000-C000-000000000046}] 2 | Prop3=19,2 3 | [InternetShortcut] 4 | URL=http://www.htmleaf.com/ 5 | IDList= 6 | HotKey=0 7 | IconFile=C:\Windows\system32\SHELL32.dll 8 | IconIndex=220 9 | [InternetShortcut.A] 10 | [InternetShortcut.W] 11 | IconFile=F:+AFx/UVP2-jQuery+AFw-favicon.ico 12 | -------------------------------------------------------------------------------- /MyApp/static/201908059658/readme.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | jQuery之家 6 | 13 | 14 | 15 |

欢迎访问jQuery之家

16 |
17 |

更多精彩内容请访问jQuery之家:http://www.htmleaf.com

18 |

jQuery之家致力于搜集和整理各种jQuery插件,jQuery特效,jquery ui,jQuery 教程,JS特效,网页特效,以及各种html5,css3动画和效果。

19 |

为前端开发者提供最全面的网页开发素材。

20 |
21 | 22 | -------------------------------------------------------------------------------- /MyApp/static/201908059658/related/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/201908059658/related/1.jpg -------------------------------------------------------------------------------- /MyApp/static/201908059658/related/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/201908059658/related/2.jpg -------------------------------------------------------------------------------- /MyApp/static/201908059658/src/img/cb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/201908059658/src/img/cb.png -------------------------------------------------------------------------------- /MyApp/static/201908059658/src/img/cw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/201908059658/src/img/cw.png -------------------------------------------------------------------------------- /MyApp/static/201908059658/src/img/db.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/201908059658/src/img/db.png -------------------------------------------------------------------------------- /MyApp/static/201908059658/src/img/dw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/201908059658/src/img/dw.png -------------------------------------------------------------------------------- /MyApp/static/201908059658/src/img/lb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/201908059658/src/img/lb.png -------------------------------------------------------------------------------- /MyApp/static/201908059658/src/img/lw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/201908059658/src/img/lw.png -------------------------------------------------------------------------------- /MyApp/static/201908059658/src/img/mb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/201908059658/src/img/mb.png -------------------------------------------------------------------------------- /MyApp/static/201908059658/src/img/mw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/201908059658/src/img/mw.png -------------------------------------------------------------------------------- /MyApp/static/201908059658/src/img/rb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/201908059658/src/img/rb.png -------------------------------------------------------------------------------- /MyApp/static/201908059658/src/img/rw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/201908059658/src/img/rw.png -------------------------------------------------------------------------------- /MyApp/static/201908059658/src/jquery-rvnm-rtl.css: -------------------------------------------------------------------------------- 1 | /** 2 | * rvnm Responsive vertical navigation menu 3 | * 4 | * Copyright (C) 2017 4xmen team 5 | * 6 | * LICENSE: This program is free software; you can redistribute it and/or modify 7 | * it under the terms of the GNU General Public License as published by the Free 8 | * Software Foundation; either version 3 of the License, or (at your option) any 9 | * later version. This program is distributed in the hope that it will be 10 | * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 12 | * Public License for more details. You should have received a copy of the GNU 13 | * General Public License along with this program. 14 | * If not, see . 15 | * 16 | * @package rvnm 17 | * @subpackage rvnm style sheet right to left 18 | * @author 4xmen team 19 | * @author A1Gard 20 | * @link https://github.com/4xmen/rvnm 21 | */ 22 | .rvnm-navbar-box{ 23 | direction: rtl; 24 | left: auto ; 25 | right:0 ; 26 | } 27 | 28 | .rvnm-wrapper{ 29 | margin-left: 0; 30 | margin-right: 220px; 31 | } 32 | 33 | .rvnm-navbar-box ul li ul{ 34 | padding-left: 0; 35 | padding-right: 10px; 36 | } 37 | .rvnm-navbar-box li .fa{ 38 | margin-right: 0px; 39 | margin-left: 10px; 40 | } 41 | 42 | .rvnm-navbar-box ul li.rvnm-expandable{ 43 | background-image: url(img/lb.png) ; 44 | background-position: 5% 10px; 45 | } 46 | 47 | .rvnm-navbar-box ul li.rvnm-collapseable{ 48 | background-position: 5% 10px; 49 | } 50 | 51 | 52 | /* minmal mode */ 53 | 54 | .rvnm-wrapper.rvnm-minimal{ 55 | margin-right: 40px; 56 | margin-left: 0; 57 | } 58 | 59 | 60 | .rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand .fa{ 61 | margin-left: 20px; 62 | margin-right: 0; 63 | } 64 | 65 | .rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand > ul{ 66 | left:auto; 67 | right:40px; 68 | padding-right: 0; 69 | border-right: 1px solid #e0e0e0; 70 | border-left: 0; 71 | } 72 | 73 | /* mobile mode */ 74 | .rvnm-navbar-box.rvnm-mobile{ 75 | right: 0px; 76 | left: auto; 77 | } 78 | 79 | .rvnm-wrapper.rvnm-mobile{ 80 | margin-right: 0; 81 | } 82 | 83 | .rvnm-navbar-box.rvnm-mobile.rvnm-mobile-expand{ 84 | background-position: 97% 5px; 85 | } 86 | 87 | 88 | /* dark theme */ 89 | 90 | .rvnm-navbar-box.dark ul li.rvnm-expandable{ 91 | background-image: url(img/lw.png) ; 92 | background-position: 10px 15px; 93 | } 94 | 95 | .rvnm-navbar-box.dark ul li.rvnm-collapseable{ 96 | background-image: url(img/dw.png) ; 97 | background-position: 10px 15px; 98 | } 99 | 100 | /* Dark theme minimal mode */ 101 | .rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand > ul{ 102 | border-right: 0; 103 | } 104 | 105 | 106 | /* Dark theme mobile mode */ 107 | .rvnm-navbar-box.rvnm-mobile.dark.rvnm-mobile-expand{ 108 | background-position: 97% 5px; 109 | } 110 | 111 | 112 | /* dark ruby theme */ 113 | 114 | .rvnm-navbar-box.dark-ruby ul li.rvnm-expandable{ 115 | background-image: url(img/lw.png) ; 116 | background-position: 10px 15px; 117 | } 118 | 119 | .rvnm-navbar-box.dark-ruby ul li.rvnm-collapseable{ 120 | background-image: url(img/dw.png) ; 121 | background-position: 10px 15px; 122 | } 123 | 124 | /* Dark theme minimal mode */ 125 | .rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand > ul{ 126 | border-right: 0; 127 | } 128 | 129 | 130 | /* Dark theme mobile mode */ 131 | .rvnm-navbar-box.rvnm-mobile.dark-ruby.rvnm-mobile-expand{ 132 | background-position: 97% 5px; 133 | } 134 | 135 | 136 | 137 | /* dark beryl theme */ 138 | 139 | .rvnm-navbar-box.dark-beryl ul li.rvnm-expandable{ 140 | background-image: url(img/lw.png) ; 141 | background-position: 10px 15px; 142 | } 143 | 144 | .rvnm-navbar-box.dark-beryl ul li.rvnm-collapseable{ 145 | background-image: url(img/dw.png) ; 146 | background-position: 10px 15px; 147 | } 148 | 149 | /* Dark theme minimal mode */ 150 | .rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand > ul{ 151 | border-right: 0; 152 | } 153 | 154 | 155 | /* Dark theme mobile mode */ 156 | .rvnm-navbar-box.rvnm-mobile.dark-beryl.rvnm-mobile-expand{ 157 | background-position: 97% 5px; 158 | } 159 | 160 | 161 | 162 | 163 | /* dark doder theme */ 164 | 165 | .rvnm-navbar-box.dark-doder ul li.rvnm-expandable{ 166 | background-image: url(img/lw.png) ; 167 | background-position: 10px 15px; 168 | } 169 | 170 | .rvnm-navbar-box.dark-doder ul li.rvnm-collapseable{ 171 | background-image: url(img/dw.png) ; 172 | background-position: 10px 15px; 173 | } 174 | 175 | /* Dark theme minimal mode */ 176 | .rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand > ul{ 177 | border-right: 0; 178 | } 179 | 180 | 181 | /* Dark theme mobile mode */ 182 | .rvnm-navbar-box.rvnm-mobile.dark-doder.rvnm-mobile-expand{ 183 | background-position: 97% 5px; 184 | } 185 | 186 | 187 | 188 | 189 | 190 | 191 | /* dark lesb theme */ 192 | 193 | .rvnm-navbar-box.dark-lesb ul li.rvnm-expandable{ 194 | background-image: url(img/lw.png) ; 195 | background-position: 10px 15px; 196 | } 197 | 198 | .rvnm-navbar-box.dark-lesb ul li.rvnm-collapseable{ 199 | background-image: url(img/dw.png) ; 200 | background-position: 10px 15px; 201 | } 202 | 203 | /* Dark theme minimal mode */ 204 | .rvnm-navbar-box.rvnm-minimal .rvnm-minimal-expand > ul{ 205 | border-right: 0; 206 | } 207 | 208 | 209 | /* Dark theme mobile mode */ 210 | .rvnm-navbar-box.rvnm-mobile.dark-lesb.rvnm-mobile-expand{ 211 | background-position: 97% 5px; 212 | } 213 | 214 | 215 | 216 | -------------------------------------------------------------------------------- /MyApp/static/Certs/CERT_13_client.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANVL9qeLh4Yu7VTf 3 | /i+iY0GRsUz/vKObZUI7+NgQ/zrbdXpYVBnnia5f2JJRRrcnFG/f1F9flgOdMVyH 4 | Qu+Y2ty1DiOTQ0ufdaAEtKZeGoDcbgHFsfTFY+JfiUtO5UpuwMglz5OdIwRsp6vU 5 | jDaBhW34o3jlk6/3a6VmbQZ8E5V/AgMBAAECgYAY9aOuZXh9bj5dgTyobFM7GAZs 6 | YTy81HFb99Kdzhdf1tB/eZiV029cFWEtdg9VXWBZ2xJp+rB+ScW98yIVEYkCtgXq 7 | Jgxc4DT3NnJmlW6T4Gc7M4QnrmorrKH4IdiOEiNPPEkDMd1sEHN0dBEHSDlDOJqh 8 | 776ntBSQK/n9F3C38QJBAO5tiG0JBsYZBlSkdZpcv9ysBMU2ephW7GxhHYzQVOdt 9 | zNNPQgSCHzXcUbulX1Gfus5X/AeGo8RuMO/awowgVAkCQQDlBEbDVek7cNlD2r8K 10 | Z1prX/6USDsIgNLfcMpjfXpt4AEtcJ0TN4Nx5SAYyRYaJeCAUq4XjAO6rO5i8Bj2 11 | Ic9HAkBJrKj6YE6qifMN1p/MahqTOshilDn/tuRpfPzflUSXGrOvHA+fSwIP55uN 12 | 60Tv+PaFamSjgrQ6L36Jr0RsflTZAkAes84QzemwsFZQRHksGeMDViE5G93eK/cZ 13 | QXPAlsfdBxThVKGaO+0BTehZqkuuQbmxOmRgf8LYOerTlMCj7rBtAkEAoCwQoGUo 14 | /HLqV+1uJ+LV2BmxUqoPfxbMTqQWTMLoXVwlDhAGr21Ex0Se3+HkCkfs1t+irIiJ 15 | DX/3bvS9RjyuQA== 16 | -----END PRIVATE KEY----- 17 | -----BEGIN CERTIFICATE----- 18 | MIIDVzCCAsCgAwIBAgIBKTANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJjbjEQ 19 | MA4GA1UECBMHQmVpamluZzEQMA4GA1UEBxMHQmVpamluZzEUMBIGA1UEChMLeGlh 20 | b3podS5jb20xEDAOBgNVBAsTB2RldmVsb3AxIjAgBgNVBAMTGWltZ3NlYy54aWFv 21 | emh1c3RhdGljMS5jb20wHhcNMTUwMTEwMTIyODQzWhcNMjUwMTA3MTIyODQzWjBr 22 | MQswCQYDVQQGEwJjbjEQMA4GA1UECBMHQmVpamluZzEUMBIGA1UEChMLeGlhb3po 23 | dS5jb20xEDAOBgNVBAsTB2RldmVsb3AxIjAgBgNVBAMTGWltZ3NlYy54aWFvemh1 24 | c3RhdGljMS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANVL9qeLh4Yu 25 | 7VTf/i+iY0GRsUz/vKObZUI7+NgQ/zrbdXpYVBnnia5f2JJRRrcnFG/f1F9flgOd 26 | MVyHQu+Y2ty1DiOTQ0ufdaAEtKZeGoDcbgHFsfTFY+JfiUtO5UpuwMglz5OdIwRs 27 | p6vUjDaBhW34o3jlk6/3a6VmbQZ8E5V/AgMBAAGjgfgwgfUwCQYDVR0TBAIwADAs 28 | BglghkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYD 29 | VR0OBBYEFJ5sEiZGc4X3Fbwc+dnxAULhrVbqMIGaBgNVHSMEgZIwgY+hgYGkfzB9 30 | MQswCQYDVQQGEwJjbjEQMA4GA1UECBMHQmVpamluZzEQMA4GA1UEBxMHQmVpamlu 31 | ZzEUMBIGA1UEChMLeGlhb3podS5jb20xEDAOBgNVBAsTB2RldmVsb3AxIjAgBgNV 32 | BAMTGWltZ3NlYy54aWFvemh1c3RhdGljMS5jb22CCQC2kTPc10/8jzANBgkqhkiG 33 | 9w0BAQUFAAOBgQAGymZrVnFpcetadS8NpsfCmX0Cn6Tee5bPvZpEdpnpHqmEs5Ep 34 | folTLuh+ssaB+F9sOVMI8hqVV2oG+ulwqmuDcJoyY9i17Apc6/ak6aZPUyekft6f 35 | zV8WevZO1u3BmPViMiV0ws3TUIMXAcj0xIhp3RiFnFqT5lv8jrrjZvvscA== 36 | -----END CERTIFICATE----- 37 | -------------------------------------------------------------------------------- /MyApp/static/WX20200708-115503@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/WX20200708-115503@2x.png -------------------------------------------------------------------------------- /MyApp/static/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/__init__.py -------------------------------------------------------------------------------- /MyApp/static/bingxingtu/css/htmleaf-demo.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'icomoon'; 3 | src:url('../fonts/icomoon.eot?rretjt'); 4 | src:url('../fonts/icomoon.eot?#iefixrretjt') format('embedded-opentype'), 5 | url('../fonts/icomoon.woff?rretjt') format('woff'), 6 | url('../fonts/icomoon.ttf?rretjt') format('truetype'), 7 | url('../fonts/icomoon.svg?rretjt#icomoon') format('svg'); 8 | font-weight: normal; 9 | font-style: normal; 10 | } 11 | 12 | [class^="icon-"], [class*=" icon-"] { 13 | font-family: 'icomoon'; 14 | speak: none; 15 | font-style: normal; 16 | font-weight: normal; 17 | font-variant: normal; 18 | text-transform: none; 19 | line-height: 1; 20 | 21 | /* Better Font Rendering =========== */ 22 | -webkit-font-smoothing: antialiased; 23 | -moz-osx-font-smoothing: grayscale; 24 | } 25 | 26 | body, html { font-size: 100%; padding: 0; margin: 0;} 27 | 28 | /* Reset */ 29 | *, 30 | *:after, 31 | *:before { 32 | -webkit-box-sizing: border-box; 33 | -moz-box-sizing: border-box; 34 | box-sizing: border-box; 35 | } 36 | 37 | /* Clearfix hack by Nicolas Gallagher: http://nicolasgallagher.com/micro-clearfix-hack/ */ 38 | .clearfix:before, 39 | .clearfix:after { 40 | content: " "; 41 | display: table; 42 | } 43 | 44 | .clearfix:after { 45 | clear: both; 46 | } 47 | 48 | body{ 49 | font-weight: 500; 50 | font-size: 1.05em; 51 | font-family: "Microsoft YaHei","Segoe UI", "Lucida Grande", Helvetica, Arial,sans-serif; 52 | } 53 | .htmleaf-links a{ color: rgba(255, 255, 255, 0.6);outline: none;text-decoration: none;-webkit-transition: 0.2s;transition: 0.2s;} 54 | .htmleaf-links a:hover,.htmleaf-links a:focus{color:#74777b;text-decoration: none;} 55 | .htmleaf-container{ 56 | margin: 0 auto; 57 | } 58 | 59 | .bgcolor-1 { background: #f0efee; } 60 | .bgcolor-2 { background: #f9f9f9; } 61 | .bgcolor-3 { background: #e8e8e8; }/*light grey*/ 62 | .bgcolor-4 { background: #2f3238; color: #fff; }/*Dark grey*/ 63 | .bgcolor-5 { background: #df6659; color: #521e18; }/*pink1*/ 64 | .bgcolor-6 { background: #2fa8ec; }/*sky blue*/ 65 | .bgcolor-7 { background: #d0d6d6; }/*White tea*/ 66 | .bgcolor-8 { background: #3d4444; color: #fff; }/*Dark grey2*/ 67 | .bgcolor-9 { background: #ef3f52; color: #fff;}/*pink2*/ 68 | .bgcolor-10{ background: #64448f; color: #fff;}/*Violet*/ 69 | .bgcolor-11{ background: #3755ad; color: #fff;}/*dark blue*/ 70 | .bgcolor-12{ background: #3498DB; color: #fff;}/*light blue*/ 71 | .bgcolor-20{ background: #494A5F;color: #D5D6E2;} 72 | /* Header */ 73 | .htmleaf-header{ 74 | padding: 1em 190px 1em; 75 | letter-spacing: -1px; 76 | text-align: center; 77 | background: #66677c; 78 | } 79 | .htmleaf-header h1 { 80 | color: #D5D6E2; 81 | font-weight: 600; 82 | font-size: 2em; 83 | line-height: 1; 84 | margin-bottom: 0; 85 | } 86 | .htmleaf-header h1 span { 87 | display: block; 88 | font-size: 60%; 89 | font-weight: 400; 90 | padding: 0.8em 0 0.5em 0; 91 | color: #c3c8cd; 92 | } 93 | /*nav*/ 94 | .htmleaf-demo a{color: #fff;text-decoration: none;} 95 | .htmleaf-demo{width: 100%;padding-bottom: 1.2em;} 96 | .htmleaf-demo a{display: inline-block;margin: 0.5em;padding: 0.6em 1em;border: 3px solid #fff;font-weight: 700;} 97 | .htmleaf-demo a:hover{opacity: 0.6;} 98 | .htmleaf-demo a.current{background:#1d7db1;color: #fff; } 99 | /* Top Navigation Style */ 100 | .htmleaf-links { 101 | position: relative; 102 | display: inline-block; 103 | white-space: nowrap; 104 | font-size: 1.5em; 105 | text-align: center; 106 | } 107 | 108 | .htmleaf-links::after { 109 | position: absolute; 110 | top: 0; 111 | left: 50%; 112 | margin-left: -1px; 113 | width: 2px; 114 | height: 100%; 115 | background: #dbdbdb; 116 | content: ''; 117 | -webkit-transform: rotate3d(0,0,1,22.5deg); 118 | transform: rotate3d(0,0,1,22.5deg); 119 | } 120 | 121 | .htmleaf-icon { 122 | display: inline-block; 123 | margin: 0.5em; 124 | padding: 0em 0; 125 | width: 1.5em; 126 | text-decoration: none; 127 | } 128 | 129 | .htmleaf-icon span { 130 | display: none; 131 | } 132 | 133 | .htmleaf-icon:before { 134 | margin: 0 5px; 135 | text-transform: none; 136 | font-weight: normal; 137 | font-style: normal; 138 | font-variant: normal; 139 | font-family: 'icomoon'; 140 | line-height: 1; 141 | speak: none; 142 | -webkit-font-smoothing: antialiased; 143 | } 144 | /* footer */ 145 | .htmleaf-footer{width: 100%;padding-top: 10px;} 146 | .htmleaf-small{font-size: 0.8em;} 147 | .center{text-align: center;} 148 | /****/ 149 | .related { 150 | width: 100%; 151 | float: left; 152 | color: #fff; 153 | background: #494A5F; 154 | text-align: center; 155 | font-size: 1.25em; 156 | padding: 0.5em 0; 157 | overflow: hidden; 158 | } 159 | 160 | .related > a { 161 | vertical-align: top; 162 | width: calc(100% - 20px); 163 | max-width: 340px; 164 | display: inline-block; 165 | text-align: center; 166 | margin: 20px 10px; 167 | padding: 25px; 168 | font-family: "Microsoft YaHei","宋体","Segoe UI", "Lucida Grande", Helvetica, Arial,sans-serif, FreeSans, Arimo; 169 | } 170 | .related a { 171 | display: inline-block; 172 | text-align: left; 173 | margin: 20px auto; 174 | padding: 10px 20px; 175 | opacity: 0.8; 176 | -webkit-transition: opacity 0.3s; 177 | transition: opacity 0.3s; 178 | -webkit-backface-visibility: hidden; 179 | text-decoration: none; 180 | } 181 | 182 | .related a:hover, 183 | .related a:active { 184 | opacity: 1; 185 | } 186 | 187 | .related a img { 188 | max-width: 100%; 189 | opacity: 0.8; 190 | border-radius: 4px; 191 | } 192 | .related a:hover img, 193 | .related a:active img { 194 | opacity: 1; 195 | } 196 | .related h3{font-family: "Microsoft YaHei", sans-serif;font-size: 1.2em} 197 | .related a h3 { 198 | font-size: 0.85em; 199 | font-weight: 300; 200 | margin-top: 0.15em; 201 | color: #fff; 202 | } 203 | /* icomoon */ 204 | .icon-htmleaf-home-outline:before { 205 | content: "\e5000"; 206 | } 207 | 208 | .icon-htmleaf-arrow-forward-outline:before { 209 | content: "\e5001"; 210 | } 211 | 212 | @media screen and (max-width: 1024px) { 213 | .htmleaf-header { 214 | padding: 2em 10% 2em; 215 | } 216 | .htmleaf-header h1 { 217 | font-size:1.4em; 218 | } 219 | .htmleaf-links{font-size: 1.4em} 220 | } 221 | 222 | @media screen and (max-width: 960px) { 223 | .htmleaf-header { 224 | padding: 2em 10% 2em; 225 | } 226 | .htmleaf-header h1 { 227 | font-size:1.2em; 228 | } 229 | .htmleaf-links{font-size: 1.2em} 230 | .related h3{font-size: 1em;} 231 | .related a h3 { 232 | font-size: 0.8em; 233 | } 234 | } 235 | 236 | @media screen and (max-width: 766px) { 237 | .htmleaf-header h1 { 238 | font-size:1.3em; 239 | } 240 | .htmleaf-links{font-size: 1.3em} 241 | } 242 | 243 | @media screen and (max-width: 640px) { 244 | .htmleaf-header { 245 | padding: 2em 10% 2em; 246 | } 247 | .htmleaf-header h1 { 248 | font-size:1em; 249 | } 250 | .htmleaf-links{font-size: 1em} 251 | .related h3{font-size: 0.8em;} 252 | .related a h3 { 253 | font-size: 0.6em; 254 | } 255 | } -------------------------------------------------------------------------------- /MyApp/static/bingxingtu/css/normalize.css: -------------------------------------------------------------------------------- 1 | article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block;}audio,canvas,video{display:inline-block;}audio:not([controls]){display:none;height:0;}[hidden]{display:none;}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;}body{margin:0;}a:focus{outline:thin dotted;}a:active,a:hover{outline:0;}h1{font-size:2em;margin:0.67em 0;}abbr[title]{border-bottom:1px dotted;}b,strong{font-weight:bold;}dfn{font-style:italic;}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0;}mark{background:#ff0;color:#000;}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em;}pre{white-space:pre-wrap;}q{quotes:"\201C" "\201D" "\2018" "\2019";}small{font-size:80%;}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;}sup{top:-0.5em;}sub{bottom:-0.25em;}img{border:0;}svg:not(:root){overflow:hidden;}figure{margin:0;}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em;}legend{border:0;padding:0;}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0;}button,input{line-height:normal;}button,select{text-transform:none;}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;}button[disabled],html input[disabled]{cursor:default;}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none;}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0;}textarea{overflow:auto;vertical-align:top;}table{border-collapse:collapse;border-spacing:0;} -------------------------------------------------------------------------------- /MyApp/static/bingxingtu/css/progresscircle.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Inspiration for this project found at: 3 | * https://markus.oberlehner.net/blog/pure-css-animated-svg-circle-chart 4 | * 1. The `reverse` animation direction plays the animation backwards 5 | * which makes it start at the stroke offset 100 which means displaying 6 | * no stroke at all and animating it to the value defined in the SVG 7 | * via the inline `stroke-dashoffset` attribute. 8 | * 2. Rotate by -90 degree to make the starting point of the 9 | * stroke the top of the circle. 10 | * 3. Using CSS transforms on SVG elements is not supported by Internet Explorer 11 | * and Edge, use the transform attribute directly on the SVG element as a 12 | * . workaround. 13 | */ 14 | 15 | .circle-chart { 16 | width: 60px; 17 | height: 60px; 18 | } 19 | 20 | .circle-chart__circle { 21 | stroke: #00acc1; 22 | stroke-width: 2; 23 | stroke-linecap: square; 24 | fill: none; 25 | animation: circle-chart-fill 2s reverse; /* 1 */ 26 | transform: rotate(-90deg); /* 2, 3 */ 27 | transform-origin: center; /* 4 */ 28 | } 29 | 30 | /** 31 | * 1. Rotate by -90 degree to make the starting point of the 32 | * stroke the top of the circle. 33 | * 2. Scaling mirrors the circle to make the stroke move right 34 | * to mark a positive chart value. 35 | * 3. Using CSS transforms on SVG elements is not supported by Internet Explorer 36 | * and Edge, use the transform attribute directly on the SVG element as a 37 | * . workaround. 38 | */ 39 | 40 | .circle-chart__circle--negative { 41 | transform: rotate(-90deg) scale(1,-1); /* 1, 2, 3 */ 42 | } 43 | 44 | .circle-chart__background { 45 | stroke: #efefef; 46 | stroke-width: 2; 47 | fill: none; 48 | } 49 | 50 | .circle-chart__info { 51 | animation: circle-chart-appear 2s forwards; 52 | opacity: 0; 53 | transform: translateY(0.3em); 54 | 55 | } 56 | 57 | .circle-chart__percent { 58 | alignment-baseline: central; 59 | text-anchor: middle; 60 | font-size: 8px; 61 | /*stroke: #0a3b47;*/ 62 | 63 | } 64 | 65 | .circle-chart__subline { 66 | alignment-baseline: central; 67 | text-anchor: middle; 68 | font-size: 4px; 69 | 70 | } 71 | 72 | .success-stroke { 73 | stroke: #00C851; 74 | } 75 | 76 | .warning-stroke { 77 | stroke: #ffbb33; 78 | } 79 | 80 | .danger-stroke { 81 | stroke: #ff4444; 82 | } 83 | 84 | @keyframes circle-chart-fill { 85 | to { stroke-dasharray: 0 100; } 86 | } 87 | 88 | @keyframes circle-chart-appear { 89 | to { 90 | opacity: 1; 91 | transform: translateY(0); 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /MyApp/static/bingxingtu/fonts/icomoon.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/bingxingtu/fonts/icomoon.eot -------------------------------------------------------------------------------- /MyApp/static/bingxingtu/fonts/icomoon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Generated by IcoMoon 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /MyApp/static/bingxingtu/fonts/icomoon.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/bingxingtu/fonts/icomoon.ttf -------------------------------------------------------------------------------- /MyApp/static/bingxingtu/fonts/icomoon.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/bingxingtu/fonts/icomoon.woff -------------------------------------------------------------------------------- /MyApp/static/bingxingtu/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 基于SVG的jquery圆形进度条插件ProgressCircle|DEMO_jQuery之家-自由分享jQuery、html5、css3的插件库 8 | 9 | 10 | 11 | 24 | 25 | 26 |
27 |
28 |

基于SVG的jquery圆形进度条插件ProgressCircle Pure CSS Animated SVG Circle Chart with jQuery Rendering

29 | 33 |
34 |

Progress Circle Demo

35 |
36 |
-20%
37 |
30%
38 |
85%
39 |
40 | 51 |
52 | 53 | 54 | 55 | 56 | 59 | 60 | -------------------------------------------------------------------------------- /MyApp/static/bingxingtu/jQuery之家.url: -------------------------------------------------------------------------------- 1 | [{000214A0-0000-0000-C000-000000000046}] 2 | Prop3=19,2 3 | [InternetShortcut] 4 | URL=http://www.htmleaf.com/ 5 | IDList= 6 | HotKey=0 7 | IconFile=C:\Windows\system32\SHELL32.dll 8 | IconIndex=220 9 | [InternetShortcut.A] 10 | [InternetShortcut.W] 11 | IconFile=F:+AFx/UVP2-jQuery+AFw-favicon.ico 12 | -------------------------------------------------------------------------------- /MyApp/static/bingxingtu/js/progresscircle.js: -------------------------------------------------------------------------------- 1 | function makesvg(percentage, inner_text){ 2 | var inner_text = ""; 3 | var abs_percentage = Math.abs(percentage).toString(); 4 | var percentage_str = percentage.toString(); 5 | var classes = "" 6 | 7 | if(percentage < 0){ 8 | classes = "danger-stroke circle-chart__circle--negative"; 9 | inner_text = '过小' 10 | } else if(percentage > 0 && percentage <= 30){ 11 | classes = "warning-stroke"; 12 | inner_text = '一般' 13 | } else{ 14 | classes = "success-stroke"; 15 | inner_text = '过大' 16 | } 17 | 18 | var svg = '' 19 | + '' 20 | + '' 22 | + '' 23 | + ' '+percentage_str+'%'; 24 | 25 | if(inner_text){ 26 | svg += ''+inner_text+'' 27 | } 28 | 29 | svg += ' '; 30 | 31 | return svg 32 | } 33 | 34 | (function( $ ) { 35 | 36 | $.fn.circlechart = function() { 37 | this.each(function() { 38 | var percentage = $(this).data("percentage"); 39 | var inner_text = $(this).text(); 40 | $(this).html(makesvg(percentage, inner_text)); 41 | }); 42 | return this; 43 | }; 44 | 45 | }( jQuery )); 46 | -------------------------------------------------------------------------------- /MyApp/static/bingxingtu/readme.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | jQuery之家 6 | 13 | 14 | 15 |

欢迎访问jQuery之家

16 |
17 |

更多精彩内容请访问jQuery之家:http://www.htmleaf.com

18 |

jQuery之家致力于搜集和整理各种jQuery插件,jQuery特效,jquery ui,jQuery 教程,JS特效,网页特效,以及各种html5,css3动画和效果。

19 |

为前端开发者提供最全面的网页开发素材。

20 |
21 | 22 | -------------------------------------------------------------------------------- /MyApp/static/bingxingtu/related/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/bingxingtu/related/1.jpg -------------------------------------------------------------------------------- /MyApp/static/bingxingtu/related/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/bingxingtu/related/2.jpg -------------------------------------------------------------------------------- /MyApp/static/bitbug_favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/bitbug_favicon.ico -------------------------------------------------------------------------------- /MyApp/static/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /MyApp/static/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /MyApp/static/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /MyApp/static/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /MyApp/static/bootstrap-3.3.7-dist/js/npm.js: -------------------------------------------------------------------------------- 1 | // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. 2 | require('../../js/transition.js') 3 | require('../../js/alert.js') 4 | require('../../js/button.js') 5 | require('../../js/carousel.js') 6 | require('../../js/collapse.js') 7 | require('../../js/dropdown.js') 8 | require('../../js/modal.js') 9 | require('../../js/tooltip.js') 10 | require('../../js/popover.js') 11 | require('../../js/scrollspy.js') 12 | require('../../js/tab.js') 13 | require('../../js/affix.js') -------------------------------------------------------------------------------- /MyApp/static/home.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/home.jpg -------------------------------------------------------------------------------- /MyApp/static/login.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/login.jpg -------------------------------------------------------------------------------- /MyApp/static/logo_hw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/logo_hw.png -------------------------------------------------------------------------------- /MyApp/static/tmp_zhengjiao.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/tmp_zhengjiao.xls -------------------------------------------------------------------------------- /MyApp/static/user_img/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/user_img/1.png -------------------------------------------------------------------------------- /MyApp/static/user_img/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/user_img/3.png -------------------------------------------------------------------------------- /MyApp/static/user_img/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/user_img/4.png -------------------------------------------------------------------------------- /MyApp/static/user_img/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/user_img/__init__.py -------------------------------------------------------------------------------- /MyApp/static/z.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/static/z.jpg -------------------------------------------------------------------------------- /MyApp/templates/P_global_data.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Title 6 | 11 | 12 | 13 | 14 | 32 | 33 |

34 | 35 | 36 | 37 | 38 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | {% for i in global_data %} 49 | 50 | 51 | 52 | 53 | 54 | 61 | {% endfor %} 62 | 63 |
选择不同变量组后,右侧进行修改 39 |
变量组名称操作
64 | 65 |
66 | 67 |
68 | 69 |
70 | 71 | 72 | 127 | 128 | 129 | -------------------------------------------------------------------------------- /MyApp/templates/P_project_set.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Title 6 | 12 | 13 | 14 | 15 | 33 | 34 |

35 | 36 |
37 |

项目名称

38 |
39 |

项目描述

40 |
41 |

其他管理员

42 | 43 |

上传client证书

44 | 45 |
46 | 47 |
48 | 49 |
50 | 当前证书:{{ project.cert }} 51 |
52 | 53 |
54 | 55 |

56 | 58 | 59 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /MyApp/templates/Reports/19.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/templates/Reports/19.html -------------------------------------------------------------------------------- /MyApp/templates/Reports/21.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 接口测试平台测试报告: 大用例1 6 | 7 | 8 | 9 | 10 | 107 | 108 | 109 | 110 | 233 | 234 |
235 |

报告标题: 用例描述

236 |
237 |

接口自动化测试平台提供

238 |

注意: 出现问题请联系管理员!

239 |

报告生成日期: 2022-04-20 15:05:49

240 |

用例执行时间: 0:00:03.033487秒

241 |

用例执行结果: 通过 1,

242 |

执行系统: darwin

243 | 244 |
245 |
246 | 247 | 248 |

249 |
250 |

查看: 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 |

259 |
260 |

261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 |
测试套件/测试用例总数量通过的失败的报错的查看
MyApp.run_case.Test: 测试类1100
test_001: 调用A接口步骤
293 | 294 | 295 | 296 | 297 |
318 | 319 | 320 |
总计1100
333 | 334 |
335 |

















336 |
337 | 338 | 339 | 340 | 341 | -------------------------------------------------------------------------------- /MyApp/templates/Reports/22.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 接口测试平台测试报告: 大用例2 6 | 7 | 8 | 9 | 10 | 107 | 108 | 109 | 110 | 233 | 234 |
235 |

报告标题: 用例描述

236 |
237 |

接口自动化测试平台提供

238 |

注意: 出现问题请联系管理员!

239 |

报告生成日期: 2022-04-20 15:09:27

240 |

用例执行时间: 0:00:03.035342秒

241 |

用例执行结果: 通过 1,

242 |

执行系统: darwin

243 | 244 |
245 |
246 | 247 | 248 |

249 |
250 |

查看: 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 |

259 |
260 |

261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 |
测试套件/测试用例总数量通过的失败的报错的查看
MyApp.run_case.Test: 测试类1100
test_001: 测试B接口步骤
293 | 294 | 295 | 296 | 297 |
318 | 319 | 320 |
总计1100
333 | 334 |
335 |

















336 |
337 | 338 | 339 | 340 | 341 | -------------------------------------------------------------------------------- /MyApp/templates/Reports/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Woqurefan/ApiTest/53f78a9c54e7049ec255bfb6f319a2965ce9d6c4/MyApp/templates/Reports/__init__.py -------------------------------------------------------------------------------- /MyApp/templates/concurrent_report.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 并发用例报告 6 | 7 | 8 | 9 | 10 | 11 | 24 | 25 | 26 | 27 |
28 |
29 |
30 | 正确率 31 |
32 | 33 |
34 | 最终结果:{{ result }}
35 | 用例总数:{{ cases_length }}
36 | 用例通过数:{{ cases_right_length }}
37 | 用例通过率:{{ cases_right_scale }} %
38 | 用例失败数:{{ cases_wrong_length }}
39 | 用例失败率:{{ cases_wrong_scale }} % 40 |
41 |
42 | {% for case in cases %} 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | {% for step in case.steps %} 53 | 54 | 55 | 56 | 57 | 58 | {% endfor %} 59 | 60 |
用例名称: {{ case.case_name }}用例结果: {{ case.result_case }}操作
步骤名称: {{ step.step_name }}步骤结果: {{ step.result_step }}
61 | {% endfor %} 62 |
63 | 74 | 75 | 82 | 99 | 100 | 101 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /MyApp/templates/help.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 帮助文档 6 | 7 | 17 | 18 | 19 | 20 | 21 |
22 | 项目列表

23 | 接口库

24 | 接口调试

25 | 后台

26 | 账户 27 |
28 | 29 |
31 |   32 |
33 |
34 | 35 |

项目列表

36 | 项目列表作为接口测试平台的基础单元,用来存放用户的接口数据等信息。
37 | 不同项目之间无法完全互通,数据互相不影响,属于平行世界。
38 | 项目有自己的权限保护系统,用户可放心的在里面进行安全的测试任务,而不被其他人打扰
39 | 项目之间可以共享的有 host域名,以便其他人在编辑接口时复用
40 | 项目内包含 接口库 和 用例库 和 项目设置 三大模块
41 | 项目的后续设置如 名称/备注/其他管理员 均可以在 项目设置模块中设置
42 | 项目列表就是所有人创建的项目的列表 您可以挑选需要的项目进入内部
43 | 每个用户可以创建无限多的项目
44 |
45 | 46 | 55 | 56 | 63 | 64 | 69 | 70 | 76 |
77 | 78 | 92 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /MyApp/templates/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 测试平台登录 6 | 28 | 29 | 30 | 31 | 32 |
33 |
34 |
35 | 接口测试平台 36 |
37 | 欢迎使用 38 |

39 | 40 | 41 |

42 | 43 | 44 |


45 | 46 |

47 | 若首次登录,请点击 注册账号 48 |

49 |
50 | 51 | 52 | 78 | 79 | 80 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /MyApp/templates/project_list.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 项目列表 6 | 22 | 23 | 24 |

项目列表: 25 | 26 | 点击 新增项目 27 | 即可创建属于您的新项目! 28 | 29 |

30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | {% for i in projects %} 39 | 40 | 41 | 45 | 46 | {% endfor %} 47 | 48 |
项目id 项目名称 创建者 备注 操作
{{ i.id }}{{ i.name }} {{ i.user }} {{ i.remark }} 42 | 43 | 44 |
49 | 50 | 60 | 61 | 62 |
66 |

项目名称:(最多100字)

67 | 68 |

69 | 70 | 71 |

72 |
73 | 74 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /MyApp/templates/test.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Title 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /MyApp/templates/welcome.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 测试平台 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 27 | 28 | 29 | 30 | 87 | 88 | 91 | 92 | 107 | 108 | 109 |
110 | 111 | HOME 112 | 113 |
114 | 115 | 116 |
117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 138 | 139 | 140 | 141 | 142 |
143 | 144 | 147 | 148 | 149 | 155 | 156 | 157 | 158 | 159 | 160 | -------------------------------------------------------------------------------- /MyApp/templates/zhengjiao.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 正交生成工具 6 | 9 | 10 | 11 | 12 |
16 |

欢迎使用正交小工具

17 |
18 |
19 | 输入条件和子状态 20 | 21 | 22 |
23 |
24 | 25 |
26 | 27 | 28 | 29 | 30 | 32 |
33 |
34 |
35 | 36 |
37 |
38 | 39 | 40 |
41 | 42 | 43 | 121 | 122 | 123 | 124 | 125 | 126 | -------------------------------------------------------------------------------- /MyApp/test.py: -------------------------------------------------------------------------------- 1 | 2 | import json 3 | s = '{"aaa":false}' 4 | 5 | print(json.loads(s)) 6 | 7 | for i in json.loads(s).keys(): 8 | print(s[i]) -------------------------------------------------------------------------------- /MyApp/tests.py: -------------------------------------------------------------------------------- 1 | class Person: 2 | def __init__(self,nicheng): 3 | self.nicheng = nicheng 4 | 5 | def get_nicheng(self): 6 | print(self.nicheng) 7 | 8 | class mj(Person): 9 | def __init__(self ): 10 | print("-----------------\n正在创建买家对象:" ) 11 | self.nicheng = '小邪😈同学' 12 | self.driver = '' 13 | self.login() 14 | 15 | def login(self): 16 | print('运行appium买家登陆脚本\n') 17 | # self.driver.find('') 18 | 19 | def xiadan(self): 20 | print('买家在下单') 21 | # self.driver.find('') 22 | 23 | def quxiao(self): 24 | print('买家取消订单') 25 | # self.driver.find('') 26 | 27 | class sj(Person): 28 | def __init__(self): 29 | print("-----------------\n正在创建商家对象:") 30 | self.nicheng = '小饭同学' 31 | self.driver = '' 32 | self.login() 33 | 34 | def login(self): 35 | print('运行appium 商家登陆脚本\n') 36 | # self.driver.find('') 37 | 38 | def queren(self): 39 | print('商家在确认订单') 40 | # self.driver.find('') 41 | 42 | def tousu(self): 43 | print('商家在投诉') 44 | # self.driver.find('') 45 | 46 | def shoubiao(self): 47 | print('商家在上架手表') 48 | # self.driver.find('') 49 | 50 | class KF(Person): 51 | def __init__(self): 52 | print("-----------------\n正在创建客服:") 53 | self.driver = '' 54 | self.login() 55 | def login(self): 56 | print('运行selenium 客服登陆脚本\n') 57 | # self.driver.find('') 58 | 59 | def jiufen(self): 60 | print('运行客服处理纠纷脚本') 61 | #self.driver.find('') 62 | print('客服在看闹事双方昵称都叫什么:') 63 | print('买家昵称:') 64 | new_mj.get_nicheng() 65 | print('商家昵称:') 66 | new_sj.get_nicheng() 67 | 68 | class Factory: 69 | def create_user(self, shenfen): 70 | if shenfen == 'mj': 71 | return mj() 72 | if shenfen == 'sj': 73 | return sj() 74 | if shenfen == 'kf': 75 | return KF() 76 | 77 | 78 | if __name__ == '__main__': 79 | factory = Factory() 80 | new_mj = factory.create_user('mj') 81 | new_sj = factory.create_user('sj') 82 | new_kf = factory.create_user('kf') 83 | new_sj.shoubiao() 84 | new_mj.xiadan() 85 | new_sj.queren() 86 | new_mj.quxiao() 87 | new_sj.tousu() 88 | new_kf.jiufen() 89 | 90 | -------------------------------------------------------------------------------- /MyApp/views_test.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | from django.contrib.auth.decorators import login_required 3 | # Create your views here. 4 | from django.http import HttpResponse,HttpResponseRedirect 5 | from django.shortcuts import render 6 | from MyApp.models import * 7 | import json 8 | import requests 9 | 10 | def test_login_A(request): 11 | res = {"userid":"uA","userpwd":"12223jjjw","butdata":{"name":"pen","price":"$5","counts":{"start":155,"now":52}}} 12 | return HttpResponse(json.dumps(res),content_type='application/json') 13 | 14 | 15 | def test_login_B(request): 16 | res ='abcdefg' 17 | return HttpResponse(res) 18 | 19 | 20 | def test_api_A(request): 21 | res = {"errcode":"0"} 22 | 23 | return HttpResponse(json.dumps(res), content_type='application/json') 24 | 25 | 26 | def test_api_B(request): 27 | res = {"errcode":"0"} 28 | 29 | return HttpResponse(json.dumps(res), content_type='application/json') 30 | -------------------------------------------------------------------------------- /MyApp/views_tools.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | from django.contrib.auth.decorators import login_required 3 | # Create your views here. 4 | from django.http import HttpResponse,HttpResponseRedirect 5 | from django.shortcuts import render 6 | from MyApp.models import * 7 | import json 8 | import requests 9 | from allpairspy import AllPairs 10 | import xlrd 11 | import xlwt 12 | import os 13 | 14 | # 获取公共参数 15 | def glodict(request): 16 | userimg = str(request.user.id)+'.png' #这里我们写死png后缀,因为上传时候我们也可以强行弄成这个png后缀。 17 | res = {"username":request.user.username,"userimg":userimg} 18 | return res 19 | 20 | 21 | # 进入正交工具页面 22 | def zhengjiao(request): 23 | return render(request,'welcome.html',{"whichHTML": "zhengjiao.html","oid":request.user.id,**glodict(request) }) 24 | 25 | # 正交工具运行 26 | def zhengjiao_play(request): 27 | end_values = request.GET['end_values'].split(',') 28 | 29 | filter_input = request.GET['filter_input'] #提取出过滤规则 30 | filter_input = filter_input.replace(',',',').replace(' ','').replace('\n','') #进行修正 31 | 32 | new_values = [ i.split('/') for i in end_values ] 33 | res = [] 34 | filter = [] 35 | for i in AllPairs(new_values): 36 | # 判断是否中了过滤规则 37 | for f in filter_input.split(','):#遍历过滤规则 38 | left = f.split('-')[0] 39 | try: 40 | right = f.split('-')[1] 41 | except: 42 | res.append(i) 43 | break 44 | if left in i and right in i: 45 | filter.append({"case":i,"filter":[left,right]}) 46 | break 47 | else: 48 | res.append(i) 49 | # print('res:',res) 50 | # print('filter:',filter) 51 | 52 | wugu = [] #声明无辜组合列表 53 | #开始对filter,整理出无辜组合 54 | for d in filter: #d此时是个字典 55 | case = d['case'] 56 | f_case = d['filter'] 57 | cha = list(set(case).difference(set(f_case))) #求出剩余的其他子状态的列表 58 | for f_c in f_case: # 遍历f_case,拆开中规则的俩个子状态,分别和其他子状态 组合成新的列表,视为无辜组合 59 | tmp = cha+[f_c] 60 | wugu.append(tmp) 61 | 62 | # print('wugo: ',wugu) 63 | bdgl = [] 64 | for w in wugu: 65 | # 看看无辜组合是否已经存在于res中 66 | for i in res: 67 | if set(w).issubset(set(i)) : #判断w是否是i的子列表 68 | break 69 | else: #只有当正常结束才会运行,正常结束代表未存在res,可以继续往后走。 70 | # 用一个新的非中过滤规则的子状态填充,形成完整的组合 71 | # print('-----------------') 72 | # print(w) #此时的w 是要添加新的子状态 组成完整组合的~ 73 | which = [v for v in new_values if set(v).intersection(set(w)) == set()][0] # 用交集函数 确认那个需要增加的输入条件: 74 | # print(which) 75 | for whi in which: 76 | new_zuhe = w + [whi] #变成新组合 77 | # print('新组合:',new_zuhe) 78 | # 判断是否中了过滤规则 79 | for f in filter_input.split(','): # 遍历过滤规则 80 | left = f.split('-')[0] 81 | right = f.split('-')[1] 82 | if left in new_zuhe and right in new_zuhe: #说明中标 83 | # print('中了,则该组合不行,看下一个组合吧~') 84 | break 85 | else: #说明新组合没中过滤 86 | # print('全程没中过滤,很nice') 87 | # 对有效新组合 进行 顺序校验! 88 | # print('--------') 89 | # print(new_zuhe) 90 | # print(new_values) 91 | new_tmp = [list(set(nv).intersection(set(new_zuhe)))[0] for nv in new_values if set(nv).intersection(set(new_zuhe))] 92 | # print(new_tmp) 93 | # 校验后,再添加给res 94 | res.append(new_tmp) # 95 | break 96 | # 中了过滤 走这里,所以要换下一个新组合 97 | continue 98 | else: # 说明是没有break出来的,被动过滤组合,给bdgl组合列表送去把 99 | bdgl.append('-'.join(w)) 100 | # break出来的,说明找到了有效组合,所以这个无辜组合已经可以了,赶紧搞下一个无辜组合把~ 101 | 102 | d = { "res" : res,"bdgl":bdgl} 103 | return HttpResponse(json.dumps(d),content_type="application/json") 104 | 105 | # 正交工具导出 106 | def zhengjiao_excel(request): 107 | end_keys = request.GET['end_keys'].split(',') 108 | end_values = request.GET['end_values'].split(',') 109 | new_values = [i.split('/') for i in end_values] 110 | res = [] 111 | for i in AllPairs(new_values): 112 | res.append(i) 113 | # 先创建 114 | wqrf_book = xlwt.Workbook(encoding='utf-8') # 创建excel 115 | wqrf_sheet = wqrf_book.add_sheet("正交结果") # 创建sheet页 116 | for i in range(len(res)): 117 | case_index = '用例:'+str(i+1) # 用例序号 118 | hb = list(zip(end_keys,res[i])) #把key和value进行合并 119 | wqrf_sheet.write(i,0,case_index) # 写入,i为行,0为第一例 120 | 121 | case = [':'.join(list(i)) for i in hb] #进行格式化,便于阅读 122 | for c in range(len(case)): 123 | wqrf_sheet.write(i,1+c , case[c]) # 写入,i为行,1为第二例 124 | 125 | 126 | wqrf_book.save('MyApp/static/tmp_zhengjiao.xls') #保存 127 | 128 | return HttpResponse('') 129 | -------------------------------------------------------------------------------- /MyApp/wqrf_run_case.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | import sys,os,django 3 | path = "../ApiTest" 4 | sys.path.append(path) 5 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ApiTest.settings") 6 | django.setup() 7 | from MyApp.models import * 8 | from MyApp.views import global_datas_replace,encyption 9 | import re 10 | import json 11 | import requests 12 | 13 | def do_step(step_id,tmp_datas): 14 | '请求数据准备' 15 | ## 计算项目id 16 | project_id = DB_cases.objects.filter(id=DB_step.objects.filter(id=step_id)[0].Case_id)[0].project_id 17 | # 拿到step 18 | step = DB_step.objects.filter(id=step_id)[0] 19 | # 初始化请求方式 20 | api_method = step.api_method 21 | # 初始化url 22 | api_url = step.api_url 23 | # url添加全局变量 24 | api_url = global_datas_replace(project_id, api_url) 25 | ## 取出证书开关 26 | api_cert = step.cert 27 | ## 域名初始化 28 | api_host = step.api_host 29 | ## 域名添加全局变量 30 | api_host = global_datas_replace(project_id, api_host) 31 | ## 请求体初始化 32 | api_body = step.api_body 33 | ## 请求方式初始化 34 | api_method = step.api_method 35 | ## 请求体添加全局变量 36 | api_body = global_datas_replace(project_id, api_body) 37 | ## 返回值处理方式初始化 38 | get_path = step.get_path 39 | get_zz = step.get_zz 40 | assert_zz = step.assert_zz 41 | assert_qz = step.assert_qz 42 | assert_path = step.assert_path 43 | ## 请求头初始化 44 | api_header = step.api_header 45 | ## 请求头添加全局变量 46 | api_header = global_datas_replace(project_id, api_header) 47 | ## 公共请求头获取 48 | ts_project_headers = step.public_header.split(',') # 获取公共请求头 49 | ## 请求体类型初始化: 50 | api_body_method = step.api_body_method 51 | ## Mock返回值初始化 52 | mock_res = step.mock_res 53 | ## 是否mock判断 54 | if mock_res not in ['', None, 'None']: 55 | res = mock_res 56 | ## 请求头为空处理 57 | if api_header == '': 58 | api_header = '{}' 59 | 60 | ## 占位符变量替换 61 | # url 处理 62 | rlist_url = re.findall(r"##(.*?)##", api_url) 63 | for i in rlist_url: 64 | api_url = api_url.replace("##" + i + "##", tmp_datas[i]) 65 | 66 | # header 处理 67 | rlist_header = re.findall(r"##(.*?)##", api_header) 68 | for i in rlist_header: 69 | api_header = api_header.replace("##" + i + "##", repr(tmp_datas[i])) 70 | # 请求体 处理 71 | if api_body_method == 'none': 72 | pass 73 | elif api_body_method == 'form-data' or api_body_method == 'x-www-form-urlencoded': 74 | rlist_body = re.findall(r"##(.*?)##", api_body) 75 | for i in rlist_body: 76 | api_body = api_body.replace("##" + i + "##", str(eval(i))) 77 | 78 | elif api_body_method == 'Json': 79 | rlist_body = re.findall(r"##(.*?)##", api_body) 80 | for i in rlist_body: 81 | api_body = api_body.replace("##" + i + "##", repr(tmp_datas[i])) 82 | 83 | else: 84 | rlist_body = re.findall(r"##(.*?)##", api_body) 85 | for i in rlist_body: 86 | api_body = api_body.replace("##" + i + "##", tmp_datas[i]) 87 | 88 | ## 域名额外处理-全局域名 89 | if api_host[:4] == '全局域名': 90 | project_host_id = api_host.split('-')[1] 91 | api_host = DB_project_host.objects.filter(id=project_host_id)[0].host 92 | 93 | ## header转换为字典 94 | try: 95 | header = json.loads(api_header) # 处理header 96 | except: 97 | header = eval(api_header) 98 | # 在这遍历公共请求头,并把其加入到header的字典中。 99 | for i in ts_project_headers: 100 | if i == '': 101 | continue 102 | project_header = DB_project_header.objects.filter(id=i)[0] 103 | header[project_header.key] = project_header.value 104 | ## 最终url生成 105 | if api_host[-1] == '/' and api_url[0] == '/': # 都有/ 106 | url = api_host[:-1] + api_url 107 | elif api_host[-1] != '/' and api_url[0] != '/': # 都没有/ 108 | url = api_host + '/' + api_url 109 | else: # 肯定有一个有/ 110 | url = api_host + api_url 111 | ## 登录态融合 112 | api_login = step.api_login # 获取登陆开关 113 | if api_login == 'no': 114 | login_res = {} 115 | 116 | else : # 需要登录态 117 | Case_id = step.Case_id # 先求出当前执行step所属的case_id 118 | global login_res_list # 新建一个登陆态列表 119 | try: 120 | eval('login_res_list') 121 | except: 122 | login_res_list = [] # 判断是否存在,若不存在,则创建空的。 123 | # 去login_res_list中查找是否已经存在 124 | for i in login_res_list: 125 | if i['Case_id'] == Case_id: # 说明找到了.直接用。 126 | print('找到了') 127 | login_res = i 128 | break 129 | else: # 说明没找到,要创建 130 | print('没找到要创建') 131 | from MyApp.views import project_login_send_for_other 132 | login_res = project_login_send_for_other(project_id) # 调用我们之前写好的获取函数 133 | login_res['Case_id'] = Case_id # 给它加入 大用例id 标记 134 | login_res_list.append(login_res) 135 | # 运行到这的时候,可以肯定已经有了这个login res了 136 | ## url插入 137 | if '?' not in url: 138 | url += '?' 139 | if type(login_res) == dict: 140 | for i in login_res.keys(): 141 | url += i + '=' + login_res[i] + '&' 142 | else: # 证明已经有参数了 143 | if type(login_res) == dict: 144 | for i in login_res.keys(): 145 | url += '&' + i + '=' + login_res[i] 146 | ## header插入 147 | if type(login_res) == dict: 148 | header.update(login_res) 149 | 150 | ## 加密策略 151 | step_encyption = step.sign 152 | if step_encyption == 'yes': 153 | url, api_body = encyption(url, api_body_method, api_body, project_id) 154 | 155 | ## 证书融合 156 | if api_cert == 'yes': 157 | cert_name = 'MyApp/static/Certs/%s' % DB_project.objects.filter(id=project_id)[0].cert 158 | else: 159 | cert_name = '' 160 | 161 | ## 数据库写入请求数据 162 | r_step = DB_wqrf_step_report.objects.get_or_create(id=step_id)[0] 163 | r_step.request_data = json.dumps({ 164 | "url":url, 165 | "method":api_method, 166 | "api_body":api_body, 167 | "api_body_method":api_body_method 168 | }) 169 | 170 | '执行请求' 171 | ## none请求 172 | if api_body_method == 'none' or api_body_method == 'null': 173 | if type(login_res) == dict: 174 | response = requests.request(api_method.upper(), url, headers=header, data={}, cert=cert_name) 175 | else: 176 | response = login_res.request(api_method.upper(), url, headers=header, data={}, cert=cert_name) 177 | 178 | ## form-data请求 179 | elif api_body_method == 'form-data': 180 | files = [] 181 | payload = () 182 | for i in eval(api_body): 183 | payload += ((i[0], i[1]),) 184 | 185 | if type(login_res) == dict: 186 | for i in login_res.keys(): 187 | payload += ((i, login_res[i]),) 188 | 189 | response = requests.request(api_method.upper(), url, headers=header, data=payload, files=files, 190 | cert=cert_name) 191 | else: 192 | response = login_res.request(api_method.upper(), url, headers=header, data=payload, files=files, 193 | cert=cert_name) 194 | 195 | ## x-www-form-urlencoded请求 196 | elif api_body_method == 'x-www-form-urlencoded': 197 | header['Content-Type'] = 'application/x-www-form-urlencoded' 198 | 199 | payload = () 200 | for i in eval(api_body): 201 | payload += ((i[0], i[1]),) 202 | 203 | if type(login_res) == dict: 204 | for i in login_res.keys(): 205 | payload += ((i, login_res[i]),) 206 | 207 | if type(login_res) == dict: 208 | response = requests.request(api_method.upper(), url, headers=header, data=payload, cert=cert_name) 209 | else: 210 | response = login_res.request(api_method.upper(), url, headers=header, data=payload, cert=cert_name) 211 | 212 | ## GraphQL请求 213 | elif api_body_method == 'GraphQL': 214 | header['Content-Type'] = 'application/json' 215 | query = api_body.split('*WQRF*')[0] 216 | graphql = api_body.split('*WQRF*')[1] 217 | try: 218 | eval(graphql) 219 | except: 220 | graphql = '{}' 221 | payload = '{"query":"%s","variables":%s}' % (query, graphql) 222 | if type(login_res) == dict: 223 | response = requests.request(api_method.upper(), url, headers=header, data=payload, cert=cert_name) 224 | else: 225 | response = login_res.request(api_method.upper(), url, headers=header, data=payload, cert=cert_name) 226 | 227 | ## raw的五种请求 228 | else: # 这时肯定是raw的五个子选项: 229 | if api_body_method == 'Text': 230 | header['Content-Type'] = 'text/plain' 231 | 232 | if api_body_method == 'JavaScript': 233 | header['Content-Type'] = 'text/plain' 234 | 235 | if api_body_method == 'Json': 236 | api_body = json.loads(api_body) 237 | for i in login_res.keys(): 238 | api_body[i] = login_res[i] 239 | api_body = json.dumps(api_body) 240 | header['Content-Type'] = 'text/plain' 241 | 242 | if api_body_method == 'Html': 243 | header['Content-Type'] = 'text/plain' 244 | 245 | if api_body_method == 'Xml': 246 | header['Content-Type'] = 'text/plain' 247 | if type(login_res) == dict: 248 | response = requests.request(api_method.upper(), url, headers=header, data=api_body.encode('utf-8'), 249 | cert=cert_name) 250 | else: 251 | response = login_res.request(api_method.upper(), url, headers=header, data=api_body.encode('utf-8'), 252 | cert=cert_name) 253 | response.encoding = "utf-8" 254 | res = response.text #最终结果文案 255 | 256 | # 返回结果存入数据库表 257 | r_step.response = res 258 | 259 | '结果处理' 260 | # 新建临时变量列表 261 | tmp_d = {} 262 | ## 对返回值res提取-路径法 263 | if get_path != '': # 说明有设置 264 | for i in get_path.split('\n'): 265 | key = i.split('=')[0].rstrip() 266 | path = i.split('=')[1].lstrip() 267 | py_path = "" 268 | for j in path.split('/'): 269 | if j != '': 270 | if j[0] != '[': 271 | py_path += '["%s"]' % j 272 | else: 273 | py_path += j 274 | value = eval("%s%s" % (json.loads(res), py_path)) 275 | tmp_d[key] = value 276 | ## 对返回值res提取-正则法 277 | if get_zz != '': # 说明有设置 278 | for i in get_zz.split('\n'): 279 | key = i.split('=')[0].rstrip() 280 | zz = i.split('=')[1].lstrip() 281 | value = re.findall(zz, res)[0] 282 | tmp_d[key] = value 283 | 284 | ## 对返回值断言-路径法 285 | 286 | tmp_assert_result = {} #先弄个总的字典存放 287 | if assert_path != '': # 说明有设置 288 | for i in assert_path.split('\n'): 289 | path = i.split('=')[0].rstrip() 290 | want = eval(i.split('=')[1].lstrip()) 291 | py_path = "" 292 | for j in path.split('/'): 293 | if j != '': 294 | if j[0] != '[': 295 | py_path += '["%s"]' % j 296 | else: 297 | py_path += j 298 | value = eval("%s%s" % (json.loads(res), py_path)) 299 | tmp_assert_result[i] = ( want==value ) 300 | 301 | ## 对返回值断言-正则 302 | if assert_zz != '': 303 | for i in assert_zz.split('\n'): 304 | zz = i.split('=')[0].rstrip() 305 | want = i.split('=')[1].lstrip() 306 | value = re.findall(zz, res)[0] 307 | tmp_assert_result[i] = ( want==value ) 308 | 309 | 310 | ## 对返回值断言-全值检测 311 | if assert_qz != '': 312 | for i in assert_qz.split('\n'): 313 | if i not in res: 314 | tmp_assert_result[i] = (False) 315 | else: 316 | tmp_assert_result[i] = (True) 317 | 318 | r_step.assert_result = json.dumps(tmp_assert_result) 319 | r_step.step_id = step_id 320 | r_step.save() 321 | return tmp_d 322 | 323 | def main_request(case_id): 324 | '入口主函数' 325 | tmp_datas = {} # 总临时变量列表 326 | steps = DB_step.objects.filter(Case_id=case_id) 327 | for i in steps: 328 | tmp_d = do_step(i.id,tmp_datas) #tmp_d为单步骤临时变量,列表 329 | tmp_datas.update(tmp_d) 330 | 331 | 332 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ApiTest 2 | 接口测试平台-python3+django+requests实现 公众号:测试开发干货 testerhome社团:测试方舟号 3 | 临时在线体验地址: 用户名密码:admin 123456 或者自己注册也可以 4 | 5 | 感谢各位使用~ 6 | 下载后请先执行: 7 | python3 manage.py makemigrations 8 | python3 manage.py migrate 9 | 10 | 运行命令:python3 manage.py runserver 0.0.0.0:8000 11 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | 5 | if __name__ == "__main__": 6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ApiTest.settings") 7 | try: 8 | from django.core.management import execute_from_command_line 9 | except ImportError: 10 | # The above import may fail for some other reason. Ensure that the 11 | # issue is really that Django is missing to avoid masking other 12 | # exceptions on Python 2. 13 | try: 14 | import django 15 | except ImportError: 16 | raise ImportError( 17 | "Couldn't import Django. Are you sure it's installed and " 18 | "available on your PYTHONPATH environment variable? Did you " 19 | "forget to activate a virtual environment?" 20 | ) 21 | raise 22 | execute_from_command_line(sys.argv) 23 | --------------------------------------------------------------------------------