├── Joy_QA_Platform ├── .DS_Store ├── .gitattributes ├── ApiManager │ ├── __pycache__ │ │ ├── __init__.cpython-36.pyc │ │ ├── managers.cpython-36.pyc │ │ ├── models.cpython-36.pyc │ │ ├── tasks.cpython-36.pyc │ │ └── views.cpython-36.pyc │ ├── managers.py │ ├── models.py │ ├── operations │ │ ├── __pycache__ │ │ │ ├── __init__.cpython-36.pyc │ │ │ ├── operation_auth.cpython-36.pyc │ │ │ ├── operation_case.cpython-36.pyc │ │ │ ├── operation_env.cpython-36.pyc │ │ │ ├── operation_index.cpython-36.pyc │ │ │ ├── operation_locust.cpython-36.pyc │ │ │ ├── operation_module.cpython-36.pyc │ │ │ ├── operation_project.cpython-36.pyc │ │ │ ├── operation_report.cpython-36.pyc │ │ │ └── operation_task.cpython-36.pyc │ │ ├── operation_auth.py │ │ ├── operation_case.py │ │ ├── operation_env.py │ │ ├── operation_index.py │ │ ├── operation_locust.py │ │ ├── operation_module.py │ │ ├── operation_project.py │ │ ├── operation_report.py │ │ └── operation_task.py │ ├── tasks.py │ ├── utils │ │ ├── __pycache__ │ │ │ ├── __init__.cpython-36.pyc │ │ │ ├── case_loader.cpython-36.pyc │ │ │ ├── case_utils.cpython-36.pyc │ │ │ ├── common.cpython-36.pyc │ │ │ ├── file_tools.cpython-36.pyc │ │ │ ├── forms.cpython-36.pyc │ │ │ ├── schedule.cpython-36.pyc │ │ │ └── utils.cpython-36.pyc │ │ ├── case_loader.py │ │ ├── case_utils.py │ │ ├── common.py │ │ ├── file_tools.py │ │ ├── forms.py │ │ ├── schedule.py │ │ ├── slave_locust.py │ │ └── utils.py │ └── views.py ├── Joy_QA_Platform │ ├── __init__.py │ ├── __pycache__ │ │ ├── __init__.cpython-36.pyc │ │ ├── activator.cpython-36.pyc │ │ ├── configs.cpython-36.pyc │ │ ├── settings.cpython-36.pyc │ │ ├── urls.cpython-36.pyc │ │ └── wsgi.cpython-36.pyc │ ├── activator.py │ ├── configs.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── frame │ ├── __pycache__ │ │ ├── __init__.cpython-36.pyc │ │ ├── models.cpython-36.pyc │ │ ├── tasks.cpython-36.pyc │ │ └── views.cpython-36.pyc │ ├── managers.py │ ├── models.py │ ├── tasks.py │ ├── utils │ │ ├── __pycache__ │ │ │ ├── common.cpython-36.pyc │ │ │ ├── forms.cpython-36.pyc │ │ │ └── operation.cpython-36.pyc │ │ ├── common.py │ │ ├── forms.py │ │ └── operation.py │ └── views.py ├── httprunner │ ├── Pipfile │ ├── __about__.py │ ├── __init__.py │ ├── __pycache__ │ │ ├── __about__.cpython-36.pyc │ │ ├── __init__.cpython-36.pyc │ │ ├── built_in.cpython-36.pyc │ │ ├── client.cpython-36.pyc │ │ ├── compat.cpython-36.pyc │ │ ├── context.cpython-36.pyc │ │ ├── exception.cpython-36.pyc │ │ ├── logger.cpython-36.pyc │ │ ├── report.cpython-36.pyc │ │ ├── response.cpython-36.pyc │ │ ├── runner.cpython-36.pyc │ │ ├── task.cpython-36.pyc │ │ ├── testcase.cpython-36.pyc │ │ └── utils.cpython-36.pyc │ ├── built_in.py │ ├── cli.py │ ├── client.py │ ├── compat.py │ ├── context.py │ ├── exception.py │ ├── locusts.py │ ├── logger.py │ ├── report.py │ ├── response.py │ ├── runner.py │ ├── task.py │ ├── templates │ │ ├── default_report_template.html │ │ ├── extent_report_template.html │ │ └── locustfile_template │ ├── testcase.py │ └── utils.py ├── logs │ ├── debug.log │ └── warn.log ├── manage.py ├── requirements.txt ├── slave │ └── QAPlatform │ │ ├── config │ │ ├── debugtalk.py │ │ ├── locust.yml │ │ └── locustfile.py ├── static │ ├── .DS_Store │ ├── api │ │ ├── css │ │ │ ├── bootstrap-datetimepicker.min.css │ │ │ ├── bootstrap-multiselect.css │ │ │ └── daterangepicker.css │ │ ├── js │ │ │ ├── auth.js │ │ │ ├── authtree.js │ │ │ ├── bootstrap-datetimepicker.min.js │ │ │ ├── bootstrap-multiselect.js │ │ │ ├── case_add.js │ │ │ ├── case_list.js │ │ │ ├── commons.js │ │ │ ├── config_list.js │ │ │ ├── config_new.js │ │ │ ├── daterangepicker.js │ │ │ ├── debugtalk_list.js │ │ │ ├── environment_manage.js │ │ │ ├── index.js │ │ │ ├── jquery.json-viewer.js │ │ │ ├── jquery.sticky.js │ │ │ ├── module_list.js │ │ │ ├── module_new.js │ │ │ ├── moment.min.js │ │ │ ├── netutils.js │ │ │ ├── project_list.js │ │ │ ├── project_new.js │ │ │ ├── report_list.js │ │ │ ├── task_list.js │ │ │ ├── task_monitor.js │ │ │ └── task_new.js │ │ └── less │ │ │ ├── auth.less │ │ │ ├── case_add.less │ │ │ ├── case_list.less │ │ │ ├── env_manage.less │ │ │ ├── index.less │ │ │ ├── module_list.less │ │ │ ├── module_new.less │ │ │ ├── project_list.less │ │ │ ├── project_new.less │ │ │ ├── report_list.less │ │ │ ├── task_list.less │ │ │ ├── task_monitor.less │ │ │ └── task_new.less │ ├── frame │ │ ├── css │ │ │ ├── admin.css │ │ │ ├── bootstrap.css │ │ │ ├── bootstrap.min.css │ │ │ ├── common.css │ │ │ ├── css-index.css │ │ │ ├── demo.css │ │ │ ├── demo.css.map │ │ │ ├── jquery.json-viewer.css │ │ │ ├── main.css │ │ │ └── main.css.map │ │ ├── img │ │ │ ├── alphalogo.png │ │ │ ├── apple-icon.png │ │ │ ├── favicon.png │ │ │ └── loginbg.jpg │ │ ├── js │ │ │ ├── app.js │ │ │ ├── commons.js │ │ │ ├── custom.js │ │ │ ├── jquery.json-viewer.js │ │ │ ├── jquery.sticky.js │ │ │ ├── login.js │ │ │ ├── md5.min.js │ │ │ ├── owl.carousel.min.js │ │ │ ├── pageIndicator.js │ │ │ ├── register.js │ │ │ ├── reset.js │ │ │ ├── router.js │ │ │ ├── user.js │ │ │ ├── utils.js │ │ │ └── wow.min.js │ │ ├── scripts │ │ │ ├── klorofil-common.js │ │ │ └── reconnecting-websocket.js │ │ └── vendor │ │ │ ├── bootstrap │ │ │ ├── css │ │ │ │ ├── bootstrap-theme.css │ │ │ │ ├── bootstrap-theme.min.css │ │ │ │ ├── bootstrap.css │ │ │ │ ├── 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-filestyle.min.js │ │ │ │ ├── bootstrap.js │ │ │ │ ├── bootstrap.min.js │ │ │ │ └── npm.js │ │ │ ├── chartist │ │ │ ├── css │ │ │ │ ├── chartist-custom.css │ │ │ │ ├── chartist-custom.css.map │ │ │ │ ├── chartist.css │ │ │ │ └── chartist.min.css │ │ │ ├── js │ │ │ │ ├── chartist.js │ │ │ │ └── chartist.min.js │ │ │ ├── map │ │ │ │ ├── chartist.css.map │ │ │ │ └── chartist.min.js.map │ │ │ └── scss │ │ │ │ └── chartist.scss │ │ │ ├── datatables │ │ │ ├── css │ │ │ │ └── jquery.dataTables.css │ │ │ ├── images │ │ │ │ ├── sort_asc.png │ │ │ │ ├── sort_asc_disabled.png │ │ │ │ ├── sort_both.png │ │ │ │ ├── sort_desc.png │ │ │ │ └── sort_desc_disabled.png │ │ │ └── js │ │ │ │ └── jquery.dataTables.js │ │ │ ├── echarts │ │ │ └── echarts.common.min.js │ │ │ ├── font-awesome │ │ │ ├── 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 │ │ │ ├── googleapis-fonts │ │ │ ├── M2Jd71oPJhLKp0zdtTvoM40tgx99jmYGv_xzYuwd1rU.woff2 │ │ │ ├── M2Jd71oPJhLKp0zdtTvoM7YHq4FgHI02B8rPccK0FJQ.woff2 │ │ │ ├── M2Jd71oPJhLKp0zdtTvoMxgy2Fsj5sj3EzlXpqVXRKo.woff2 │ │ │ ├── ODelI1aHBYDBqgeIAH2zlC2Q8seG17bfDXYR_jUsrzg.woff2 │ │ │ ├── ODelI1aHBYDBqgeIAH2zlNOAHFN6BivSraYkjhveRHY.woff2 │ │ │ ├── ODelI1aHBYDBqgeIAH2zlNV_2ngZ8dMf8fLgjYEouxg.woff2 │ │ │ ├── fonts.css │ │ │ ├── fpTVHK8qsXbIeTHTrnQH6CzM2XYAq8cDhaXsrN8WXcA.woff2 │ │ │ ├── fpTVHK8qsXbIeTHTrnQH6E78GtRp3lhchupCJNw8t58.woff2 │ │ │ ├── fpTVHK8qsXbIeTHTrnQH6GQKuzMuncr0JB710wa2dPI.woff2 │ │ │ ├── fpTVHK8qsXbIeTHTrnQH6Lpx497t94oDua8KfAL9f-E.woff2 │ │ │ ├── fpTVHK8qsXbIeTHTrnQH6MAjkyiewWYrWZc50I8hK7I.woff2 │ │ │ ├── fpTVHK8qsXbIeTHTrnQH6OXKTZYPNtG1yMB_YJSqlic.woff2 │ │ │ ├── toadOcfmlt9b38dHJxOBGCOFnW3Jk0f09zW_Yln67Ac.woff2 │ │ │ ├── toadOcfmlt9b38dHJxOBGClYwVOhDRq2vbpGRTZ7bbs.woff2 │ │ │ ├── toadOcfmlt9b38dHJxOBGDRVvBvQIc1z78c__uoBcyI.woff2 │ │ │ ├── toadOcfmlt9b38dHJxOBGD_j0nMiB9fPhg_k1wdK2h0.woff2 │ │ │ ├── toadOcfmlt9b38dHJxOBGDovqjS_dXPZszO_XltPdNg.woff2 │ │ │ ├── toadOcfmlt9b38dHJxOBGEo0As1BFRXtCDhS66znb_k.woff2 │ │ │ ├── toadOcfmlt9b38dHJxOBGFKFh1TDTPrUZWzVp6FtpG8.woff2 │ │ │ ├── toadOcfmlt9b38dHJxOBGFxe-GPfKKFmiXaJ_Q0GFr8.woff2 │ │ │ ├── toadOcfmlt9b38dHJxOBGOode0-EuMkY--TSyExeINg.woff2 │ │ │ ├── 原始.css │ │ │ └── 说明.txt │ │ │ ├── jquery-slimscroll │ │ │ ├── jquery.slimscroll.js │ │ │ └── jquery.slimscroll.min.js │ │ │ ├── jquery.easy-pie-chart │ │ │ ├── angular.easypiechart.js │ │ │ ├── angular.easypiechart.min.js │ │ │ ├── easypiechart.js │ │ │ ├── easypiechart.min.js │ │ │ ├── jquery.easypiechart.js │ │ │ └── jquery.easypiechart.min.js │ │ │ ├── jquery │ │ │ ├── jquery.js │ │ │ ├── jquery.min.js │ │ │ ├── jquery.min.map │ │ │ └── jquery.serializejson.js │ │ │ ├── layer │ │ │ ├── layer.js │ │ │ ├── mobile │ │ │ │ ├── layer.js │ │ │ │ └── need │ │ │ │ │ └── layer.css │ │ │ └── theme │ │ │ │ └── default │ │ │ │ ├── icon-ext.png │ │ │ │ ├── icon.png │ │ │ │ ├── layer.css │ │ │ │ ├── loading-0.gif │ │ │ │ ├── loading-1.gif │ │ │ │ └── loading-2.gif │ │ │ ├── linearicons │ │ │ ├── fonts │ │ │ │ ├── Linearicons-Free.eot │ │ │ │ ├── Linearicons-Free.svg │ │ │ │ ├── Linearicons-Free.ttf │ │ │ │ ├── Linearicons-Free.woff │ │ │ │ └── Linearicons-Free.woff2 │ │ │ └── style.css │ │ │ ├── modal │ │ │ ├── css │ │ │ │ └── modal.css │ │ │ └── js │ │ │ │ └── modal.js │ │ │ ├── plugins │ │ │ └── less.min.js │ │ │ ├── postbirdalertbox │ │ │ ├── css │ │ │ │ └── postbirdAlertBox.css │ │ │ └── js │ │ │ │ └── postbirdAlertBox.js │ │ │ ├── prettydoc │ │ │ ├── admin.png │ │ │ ├── css │ │ │ │ ├── googleapis.css │ │ │ │ ├── prettify.css │ │ │ │ ├── run_prettify.js │ │ │ │ └── style.css │ │ │ └── js │ │ │ │ ├── jquery.min.js │ │ │ │ ├── layout.js │ │ │ │ ├── prettify │ │ │ │ └── prettify.js │ │ │ │ └── run_prettify.js │ │ │ ├── selectivity │ │ │ ├── javascripts │ │ │ │ └── selectivity-jquery.js │ │ │ └── stylesheets │ │ │ │ └── selectivity-jquery.css │ │ │ ├── toastr │ │ │ ├── toastr.css │ │ │ ├── toastr.js │ │ │ ├── toastr.min.css │ │ │ └── toastr.min.js │ │ │ └── zebra │ │ │ ├── css │ │ │ └── zebra_tooltips.css │ │ │ └── js │ │ │ └── zebra_tooltips.js │ └── layui │ │ ├── css │ │ ├── layui.css │ │ ├── layui.mobile.css │ │ └── modules │ │ │ ├── code.css │ │ │ ├── laydate │ │ │ └── default │ │ │ │ └── laydate.css │ │ │ └── layer │ │ │ └── default │ │ │ ├── icon-ext.png │ │ │ ├── icon.png │ │ │ ├── layer.css │ │ │ ├── loading-0.gif │ │ │ ├── loading-1.gif │ │ │ └── loading-2.gif │ │ ├── font │ │ ├── iconfont.eot │ │ ├── iconfont.svg │ │ ├── iconfont.ttf │ │ └── iconfont.woff │ │ ├── images │ │ └── face │ │ │ ├── 0.gif │ │ │ ├── 1.gif │ │ │ ├── 10.gif │ │ │ ├── 11.gif │ │ │ ├── 12.gif │ │ │ ├── 13.gif │ │ │ ├── 14.gif │ │ │ ├── 15.gif │ │ │ ├── 16.gif │ │ │ ├── 17.gif │ │ │ ├── 18.gif │ │ │ ├── 19.gif │ │ │ ├── 2.gif │ │ │ ├── 20.gif │ │ │ ├── 21.gif │ │ │ ├── 22.gif │ │ │ ├── 23.gif │ │ │ ├── 24.gif │ │ │ ├── 25.gif │ │ │ ├── 26.gif │ │ │ ├── 27.gif │ │ │ ├── 28.gif │ │ │ ├── 29.gif │ │ │ ├── 3.gif │ │ │ ├── 30.gif │ │ │ ├── 31.gif │ │ │ ├── 32.gif │ │ │ ├── 33.gif │ │ │ ├── 34.gif │ │ │ ├── 35.gif │ │ │ ├── 36.gif │ │ │ ├── 37.gif │ │ │ ├── 38.gif │ │ │ ├── 39.gif │ │ │ ├── 4.gif │ │ │ ├── 40.gif │ │ │ ├── 41.gif │ │ │ ├── 42.gif │ │ │ ├── 43.gif │ │ │ ├── 44.gif │ │ │ ├── 45.gif │ │ │ ├── 46.gif │ │ │ ├── 47.gif │ │ │ ├── 48.gif │ │ │ ├── 49.gif │ │ │ ├── 5.gif │ │ │ ├── 50.gif │ │ │ ├── 51.gif │ │ │ ├── 52.gif │ │ │ ├── 53.gif │ │ │ ├── 54.gif │ │ │ ├── 55.gif │ │ │ ├── 56.gif │ │ │ ├── 57.gif │ │ │ ├── 58.gif │ │ │ ├── 59.gif │ │ │ ├── 6.gif │ │ │ ├── 60.gif │ │ │ ├── 61.gif │ │ │ ├── 62.gif │ │ │ ├── 63.gif │ │ │ ├── 64.gif │ │ │ ├── 65.gif │ │ │ ├── 66.gif │ │ │ ├── 67.gif │ │ │ ├── 68.gif │ │ │ ├── 69.gif │ │ │ ├── 7.gif │ │ │ ├── 70.gif │ │ │ ├── 71.gif │ │ │ ├── 8.gif │ │ │ └── 9.gif │ │ ├── lay │ │ └── modules │ │ │ ├── carousel.js │ │ │ ├── code.js │ │ │ ├── element.js │ │ │ ├── flow.js │ │ │ ├── form.js │ │ │ ├── jquery.js │ │ │ ├── laydate.js │ │ │ ├── layedit.js │ │ │ ├── layer.js │ │ │ ├── laypage.js │ │ │ ├── laytpl.js │ │ │ ├── mobile.js │ │ │ ├── table.js │ │ │ ├── tree.js │ │ │ ├── upload.js │ │ │ └── util.js │ │ ├── layui.all.js │ │ └── layui.js ├── suite │ ├── basicLibrary.txt │ └── debugtalk.py └── templates │ ├── api │ ├── auth.html │ ├── case_add.html │ ├── case_list.html │ ├── choose_env.html │ ├── config_add.html │ ├── config_list.html │ ├── config_new.html │ ├── debugtalk.html │ ├── debugtalk_list.html │ ├── edit_case.html │ ├── edit_env.html │ ├── environment_manage.html │ ├── module_list.html │ ├── module_new.html │ ├── project_list.html │ ├── project_new.html │ ├── report_list.html │ ├── task_list.html │ ├── task_monitor.html │ ├── task_new.html │ ├── testcaseclone.html │ ├── testcasecreate.html │ ├── testcasedetails.html │ ├── testcases.html │ ├── testsuiteedit.html │ └── testsuites.html │ ├── frame │ ├── 403.html │ ├── 404.html │ ├── 500.html │ ├── base.html │ ├── base_footer.html │ ├── base_head.html │ ├── base_js.html │ ├── base_navbar.html │ ├── base_sidebar.html │ ├── createnotes.html │ ├── help.html │ ├── index.html │ ├── lock.html │ ├── login.html │ ├── onlineusers.html │ ├── permstest_high.html │ ├── permstest_low.html │ ├── permstest_medium.html │ ├── profile.html │ ├── register.html │ ├── reset.html │ ├── resetpwd.html │ ├── sendallmessages.html │ ├── viewmessages.html │ └── viewnotes.html │ └── report │ ├── template │ └── 测试用例-测试模块-测试项目-2019-03-01-10-43-57-908.html ├── LICENSE └── README.md /Joy_QA_Platform/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/.DS_Store -------------------------------------------------------------------------------- /Joy_QA_Platform/.gitattributes: -------------------------------------------------------------------------------- 1 | *.html linguist-language=Python -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/ApiManager/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/__pycache__/managers.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/ApiManager/__pycache__/managers.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/__pycache__/models.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/ApiManager/__pycache__/models.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/__pycache__/tasks.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/ApiManager/__pycache__/tasks.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/__pycache__/views.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/ApiManager/__pycache__/views.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/operations/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/ApiManager/operations/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/operations/__pycache__/operation_auth.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/ApiManager/operations/__pycache__/operation_auth.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/operations/__pycache__/operation_case.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/ApiManager/operations/__pycache__/operation_case.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/operations/__pycache__/operation_env.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/ApiManager/operations/__pycache__/operation_env.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/operations/__pycache__/operation_index.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/ApiManager/operations/__pycache__/operation_index.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/operations/__pycache__/operation_locust.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/ApiManager/operations/__pycache__/operation_locust.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/operations/__pycache__/operation_module.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/ApiManager/operations/__pycache__/operation_module.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/operations/__pycache__/operation_project.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/ApiManager/operations/__pycache__/operation_project.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/operations/__pycache__/operation_report.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/ApiManager/operations/__pycache__/operation_report.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/operations/__pycache__/operation_task.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/ApiManager/operations/__pycache__/operation_task.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/tasks.py: -------------------------------------------------------------------------------- 1 | # #用例执行 2 | # #@shared_task 装饰器能在没有具体的 Celery 实例时创建任务 3 | from celery import shared_task 4 | from httprunner import HttpRunner 5 | import time,json,os,shutil 6 | from djcelery import celery 7 | from datetime import datetime, date 8 | 9 | import django 10 | 11 | os.environ['DJANGO_SETTINGS_MODULE'] = 'Joy_QA_Platform.settings' 12 | django.setup() 13 | 14 | from ApiManager.models import * 15 | from celery import Celery 16 | 17 | broker = 'redis://127.0.0.1:6379/0' 18 | backend = 'redis://127.0.0.1:6379/1' 19 | 20 | app = Celery('my_task', broker=broker, backend=backend) 21 | 22 | @celery.task 23 | def hrun_path(testset_path, report_name, belong_project, belong_module, report_id='', user_name='', isTask=False): 24 | """ 25 | 用例运行 26 | :param testset_path: dict or list 27 | :param report_name: str 28 | :return: 29 | """ 30 | kwargs = { "failfast": False } 31 | runner = HttpRunner(**kwargs) 32 | runner.run(testset_path) 33 | #删除文件临时文件 34 | root_path = os.path.dirname(os.path.dirname(os.path.dirname(testset_path))) 35 | shutil.rmtree(root_path) 36 | 37 | summary = runner.summary 38 | 39 | # 处理CaseInsensitiveDict不能序列化的问题 40 | for item in summary['records']: 41 | meta_data = item['meta_data'] 42 | if meta_data.__contains__('request_headers') and meta_data.__contains__('response_headers'): 43 | meta_data['request_headers'] = dict(meta_data['request_headers']) 44 | meta_data['response_headers'] = dict(meta_data['response_headers']) 45 | stats = summary['stat'] 46 | if isTask and stats['successes'] == stats['testsRun']: 47 | # 是定时任务,并且没有失败,则不写入报告 48 | pass 49 | else: 50 | saveReport(report_name,belong_project,belong_module,testset_path,runner.summary,report_id,user_name) 51 | return '' 52 | 53 | @celery.task 54 | def locust_run(testset_path): 55 | locusts.run_locusts_with_processes(sys.argv, processes_count) 56 | 57 | def saveReport(report_name,belong_project,belong_module,original_data,result_data,report_id,user_name): 58 | report = ReportInfo(report_name=report_name,belong_project=belong_project,belong_module=belong_module,original_data=dataToJson(original_data), 59 | result_data=dataToJson(result_data),test_time=result_data['time']['start_at'].timestamp(),report_id=report_id,user_name=user_name) 60 | report.save() 61 | 62 | def dataToJson(data): 63 | return json.dumps(data, cls=Encoder) 64 | 65 | 66 | class Encoder(json.JSONEncoder): 67 | def default(self, obj): 68 | result = '' 69 | if isinstance(obj, datetime): 70 | result = obj.strftime('%Y-%m-%d %H:%M:%S') 71 | elif isinstance(obj, date): 72 | result = obj.strftime("%Y-%m-%d") 73 | elif isinstance(obj, bytes): 74 | result = str(obj, encoding='utf-8') 75 | else: 76 | result = json.JSONEncoder.default(self, obj) 77 | return result 78 | 79 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/utils/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/ApiManager/utils/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/utils/__pycache__/case_loader.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/ApiManager/utils/__pycache__/case_loader.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/utils/__pycache__/case_utils.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/ApiManager/utils/__pycache__/case_utils.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/utils/__pycache__/common.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/ApiManager/utils/__pycache__/common.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/utils/__pycache__/file_tools.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/ApiManager/utils/__pycache__/file_tools.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/utils/__pycache__/forms.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/ApiManager/utils/__pycache__/forms.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/utils/__pycache__/schedule.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/ApiManager/utils/__pycache__/schedule.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/utils/__pycache__/utils.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/ApiManager/utils/__pycache__/utils.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/utils/case_utils.py: -------------------------------------------------------------------------------- 1 | import os, shutil, datetime 2 | 3 | from django.core.exceptions import ObjectDoesNotExist 4 | from django.http import JsonResponse 5 | 6 | from ApiManager.models import ModuleInfo, TestCaseInfo, DebugTalk 7 | from ApiManager.utils.common import get_report_name, get_uuid 8 | from ApiManager.utils.file_tools import get_time_stamp, dump_python_file, dump_yaml_file 9 | from ApiManager.utils.case_loader import load_case_data 10 | from ApiManager import tasks 11 | 12 | # 用例执行成功 13 | RUN_CASE_SUC = 1 14 | # 执行用例错误 15 | RUN_CASE_ERR = 0 16 | # 用例解析异常 17 | RUN_CASE_EXCEPTION = -1 18 | 19 | 20 | def run_case_by_id(base_url, case_id, report_name=None ,user_name='测试人员',isTask=False): 21 | result_code = RUN_CASE_EXCEPTION 22 | try: 23 | case = TestCaseInfo.objects.get(id=case_id) 24 | # 存储本次运行所使用的环境 25 | TestCaseInfo.objects.update_case_run_env(case, base_url) 26 | if report_name is None: 27 | # 获取报告名称 28 | projectName = case.belong_module.belong_project.project_name 29 | moduleName = case.belong_module.module_name 30 | report_name = get_report_name(projectName=projectName, moduleName=moduleName, caseName=case.name) 31 | else: 32 | report_name = report_name + '-' + datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') 33 | report_id = get_uuid() 34 | # 加载用例字典 35 | testcase_list = load_case_data(case_id, base_url) 36 | if testcase_list: 37 | # 将yml加入指定目录 字典写入yml文件 38 | yml_path = make_yml(case, testcase_list) 39 | 40 | result = tasks.hrun_path.delay(yml_path, report_name, case.belong_module.belong_project.id, case.belong_module.id, report_id, user_name, isTask) 41 | result_code = report_id 42 | except ValueError: 43 | result_code = RUN_CASE_ERR 44 | return result_code 45 | 46 | # 获取执行yml文件路径 47 | def make_yml(case, testcase_list): 48 | module_id = case.belong_module_id 49 | project_id = ModuleInfo.objects.get(id=module_id).belong_project_id 50 | 51 | project = ModuleInfo.objects.get(id=module_id).belong_project 52 | 53 | path = os.path.join(os.getcwd(), 'suite') 54 | # 时间戳 55 | path = os.path.join(path, get_time_stamp()) 56 | os.mkdir(path) 57 | 58 | testcase_dir_path = os.path.join(path, str(project_id)) 59 | if not os.path.exists(testcase_dir_path): 60 | os.mkdir(testcase_dir_path) 61 | 62 | make_debugtalk(testcase_dir_path, project_id) 63 | 64 | testcase_dir_path = os.path.join(testcase_dir_path, str(module_id)) 65 | if not os.path.exists(testcase_dir_path): 66 | os.mkdir(testcase_dir_path) 67 | 68 | yml_path = os.path.join(testcase_dir_path, case.name + '.yml') 69 | dump_yaml_file(yml_path, testcase_list) 70 | return yml_path 71 | 72 | 73 | # 生成debugtalk文件 74 | def make_debugtalk(testcase_dir_path, project_id): 75 | try: 76 | debugtalk = DebugTalk.objects.get(belong_project_id=project_id).debugtalk 77 | except ObjectDoesNotExist: 78 | debugtalk = '' 79 | # 生成debugtalk文件 80 | debugtalk_path = os.path.join(testcase_dir_path, 'debugtalk.py') 81 | if '#debugtalk.py' == debugtalk or '' == debugtalk: 82 | # 如果是空的 则copy默认文件 83 | root_path = os.path.dirname(os.path.dirname(testcase_dir_path)) 84 | default_debugtalk_path = os.path.join(root_path, 'debugtalk.py') 85 | shutil.copyfile(default_debugtalk_path, debugtalk_path) # 复制文件 86 | else: 87 | dump_python_file(debugtalk_path, debugtalk) 88 | -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/utils/file_tools.py: -------------------------------------------------------------------------------- 1 | import io 2 | import json 3 | import time 4 | import shutil 5 | import yaml 6 | 7 | 8 | def get_time_stamp(): 9 | ct = time.time() 10 | local_time = time.localtime(ct) 11 | data_head = time.strftime("%Y-%m-%d %H-%M-%S", local_time) 12 | data_secs = (ct - int(ct)) * 1000 13 | time_stamp = "%s-%03d" % (data_head, data_secs) 14 | return time_stamp 15 | 16 | 17 | def dump_yaml_file(yaml_file, data): 18 | """ load yaml file and check file content format 19 | """ 20 | with io.open(yaml_file, 'w', encoding='utf-8') as stream: 21 | yaml.dump(data, stream, indent=4, default_flow_style=False, encoding='utf-8') 22 | 23 | 24 | def _dump_json_file(json_file, data): 25 | """ load json file and check file content format 26 | """ 27 | with io.open(json_file, 'w', encoding='utf-8') as stream: 28 | json.dump(data, stream, indent=4, separators=(',', ': '), ensure_ascii=False) 29 | 30 | 31 | def dump_python_file(python_file, data): 32 | with io.open(python_file, 'w', encoding='utf-8') as stream: 33 | stream.write(data) 34 | 35 | def parseYml(path): 36 | with open(path,'r') as f: 37 | data = yaml.load(f) 38 | return data 39 | 40 | # def copyfile(srcfile,dstfile): 41 | # if not os.path.isfile(srcfile): 42 | # print "%s not exist!"%(srcfile) 43 | # else: 44 | # fpath,fname = os.path.split(dstfile) #分离文件名和路径 45 | # if not os.path.exists(fpath): 46 | # os.makedirs(fpath) #创建路径 47 | # shutil.copyfile(srcfile,dstfile) #复制文件 -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/utils/slave_locust.py: -------------------------------------------------------------------------------- 1 | import os, shutil, time 2 | filename_list = ['config','debugtalk.py','locustfile.py','locust.yml'] 3 | 4 | # locust 从机下载配置 5 | LOCUST_DOWNLOAD_URL = '' 6 | LOCUST_DOWNLOAD_USER = '' 7 | LOCUST_DOWNLOAD_PWD = '' 8 | 9 | def get_curr_dir(): 10 | return os.getcwd() 11 | 12 | def download_files(): 13 | for file in filename_list: 14 | QAPlatformPath = get_curr_dir() 15 | dest = os.path.join(QAPlatformPath,file) 16 | cmd = "wget " + LOCUST_DOWNLOAD_URL + file + " --http-user=" + LOCUST_DOWNLOAD_USER + " --http-passwd=" + LOCUST_DOWNLOAD_PWD + " -O " + str(dest) 17 | print(cmd) 18 | os.system(cmd) 19 | if os.path.exists(dest): 20 | cmd = "chmod 777 " + str(dest) 21 | print(cmd) 22 | os.system(cmd) 23 | 24 | def prepare_locust_file(new_host): 25 | QAPlatformPath = get_curr_dir() 26 | locust_file = os.path.join(QAPlatformPath, 'locustfile.py') 27 | write_list = [] 28 | with open(locust_file, 'r') as f: 29 | for line in f.readlines(): 30 | # 替换locustfile中的host参数 31 | if 'host' in line: 32 | old_host = line.split('"')[1] 33 | line = line.replace(old_host, new_host) 34 | # 替换locustfile中的file_path参数 35 | if 'file_path' in line and 'self.' not in line: 36 | old_file_path = line.split('"')[1] 37 | new_file_path = os.path.join(QAPlatformPath, 'locust.yml') 38 | line = line.replace(old_file_path, new_file_path) 39 | write_list.append(line) 40 | f.close() 41 | with open(locust_file, 'w') as f: 42 | for line in write_list: 43 | f.write(line) 44 | f.close() 45 | 46 | def run_locust(master_host): 47 | QAPlatformPath = get_curr_dir() 48 | locust_file = os.path.join(QAPlatformPath, 'locustfile.py') 49 | os.chdir(QAPlatformPath) 50 | cmd = 'locusts -f %s --slave --master-host=%s --master-port=8095' % (locust_file, master_host.strip()) 51 | print(cmd) 52 | os.system(cmd) 53 | 54 | download_files() 55 | 56 | # 读取配置文件 57 | QAPlatformPath = get_curr_dir() 58 | config_file = os.path.join(QAPlatformPath, 'config') 59 | with open(config_file, 'r') as f: 60 | for line in f.readlines(): 61 | # 从配置文件获取master_host 62 | if 'master_host' in line: 63 | master_host = str(line.split('=')[1]) 64 | print(master_host) 65 | # 从配置文件获取request_host 66 | if 'request_host' in line: 67 | request_host = str(line.split('=')[1]) 68 | print(request_host) 69 | 70 | prepare_locust_file(request_host) 71 | run_locust(master_host) 72 | -------------------------------------------------------------------------------- /Joy_QA_Platform/ApiManager/utils/utils.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | 4 | def pagination_for_objects(objects, index): 5 | """ 6 | 分页返回查询结果 7 | """ 8 | if index < 1: 9 | pass 10 | elif index >= 1: 11 | start = (index - 1) * 10 12 | objects = objects[start:start + 10] 13 | return objects 14 | 15 | 16 | def getLogger(): 17 | """ 18 | 获取 mLogger,在 settings.py 中配置 19 | 所有级别日志均输出到控制台中 20 | DEBUG 级别或以上级别日志输出到 debug.log 文件 21 | WARNING 级别或以上级别日志输出到 warn.log 文件 22 | """ 23 | return logging.getLogger('mLogger') 24 | 25 | 26 | logger = getLogger() 27 | -------------------------------------------------------------------------------- /Joy_QA_Platform/Joy_QA_Platform/__init__.py: -------------------------------------------------------------------------------- 1 | # 2 | from __future__ import absolute_import, unicode_literals 3 | 4 | # This will make sure the app is always imported when 5 | # Django starts so that shared_task will use this app. 6 | #from .celery import app as celery_app 7 | 8 | #__all__ = ['celery_app'] 9 | 10 | 11 | # import pymysql 12 | # pymysql.install_as_MySQLdb() -------------------------------------------------------------------------------- /Joy_QA_Platform/Joy_QA_Platform/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/Joy_QA_Platform/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/Joy_QA_Platform/__pycache__/activator.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/Joy_QA_Platform/__pycache__/activator.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/Joy_QA_Platform/__pycache__/configs.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/Joy_QA_Platform/__pycache__/configs.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/Joy_QA_Platform/__pycache__/settings.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/Joy_QA_Platform/__pycache__/settings.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/Joy_QA_Platform/__pycache__/urls.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/Joy_QA_Platform/__pycache__/urls.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/Joy_QA_Platform/__pycache__/wsgi.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/Joy_QA_Platform/__pycache__/wsgi.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/Joy_QA_Platform/activator.py: -------------------------------------------------------------------------------- 1 | # 2 | 3 | from django.http import HttpResponse 4 | from django.shortcuts import render 5 | from django.http import JsonResponse 6 | from frame.utils.common import get_ajax_msg 7 | from ApiManager.utils.utils import logger 8 | import traceback 9 | 10 | 11 | def process(request, **kwargs): 12 | app = kwargs.pop('app', None) 13 | fun = kwargs.pop('function', None) 14 | index = kwargs.pop('id', None) 15 | 16 | # print(('app==>{app},\nfun==>{fun},\nindex==>{index}'.format(app=app,fun=fun,index=index))) 17 | app_module = app 18 | 19 | if app == 'api': 20 | app_module = 'ApiManager' 21 | elif app == 'frame': 22 | app_module = 'frame' 23 | elif app == None: 24 | app_module = 'frame' 25 | app = 'frame' 26 | fun = 'login' 27 | 28 | try: 29 | app_module = __import__("%s.views" % app_module) 30 | view = getattr(app_module, 'views') 31 | fun = getattr(view, fun) 32 | 33 | # 执行view.py中的函数,并获取其返回值 34 | # result = fun(request, index) if index else fun(request) 35 | result = execute_views(fun, request=request, app=app, index=index) 36 | except (ImportError, AttributeError) as e: 37 | err_msg = '\n' 38 | err_msg += 'str(Exception):\t\t' + str(Exception) + '\n' 39 | err_msg += 'str(e):\t\t\t\t' + str(e) + '\n' 40 | err_msg += 'repr(e):\t\t\t' + repr(e) + '\n' 41 | err_msg += 'e.args:\t\t\t\t' + str(e.args) + '\n' 42 | err_msg += 'traceback.format_exc():\n' + str(traceback.format_exc()) 43 | logger.error(err_msg) 44 | return HttpResponse('404 Not Found') 45 | except Exception as e: 46 | err_msg = '\n' 47 | err_msg += 'str(Exception):\t\t' + str(Exception) + '\n' 48 | err_msg += 'str(e):\t\t\t\t' + str(e) + '\n' 49 | err_msg += 'repr(e):\t\t\t' + repr(e) + '\n' 50 | err_msg += 'e.args:\t\t\t\t' + str(e.args) + '\n' 51 | err_msg += 'traceback.format_exc():\n' + str(traceback.format_exc()) 52 | logger.error(err_msg) 53 | return HttpResponse('Exception') 54 | return result 55 | 56 | 57 | def login_required(func): 58 | def inner(*args, **kwargs): 59 | request = kwargs['request'] 60 | app = kwargs['app'] 61 | # ApiManager的接口需要登录权限,否则重定向到登录页面 62 | if app == 'api': 63 | if request.user.is_authenticated: 64 | return func(*args, **kwargs) 65 | else: 66 | if request.method == 'GET': 67 | return render(request, 'frame/login.html') 68 | elif request.method == 'POST': 69 | return JsonResponse(get_ajax_msg(0, 0, '登录状态已失效,请重新登录')) 70 | elif app == 'frame': 71 | return func(*args, **kwargs) 72 | return inner 73 | 74 | 75 | @login_required 76 | def execute_views(fun, request, app, index): 77 | result = fun(request, index) if index else fun(request) 78 | return result 79 | -------------------------------------------------------------------------------- /Joy_QA_Platform/Joy_QA_Platform/configs.py: -------------------------------------------------------------------------------- 1 | 2 | # debug 环境数据库配置 3 | DEBUG_DATABASES_NAME = '' 4 | DEBUG_DATABASES_USER = '' 5 | DEBUG_DATABASES_PWD = '' 6 | DEBUG_DATABASES_HOST = '127.0.0.1' 7 | DEBUG_DATABASES_PORT = '3306' 8 | 9 | # 线上环境数据库配置 10 | DATABASES_NAME = '' 11 | DATABASES_USER = '' 12 | DATABASES_PWD = '' 13 | DATABASES_HOST = '127.0.0.1' 14 | DATABASES_PORT = '3306' 15 | 16 | # 验证码邮件和警报邮件配置 17 | EMAIL_HOST_USER = '' # 邮箱帐号 18 | EMAIL_HOST_PASSWORD = '' # 邮箱密码 19 | EMAIL_FROM = '' # 邮件发送者帐号 20 | 21 | # redis配置 22 | REDIS_LOCATION = 'redis://127.0.0.1:6379' 23 | REDIS_PASSWORD = '' 24 | 25 | # locust相关配置 26 | 27 | # locust 主机工作目录名配置 28 | LOCUST_WORKSPACE_DIR = 'QAPlatform' 29 | LOCUST_MASTER_BIND_PORT = '8095' 30 | 31 | # 默认管理员账号 32 | IS_CREATE_SUPERUSER = True 33 | SUPERUSER_NAME = '' 34 | SUPERUSER_PWD = '' 35 | 36 | # 权限名称 37 | AUTH_ADD_PROJECT = 'ApiManager.add_projectinfo' 38 | AUTH_ADD_MODULE = 'ApiManager.add_moduleinfo' 39 | AUTH_ADD_TASK = 'ApiManager.add_taskinfo' 40 | AUTH_ADD_CASE = 'ApiManager.add_testcaseinfo' 41 | AUTH_DELETE = 'ApiManager.delete_projectinfo' 42 | AUTH_UPDATE = 'ApiManager.change_projectinfo' 43 | AUTH_VIEW = 'ApiManager.view_projectinfo' 44 | 45 | # 邮箱后缀限制 46 | EMAIL_SUFFIX = '' 47 | -------------------------------------------------------------------------------- /Joy_QA_Platform/Joy_QA_Platform/urls.py: -------------------------------------------------------------------------------- 1 | """Joy_QA_Platform 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 URLconf 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,include 17 | from django.contrib import admin 18 | from django.views.generic import RedirectView 19 | 20 | from Joy_QA_Platform.activator import process 21 | 22 | 23 | 24 | #反射机制,动态的路由系统 25 | urlpatterns = [ 26 | 27 | #####静态路由##### 28 | # ① 匹配规则 http://127.0.0.1:8000/admin/* 29 | url(r'^admin/', admin.site.urls), 30 | url(r'^$', process), 31 | url(r'^favicon\.ico$', RedirectView.as_view(url='/static/assets/img/favicon.ico')), 32 | url('^(?P(\w+))/(?P(\w+))/$', process), 33 | url('^(?P(\w+))/(?P(\w+))/(?P(\w+))/$', process), 34 | 35 | ] 36 | -------------------------------------------------------------------------------- /Joy_QA_Platform/Joy_QA_Platform/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for Joy_QA_Platform 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 | import hashlib 12 | 13 | from django.core.wsgi import get_wsgi_application 14 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Joy_QA_Platform.settings") 15 | application = get_wsgi_application() 16 | 17 | from ApiManager.operations.operation_task import restart_running_task 18 | restart_running_task() # 平台重启后,重启正在运行的任务 19 | 20 | from Joy_QA_Platform import configs 21 | from django.contrib.auth import get_user_model 22 | from django.contrib.auth.hashers import make_password 23 | if configs.IS_CREATE_SUPERUSER: 24 | get_user_model().create_superuser('admin', configs.SUPERUSER_NAME, hashlib.md5(configs.SUPERUSER_PWD.encode('utf8')).hexdigest()) # 平台启动,创建超级管理员 25 | -------------------------------------------------------------------------------- /Joy_QA_Platform/frame/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/frame/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/frame/__pycache__/models.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/frame/__pycache__/models.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/frame/__pycache__/tasks.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/frame/__pycache__/tasks.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/frame/__pycache__/views.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/frame/__pycache__/views.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/frame/managers.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | #Django模块通过models.Manager进行数据库查询 需要了解 4 | 5 | '''用户类型表操作''' 6 | class UserTypeManager(models.Manager): 7 | def insert_user_type(self, user_type): 8 | self.create(user_type=user_type) 9 | 10 | def insert_type_name(self, type_name): 11 | self.create(type_name=type_name) 12 | 13 | def insert_type_desc(self, type_desc): 14 | self.create(type_desc=type_desc) 15 | 16 | def get_objects(self, user_type_id): # 根据user_type得到一条数据 17 | return self.get(user_type_id=user_type_id) 18 | 19 | 20 | '''用户信息表操作''' 21 | class UserInfoManager(models.Manager): 22 | def insert_user(self, username, password, email, object): 23 | self.create(username=username, password=password, email=email, user_type=object) 24 | 25 | def query_user(self, username, password): 26 | return self.filter(username__exact=username, password__exact=password).count() 27 | 28 | -------------------------------------------------------------------------------- /Joy_QA_Platform/frame/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | from django.contrib.auth.models import AbstractUser 4 | from django.contrib.auth.hashers import make_password 5 | from datetime import datetime 6 | 7 | 8 | # Create your models here. 9 | class BaseModel(models.Model): 10 | create_time = models.DateTimeField('创建时间', auto_now_add=True) 11 | update_time = models.DateTimeField('更新时间', auto_now=True) 12 | 13 | class Meta: 14 | abstract = True 15 | db_table = 'base_model' 16 | verbose_name = "公共模型" 17 | 18 | 19 | # 用户信息model 20 | class UserInfo(AbstractUser): 21 | class Meta: 22 | db_table = 'user_info' 23 | verbose_name = "用户信息" 24 | 25 | # 重写__str__方法,使用该方法打印实例时输出username,username字段继承自AbstractUser 26 | def __str__(self): 27 | return self.username 28 | 29 | @classmethod 30 | def create_superuser(cls, username, email, password): 31 | if not UserInfo.objects.filter(username=username).exists(): 32 | user_info = UserInfo() 33 | user_info.username = username 34 | user_info.email = email 35 | # 加密password进行保存 36 | user_info.password = make_password(password) 37 | user_info.is_superuser = 1 38 | user_info.save() 39 | 40 | 41 | # 邮箱验证码model 42 | class CaptchaRecord(models.Model): 43 | SEND_CHOICES = ( 44 | ("register", "注册"), 45 | ("reset", "重置密码"), 46 | ("update_email", "修改邮箱"), 47 | ) 48 | receiver = models.EmailField(max_length=50, verbose_name="邮箱") 49 | send_type = models.CharField(choices=SEND_CHOICES, max_length=20, verbose_name="验证码类型") 50 | code = models.CharField(max_length=20, verbose_name="验证码") 51 | # 这里的now得去掉(),不去掉会根据编译时间。而不是根据实例化时间。 52 | send_time = models.DateTimeField(default=datetime.now, verbose_name="发送时间") 53 | is_valid = models.BooleanField('是否有效', default=True) 54 | 55 | class Meta: 56 | db_table = 'captcha_record' 57 | verbose_name = "验证码记录" 58 | 59 | # 重载__str__方法, 使用该方法打印实例时输出验证码和接收者 60 | def __str__(self): 61 | return '{0}({1})'.format(self.code, self.receiver) 62 | -------------------------------------------------------------------------------- /Joy_QA_Platform/frame/tasks.py: -------------------------------------------------------------------------------- 1 | from djcelery import celery 2 | import time 3 | 4 | @celery.task 5 | def sleeptask(i): 6 | from time import sleep 7 | sleep(i) 8 | run_time = time.strftime('%Y-%m-%d %H-%M-%S', time.localtime(time.time())) 9 | print('sleep====>{}'.format(run_time)) 10 | return i 11 | -------------------------------------------------------------------------------- /Joy_QA_Platform/frame/utils/__pycache__/common.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/frame/utils/__pycache__/common.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/frame/utils/__pycache__/forms.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/frame/utils/__pycache__/forms.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/frame/utils/__pycache__/operation.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/frame/utils/__pycache__/operation.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/frame/utils/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | 3 | 4 | # 验证登录表单 5 | class LoginForm(forms.Form): 6 | account = forms.CharField(required=True, error_messages={'required': "账号不能为空"}) 7 | password = forms.CharField(required=True, error_messages={'required': "密码不能为空"}) 8 | 9 | 10 | # 验证注册表单 11 | class RegisterForm(forms.Form): 12 | email = forms.EmailField(required=True, 13 | error_messages={'required': "邮箱不能为空", 14 | 'invalid': "邮箱格式错误"}) 15 | password = forms.CharField(required=True, 16 | min_length=6, 17 | error_messages={'required': "密码不能为空", 18 | 'min_length': "密码至少6位"}) 19 | repassword = forms.CharField(required=True, 20 | min_length=6, 21 | error_messages={'required': "密码不能为空", 22 | 'min_length': "密码至少6位"}) 23 | username = forms.CharField(required=True, 24 | max_length=20, 25 | error_messages={'required': "用户名不能为空", 26 | 'max_length': "用户名最多为20位"}) 27 | emailcapture = forms.CharField(required=True, 28 | error_messages={'required': "验证码不能为空"}) 29 | 30 | 31 | # 验证重置密码表单 32 | class ResetForm(forms.Form): 33 | email = forms.EmailField(required=True, 34 | error_messages={'required': "邮箱不能为空", 35 | 'invalid': "邮箱格式错误"}) 36 | password = forms.CharField(required=True, 37 | min_length=6, 38 | error_messages={'required': "密码不能为空", 39 | 'min_length': "密码至少6位"}) 40 | repassword = forms.CharField(required=True, 41 | min_length=6, 42 | error_messages={'required': "密码不能为空", 43 | 'min_length': "密码至少6位"}) 44 | emailcapture = forms.CharField(required=True, 45 | error_messages={'required': "验证码不能为空"}) 46 | -------------------------------------------------------------------------------- /Joy_QA_Platform/frame/views.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from django.http import JsonResponse 4 | from django.shortcuts import render 5 | 6 | from frame.utils.operation import login_operation, register_operation, captcha_operation, reset_operation, \ 7 | logout_operation, user_list_operation,log_operation 8 | 9 | 10 | def login(request): 11 | if request.method == 'GET': 12 | return render(request, 'frame/login.html') 13 | elif request.method == 'POST': 14 | ajax_msg = login_operation(request) 15 | username = request.POST.get('account') 16 | password = request.POST.get('password') 17 | return JsonResponse(ajax_msg) 18 | 19 | 20 | def register(request): 21 | if request.method == 'GET': 22 | return render(request, 'frame/register.html') 23 | elif request.method == 'POST': 24 | ajax_msg = register_operation(request) 25 | return JsonResponse(ajax_msg) 26 | 27 | 28 | def reset(request): 29 | if request.method == 'GET': 30 | return render(request, 'frame/reset.html') 31 | elif request.method == 'POST': 32 | ajax_msg = reset_operation(request) 33 | return JsonResponse(ajax_msg) 34 | 35 | 36 | def captcha(request): 37 | if request.method == 'POST': 38 | ajax_msg = captcha_operation(request) 39 | return JsonResponse(ajax_msg) 40 | 41 | 42 | def logout(request): 43 | if request.method == 'POST': 44 | ajax_msg = logout_operation(request) 45 | return JsonResponse(ajax_msg) 46 | 47 | def save_log(request): 48 | if request.method == 'POST': 49 | ajax_msg = log_operation(request) 50 | return JsonResponse(ajax_msg) 51 | 52 | def user_list(request): 53 | return user_list_operation(request) 54 | 55 | 56 | -------------------------------------------------------------------------------- /Joy_QA_Platform/httprunner/Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | url = "https://pypi.org/simple" 3 | verify_ssl = true 4 | name = "pypi" 5 | 6 | [packages] 7 | 8 | [dev-packages] 9 | 10 | [requires] 11 | python_version = "3.6" 12 | -------------------------------------------------------------------------------- /Joy_QA_Platform/httprunner/__about__.py: -------------------------------------------------------------------------------- 1 | __title__ = 'HttpRunner' 2 | __description__ = 'One-stop solution for HTTP(S) testing.' 3 | __url__ = 'https://github.com/HttpRunner/HttpRunner' 4 | __version__ = '1.4.7' 5 | __author__ = 'debugtalk' 6 | __author_email__ = 'mail@debugtalk.com' 7 | __license__ = 'MIT' 8 | __copyright__ = 'Copyright 2017 debugtalk' 9 | __cake__ = u'\u2728 \U0001f370 \u2728' -------------------------------------------------------------------------------- /Joy_QA_Platform/httprunner/__init__.py: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | 3 | from httprunner.task import HttpRunner 4 | -------------------------------------------------------------------------------- /Joy_QA_Platform/httprunner/__pycache__/__about__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/httprunner/__pycache__/__about__.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/httprunner/__pycache__/__init__.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/httprunner/__pycache__/__init__.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/httprunner/__pycache__/built_in.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/httprunner/__pycache__/built_in.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/httprunner/__pycache__/client.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/httprunner/__pycache__/client.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/httprunner/__pycache__/compat.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/httprunner/__pycache__/compat.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/httprunner/__pycache__/context.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/httprunner/__pycache__/context.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/httprunner/__pycache__/exception.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/httprunner/__pycache__/exception.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/httprunner/__pycache__/logger.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/httprunner/__pycache__/logger.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/httprunner/__pycache__/report.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/httprunner/__pycache__/report.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/httprunner/__pycache__/response.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/httprunner/__pycache__/response.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/httprunner/__pycache__/runner.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/httprunner/__pycache__/runner.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/httprunner/__pycache__/task.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/httprunner/__pycache__/task.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/httprunner/__pycache__/testcase.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/httprunner/__pycache__/testcase.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/httprunner/__pycache__/utils.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/httprunner/__pycache__/utils.cpython-36.pyc -------------------------------------------------------------------------------- /Joy_QA_Platform/httprunner/compat.py: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | 3 | """ 4 | httprunner.compat 5 | ~~~~~~~~~~~~~~~~~ 6 | 7 | This module handles import compatibility issues between Python 2 and 8 | Python 3. 9 | """ 10 | 11 | import sys 12 | 13 | # ------- 14 | # Pythons 15 | # ------- 16 | 17 | # Syntax sugar. 18 | _ver = sys.version_info 19 | 20 | #: Python 2.x? 21 | is_py2 = (_ver[0] == 2) 22 | 23 | #: Python 3.x? 24 | is_py3 = (_ver[0] == 3) 25 | 26 | try: 27 | import simplejson as json 28 | except ImportError: 29 | import json 30 | 31 | # --------- 32 | # Specifics 33 | # --------- 34 | 35 | if is_py2: 36 | from urllib3.packages.ordered_dict import OrderedDict 37 | 38 | builtin_str = str 39 | bytes = str 40 | str = unicode 41 | basestring = basestring 42 | numeric_types = (int, long, float) 43 | integer_types = (int, long) 44 | 45 | elif is_py3: 46 | from collections import OrderedDict 47 | 48 | builtin_str = str 49 | str = str 50 | bytes = bytes 51 | basestring = (str, bytes) 52 | numeric_types = (int, float) 53 | integer_types = (int,) 54 | -------------------------------------------------------------------------------- /Joy_QA_Platform/httprunner/exception.py: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | 3 | import json 4 | 5 | try: 6 | FileNotFoundError = FileNotFoundError 7 | except NameError: 8 | FileNotFoundError = IOError 9 | 10 | try: 11 | JSONDecodeError = json.decoder.JSONDecodeError 12 | except AttributeError: 13 | JSONDecodeError = ValueError 14 | 15 | class MyBaseError(BaseException): 16 | pass 17 | 18 | class FileFormatError(MyBaseError): 19 | pass 20 | 21 | class ParamsError(MyBaseError): 22 | pass 23 | 24 | class ResponseError(MyBaseError): 25 | pass 26 | 27 | class ParseResponseError(MyBaseError): 28 | pass 29 | 30 | class ValidationError(MyBaseError): 31 | pass 32 | 33 | class NotFoundError(MyBaseError): 34 | pass 35 | 36 | class FunctionNotFound(NotFoundError): 37 | pass 38 | 39 | class VariableNotFound(NotFoundError): 40 | pass 41 | 42 | class ApiNotFound(NotFoundError): 43 | pass 44 | 45 | class SuiteNotFound(NotFoundError): 46 | pass 47 | 48 | class TestcaseNotFound(NotFoundError): 49 | pass 50 | -------------------------------------------------------------------------------- /Joy_QA_Platform/httprunner/locusts.py: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | 3 | import io 4 | import multiprocessing 5 | import os 6 | import sys 7 | 8 | from httprunner.logger import color_print 9 | from httprunner.testcase import TestcaseLoader 10 | from locust.main import main 11 | 12 | 13 | def parse_locustfile(file_path): 14 | """ parse testcase file and return locustfile path. 15 | if file_path is a Python file, assume it is a locustfile 16 | if file_path is a YAML/JSON file, convert it to locustfile 17 | """ 18 | if not os.path.isfile(file_path): 19 | color_print("file path invalid, exit.", "RED") 20 | sys.exit(1) 21 | 22 | file_suffix = os.path.splitext(file_path)[1] 23 | if file_suffix == ".py": 24 | locustfile_path = file_path 25 | elif file_suffix in ['.yaml', '.yml', '.json']: 26 | locustfile_path = gen_locustfile(file_path) 27 | else: 28 | # '' or other suffix 29 | color_print("file type should be YAML/JSON/Python, exit.", "RED") 30 | sys.exit(1) 31 | 32 | return locustfile_path 33 | 34 | def gen_locustfile(testcase_file_path): 35 | """ generate locustfile from template. 36 | """ 37 | locustfile_path = 'locustfile.py' 38 | template_path = os.path.join( 39 | os.path.dirname(os.path.realpath(__file__)), 40 | "templates", 41 | "locustfile_template" 42 | ) 43 | TestcaseLoader.load_test_dependencies() 44 | testset = TestcaseLoader.load_test_file(testcase_file_path) 45 | host = testset.get("config", {}).get("request", {}).get("base_url", "") 46 | 47 | with io.open(template_path, encoding='utf-8') as template: 48 | with io.open(locustfile_path, 'w', encoding='utf-8') as locustfile: 49 | template_content = template.read() 50 | template_content = template_content.replace("$HOST", host) 51 | template_content = template_content.replace("$TESTCASE_FILE", testcase_file_path) 52 | locustfile.write(template_content) 53 | 54 | return locustfile_path 55 | 56 | def start_master(sys_argv): 57 | sys_argv.append("--master") 58 | sys.argv = sys_argv 59 | main() 60 | 61 | def start_slave(sys_argv): 62 | if "--slave" not in sys_argv: 63 | sys_argv.extend(["--slave"]) 64 | 65 | sys.argv = sys_argv 66 | main() 67 | 68 | def run_locusts_with_processes(sys_argv, processes_count): 69 | processes = [] 70 | manager = multiprocessing.Manager() 71 | 72 | for _ in range(processes_count): 73 | p_slave = multiprocessing.Process(target=start_slave, args=(sys_argv,)) 74 | p_slave.daemon = True 75 | p_slave.start() 76 | processes.append(p_slave) 77 | 78 | try: 79 | if "--slave" in sys_argv: 80 | [process.join() for process in processes] 81 | else: 82 | start_master(sys_argv) 83 | except KeyboardInterrupt: 84 | manager.shutdown() 85 | -------------------------------------------------------------------------------- /Joy_QA_Platform/httprunner/logger.py: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | 3 | import logging 4 | import sys 5 | 6 | from colorama import Back, Fore, Style, init 7 | from colorlog import ColoredFormatter 8 | 9 | init(autoreset=True) 10 | 11 | log_colors_config = { 12 | 'DEBUG': 'cyan', 13 | 'INFO': 'green', 14 | 'WARNING': 'yellow', 15 | 'ERROR': 'red', 16 | 'CRITICAL': 'red', 17 | } 18 | 19 | def setup_logger(log_level, log_file=None): 20 | """setup root logger with ColoredFormatter.""" 21 | level = getattr(logging, log_level.upper(), None) 22 | if not level: 23 | color_print("Invalid log level: %s" % log_level, "RED") 24 | sys.exit(1) 25 | 26 | # hide traceback when log level is INFO/WARNING/ERROR/CRITICAL 27 | if level >= logging.INFO: 28 | sys.tracebacklimit = 0 29 | 30 | formatter = ColoredFormatter( 31 | u"%(log_color)s%(bg_white)s%(levelname)-8s%(reset)s %(message)s", 32 | datefmt=None, 33 | reset=True, 34 | log_colors=log_colors_config 35 | ) 36 | 37 | if log_file: 38 | handler = logging.FileHandler(log_file) 39 | else: 40 | handler = logging.StreamHandler() 41 | 42 | handler.setFormatter(formatter) 43 | logging.root.addHandler(handler) 44 | logging.root.setLevel(level) 45 | 46 | 47 | def coloring(text, color="WHITE"): 48 | fore_color = getattr(Fore, color.upper()) 49 | return fore_color + text 50 | 51 | def color_print(msg, color="WHITE"): 52 | fore_color = getattr(Fore, color.upper()) 53 | print(fore_color + msg) 54 | 55 | def log_with_color(level): 56 | """ log with color by different level 57 | """ 58 | def wrapper(text): 59 | color = log_colors_config[level.upper()] 60 | getattr(logging, level.lower())(coloring(text, color)) 61 | 62 | return wrapper 63 | 64 | 65 | log_debug = log_with_color("debug") 66 | log_info = log_with_color("info") 67 | log_warning = log_with_color("warning") 68 | log_error = log_with_color("error") 69 | log_critical = log_with_color("critical") 70 | -------------------------------------------------------------------------------- /Joy_QA_Platform/httprunner/templates/locustfile_template: -------------------------------------------------------------------------------- 1 | #coding: utf-8 2 | import zmq 3 | from locust import HttpLocust, TaskSet, task 4 | from httprunner.task import LocustTask 5 | 6 | class WebPageTasks(TaskSet): 7 | def on_start(self): 8 | self.test_runner = LocustTask(self.locust.file_path, self.client) 9 | 10 | @task 11 | def test_specified_scenario(self): 12 | self.test_runner.run() 13 | 14 | class WebPageUser(HttpLocust): 15 | host = "$HOST" 16 | task_set = WebPageTasks 17 | min_wait = 1000 18 | max_wait = 5000 19 | 20 | file_path = "$TESTCASE_FILE" 21 | -------------------------------------------------------------------------------- /Joy_QA_Platform/logs/debug.log: -------------------------------------------------------------------------------- 1 | [2019-03-01 10:43:55,203] [ERROR] [process] 2 | str(Exception): 3 | str(e): Cannot determine content type 4 | repr(e): WrongAppError('Cannot determine content type',) 5 | e.args: ('Cannot determine content type',) 6 | traceback.format_exc(): 7 | Traceback (most recent call last): 8 | File "/Users/joygames/SVN/QA/Joy_QA_Platform/Joy_QA_Platform/activator.py", line 35, in process 9 | result = execute_views(fun, request=request, app=app, index=index) 10 | File "/Users/joygames/SVN/QA/Joy_QA_Platform/Joy_QA_Platform/activator.py", line 64, in inner 11 | return func(*args, **kwargs) 12 | File "/Users/joygames/SVN/QA/Joy_QA_Platform/Joy_QA_Platform/activator.py", line 77, in execute_views 13 | result = fun(request, index) if index else fun(request) 14 | File "/Users/joygames/SVN/QA/Joy_QA_Platform/ApiManager/views.py", line 21, in project_list 15 | return operation_project.project_list(request) 16 | File "/Users/joygames/SVN/QA/Joy_QA_Platform/ApiManager/operations/operation_project.py", line 52, in project_list 17 | objects = get_objects_for_user(request.user, AUTH_VIEW).all() 18 | File "/usr/local/var/pyenv/versions/3.6.5/lib/python3.6/site-packages/guardian/shortcuts.py", line 485, in get_objects_for_user 19 | raise WrongAppError("Cannot determine content type") 20 | guardian.exceptions.WrongAppError: Cannot determine content type 21 | 22 | -------------------------------------------------------------------------------- /Joy_QA_Platform/logs/warn.log: -------------------------------------------------------------------------------- 1 | [2019-03-01 10:43:55,203] [ERROR] [process] 2 | str(Exception): 3 | str(e): Cannot determine content type 4 | repr(e): WrongAppError('Cannot determine content type',) 5 | e.args: ('Cannot determine content type',) 6 | traceback.format_exc(): 7 | Traceback (most recent call last): 8 | File "/Users/joygames/SVN/QA/Joy_QA_Platform/Joy_QA_Platform/activator.py", line 35, in process 9 | result = execute_views(fun, request=request, app=app, index=index) 10 | File "/Users/joygames/SVN/QA/Joy_QA_Platform/Joy_QA_Platform/activator.py", line 64, in inner 11 | return func(*args, **kwargs) 12 | File "/Users/joygames/SVN/QA/Joy_QA_Platform/Joy_QA_Platform/activator.py", line 77, in execute_views 13 | result = fun(request, index) if index else fun(request) 14 | File "/Users/joygames/SVN/QA/Joy_QA_Platform/ApiManager/views.py", line 21, in project_list 15 | return operation_project.project_list(request) 16 | File "/Users/joygames/SVN/QA/Joy_QA_Platform/ApiManager/operations/operation_project.py", line 52, in project_list 17 | objects = get_objects_for_user(request.user, AUTH_VIEW).all() 18 | File "/usr/local/var/pyenv/versions/3.6.5/lib/python3.6/site-packages/guardian/shortcuts.py", line 485, in get_objects_for_user 19 | raise WrongAppError("Cannot determine content type") 20 | guardian.exceptions.WrongAppError: Cannot determine content type 21 | 22 | [2019-03-01 10:44:02,794] [WARNING] [log_message] "GET /static/assets/img/favicon.ico HTTP/1.1" 404 1695 23 | -------------------------------------------------------------------------------- /Joy_QA_Platform/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", "Joy_QA_Platform.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 | -------------------------------------------------------------------------------- /Joy_QA_Platform/requirements.txt: -------------------------------------------------------------------------------- 1 | Django==2.1.3 2 | django-celery==3.2.2 3 | django-celery-beat==1.1.1 4 | django-celery-results==1.0.1 5 | django-redis==4.10.0 6 | django-guardian==1.4.9 7 | mysqlclient==1.3.13 8 | six==1.11.0 9 | celery==4.2.0 10 | requests==2.19.1 11 | PyYAML==3.13 12 | colorama==0.3.9 13 | colorlog==3.1.4 14 | jinja2==2.10 15 | requests_toolbelt==0.8.0 16 | flower==0.9.2 17 | locustio==0.9.0 -------------------------------------------------------------------------------- /Joy_QA_Platform/slave/QAPlatform/config: -------------------------------------------------------------------------------- 1 | master_host=139.196.173.102 2 | request_host=空白环境空白环境 -------------------------------------------------------------------------------- /Joy_QA_Platform/slave/QAPlatform/locust.yml: -------------------------------------------------------------------------------- 1 | - config: 2 | name: "\u7F51\u7EDC\u8D28\u91CF\u68C0\u6D4BSDK\u67E5\u8BE2\u63A5\u53E3" 3 | parameters: 4 | - type: 5 | - ping.delay 6 | - ping.loss 7 | - traceroute.delay 8 | request: 9 | base_url: "\u7A7A\u767D\u73AF\u5883\u7A7A\u767D\u73AF\u5883" 10 | - test: 11 | name: "\u7F51\u7EDC\u8D28\u91CF\u68C0\u6D4BSDK\u67E5\u8BE2\u63A5\u53E3" 12 | request: 13 | data: 14 | app_id: com.bomwan.mtjsd.vivo 15 | platform: '0' 16 | type: traceroute.delay 17 | headers: 18 | Content-Type: application/json 19 | method: POST 20 | url: https://net-trace.ucloud.cn:8000/api/query/getdata/ 21 | variables: 22 | app_id: com.bomwan.mtjsd.vivo 23 | -------------------------------------------------------------------------------- /Joy_QA_Platform/slave/QAPlatform/locustfile.py: -------------------------------------------------------------------------------- 1 | #coding: utf-8 2 | import zmq 3 | from locust import HttpLocust, TaskSet, task 4 | from httprunner import LocustRunner 5 | import os 6 | 7 | class WebPageTasks(TaskSet): 8 | def on_start(self): 9 | self.test_runner = LocustRunner(self.client) 10 | self.file_path = self.locust.file_path 11 | 12 | @task 13 | def test_specified_scenario(self): 14 | self.test_runner.run(self.file_path) 15 | 16 | 17 | class WebPageUser(HttpLocust): 18 | host = "https://www.baidu.com/" 19 | task_set = WebPageTasks 20 | min_wait = 1000 21 | max_wait = 5000 22 | 23 | file_path = "/Users/wujunfeng/git/QAPlatform/locust.yml" 24 | -------------------------------------------------------------------------------- /Joy_QA_Platform/static/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/.DS_Store -------------------------------------------------------------------------------- /Joy_QA_Platform/static/api/css/bootstrap-multiselect.css: -------------------------------------------------------------------------------- 1 | span.multiselect-native-select{position:relative}span.multiselect-native-select select{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px -1px -1px -3px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important;left:50%;top:30px}.multiselect-container{position:absolute;list-style-type:none;margin:0;padding:0}.multiselect-container .input-group{margin:5px}.multiselect-container .multiselect-reset .input-group{width:93%}.multiselect-container>li{padding:0}.multiselect-container>li>a.multiselect-all label{font-weight:700}.multiselect-container>li.multiselect-group label{margin:0;padding:3px 20px;height:100%;font-weight:700}.multiselect-container>li.multiselect-group-clickable label{cursor:pointer}.multiselect-container>li>a{padding:0}.multiselect-container>li>a>label{margin:0;height:100%;cursor:pointer;font-weight:400;padding:3px 20px 3px 40px}.multiselect-container>li>a>label.checkbox,.multiselect-container>li>a>label.radio{margin:0}.multiselect-container>li>a>label>input[type=checkbox]{margin-bottom:5px}.btn-group>.btn-group:nth-child(2)>.multiselect.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.form-inline .multiselect-container label.checkbox,.form-inline .multiselect-container label.radio{padding:3px 20px 3px 40px}.form-inline .multiselect-container li a label.checkbox input[type=checkbox],.form-inline .multiselect-container li a label.radio input[type=radio]{margin-left:-20px;margin-right:0} -------------------------------------------------------------------------------- /Joy_QA_Platform/static/api/js/debugtalk_list.js: -------------------------------------------------------------------------------- 1 | ; 2 | (function() { 3 | 4 | //加载首页数据 5 | showFirstPage(); 6 | 7 | //设置回调方法(回调参数为需要显示的页数,根据此页数进行网络请求,展示相应数据) 8 | window.PageIndicator.setCallback(function(curr) { 9 | window.APINet.getDebugtalkList({}, curr, function(data) { 10 | var param = JSON.parse(data['data']['debugtalks']); 11 | //console.log(param) 12 | var count = data['data']['count']; 13 | var curr = data['data']['currPage']; 14 | 15 | var proInfo = data['data']['proInfo'] 16 | 17 | for(var index = 0; index < param.length; index ++) { 18 | //处理project_id与project_name 19 | param[index]['project_name'] = proInfo[param[index]['belong_project']] 20 | param[index]['project_id'] = param[index]['belong_project'] 21 | } 22 | 23 | showResult(param); 24 | //设置总条数 25 | window.PageIndicator.setCount(count); 26 | //设置当前显示第几页 27 | window.PageIndicator.setPage(curr); 28 | }); 29 | }); 30 | 31 | function showFirstPage() { 32 | 33 | window.APINet.getDebugtalkList({}, 1, function(data) { 34 | var param = JSON.parse(data['data']['debugtalks']); 35 | //console.log(param) 36 | var count = data['data']['count']; 37 | var curr = data['data']['currPage']; 38 | 39 | var proInfo = data['data']['proInfo'] 40 | 41 | for(var index = 0; index < param.length; index ++) { 42 | //处理project_id与project_name 43 | param[index]['project_name'] = proInfo[param[index]['belong_project']] 44 | param[index]['project_id'] = param[index]['belong_project'] 45 | } 46 | 47 | showResult(param); 48 | //设置总条数 49 | window.PageIndicator.setCount(count); 50 | //设置当前显示第几页 51 | window.PageIndicator.setPage(1); 52 | }); 53 | } 54 | 55 | function showResult(param) { 56 | //清空表格节点 57 | $('#debugtalk_list_body').empty(); 58 | for(var index = 0; index < param.length; index++) { 59 | $("#debugtalk_list_body").append(getDebugtalkElement(param[index], index)); 60 | }; 61 | } 62 | 63 | //生成html元素 64 | function getDebugtalkElement(param, index) { 65 | console.log(param); 66 | var project_name = param['project_name']; 67 | var project_id = param['project_id']; 68 | var update_time = param['update_time']; 69 | var create_time = param['create_time']; 70 | var id = param['id'] 71 | 72 | var debugtalk_str = '' + (id) + '' + 73 | '' + project_name + '' + 'debugtalk.py' + 74 | '' + create_time + '' + 75 | '' + update_time + '' + 76 | ''; 77 | return debugtalk_str; 78 | } 79 | 80 | 81 | 82 | }()); -------------------------------------------------------------------------------- /Joy_QA_Platform/static/api/js/module_new.js: -------------------------------------------------------------------------------- 1 | ; 2 | (function() { 3 | 4 | var ids = ["module_name", "project_name", "test_user", "simple_desc", "other_desc"]; 5 | 6 | $("#module_name").blur(function(){ 7 | //项目名称失去焦点时,填入简要描述和其他信息中 8 | if($("#simple_desc").val().trim() == ""){ 9 | $("#simple_desc").val($(this).val()); 10 | } 11 | if($("#other_desc").val().trim() == ""){ 12 | $("#other_desc").val($(this).val()); 13 | } 14 | }); 15 | 16 | $('#send').click(function() { 17 | createModule(function(data) { 18 | var result = parseInt(data['result']); 19 | window.utils.tips(data['msg'],function(){ 20 | if(result == 1){ 21 | window.pageRouter.toModuleList(); 22 | }else{ 23 | console.log(data); 24 | } 25 | }); 26 | }); 27 | }); 28 | 29 | $('#add_new').click(function() { 30 | createModule(function(data) { 31 | var result = parseInt(data['result']); 32 | window.utils.tips(data['msg'],function(){ 33 | if(result == 1) { 34 | window.pageRouter.toAddModule(); 35 | }else{ 36 | console.log(data); 37 | } 38 | }); 39 | }); 40 | }); 41 | 42 | window.utils.setListener(ids,setNormal); 43 | 44 | window.APINet.getProjectList({}, -1, function(data) { 45 | var result = data['result']; 46 | if(parseInt(result) == 1) { 47 | //获取项目列表成功 48 | var projects = JSON.parse(data['data']['projects']); 49 | for(var index = 0; index < projects.length; index++) { 50 | var project = projects[index] 51 | $("#project_name").append(''); 52 | } 53 | } 54 | }); 55 | 56 | function createModule(callback) { 57 | if(!window.utils.checkInput(ids,setError)){ 58 | return; 59 | } 60 | 61 | var module_name = $('#module_name').val(); 62 | var project_id = $('#project_name').val(); 63 | var test_user = $('#test_user').val(); 64 | var simple_desc = $('#simple_desc').val(); 65 | var other_desc = $('#other_desc').val(); 66 | 67 | window.APINet.createModule({ 68 | module_name: module_name, 69 | belong_project: project_id, 70 | test_user: test_user, 71 | simple_desc: simple_desc, 72 | other_desc: other_desc 73 | }, function(data) { 74 | callback(data); 75 | }); 76 | } 77 | 78 | //设置输入框为有错误状态 79 | function setError(id) { 80 | $('#' + id).parent().parent().addClass('has-error'); 81 | } 82 | 83 | //设置输入框为正常状态 84 | function setNormal(id) { 85 | $('#' + id).parent().parent().removeClass('has-error'); 86 | } 87 | 88 | }()); -------------------------------------------------------------------------------- /Joy_QA_Platform/static/api/js/project_new.js: -------------------------------------------------------------------------------- 1 | ; 2 | (function() { 3 | 4 | var ids = ["project_name", "responsible_name", "test_user", "dev_user", "publish_app", "simple_desc", "other_desc"]; 5 | 6 | $("#project_name").blur(function(){ 7 | //项目名称失去焦点时,填入简要描述和其他信息中 8 | if($("#simple_desc").val().trim() == ""){ 9 | $("#simple_desc").val($(this).val()); 10 | } 11 | if($("#other_desc").val().trim() == ""){ 12 | $("#other_desc").val($(this).val()); 13 | } 14 | }); 15 | 16 | //点击创建项目 17 | $('#send').click(function() { 18 | createProject(function(data) { 19 | var result = parseInt(data['result']); 20 | window.utils.tips(data['msg'],function(){ 21 | if(result == 1){ 22 | window.pageRouter.toProjectList(); 23 | }else{ 24 | console.log(data); 25 | } 26 | }); 27 | }); 28 | }); 29 | 30 | $('#add_module').click(function() { 31 | createProject(function(data) { 32 | var result = parseInt(data['result']); 33 | window.utils.tips(data['msg'],function(){ 34 | if(result == 1) { 35 | window.pageRouter.toAddModule(); 36 | }else{ 37 | console.log(data); 38 | } 39 | }); 40 | }); 41 | }); 42 | 43 | window.utils.setListener(ids,setNormal); 44 | 45 | function createProject(callback) { 46 | if(!window.utils.checkInput(ids,setError)){ 47 | return; 48 | } 49 | 50 | var jsonstr = $('#add_project').serializeJSON(); 51 | window.APINet.createProject(JSON.stringify(jsonstr),function(data){ 52 | callback(data); 53 | }); 54 | } 55 | 56 | //设置输入框为有错误状态 57 | function setError(id) { 58 | $('#' + id).parent().parent().addClass('has-error'); 59 | } 60 | 61 | //设置输入框为正常状态 62 | function setNormal(id) { 63 | $('#' + id).parent().parent().removeClass('has-error'); 64 | } 65 | }()); -------------------------------------------------------------------------------- /Joy_QA_Platform/static/api/less/auth.less: -------------------------------------------------------------------------------- 1 | @btn_backgroud: #dd514c; 2 | 3 | #title { 4 | font-size: 20px; 5 | font-weight: bold; 6 | color: #8C8989; 7 | margin-right: 10px; 8 | } 9 | -------------------------------------------------------------------------------- /Joy_QA_Platform/static/api/less/case_add.less: -------------------------------------------------------------------------------- 1 | #json_text{ 2 | margin: 15px; 3 | } 4 | 5 | 6 | //td{ 7 | // text-align: center; 8 | // vertical-align: middle; 9 | // padding-left: 0px !important; 10 | // padding-right: 0px !important; 11 | //} 12 | -------------------------------------------------------------------------------- /Joy_QA_Platform/static/api/less/case_list.less: -------------------------------------------------------------------------------- 1 | @btn_backgroud:#dd514c; 2 | 3 | #title{ 4 | font-size: 20px; 5 | font-weight: bold; 6 | color: #8C8989; 7 | margin-right: 10px; 8 | } 9 | 10 | #add_case{ 11 | background: @btn_backgroud; 12 | } 13 | 14 | #excute{ 15 | background: @btn_backgroud; 16 | } 17 | 18 | .font-white{ 19 | color: white; 20 | border-radius: 50px; 21 | font-weight: bold; 22 | margin-left: 5px; 23 | } 24 | 25 | #search-bar{ 26 | padding-left: 25px; 27 | padding-bottom: 10px; 28 | 29 | .form-control{ 30 | padding-left: 2px; 31 | } 32 | 33 | .input{ 34 | min-width: 150px; 35 | height: 20px; 36 | top: 50%; 37 | margin-top: -10px; 38 | } 39 | 40 | .search{ 41 | top: 50%; 42 | margin-top: -10px; 43 | } 44 | 45 | .clear{ 46 | top: 50%; 47 | margin-top: -10px; 48 | margin-left: 10px; 49 | } 50 | } 51 | 52 | #case_list_table{ 53 | max-height: 450px; 54 | } 55 | 56 | #page_navigation_wrapper{ 57 | text-align: center; 58 | } 59 | 60 | 61 | .bt-group-class .btn{ 62 | padding: 1px 11px; 63 | margin: 0px 5px; 64 | } 65 | 66 | .modal-content{ 67 | width: 100%; 68 | height: 100%; 69 | } 70 | 71 | #json_text{ 72 | margin: 15px; 73 | } 74 | 75 | -------------------------------------------------------------------------------- /Joy_QA_Platform/static/api/less/env_manage.less: -------------------------------------------------------------------------------- 1 | @btn_backgroud:#dd514c; 2 | 3 | #title{ 4 | font-size: 20px; 5 | font-weight: bold; 6 | color: #8C8989; 7 | margin-right: 10px; 8 | } 9 | 10 | 11 | .bt-group-class .btn{ 12 | padding: 1px 11px; 13 | margin: 0px 5px; 14 | } 15 | 16 | #add_env_button{ 17 | background: @btn_backgroud; 18 | } 19 | 20 | #page_navigation_wrapper{ 21 | text-align: center; 22 | } 23 | 24 | .font-white{ 25 | color: white; 26 | border-radius: 50px; 27 | font-weight: bold; 28 | margin-left: 5px; 29 | } 30 | 31 | .row_wrapper{ 32 | padding-top: 5px; 33 | padding-bottom: 5px; 34 | } 35 | -------------------------------------------------------------------------------- /Joy_QA_Platform/static/api/less/index.less: -------------------------------------------------------------------------------- 1 | #charts_count{ 2 | margin: 15px; 3 | } 4 | 5 | #charts_pie{ 6 | margin:15px; 7 | } 8 | 9 | #chart_container{ 10 | margin: 5px; 11 | } 12 | 13 | #fail_task_list{ 14 | margin: 5px; 15 | margin-left: 20px; 16 | } 17 | 18 | #fail_task_container{ 19 | max-height: 650px; 20 | } 21 | 22 | #start_time_container{ 23 | background-color: #fff; 24 | } 25 | 26 | //#other_chart{ 27 | // margin:15px; 28 | //} 29 | // 30 | //#other_chart1{ 31 | // margin:15px; 32 | //} 33 | // 34 | //#fail_task_list{ 35 | // margin:15px; 36 | //} -------------------------------------------------------------------------------- /Joy_QA_Platform/static/api/less/module_list.less: -------------------------------------------------------------------------------- 1 | @btn_backgroud:#dd514c; 2 | 3 | #title{ 4 | font-size: 20px; 5 | font-weight: bold; 6 | color: #8C8989; 7 | margin-right: 10px; 8 | } 9 | 10 | #add_module{ 11 | background: @btn_backgroud; 12 | } 13 | 14 | #excute{ 15 | background: @btn_backgroud; 16 | } 17 | 18 | .font-white{ 19 | color: white; 20 | border-radius: 50px; 21 | font-weight: bold; 22 | margin-left: 5px; 23 | } 24 | 25 | #search-bar{ 26 | padding-left: 25px; 27 | padding-bottom: 10px; 28 | 29 | .form-control{ 30 | padding-left: 2px; 31 | } 32 | 33 | .input{ 34 | min-width: 150px; 35 | height: 20px; 36 | top: 50%; 37 | margin-top: -10px; 38 | } 39 | 40 | .search{ 41 | top: 50%; 42 | margin-top: -10px; 43 | } 44 | 45 | .clear{ 46 | top: 50%; 47 | margin-top: -10px; 48 | margin-left: 10px; 49 | } 50 | } 51 | 52 | #module_list_body{ 53 | max-height: 450px; 54 | } 55 | 56 | #page_navigation_wrapper{ 57 | text-align: center; 58 | } 59 | 60 | 61 | .bt-group-class .btn{ 62 | padding: 1px 11px; 63 | margin: 0px 5px; 64 | } 65 | 66 | .modal-body{ 67 | 68 | label{ 69 | display: block; 70 | line-height: 34px; 71 | height: 34px; 72 | padding: 0 0 0 0; 73 | margin: auto 0; 74 | } 75 | 76 | .row_wrapper{ 77 | padding: 0 0 0 0; 78 | margin-bottom: 10px; 79 | } 80 | 81 | } -------------------------------------------------------------------------------- /Joy_QA_Platform/static/api/less/module_new.less: -------------------------------------------------------------------------------- 1 | 2 | 3 | #add_module{ 4 | margin-bottom: 15px; 5 | } 6 | -------------------------------------------------------------------------------- /Joy_QA_Platform/static/api/less/project_list.less: -------------------------------------------------------------------------------- 1 | @btn_backgroud:#dd514c; 2 | 3 | #title{ 4 | font-size: 20px; 5 | font-weight: bold; 6 | color: #8C8989; 7 | margin-right: 10px; 8 | } 9 | 10 | #add_project{ 11 | background: @btn_backgroud; 12 | } 13 | 14 | #add_projects{ 15 | background: #0e90d2; 16 | } 17 | 18 | #excute{ 19 | background: @btn_backgroud; 20 | } 21 | 22 | .font-white{ 23 | color: white; 24 | border-radius: 50px; 25 | font-weight: bold; 26 | margin-left: 5px; 27 | } 28 | 29 | #search-bar{ 30 | padding-left: 25px; 31 | padding-bottom: 10px; 32 | 33 | .form-control{ 34 | padding-left: 2px; 35 | } 36 | 37 | .input{ 38 | min-width: 150px; 39 | height: 20px; 40 | top: 50%; 41 | margin-top: -10px; 42 | } 43 | 44 | .search{ 45 | top: 50%; 46 | margin-top: -10px; 47 | } 48 | 49 | .clear{ 50 | top: 50%; 51 | margin-top: -10px; 52 | margin-left: 10px; 53 | } 54 | } 55 | 56 | #project_list_table{ 57 | max-height: 450px; 58 | } 59 | 60 | #page_navigation_wrapper{ 61 | text-align: center; 62 | } 63 | 64 | 65 | .bt-group-class .btn{ 66 | padding: 1px 11px; 67 | margin: 0px 5px; 68 | } 69 | 70 | .modal-body{ 71 | 72 | label{ 73 | display: block; 74 | line-height: 34px; 75 | height: 34px; 76 | padding: 0 0 0 0; 77 | margin: auto 0; 78 | } 79 | 80 | .row_wrapper{ 81 | padding: 0 0 0 0; 82 | margin-bottom: 10px; 83 | } 84 | 85 | } 86 | -------------------------------------------------------------------------------- /Joy_QA_Platform/static/api/less/project_new.less: -------------------------------------------------------------------------------- 1 | 2 | 3 | #add_project{ 4 | margin-bottom: 15px; 5 | } 6 | -------------------------------------------------------------------------------- /Joy_QA_Platform/static/api/less/report_list.less: -------------------------------------------------------------------------------- 1 | @btn_backgroud:#dd514c; 2 | 3 | #title{ 4 | font-size: 20px; 5 | font-weight: bold; 6 | color: #8C8989; 7 | margin-right: 10px; 8 | } 9 | 10 | .font-white{ 11 | color: white; 12 | border-radius: 50px; 13 | font-weight: bold; 14 | margin-left: 5px; 15 | } 16 | 17 | #search-bar{ 18 | padding-left: 25px; 19 | padding-bottom: 10px; 20 | 21 | .form-control{ 22 | padding-left: 2px; 23 | } 24 | 25 | .input{ 26 | min-width: 150px; 27 | height: 20px; 28 | top: 50%; 29 | margin-top: -10px; 30 | } 31 | 32 | .search{ 33 | top: 50%; 34 | margin-top: -10px; 35 | } 36 | 37 | .clear{ 38 | top: 50%; 39 | margin-top: -10px; 40 | margin-left: 10px; 41 | } 42 | 43 | .delete{ 44 | top: 50%; 45 | margin-top: -10px; 46 | margin-left: 10px; 47 | } 48 | } 49 | 50 | #report_list_table{ 51 | max-height: 450px; 52 | } 53 | 54 | #page_navigation_wrapper{ 55 | text-align: center; 56 | } 57 | 58 | 59 | .bt-group-class .btn{ 60 | padding: 1px 11px; 61 | margin: 0px 5px; 62 | } 63 | 64 | -------------------------------------------------------------------------------- /Joy_QA_Platform/static/api/less/task_list.less: -------------------------------------------------------------------------------- 1 | @btn_backgroud: #dd514c; 2 | 3 | #title { 4 | font-size: 20px; 5 | font-weight: bold; 6 | color: #8C8989; 7 | margin-right: 10px; 8 | } 9 | 10 | #add_task { 11 | background: @btn_backgroud; 12 | } 13 | 14 | #add_tasks { 15 | background: #0e90d2; 16 | } 17 | 18 | #excute { 19 | background: @btn_backgroud; 20 | } 21 | 22 | .font-white { 23 | color: white; 24 | border-radius: 50px; 25 | font-weight: bold; 26 | margin-left: 5px; 27 | } 28 | 29 | #search-bar { 30 | padding-left: 25px; 31 | padding-bottom: 10px; 32 | 33 | .form-control { 34 | padding-left: 2px; 35 | } 36 | 37 | .input { 38 | min-width: 150px; 39 | height: 20px; 40 | top: 50%; 41 | margin-top: -10px; 42 | } 43 | 44 | .search { 45 | top: 50%; 46 | margin-top: -10px; 47 | } 48 | } 49 | 50 | #task_list_table { 51 | max-height: 450px; 52 | } 53 | 54 | #page_navigation_wrapper { 55 | text-align: center; 56 | } 57 | 58 | .bt-group-class .btn { 59 | padding: 1px 11px; 60 | margin: 0px 5px; 61 | } 62 | 63 | .modal-body{ 64 | 65 | label{ 66 | display: block; 67 | line-height: 34px; 68 | height: 34px; 69 | padding: 0 0 0 0; 70 | margin: auto 0; 71 | } 72 | 73 | .row_wrapper{ 74 | padding: 0 0 0 0; 75 | margin-bottom: 10px; 76 | } 77 | 78 | } 79 | 80 | .col-md-10 .btn-group { 81 | width: 100%; 82 | } 83 | 84 | .col-md-10 .multiselect { 85 | width: 100%; 86 | text-align: right; 87 | } 88 | 89 | .col-md-10 ul { 90 | width: 100%; 91 | } 92 | 93 | .col-md-10 .multiselect-selected-text { 94 | position: absolute; 95 | left: 0; 96 | right: 25px; 97 | text-align: left; 98 | padding-left: 10px; 99 | } 100 | 101 | .interval { 102 | width: 18%; 103 | margin-right: 2%; 104 | } 105 | 106 | #edit_is_loop { 107 | margin-right: 2%; 108 | width: 16%; 109 | } 110 | -------------------------------------------------------------------------------- /Joy_QA_Platform/static/api/less/task_monitor.less: -------------------------------------------------------------------------------- 1 | @btn_backgroud: #dd514c; 2 | 3 | #title { 4 | font-size: 20px; 5 | font-weight: bold; 6 | color: #8C8989; 7 | margin-right: 10px; 8 | } 9 | 10 | #add_task { 11 | background: @btn_backgroud; 12 | } 13 | 14 | #add_tasks { 15 | background: #0e90d2; 16 | } 17 | 18 | #excute { 19 | background: @btn_backgroud; 20 | } 21 | 22 | .font-white { 23 | color: white; 24 | border-radius: 50px; 25 | font-weight: bold; 26 | margin-left: 5px; 27 | } 28 | 29 | #search-bar { 30 | padding-left: 25px; 31 | padding-bottom: 10px; 32 | 33 | .form-control { 34 | padding-left: 2px; 35 | } 36 | 37 | .input { 38 | min-width: 150px; 39 | height: 20px; 40 | top: 50%; 41 | margin-top: -10px; 42 | } 43 | 44 | .search { 45 | top: 50%; 46 | margin-top: -10px; 47 | } 48 | } 49 | 50 | #monitor_list_table { 51 | max-height: 450px; 52 | } 53 | 54 | #page_navigation_wrapper { 55 | text-align: center; 56 | } 57 | 58 | .bt-group-class .btn { 59 | padding: 1px 11px; 60 | margin: 0px 5px; 61 | } 62 | 63 | .modal-body { 64 | 65 | label { 66 | display: block; 67 | line-height: 34px; 68 | height: 34px; 69 | padding: 0 0 0 0; 70 | margin: auto 0; 71 | } 72 | 73 | .row_wrapper { 74 | padding: 0 0 0 0; 75 | margin-bottom: 10px; 76 | } 77 | 78 | } 79 | 80 | -------------------------------------------------------------------------------- /Joy_QA_Platform/static/api/less/task_new.less: -------------------------------------------------------------------------------- 1 | 2 | #add_task { 3 | margin-bottom: 15px; 4 | } 5 | 6 | .col-md-5 .btn-group { 7 | width: 100%; 8 | } 9 | 10 | .col-md-5 .multiselect { 11 | width: 100%; 12 | text-align: right; 13 | } 14 | 15 | .col-md-5 ul { 16 | width: 100%; 17 | } 18 | 19 | .col-md-5 .multiselect-selected-text { 20 | position: absolute; 21 | left: 0; 22 | right: 25px; 23 | text-align: left; 24 | padding-left: 10px; 25 | } 26 | 27 | .interval { 28 | width: 18%; 29 | margin-right: 2%; 30 | } 31 | 32 | #is_loop { 33 | margin-right: 6%; 34 | width: 16%; 35 | } 36 | 37 | 38 | -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/css/common.css: -------------------------------------------------------------------------------- 1 | table#variables tr td, table#data tr td, table#header tr td, table#validate tr td, 2 | table#extract tr td, table#hooks tr td, table#params tr td { 3 | padding: 0px; 4 | } 5 | 6 | .tips { 7 | 8 | color: rgba(0, 0, 0, 0.5); 9 | 10 | padding-left: 10px; 11 | 12 | } 13 | 14 | .tips_true, .tips_false { 15 | 16 | padding-left: 10px; 17 | 18 | } 19 | 20 | .tips_true { 21 | 22 | color: green; 23 | 24 | } 25 | 26 | .tips_false { 27 | 28 | color: red; 29 | 30 | } 31 | 32 | #pre_case li { 33 | position: relative; 34 | } 35 | 36 | #pre_case i { 37 | -webkit-transition: opacity .2s; 38 | transition: opacity .2s; 39 | opacity: 0; 40 | display: block; 41 | cursor: pointer; 42 | color: #c00; 43 | top: 10px; 44 | right: 40px; 45 | position: absolute; 46 | font-style: normal; 47 | } 48 | 49 | #pre_case li:hover i { 50 | opacity: 1; 51 | } 52 | -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/css/demo.css: -------------------------------------------------------------------------------- 1 | /* All styles created for demo purposes only, you may not need this for your project */ 2 | .demo-button button { 3 | margin-bottom: 5px; } 4 | 5 | .demo-icons li { 6 | margin-bottom: 50px; 7 | text-align: center; } 8 | 9 | .demo-icons .lnr, 10 | .demo-icons .fa { 11 | font-size: 28px; } 12 | 13 | .demo-icons .cssclass { 14 | display: block; 15 | margin-top: 5px; 16 | margin-left: 5px; } 17 | 18 | /*# sourceMappingURL=demo.css.map */ -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/css/demo.css.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "file": "demo.css", 4 | "sources": [ 5 | "../../sass/demo.scss", 6 | "../../sass/mixins/_css3.scss" 7 | ], 8 | "names": [], 9 | "mappings": "AAAA,uFAAuF;AAGvF,AACC,YADW,CACX,MAAM,CAAC;EACN,aAAa,EAAE,GAAG,GAClB;;AAGF,AACC,WADU,CACV,EAAE,CAAC;EACF,aAAa,EAAE,IAAI;EACnB,UAAU,EAAE,MAAM,GAClB;;AAJF,AAMC,WANU,CAMV,IAAI;AANL,AAOC,WAPU,CAOV,GAAG,CAAC;EACH,SAAS,EAAE,IAAI,GACf;;AATF,AAWC,WAXU,CAWV,SAAS,CAAC;EACT,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,GAAG;EACf,WAAW,EAAE,GAAG,GAChB" 10 | } -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/css/jquery.json-viewer.css: -------------------------------------------------------------------------------- 1 | /* Syntax highlighting for JSON objects */ 2 | ul.json-dict, ol.json-array { 3 | list-style-type: none; 4 | margin: 0 0 0 1px; 5 | border-left: 1px dotted #ccc; 6 | padding-left: 2em; 7 | } 8 | 9 | .json-string { 10 | color: #0B7500; 11 | } 12 | 13 | .json-literal { 14 | color: #1A01CC; 15 | font-weight: bold; 16 | } 17 | 18 | /* Toggle button */ 19 | a.json-toggle { 20 | position: relative; 21 | color: inherit; 22 | text-decoration: none; 23 | } 24 | 25 | a.json-toggle:focus { 26 | outline: none; 27 | } 28 | 29 | a.json-toggle:before { 30 | color: #aaa; 31 | content: "\25BC"; /* down arrow */ 32 | position: absolute; 33 | display: inline-block; 34 | width: 1em; 35 | left: -1em; 36 | } 37 | 38 | a.json-toggle.collapsed:before { 39 | transform: rotate(-90deg); /* Use rotated down arrow, prevents right arrow appearing smaller than down arrow in some browsers */ 40 | -ms-transform: rotate(-90deg); 41 | -webkit-transform: rotate(-90deg); 42 | } 43 | 44 | /* Collapsable placeholder links */ 45 | a.json-placeholder { 46 | color: #aaa; 47 | padding: 0 1em; 48 | text-decoration: none; 49 | } 50 | 51 | a.json-placeholder:hover { 52 | text-decoration: underline; 53 | } 54 | -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/img/alphalogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/img/alphalogo.png -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/img/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/img/apple-icon.png -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/img/favicon.png -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/img/loginbg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/img/loginbg.jpg -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/js/login.js: -------------------------------------------------------------------------------- 1 | ; 2 | (function () { 3 | 4 | var ids = ["account", "password"]; 5 | window.utils.setListener(ids, setNormal); 6 | 7 | $('#login_submit').click(function () { 8 | if (!window.utils.checkInput(ids, setError)) { 9 | return; 10 | } 11 | 12 | var post_data = { 13 | "account": $('#account').val(), 14 | "password": md5($('#password').val()), 15 | } 16 | 17 | window.utils.ajax("POST", "/frame/login/", post_data, function (data) { 18 | if (data.result == 1) { 19 | window.location.href = window.location.origin + '/api/index/'; 20 | } else if (data.result == 0) { 21 | window.utils.tips(data.msg, null); 22 | } 23 | }); 24 | }); 25 | 26 | // 设置输入框为有错误状态 27 | function setError(id) { 28 | $('#' + id).parent().parent().addClass('has-error'); 29 | } 30 | 31 | // 设置输入框为正常状态 32 | function setNormal(id) { 33 | $('#' + id).parent().parent().removeClass('has-error'); 34 | } 35 | }()); -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/js/md5.min.js: -------------------------------------------------------------------------------- 1 | !function(n){"use strict";function t(n,t){var r=(65535&n)+(65535&t);return(n>>16)+(t>>16)+(r>>16)<<16|65535&r}function r(n,t){return n<>>32-t}function e(n,e,o,u,c,f){return t(r(t(t(e,n),t(u,f)),c),o)}function o(n,t,r,o,u,c,f){return e(t&r|~t&o,n,t,u,c,f)}function u(n,t,r,o,u,c,f){return e(t&o|r&~o,n,t,u,c,f)}function c(n,t,r,o,u,c,f){return e(t^r^o,n,t,u,c,f)}function f(n,t,r,o,u,c,f){return e(r^(t|~o),n,t,u,c,f)}function i(n,r){n[r>>5]|=128<>>9<<4)]=r;var e,i,a,d,h,l=1732584193,g=-271733879,v=-1732584194,m=271733878;for(e=0;e>5]>>>t%32&255);return r}function d(n){var t,r=[];for(r[(n.length>>2)-1]=void 0,t=0;t>5]|=(255&n.charCodeAt(t/8))<16&&(o=i(o,8*n.length)),r=0;r<16;r+=1)u[r]=909522486^o[r],c[r]=1549556828^o[r];return e=i(u.concat(d(t)),512+8*t.length),a(i(c.concat(e),640))}function g(n){var t,r,e="";for(r=0;r>>4&15)+"0123456789abcdef".charAt(15&t);return e}function v(n){return unescape(encodeURIComponent(n))}function m(n){return h(v(n))}function p(n){return g(m(n))}function s(n,t){return l(v(n),v(t))}function C(n,t){return g(s(n,t))}function A(n,t,r){return t?r?s(t,n):C(t,n):r?m(n):p(n)}"function"==typeof define&&define.amd?define(function(){return A}):"object"==typeof module&&module.exports?module.exports=A:n.md5=A}(this); 2 | //# sourceMappingURL=md5.min.js.map -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/js/register.js: -------------------------------------------------------------------------------- 1 | ; 2 | (function () { 3 | 4 | var ids = ["email", "password", "repassword", "username", "emailcapture"]; 5 | var canSendCaptcha = true; 6 | window.utils.setListener(ids, setNormal); 7 | 8 | $('#register_submit').click(function () { 9 | if (!window.utils.checkInput(ids, setError)) { 10 | return; 11 | } 12 | 13 | var post_data = { 14 | "email": $('#email').val(), 15 | "password": md5($('#password').val()), 16 | "repassword": md5($('#repassword').val()), 17 | "username": $('#username').val(), 18 | "emailcapture": $('#emailcapture').val(), 19 | } 20 | 21 | window.utils.ajax("POST", "/frame/register/", post_data, function (data) { 22 | if (data.result == 1) { 23 | window.utils.tips(data.msg, null); 24 | window.location.href = window.location.origin + '/frame/login/'; 25 | } else if (data.result == 0) { 26 | window.utils.tips(data.msg, null); 27 | } 28 | }); 29 | }); 30 | 31 | $('#get_register_captcha').click(function () { 32 | if (canSendCaptcha) { 33 | if (!window.utils.checkInput(["email"], setError)) { 34 | return; 35 | } 36 | 37 | var post_data = { 38 | "receiver": $('#email').val(), 39 | "send_type": "register", 40 | } 41 | 42 | $('#get_register_captcha').attr("disabled", true); 43 | $('#get_register_captcha').css("background-color", "#eeeeee"); 44 | $('#get_register_captcha').css("color", "#1dacfc"); 45 | $('#get_register_captcha').text("60秒后再次请求"); 46 | timeDown("get_register_captcha", 59); 47 | 48 | window.utils.ajax("POST", "/frame/captcha/", post_data, function (data) { 49 | if (data.result == 0) { 50 | alert(data.msg); 51 | window.utils.tips(data.msg, null); 52 | } 53 | }); 54 | } 55 | }); 56 | 57 | // 设置输入框为有错误状态 58 | function setError(id) { 59 | $('#' + id).parent().parent().addClass('has-error'); 60 | } 61 | 62 | // 设置输入框为正常状态 63 | function setNormal(id) { 64 | $('#' + id).parent().parent().removeClass('has-error'); 65 | } 66 | 67 | // 倒计时 68 | function timeDown(id, timeInterval) { 69 | var interval = setInterval(function () { 70 | console.log('daojishi'); 71 | $('#' + id).text(timeInterval + '秒后再次请求'); 72 | timeInterval--; 73 | if (timeInterval == 0) { 74 | clearInterval(interval); 75 | $('#' + id).text('重新发送'); 76 | $('#' + id).attr("disabled", false); 77 | $('#' + id).css("background-color", "#1dacfc"); 78 | $('#' + id).css("color", "#ffffff"); 79 | } 80 | }, 1000); 81 | } 82 | 83 | }()); -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/js/reset.js: -------------------------------------------------------------------------------- 1 | ; 2 | (function () { 3 | 4 | var ids = ["email", "password", "repassword", "emailcapture"]; 5 | window.utils.setListener(ids, setNormal); 6 | 7 | $('#reset_submit').click(function () { 8 | if (!window.utils.checkInput(ids, setError)) { 9 | return; 10 | } 11 | 12 | var post_data = { 13 | "email": $('#email').val(), 14 | "password": md5($('#password').val()), 15 | "repassword": md5($('#repassword').val()), 16 | "emailcapture": $('#emailcapture').val(), 17 | } 18 | 19 | window.utils.ajax("POST", "/frame/reset/", post_data, function (data) { 20 | if (data.result == 1) { 21 | window.utils.tips(data.msg, null); 22 | window.location.href = window.location.origin + '/frame/login/'; 23 | } else if (data.result == 0) { 24 | window.utils.tips(data.msg, null); 25 | } 26 | }); 27 | }); 28 | 29 | $('#get_reset_captcha').click(function () { 30 | if (!window.utils.checkInput(["email"], setError)) { 31 | return; 32 | } 33 | 34 | var post_data = { 35 | "receiver": $('#email').val(), 36 | "send_type": "reset", 37 | } 38 | 39 | $('#get_reset_captcha').attr("disabled", true); 40 | $('#get_reset_captcha').css("background-color", "#eeeeee"); 41 | $('#get_reset_captcha').css("color", "#1dacfc"); 42 | $('#get_reset_captcha').text("60秒后再次请求"); 43 | timeDown("get_reset_captcha", 59); 44 | 45 | window.utils.ajax("POST", "/frame/captcha/", post_data, function (data) { 46 | if (data.result == 0) { 47 | window.utils.tips(data.msg, null); 48 | } 49 | }); 50 | }); 51 | 52 | //倒计时 53 | function timeDown(id, timeInterval) { 54 | var interval = setInterval(function () { 55 | $('#' + id).text(timeInterval + '秒后再次请求'); 56 | timeInterval--; 57 | if (timeInterval == 0) { 58 | clearInterval(interval); 59 | $('#' + id).text('重新发送'); 60 | $('#' + id).attr("disabled", false); 61 | $('#' + id).css("background-color", "#1dacfc"); 62 | $('#' + id).css("color", "#ffffff"); 63 | } 64 | }, 1000); 65 | } 66 | 67 | // 设置输入框为有错误状态 68 | function setError(id) { 69 | $('#' + id).parent().parent().addClass('has-error'); 70 | } 71 | 72 | // 设置输入框为正常状态 73 | function setNormal(id) { 74 | $('#' + id).parent().parent().removeClass('has-error'); 75 | } 76 | }()); -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/js/router.js: -------------------------------------------------------------------------------- 1 | ; 2 | (function () { 3 | 4 | function toAddProject() { 5 | window.location.href = '/api/project_create/'; 6 | } 7 | 8 | function toProjectList() { 9 | window.location.href = '/api/project_list/'; 10 | } 11 | 12 | function toAddCase(){ 13 | window.location.href = '/api/case_create/'; 14 | } 15 | 16 | function toAddModule() { 17 | window.location.href = '/api/module_create/'; 18 | } 19 | 20 | function toModuleList() { 21 | window.location.href = '/api/module_list/'; 22 | } 23 | 24 | function toAddConfig() { 25 | window.location.href = '/api/config_new/'; 26 | } 27 | 28 | function toAddTask() { 29 | window.location.href = '/api/task_create/'; 30 | } 31 | 32 | function toTaskList() { 33 | window.location.href = '/api/task_list/' 34 | } 35 | 36 | function toCaseList(){ 37 | window.location.href = '/api/case_list/' 38 | } 39 | 40 | function toRport(id){ 41 | window.location.href = '/api/report_query?id='+id; 42 | } 43 | 44 | window.pageRouter = { 45 | toAddProject: toAddProject, 46 | toAddModule: toAddModule, 47 | toAddConfig: toAddConfig, 48 | toAddTask: toAddTask, 49 | toAddCase: toAddCase, 50 | toProjectList: toProjectList, 51 | toModuleList: toModuleList, 52 | toTaskList: toTaskList, 53 | toCaseList: toCaseList, 54 | toRport: toRport 55 | } 56 | 57 | }()); -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/js/user.js: -------------------------------------------------------------------------------- 1 | ; 2 | (function () { 3 | 4 | function ajax_request(method, url, request_data, success) { 5 | $.ajax({ 6 | cache: false, 7 | type: method, 8 | url: url, 9 | data: request_data, 10 | async: true, 11 | success: success, 12 | }); 13 | } 14 | 15 | $('#login_submit').click(function () { 16 | var post_data = { 17 | "account": $('#account').val(), 18 | "password": $('#password').val(), 19 | } 20 | ajax_request("POST", "/frame/login/", post_data, function (data) { 21 | if (data.result == 1) { 22 | window.location.href = window.location.origin + '/api/index/'; 23 | } else if (data.result == 0) { 24 | alert(data.msg) 25 | } 26 | }); 27 | }); 28 | 29 | $('#register_submit').click(function () { 30 | var post_data = { 31 | "email": $('#email').val(), 32 | "password": $('#password').val(), 33 | "repassword": $('#repassword').val(), 34 | "username": $('#username').val(), 35 | "emailcapture": $('#emailcapture').val(), 36 | } 37 | ajax_request("POST", "/frame/register/", post_data, function (data) { 38 | if (data.result == 1) { 39 | alert(data.msg) 40 | window.location.href = window.location.origin + '/frame/login/'; 41 | } else if (data.result == 0) { 42 | alert(data.msg) 43 | } 44 | }); 45 | }); 46 | 47 | $('#logout').click(function () { 48 | ajax_request("POST", "/frame/logout/", null, function (data) { 49 | if (data.result == 1) { 50 | window.utils.tips(data.msg, null); 51 | window.location.href = window.location.origin + '/frame/login/'; 52 | } else if (data.result == 0) { 53 | window.utils.tips(data.msg, null); 54 | } 55 | }); 56 | }); 57 | 58 | $('#reset_submit').click(function () { 59 | var post_data = { 60 | "email": $('#email').val(), 61 | "password": $('#password').val(), 62 | "repassword": $('#repassword').val(), 63 | "emailcapture": $('#emailcapture').val(), 64 | } 65 | ajax_request("POST", "/frame/reset/", post_data, function (data) { 66 | if (data.result == 1) { 67 | alert(data.msg) 68 | window.location.href = window.location.origin + '/frame/login/'; 69 | } else if (data.result == 0) { 70 | alert(data.msg) 71 | } 72 | }); 73 | }); 74 | 75 | $('#get_register_captcha').click(function () { 76 | var post_data = { 77 | "receiver": $('#email').val(), 78 | "send_type": "register", 79 | } 80 | $(this).text("重新发送"); 81 | ajax_request("POST", "/frame/captcha/", post_data, function (data) { 82 | if (data.result == 0) { 83 | alert(data.msg) 84 | } 85 | }); 86 | }); 87 | 88 | $('#get_reset_captcha').click(function () { 89 | var post_data = { 90 | "receiver": $('#email').val(), 91 | "send_type": "reset", 92 | } 93 | $(this).text("重新发送"); 94 | ajax_request("POST", "/frame/captcha/", post_data, function (data) { 95 | if (data.result == 0) { 96 | alert(data.msg) 97 | } 98 | }); 99 | }); 100 | 101 | }()); -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/bootstrap/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/bootstrap/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/bootstrap/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/bootstrap/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/bootstrap/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/bootstrap/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') -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/datatables/images/sort_asc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/datatables/images/sort_asc.png -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/datatables/images/sort_asc_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/datatables/images/sort_asc_disabled.png -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/datatables/images/sort_both.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/datatables/images/sort_both.png -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/datatables/images/sort_desc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/datatables/images/sort_desc.png -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/datatables/images/sort_desc_disabled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/datatables/images/sort_desc_disabled.png -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/font-awesome/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/font-awesome/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/font-awesome/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/font-awesome/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/font-awesome/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/font-awesome/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/font-awesome/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/font-awesome/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/font-awesome/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/font-awesome/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/googleapis-fonts/M2Jd71oPJhLKp0zdtTvoM40tgx99jmYGv_xzYuwd1rU.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/googleapis-fonts/M2Jd71oPJhLKp0zdtTvoM40tgx99jmYGv_xzYuwd1rU.woff2 -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/googleapis-fonts/M2Jd71oPJhLKp0zdtTvoM7YHq4FgHI02B8rPccK0FJQ.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/googleapis-fonts/M2Jd71oPJhLKp0zdtTvoM7YHq4FgHI02B8rPccK0FJQ.woff2 -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/googleapis-fonts/M2Jd71oPJhLKp0zdtTvoMxgy2Fsj5sj3EzlXpqVXRKo.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/googleapis-fonts/M2Jd71oPJhLKp0zdtTvoMxgy2Fsj5sj3EzlXpqVXRKo.woff2 -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/googleapis-fonts/ODelI1aHBYDBqgeIAH2zlC2Q8seG17bfDXYR_jUsrzg.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/googleapis-fonts/ODelI1aHBYDBqgeIAH2zlC2Q8seG17bfDXYR_jUsrzg.woff2 -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/googleapis-fonts/ODelI1aHBYDBqgeIAH2zlNOAHFN6BivSraYkjhveRHY.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/googleapis-fonts/ODelI1aHBYDBqgeIAH2zlNOAHFN6BivSraYkjhveRHY.woff2 -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/googleapis-fonts/ODelI1aHBYDBqgeIAH2zlNV_2ngZ8dMf8fLgjYEouxg.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/googleapis-fonts/ODelI1aHBYDBqgeIAH2zlNV_2ngZ8dMf8fLgjYEouxg.woff2 -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/googleapis-fonts/fpTVHK8qsXbIeTHTrnQH6CzM2XYAq8cDhaXsrN8WXcA.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/googleapis-fonts/fpTVHK8qsXbIeTHTrnQH6CzM2XYAq8cDhaXsrN8WXcA.woff2 -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/googleapis-fonts/fpTVHK8qsXbIeTHTrnQH6E78GtRp3lhchupCJNw8t58.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/googleapis-fonts/fpTVHK8qsXbIeTHTrnQH6E78GtRp3lhchupCJNw8t58.woff2 -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/googleapis-fonts/fpTVHK8qsXbIeTHTrnQH6GQKuzMuncr0JB710wa2dPI.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/googleapis-fonts/fpTVHK8qsXbIeTHTrnQH6GQKuzMuncr0JB710wa2dPI.woff2 -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/googleapis-fonts/fpTVHK8qsXbIeTHTrnQH6Lpx497t94oDua8KfAL9f-E.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/googleapis-fonts/fpTVHK8qsXbIeTHTrnQH6Lpx497t94oDua8KfAL9f-E.woff2 -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/googleapis-fonts/fpTVHK8qsXbIeTHTrnQH6MAjkyiewWYrWZc50I8hK7I.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/googleapis-fonts/fpTVHK8qsXbIeTHTrnQH6MAjkyiewWYrWZc50I8hK7I.woff2 -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/googleapis-fonts/fpTVHK8qsXbIeTHTrnQH6OXKTZYPNtG1yMB_YJSqlic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/googleapis-fonts/fpTVHK8qsXbIeTHTrnQH6OXKTZYPNtG1yMB_YJSqlic.woff2 -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/googleapis-fonts/toadOcfmlt9b38dHJxOBGCOFnW3Jk0f09zW_Yln67Ac.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/googleapis-fonts/toadOcfmlt9b38dHJxOBGCOFnW3Jk0f09zW_Yln67Ac.woff2 -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/googleapis-fonts/toadOcfmlt9b38dHJxOBGClYwVOhDRq2vbpGRTZ7bbs.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/googleapis-fonts/toadOcfmlt9b38dHJxOBGClYwVOhDRq2vbpGRTZ7bbs.woff2 -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/googleapis-fonts/toadOcfmlt9b38dHJxOBGDRVvBvQIc1z78c__uoBcyI.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/googleapis-fonts/toadOcfmlt9b38dHJxOBGDRVvBvQIc1z78c__uoBcyI.woff2 -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/googleapis-fonts/toadOcfmlt9b38dHJxOBGD_j0nMiB9fPhg_k1wdK2h0.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/googleapis-fonts/toadOcfmlt9b38dHJxOBGD_j0nMiB9fPhg_k1wdK2h0.woff2 -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/googleapis-fonts/toadOcfmlt9b38dHJxOBGDovqjS_dXPZszO_XltPdNg.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/googleapis-fonts/toadOcfmlt9b38dHJxOBGDovqjS_dXPZszO_XltPdNg.woff2 -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/googleapis-fonts/toadOcfmlt9b38dHJxOBGEo0As1BFRXtCDhS66znb_k.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/googleapis-fonts/toadOcfmlt9b38dHJxOBGEo0As1BFRXtCDhS66znb_k.woff2 -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/googleapis-fonts/toadOcfmlt9b38dHJxOBGFKFh1TDTPrUZWzVp6FtpG8.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/googleapis-fonts/toadOcfmlt9b38dHJxOBGFKFh1TDTPrUZWzVp6FtpG8.woff2 -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/googleapis-fonts/toadOcfmlt9b38dHJxOBGFxe-GPfKKFmiXaJ_Q0GFr8.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/googleapis-fonts/toadOcfmlt9b38dHJxOBGFxe-GPfKKFmiXaJ_Q0GFr8.woff2 -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/googleapis-fonts/toadOcfmlt9b38dHJxOBGOode0-EuMkY--TSyExeINg.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/googleapis-fonts/toadOcfmlt9b38dHJxOBGOode0-EuMkY--TSyExeINg.woff2 -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/googleapis-fonts/说明.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/frame/vendor/googleapis-fonts/说明.txt -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/layer/mobile/layer.js: -------------------------------------------------------------------------------- 1 | /*! layer mobile-v2.0.0 Web弹层组件 MIT License http://layer.layui.com/mobile By 贤心 */ 2 | ;!function(e){"use strict";var t=document,n="querySelectorAll",i="getElementsByClassName",a=function(e){return t[n](e)},s={type:0,shade:!0,shadeClose:!0,fixed:!0,anim:"scale"},l={extend:function(e){var t=JSON.parse(JSON.stringify(s));for(var n in e)t[n]=e[n];return t},timer:{},end:{}};l.touch=function(e,t){e.addEventListener("click",function(e){t.call(this,e)},!1)};var r=0,o=["layui-m-layer"],c=function(e){var t=this;t.config=l.extend(e),t.view()};c.prototype.view=function(){var e=this,n=e.config,s=t.createElement("div");e.id=s.id=o[0]+r,s.setAttribute("class",o[0]+" "+o[0]+(n.type||0)),s.setAttribute("index",r);var l=function(){var e="object"==typeof n.title;return n.title?'

'+(e?n.title[0]:n.title)+"

":""}(),c=function(){"string"==typeof n.btn&&(n.btn=[n.btn]);var e,t=(n.btn||[]).length;return 0!==t&&n.btn?(e=''+n.btn[0]+"",2===t&&(e=''+n.btn[1]+""+e),'
'+e+"
"):""}();if(n.fixed||(n.top=n.hasOwnProperty("top")?n.top:100,n.style=n.style||"",n.style+=" top:"+(t.body.scrollTop+n.top)+"px"),2===n.type&&(n.content='

'+(n.content||"")+"

"),n.skin&&(n.anim="up"),"msg"===n.skin&&(n.shade=!1),s.innerHTML=(n.shade?"
':"")+'
"+l+'
'+n.content+"
"+c+"
",!n.type||2===n.type){var d=t[i](o[0]+n.type),y=d.length;y>=1&&layer.close(d[0].getAttribute("index"))}document.body.appendChild(s);var u=e.elem=a("#"+e.id)[0];n.success&&n.success(u),e.index=r++,e.action(n,u)},c.prototype.action=function(e,t){var n=this;e.time&&(l.timer[n.index]=setTimeout(function(){layer.close(n.index)},1e3*e.time));var a=function(){var t=this.getAttribute("type");0==t?(e.no&&e.no(),layer.close(n.index)):e.yes?e.yes(n.index):layer.close(n.index)};if(e.btn)for(var s=t[i]("layui-m-layerbtn")[0].children,r=s.length,o=0;o 1) { 34 | var $anchor = $(href).first(); 35 | 36 | if ($anchor.length > 0) { 37 | var offset = $anchor.offset(); 38 | 39 | if (top < offset.top - AFFIX_OFFSET) { 40 | return last; 41 | } 42 | 43 | last = $link; 44 | } 45 | } 46 | } 47 | return last; 48 | } 49 | 50 | 51 | $(window).on("scroll", function (evt) { 52 | var top = window.scrollY, 53 | height = $affixNav.outerHeight(), 54 | max_bottom = $container.offset().top + $container.outerHeight(), 55 | bottom = top + height + AFFIX_OFFSET; 56 | 57 | if (affixNavfixed) { 58 | if (top <= AFFIX_TOP_LIMIT) { 59 | $affixNav.removeClass("fixed"); 60 | $affixNav.css("top", 0); 61 | affixNavfixed = false; 62 | } else if (bottom > max_bottom) { 63 | $affixNav.css("top", (max_bottom - height) - top); 64 | } else { 65 | $affixNav.css("top", AFFIX_OFFSET); 66 | } 67 | } else if (top > AFFIX_TOP_LIMIT) { 68 | $affixNav.addClass("fixed"); 69 | affixNavfixed = true; 70 | } 71 | 72 | var $current = getClosestHeader(top); 73 | 74 | if (current !== $current) { 75 | $affixNav.find(".active").removeClass("active"); 76 | $current.addClass("active"); 77 | current = $current; 78 | } 79 | }); 80 | }); 81 | 82 | prettyPrint(); 83 | }); 84 | -------------------------------------------------------------------------------- /Joy_QA_Platform/static/frame/vendor/zebra/css/zebra_tooltips.css: -------------------------------------------------------------------------------- 1 | .Zebra_Tooltip { 2 | position: absolute; 3 | z-index: 8000; 4 | background: transparent; 5 | font-family: Geneva, 'Lucida Sans', 'Lucida Grande', 'Lucida Sans Unicode', Verdana, sans-serif; 6 | } 7 | 8 | .Zebra_Tooltip .Zebra_Tooltip_Message { 9 | position: relative; 10 | padding: 15px; 11 | font-size: inherit; 12 | text-align: left; 13 | font-weight: normal; 14 | line-height: inherit; 15 | -webkit-border-radius: 5px; 16 | -moz-border-radius: 5px; 17 | border-radius: 5px; 18 | border: 1px solid transparent; 19 | *margin-right: 0; 20 | _width:expression(document.body.clientWidth > 250 ? '250px': 'auto'); /* max-width for IE6 */ 21 | } 22 | 23 | .Zebra_Tooltip .Zebra_Tooltip_Arrow { position: absolute; height: 10px; width: 20px; overflow: hidden } 24 | 25 | .Zebra_Tooltip .Zebra_Tooltip_Arrow_Bottom { bottom: 0 } 26 | .Zebra_Tooltip .Zebra_Tooltip_Arrow_Top { top: 0 } 27 | 28 | .Zebra_Tooltip .Zebra_Tooltip_Arrow div { 29 | position: absolute; 30 | border-style: solid; 31 | border-width: 10px; 32 | height: 0; 33 | width: 0; 34 | left: 0; 35 | _border-left-color: pink; 36 | _border-right-color: pink; 37 | _filter: chroma(color=pink); 38 | } 39 | 40 | .Zebra_Tooltip .Zebra_Tooltip_Arrow_Bottom div { 41 | top: 0; 42 | _border-bottom-color: pink; 43 | } 44 | 45 | .Zebra_Tooltip .Zebra_Tooltip_Arrow_Top div { 46 | bottom: 0; 47 | _border-top-color: pink; 48 | } 49 | 50 | .Zebra_Tooltip .Zebra_Tooltip_Close { 51 | text-decoration: none; 52 | color: #FFF; 53 | position: absolute; 54 | right: 8px; 55 | top: 1px; 56 | font-size: inherit; 57 | font-weight: bold; 58 | border: 1px solid transparent; 59 | } 60 | 61 | .Zebra_Tooltip .Zebra_Tooltip_Close:hover { 62 | color: #C40000; 63 | } 64 | -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/css/modules/code.css: -------------------------------------------------------------------------------- 1 | /** layui-v2.2.3 MIT License By http://www.layui.com */ 2 | html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #e2e2e2;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:32px;line-height:32px;border-bottom:1px solid #e2e2e2}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 5px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none} -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/css/modules/layer/default/icon-ext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/css/modules/layer/default/icon-ext.png -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/css/modules/layer/default/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/css/modules/layer/default/icon.png -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/css/modules/layer/default/loading-0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/css/modules/layer/default/loading-0.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/css/modules/layer/default/loading-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/css/modules/layer/default/loading-1.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/css/modules/layer/default/loading-2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/css/modules/layer/default/loading-2.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/font/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/font/iconfont.eot -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/font/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/font/iconfont.ttf -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/font/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/font/iconfont.woff -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/0.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/1.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/10.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/10.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/11.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/11.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/12.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/12.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/13.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/13.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/14.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/14.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/15.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/15.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/16.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/16.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/17.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/17.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/18.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/18.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/19.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/19.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/2.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/20.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/20.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/21.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/21.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/22.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/22.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/23.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/23.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/24.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/24.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/25.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/25.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/26.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/26.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/27.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/27.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/28.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/28.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/29.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/29.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/3.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/30.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/30.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/31.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/31.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/32.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/32.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/33.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/33.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/34.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/34.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/35.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/35.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/36.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/36.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/37.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/37.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/38.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/38.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/39.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/39.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/4.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/40.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/40.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/41.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/41.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/42.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/42.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/43.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/43.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/44.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/44.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/45.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/45.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/46.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/46.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/47.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/47.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/48.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/48.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/49.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/49.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/5.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/50.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/50.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/51.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/51.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/52.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/52.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/53.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/53.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/54.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/54.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/55.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/55.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/56.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/56.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/57.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/57.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/58.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/58.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/59.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/59.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/6.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/6.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/60.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/60.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/61.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/61.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/62.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/62.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/63.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/63.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/64.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/64.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/65.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/65.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/66.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/66.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/67.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/67.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/68.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/68.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/69.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/69.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/7.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/7.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/70.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/70.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/71.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/71.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/8.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/8.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/images/face/9.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JoyMobileDevelopmentTeam/Joy_QA_Platform/793c14de58bfede0fc49fc72cfa45281fec991f2/Joy_QA_Platform/static/layui/images/face/9.gif -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/lay/modules/code.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.2.3 MIT License By http://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var a=layui.$,l="http://www.layui.com/doc/modules/code.html";e("code",function(e){var t=[];e=e||{},e.elem=a(e.elem||".layui-code"),e.about=!("about"in e)||e.about,e.elem.each(function(){t.push(this)}),layui.each(t.reverse(),function(t,i){var c=a(i),o=c.html();(c.attr("lay-encode")||e.encode)&&(o=o.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")),c.html('
  1. '+o.replace(/[\r\t\n]+/g,"
  2. ")+"
"),c.find(">.layui-code-h3")[0]||c.prepend('

'+(c.attr("lay-title")||e.title||"code")+(e.about?'layui.code':"")+"

");var d=c.find(">.layui-code-ol");c.addClass("layui-box layui-code-view"),(c.attr("lay-skin")||e.skin)&&c.addClass("layui-code-"+(c.attr("lay-skin")||e.skin)),(d.find("li").length/100|0)>0&&d.css("margin-left",(d.find("li").length/100|0)+"px"),(c.attr("lay-height")||e.height)&&d.css("max-height",c.attr("lay-height")||e.height)})})}).addcss("modules/code.css","skincodecss"); -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/lay/modules/flow.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.2.3 MIT License By http://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var l=layui.$,o=function(e){},t='';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var f=l(e.elem);if(f[0]){var m=l(e.scrollElem||document),u=e.mb||50,s=!("isAuto"in e)||e.isAuto,v=e.end||"没有更多了",y=e.scrollElem&&e.scrollElem!==document,d="加载更多",h=l('");f.find(".layui-flow-more")[0]||f.append(h);var p=function(e,t){e=l(e),h.before(e),t=0==t||null,t?h.html(v):h.find("a").html(d),i=t,o=null,n&&n()},g=function(){o=!0,h.find("a").html(t),"function"==typeof e.done&&e.done(++c,p)};if(g(),h.find("a").on("click",function(){l(this);i||o||g()}),e.isLazyimg)var n=a.lazyimg({elem:e.elem+" img",scrollElem:e.scrollElem});return s?(m.on("scroll",function(){var e=l(this),t=e.scrollTop();r&&clearTimeout(r),i||(r=setTimeout(function(){var i=y?e.height():l(window).height(),n=y?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=u&&(o||g())},100))}),a):a}},o.prototype.lazyimg=function(e){var o,t=this,i=0;e=e||{};var n=l(e.scrollElem||document),r=e.elem||"img",a=e.scrollElem&&e.scrollElem!==document,c=function(e,l){var o=n.scrollTop(),r=o+l,c=a?function(){return e.offset().top-n.offset().top+o}():e.offset().top;if(c>=o&&c<=r&&!e.attr("src")){var m=e.attr("lay-src");layui.img(m,function(){var l=t.lazyimg.elem.eq(i);e.attr("src",m).removeAttr("lay-src"),l[0]&&f(l),i++})}},f=function(e,o){var f=a?(o||n).height():l(window).height(),m=n.scrollTop(),u=m+f;if(t.lazyimg.elem=l(r),e)c(e,f);else for(var s=0;su)break}};if(f(),!o){var m;n.on("scroll",function(){var e=l(this);m&&clearTimeout(m),m=setTimeout(function(){f(null,e)},50)}),o=!0}return f},e("flow",new o)}); -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/lay/modules/laytpl.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.2.3 MIT License By http://www.layui.com */ 2 | ;layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},c={exp:function(e){return new RegExp(e,"g")},query:function(e,c,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return n((c||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error:";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)}); -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/lay/modules/tree.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.2.3 MIT License By http://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var o=layui.$,a=layui.hint(),i="layui-tree-enter",r=function(e){this.options=e},t={arrow:["",""],checkbox:["",""],radio:["",""],branch:["",""],leaf:""};r.prototype.init=function(e){var o=this;e.addClass("layui-box layui-tree"),o.options.skin&&e.addClass("layui-tree-skin-"+o.options.skin),o.tree(e),o.on(e)},r.prototype.tree=function(e,a){var i=this,r=i.options,n=a||r.nodes;layui.each(n,function(a,n){var l=n.children&&n.children.length>0,c=o('
    '),s=o(["
  • ",function(){return l?''+(n.spread?t.arrow[1]:t.arrow[0])+"":""}(),function(){return r.check?''+("checkbox"===r.check?t.checkbox[0]:"radio"===r.check?t.radio[0]:"")+"":""}(),function(){return'"+(''+(l?n.spread?t.branch[1]:t.branch[0]:t.leaf)+"")+(""+(n.name||"未命名")+"")}(),"
  • "].join(""));l&&(s.append(c),i.tree(c,n.children)),e.append(s),"function"==typeof r.click&&i.click(s,n),i.spread(s,n),r.drag&&i.drag(s,n)})},r.prototype.click=function(e,o){var a=this,i=a.options;e.children("a").on("click",function(e){layui.stope(e),i.click(o)})},r.prototype.spread=function(e,o){var a=this,i=(a.options,e.children(".layui-tree-spread")),r=e.children("ul"),n=e.children("a"),l=function(){e.data("spread")?(e.data("spread",null),r.removeClass("layui-show"),i.html(t.arrow[0]),n.find(".layui-icon").html(t.branch[0])):(e.data("spread",!0),r.addClass("layui-show"),i.html(t.arrow[1]),n.find(".layui-icon").html(t.branch[1]))};r[0]&&(i.on("click",l),n.on("dblclick",l))},r.prototype.on=function(e){var a=this,r=a.options,t="layui-tree-drag";e.find("i").on("selectstart",function(e){return!1}),r.drag&&o(document).on("mousemove",function(e){var i=a.move;if(i.from){var r=(i.to,o('
    '));e.preventDefault(),o("."+t)[0]||o("body").append(r);var n=o("."+t)[0]?o("."+t):r;n.addClass("layui-show").html(i.from.elem.children("a").html()),n.css({left:e.pageX+10,top:e.pageY+10})}}).on("mouseup",function(){var e=a.move;e.from&&(e.from.elem.children("a").removeClass(i),e.to&&e.to.elem.children("a").removeClass(i),a.move={},o("."+t).remove())})},r.prototype.move={},r.prototype.drag=function(e,a){var r=this,t=(r.options,e.children("a")),n=function(){var t=o(this),n=r.move;n.from&&(n.to={item:a,elem:e},t.addClass(i))};t.on("mousedown",function(){var o=r.move;o.from={item:a,elem:e}}),t.on("mouseenter",n).on("mousemove",n).on("mouseleave",function(){var e=o(this),a=r.move;a.from&&(delete a.to,e.removeClass(i))})},e("tree",function(e){var i=new r(e=e||{}),t=o(e.elem);return t[0]?void i.init(t):a.error("layui.tree 没有找到"+e.elem+"元素")})}); -------------------------------------------------------------------------------- /Joy_QA_Platform/static/layui/lay/modules/util.js: -------------------------------------------------------------------------------- 1 | /** layui-v2.2.3 MIT License By http://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var t=layui.$,i={fixbar:function(e){var i,o,a="layui-fixbar",r="layui-fixbar-top",n=t(document),l=t("body");e=t.extend({showHeight:200},e),e.bar1=e.bar1===!0?"":e.bar1,e.bar2=e.bar2===!0?"":e.bar2,e.bgcolor=e.bgcolor?"background-color:"+e.bgcolor:"";var c=[e.bar1,e.bar2,""],g=t(['
      ',e.bar1?'
    • '+c[0]+"
    • ":"",e.bar2?'
    • '+c[1]+"
    • ":"",'
    • '+c[2]+"
    • ","
    "].join("")),s=g.find("."+r),u=function(){var t=n.scrollTop();t>=e.showHeight?i||(s.show(),i=1):i&&(s.hide(),i=0)};t("."+a)[0]||("object"==typeof e.css&&g.css(e.css),l.append(g),u(),g.find("li").on("click",function(){var i=t(this),o=i.attr("lay-type");"top"===o&&t("html,body").animate({scrollTop:0},200),e.click&&e.click.call(this,o)}),n.on("scroll",function(){clearTimeout(o),o=setTimeout(function(){u()},100)}))},countdown:function(e,t,i){var o=this,a="function"==typeof t,r=new Date(e).getTime(),n=new Date(!t||a?(new Date).getTime():t).getTime(),l=r-n,c=[Math.floor(l/864e5),Math.floor(l/36e5)%24,Math.floor(l/6e4)%60,Math.floor(l/1e3)%60];a&&(i=t);var g=setTimeout(function(){o.countdown(e,n+1e3,i)},1e3);return i&&i(l>0?c:[0,0,0,0],t,g),l<=0&&clearTimeout(g),g},timeAgo:function(e,t){var i=this,o=[[],[]],a=(new Date).getTime()-new Date(e).getTime();return a>6912e5?(a=new Date(e),o[0][0]=i.digit(a.getFullYear(),4),o[0][1]=i.digit(a.getMonth()+1),o[0][2]=i.digit(a.getDate()),t||(o[1][0]=i.digit(a.getHours()),o[1][1]=i.digit(a.getMinutes()),o[1][2]=i.digit(a.getSeconds())),o[0].join("-")+" "+o[1].join(":")):a>=864e5?(a/1e3/60/60/24|0)+"天前":a>=36e5?(a/1e3/60/60|0)+"小时前":a>=12e4?(a/1e3/60|0)+"分钟前":a<0?"未来":"刚刚"},digit:function(e,t){var i="";e=String(e),t=t||2;for(var o=e.length;o 4 |
    5 |
    6 | 10 |
    11 | 12 |
    13 | 16 |
    17 |
    18 | 22 |
    23 |
    24 | -------------------------------------------------------------------------------- /Joy_QA_Platform/templates/api/debugtalk.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | debugtalk.py 5 | 6 | {% load staticfiles %} 7 | 8 | 10 | 12 | 13 | 14 | 42 | 43 | 44 | 45 | 46 |
    47 | 
    50 | 
    51 | 52 |
    53 | 54 | 返回首页 55 |
    56 | 57 | 58 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /Joy_QA_Platform/templates/api/edit_env.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
    4 |
    5 |
    6 | 10 | 39 | 43 |
    44 |
    45 |
    -------------------------------------------------------------------------------- /Joy_QA_Platform/templates/api/testsuiteedit.html: -------------------------------------------------------------------------------- 1 | {% extends 'frame/base.html' %} 2 | {% load staticfiles %} 3 | {% load frame_tags %} 4 | {% load apiauto_tags %} 5 | {% block title_block %} 6 | 测试集编辑 7 | {% endblock %} 8 | 9 | {% block body_block %} 10 |
    11 | 12 |
    13 |
    14 |
    15 |
    16 |
    17 |
    18 |
    19 | 20 |
    21 |
    22 | 25 |
    26 |
    27 |
    28 |
    29 |
    30 | 31 |
    32 |
    38 |
    39 |
    40 | 45 |
    46 |
    47 |
    48 |
    49 |
    50 |
    51 |
    52 |
    53 | 54 | {% endblock %} 55 | 56 | -------------------------------------------------------------------------------- /Joy_QA_Platform/templates/frame/403.html: -------------------------------------------------------------------------------- 1 | 2 | {% load staticfiles %} 3 | 4 | 5 | 6 | 卓游测试平台 | 403 7 | 8 | {% include './base_head.html' %} 9 | 10 | 11 | 12 |
    13 |
    14 |
    15 |

    Error 403

    16 |
    17 |
    18 |
    19 |

    Forbidden Access!

    20 |
    21 | 22 |
    23 |
    24 |
    25 |
    26 | 27 |

    您没有访问该页面的权限!

    28 |

    请联系卓游测试平台管理员: wuwei@joygames.cc

    29 |
    30 |
    31 | 37 |
    38 |
    39 |
    40 |
    41 | 42 | 43 | 44 | {% include './base_js.html' %} 45 | 46 | 47 | -------------------------------------------------------------------------------- /Joy_QA_Platform/templates/frame/404.html: -------------------------------------------------------------------------------- 1 | 2 | {% load staticfiles %} 3 | 4 | 5 | 6 | 卓游测试平台 | 404 7 | 8 | {% include './base_head.html' %} 9 | 10 | 11 | 12 |
    13 |
    14 |
    15 |

    Error 404

    16 |
    17 |
    18 |
    19 |

    Page Not Found!

    20 |
    21 | 22 |
    23 |
    24 |
    25 |
    26 | 27 |

    您所请求的页面不存在!

    28 |

    请联系卓游测试平台管理员: wuwei@joygames.cc

    29 |
    30 |
    31 | 37 |
    38 |
    39 |
    40 |
    41 | 42 | 43 | 44 | {% include './base_js.html' %} 45 | 46 | 47 | -------------------------------------------------------------------------------- /Joy_QA_Platform/templates/frame/500.html: -------------------------------------------------------------------------------- 1 | 2 | {% load staticfiles %} 3 | 4 | 5 | 6 | 卓游测试平台 | 500 7 | 8 | {% include './base_head.html' %} 9 | 10 | 11 | 12 |
    13 |
    14 |
    15 |

    Error 500

    16 |
    17 |
    18 |
    19 |

    Internal Server Error!

    20 |
    21 | 22 |
    23 |
    24 |
    25 |
    26 | 27 |

    服务器内部错误!

    28 |

    请联系卓游测试平台管理员: wuwei@joygames.cc

    29 |
    30 |
    31 | 37 |
    38 |
    39 |
    40 |
    41 | 42 | 43 | 44 | {% include './base_js.html' %} 45 | 46 | 47 | -------------------------------------------------------------------------------- /Joy_QA_Platform/templates/frame/base.html: -------------------------------------------------------------------------------- 1 | 2 | {% load staticfiles %} 3 | 4 | 5 | 6 | 7 | 8 | 卓游测试平台 | {% block title_block %}默认{% endblock %} 9 | 10 | {% include './base_head.html' %} 11 | {% include './base_js.html' %} 12 | 13 | {% block mystyle_css %}{% endblock %} 14 | 15 | 16 | 17 | 18 | 19 | 20 |
    21 | 22 | {% include './base_navbar.html' %} 23 | 24 | 25 | 26 | {% include './base_sidebar.html' %} 27 | 28 | 29 | 30 | {% block body_block %}{% endblock %} 31 | 32 | 33 | 34 | {% include './base_footer.html' %} 35 | 36 |
    37 | 38 | 39 | 40 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /Joy_QA_Platform/templates/frame/base_footer.html: -------------------------------------------------------------------------------- 1 | {% load staticfiles %} 2 | 3 |
    4 |
    5 | 8 |
    9 |
    10 | 11 | -------------------------------------------------------------------------------- /Joy_QA_Platform/templates/frame/base_head.html: -------------------------------------------------------------------------------- 1 | {% load staticfiles %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /Joy_QA_Platform/templates/frame/base_js.html: -------------------------------------------------------------------------------- 1 | {% load staticfiles %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Joy_QA_Platform/templates/frame/base_navbar.html: -------------------------------------------------------------------------------- 1 | {% load staticfiles %} 2 | 3 | 44 | 45 | -------------------------------------------------------------------------------- /Joy_QA_Platform/templates/frame/createnotes.html: -------------------------------------------------------------------------------- 1 | {% extends 'frame/base.html' %} 2 | {% load staticfiles %} 3 | {% block title_block %} 4 | 创建便利贴 5 | {% endblock %} 6 | {% block mystyle_css %} 7 | 13 | {% endblock %} 14 | {% block body_block %} 15 |
    16 | 17 |
    18 |
    19 |
    20 |
    21 |
    22 |

    创建便利贴

    23 |
    24 |
    25 | 26 |
    27 | 28 |
    29 | 30 |
    31 |
    32 | 37 |
    38 |
    39 |
    40 |
    41 |
    42 |
    43 | 44 |
    45 | {% endblock %} 46 | -------------------------------------------------------------------------------- /Joy_QA_Platform/templates/frame/index.html: -------------------------------------------------------------------------------- 1 | {% extends 'frame/base.html' %} {% load staticfiles %} {% block title_block %} 首页 {% endblock %} {% block body_block %} 2 |
    3 |
    4 |
    5 |
    6 |
    7 |
    8 |
    9 |
    10 |
    11 |
    12 | 13 |
    14 |
    15 |
    16 |
    17 | 19 |
    20 |
    21 |
    22 |
    23 | 24 |
    25 |
    26 |
    27 |
    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 |
    53 |
    54 | 55 | 56 | 57 | 58 | 59 | 60 | {% endblock %} -------------------------------------------------------------------------------- /Joy_QA_Platform/templates/frame/lock.html: -------------------------------------------------------------------------------- 1 | 2 | {% load staticfiles %} 3 | 4 | 5 | 6 | 7 | 卓游测试平台 | 锁屏 8 | 9 | {% include './base_head.html' %} 10 | 11 | 12 | 13 | 14 |
    15 |
    16 |
    17 |
    18 |
    19 | 20 |
    21 | 22 |

    {{username}}

    23 |
    24 |
    25 | 26 | 27 | 28 |
    29 |
    30 |
    31 | 34 | 35 | 38 | 39 | 42 |
    43 |
    44 |
    45 |
    46 |
    47 |
    48 | 49 | 50 | 51 |
    52 | 53 |
    54 | 55 | 56 | 57 | {% include './base_js.html' %} 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /Joy_QA_Platform/templates/frame/onlineusers.html: -------------------------------------------------------------------------------- 1 | {% extends 'frame/base.html' %} 2 | {% load staticfiles %} 3 | {% block title_block %} 4 | 在线用户 5 | {% endblock %} 6 | {% block body_block %} 7 |
    8 | 9 |
    10 |
      11 | {% for user in online_users %} 12 | 13 |
    • 14 | {{ user.username|escape }}: {{ user.online }} 15 |
    • 16 | {% endfor %} 17 |
    18 |
    19 |
    20 | 21 |
    22 | {% endblock %} 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Joy_QA_Platform/templates/frame/permstest_high.html: -------------------------------------------------------------------------------- 1 | {% extends 'frame/base.html' %} 2 | {% load staticfiles %} 3 | {% block title_block %} 4 | 权限 5 | {% endblock %} 6 | {% block body_block %} 7 |
    8 | 9 |
    10 |
    11 | {% if perms.frame.permstest_high_pagetitle %} 12 |

    13 | 权限高 14 |

    15 | {% endif %} 16 |
    17 |
    18 | 19 |
    20 |
    21 |

    权限高

    22 |

    23 | 权限高 24 | {% if perms.frame.permstest_high_viewmsg %} 25 | {{permshighmsg}} 26 | {% endif %} 27 |

    28 |
    29 |
    30 |

    权限高

    31 | {% if perms.frame.permstest_high_bodyp %} 32 |

    权限高

    33 | {% endif %} 34 |
    35 |
    36 | 37 |
    38 |
    39 |
    40 |
    41 |
    42 | 43 | {% endblock %} 44 | -------------------------------------------------------------------------------- /Joy_QA_Platform/templates/frame/permstest_low.html: -------------------------------------------------------------------------------- 1 | {% extends 'frame/base.html' %} 2 | {% load staticfiles %} 3 | {% block title_block %} 4 | 权限 5 | {% endblock %} 6 | {% block body_block %} 7 |
    8 | 9 |
    10 |
    11 |

    权限低

    12 |
    13 |
    14 | 15 |
    16 |
    17 |

    权限低

    18 |

    权限低

    19 |
    20 |
    21 |

    权限低

    22 |

    权限低

    23 |
    24 |
    25 | 26 |
    27 |
    28 |
    29 |
    30 |
    31 | 32 | {% endblock %} 33 | -------------------------------------------------------------------------------- /Joy_QA_Platform/templates/frame/permstest_medium.html: -------------------------------------------------------------------------------- 1 | {% extends 'frame/base.html' %} 2 | {% load staticfiles %} 3 | {% block title_block %} 4 | 权限 5 | {% endblock %} 6 | {% block body_block %} 7 |
    8 | 9 |
    10 |
    11 |

    权限中

    12 |
    13 |
    14 | 15 |
    16 |
    17 |

    权限中

    18 |

    权限中

    19 |
    20 |
    21 |

    权限中

    22 |

    权限中

    23 |
    24 |
    25 | 26 |
    27 |
    28 |
    29 |
    30 |
    31 | 32 | {% endblock %} 33 | -------------------------------------------------------------------------------- /Joy_QA_Platform/templates/frame/sendallmessages.html: -------------------------------------------------------------------------------- 1 | {% extends 'frame/base.html' %} 2 | {% load staticfiles %} 3 | {% block title_block %} 4 | 广播消息 5 | {% endblock %} 6 | {% block mystyle_css %} 7 | 29 | {% endblock %} 30 | {% block body_block %} 31 |
    32 | 33 |
    34 |
    35 |
    36 |
    37 |
    38 |
    39 |
    40 | 41 |
    42 |
    43 | 46 |
    47 |
    48 |
    49 |
    50 |
    51 |
    52 | 59 | 63 | 67 | 71 |
    72 |
    73 | 78 |
    79 |
    80 |
    81 |
    82 |
    83 |
    84 |
    85 |
    86 | 87 | {% endblock %} 88 | 89 | -------------------------------------------------------------------------------- /Joy_QA_Platform/templates/frame/viewnotes.html: -------------------------------------------------------------------------------- 1 | {% extends 'frame/base.html' %} 2 | {% load staticfiles %} 3 | {% block title_block %} 4 | 便利贴看板 5 | {% endblock %} 6 | {% block body_block %} 7 |
    8 | 9 |
    10 |
    11 | {% get_user_notes session_user_object.id as user_notes_list %} 12 | {% for note in user_notes_list %} 13 | {% newline forloop.counter0 as newtrue %} 14 | {% if newtrue %} 15 |
    16 | {% endif %} 17 |
    18 |
    19 |
    20 |
    21 |

    {{note.title|slice:"18"}}

    22 |

    {{note.subtitle|slice:"25"}}

    23 |
    24 | 25 | 26 |
    27 |
    28 |
    29 |
    30 |

    {{note.text}}

    31 |
    32 | 37 |
    38 |
    39 | {% if newtrue %} 40 |
    41 | {% endif %} 42 | {% endfor %} 43 | 44 |
    45 |
    46 |
    47 |
    48 | 49 | {% endblock %} 50 | --------------------------------------------------------------------------------