Commit 6ce85b62 authored by 王英豪's avatar 王英豪

项目上传

parent 66483838
Pipeline #1789 failed with stages
> 1%
last 2 versions
not ie <= 8
package-lock.json
dist.zip
node_modules/*
dist/
dist/*
.idea/*
.idear/*
.scannerwork/
.scannerwork/*
.vscode
node_modules/
build/
node_modules
*.zip
{
"tabWidth": 4,
"singleQuote": true,
"trailingComma": "none",
"printWidth": 140
}
\ No newline at end of file
MIT License
Copyright (c) 2016-2019 vue-manage-system
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
\ No newline at end of file
#前端Vue-测试平台
下载后运行npm install 如异常报错,
运行如下命令:
npm config set strict-ssl false
然后再运行 npm install
#项目页面
![img13.png](img/img13.png)
#首页
![img.png](img/img11.png)
#Web自动化
页面元素管理
![img_2.png](img/img_2.png)
测试报告
![img_1.png](img/img_1.png)
测试报告详情
![img_3.png](img/img_3.png)
UI定位
![img_4.png](img/img_4.png)
UI元素操作
![img_5.png](img/img_5.png)
#接口自动化
API测试用例
![img.png](img/img6.png)
API测试用例-发送请求
![img_6.png](img/img_6.png)
API业务测试用例
![img_7.png](img/img_7.png)
API测试报告
![img_8.png](img/img_8.png)
API测试报告详情
![img_9.png](img/img_9.png)
#性能测试
性能测试脚本页面
![img_10.png](img/img_10.png)
性能测试脚本
![img_11.png](img/img_11.png)
module.exports = {
presets: [
'@vue/app'
]
}
{
"name": "qa",
"version": "4.2.0",
"private": true,
"scripts": {
"dev": "npm run serve",
"serve": "vue-cli-service serve --mode development",
"build": "vue-cli-service build --mode production"
},
"dependencies": {
"@jiaminghi/data-view": "^2.10.0",
"ace-builds": "^1.7.1",
"axios": "^0.21.4",
"babel-polyfill": "^6.26.0",
"bin-code-editor": "^0.9.0",
"default-passive-events": "^2.0.0",
"echarts": "^5.3.2",
"element-ui": "^2.11.0",
"jquery": "^3.6.0",
"js-cookie": "^3.0.1",
"less": "^4.1.1",
"less-loader": "^7.3.0",
"mavon-editor": "^2.10.1",
"moment": "^2.29.3",
"nprogress": "^0.2.0",
"popper.js": "^1.16.1",
"qs": "^6.10.1",
"sortable.js": "^0.3.0",
"sortablejs": "^1.14.0",
"vue": "^2.6.10",
"vue-clipboard2": "^0.3.3",
"vue-cropperjs": "^3.0.0",
"vue-i18n": "^8.10.0",
"vue-json-pretty": "^1.8.1",
"vue-json-viewer": "^2.2.19",
"vue-router": "^3.0.3",
"vue-schart": "^2.0.0",
"vue2-ace-editor": "0.0.15",
"vuedraggable": "^2.24.3"
},
"devDependencies": {
"@vue/cli-plugin-babel": "^3.9.0",
"@vue/cli-service": "^4.5.13",
"bootstrap": "^4.5.3",
"vue-template-compiler": "^2.6.10"
}
}
module.exports = {
plugins: {
autoprefixer: {}
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no">
<link rel="stylesheet" href="//at.alicdn.com/t/font_830376_qzecyukz0s.css">
<title>quality-质量平台</title>
</head>
<body>
<noscript>
<strong>We're sorry but vms doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
{
"list": [{
"id": 1,
"name": "张三",
"money": 123,
"address": "广东省东莞市长安镇",
"state": "成功",
"date": "2019-11-1",
"thumb": "https://lin-xin.gitee.io/images/post/wms.png"
},
{
"id": 2,
"name": "李四",
"money": 456,
"address": "广东省广州市白云区",
"state": "成功",
"date": "2019-10-11",
"thumb": "https://lin-xin.gitee.io/images/post/node3.png"
},
{
"id": 3,
"name": "王五",
"money": 789,
"address": "湖南省长沙市",
"state": "失败",
"date": "2019-11-11",
"thumb": "https://lin-xin.gitee.io/images/post/parcel.png"
},
{
"id": 4,
"name": "赵六",
"money": 1011,
"address": "福建省厦门市鼓浪屿",
"state": "成功",
"date": "2019-10-20",
"thumb": "https://lin-xin.gitee.io/images/post/notice.png"
}
],
"pageTotal": 4
}
\ No newline at end of file
<template>
<div id="app">
<router-view v-if="isRouterAlive"></router-view>
</div>
</template>
<style>
@import "./assets/css/main.css";
@import "./assets/css/color-dark.css"; /*深色主题*/
/*@import "./assets/css/theme-green/color-green.css"; 浅绿色主题*/
</style>
<script>
export default {
name: 'App',
provide () { //父组件中通过provide来提供变量,在子组件中通过inject来注入变量。
return {
reload: this.reload
}
},
data() {
return{
isRouterAlive: true //控制视图是否显示的变量
}
},
methods: {
reload () {
this.isRouterAlive = false; //先关闭,
this.$nextTick(function () {
this.isRouterAlive = true; //再打开
})
}
},
}
</script>
\ No newline at end of file
import {getRequest, postRequest, deleteRequest,putRequest} from "../common/common";
// 获取该项目的所有API业务测试列表
export const getApiBusinessTestRequest = (api_project_id) =>{
return getRequest("api/backend/api_business_test/list/" + api_project_id + "/")
};
//添加API业务测试
export const addApiBusinessTestRequest = (data) =>{
return putRequest("api/backend/api_business_test/", data)
};
//获取单个API业务测试
export const getSingleApiBusinessTestRequest = (api_business_test_id) =>{
return getRequest("api/backend/api_business_test/" + api_business_test_id + "/")
};
//编辑API业务测试
export const updateBusinessTestRequest = (api_business_test_id, data) =>{
return postRequest("api/backend/api_business_test/" + api_business_test_id + "/", data)
};
//删除API业务测试
export const deleteSingleApiBusinessTestRequest = (api_business_test_id) =>{
return deleteRequest("api/backend/api_business_test/" + api_business_test_id + "/")
};
//获取模块-》api测试用例列表
export const getSelectApiBusinessTestRequest = (api_project_id) =>{
return getRequest("api/backend/api_business_test/get_api_test_business_test_select_data/" + api_project_id + "/")
};
//api业务测试调试
export const postApiBusinessTestDeBugRequest = (data) =>{
return postRequest("api/backend/api_business_test/api_business_test_debug/", data)
};
import {getRequest, postRequest, deleteRequest,putRequest} from "../common/common";
// 获取所有数据库配置
export const getDatabaseRequest = () =>{
return getRequest("api/backend/api_database/list/")
};
//添加数据库
export const addDatabaseRequest = (data) =>{
return putRequest("api/backend/api_database/", data)
};
//获取单个数据库配置
export const getSingleDatabaseRequest = (api_database_id) =>{
return getRequest("api/backend/api_database/" + api_database_id + "/")
};
//编辑单个数据库配置
export const updateSingleDatabaseRequest = (api_database_id, data) =>{
return postRequest("api/backend/api_database/" + api_database_id + "/", data)
};
//删除单个数据库配置
export const deleteSingleDatabaseRequest = (api_database_id) =>{
return deleteRequest("api/backend/api_database/" + api_database_id + "/")
};
//调试数据库配置连接
export const updateDebugDatabaseRequest = (data) =>{
return postRequest("api/backend/api_debug_database/",data)
};
\ No newline at end of file
import {getRequest, postRequest, deleteRequest,putRequest} from "../common/common";
// 获取所有API环境列表
export const getApiEnvironmentRequest = () =>{
return getRequest("api/backend/api_environment/list/")
};
//添加API环境
export const addApiEnvironmentRequest = (data) =>{
return putRequest("api/backend/api_environment/", data)
};
//获取单个API环境
export const getSingleApiEnvironmentRequest = (api_environment_id) =>{
return getRequest("api/backend/api_environment/" + api_environment_id + "/")
};
//编辑单个API环境
export const updateSingleApiEnvironmentRequest = (api_environment_id, data) =>{
return postRequest("api/backend/api_environment/" + api_environment_id + "/", data)
};
//删除单个API环境
export const deleteSingleApiEnvironmentRequest = (api_environment_id) =>{
return deleteRequest("api/backend/api_environment/" + api_environment_id + "/")
};
\ No newline at end of file
import {getRequest, postRequest, deleteRequest,putRequest} from "../common/common";
// 获取服务的树形结构-一级目录
export const getApiManagementRequest = () =>{
return getRequest("api/backend/api_management/list/")
};
// 获取服务的树形结构-按级别查询
export const postApiManagementTreeRequest = (data) =>{
return postRequest("api/backend/api_management/list/", data)
};
// 接口测试用例调试-debug
export const debugInterfacesCaseRequest = (data) =>{
return postRequest("api/backend/apiInterfacesCase/debug/", data)
};
// 创建服务
export const putApiManagementRequest = (data) =>{
return putRequest("api/backend/api_management/list/", data)
};
// 更新服务
export const postApiManagementRequest = (api_management_id, data) =>{
return postRequest("api/backend/api_management/" + api_management_id + "/",data)
};
// 删除服务
export const deleteApiManagementRequest = (api_management_id) =>{
return deleteRequest("api/backend/api_management/" + api_management_id + "/")
};
// 获取测试用例列表
export const getApiInterfaceRequest = (api_server_id) =>{
return getRequest("api/backend/apiInterfacesList/" + api_server_id + "/")
};
// Copy测试用例
export const postApiInterfaceCaseCopyRequest = (data) =>{
return postRequest("api/backend/apiInterfacesCopyCase/", data)
};
// 新增测试用例
export const putApiInterfaceCaseRequest = (data) =>{
return putRequest("api/backend/apiInterfacesCase/",data)
};
// 获取单独测试用例
export const getApiInterfaceCaseRequest = (api_interfaces_case_id) =>{
return getRequest("api/backend/apiInterfacesCase/" + api_interfaces_case_id + "/")
};
// 编辑单独测试用例
export const updateSingleApiInterfaceCaseRequest = (api_interfaces_case_id, data) =>{
return postRequest("api/backend/apiInterfacesCase/" + api_interfaces_case_id + "/", data)
};
// 删除单个API测试用例
export const deleteSingleInterfaceCaseRequest = (api_interfaces_case_id) =>{
return deleteRequest("api/backend/apiInterfacesCase/" + api_interfaces_case_id + "/")
};
// 判断 父节点 是否可创建用例(只有用例节点才可创建用例)
export const postJudgeAddCasesRequest = (data) =>{
return postRequest("api/backend/apiManagement/JudgeAddCases/", data)
};
// 获取YAPI 接口基础参数
export const postYaPiInterfaceRequest = (data) =>{
return postRequest("api/backend/apiManagement/yaPiInterfaceBasicInformation/", data)
};
\ No newline at end of file
import {getRequest, postRequest, deleteRequest,putRequest} from "../common/common";
// 获取所有模块列表
export const getApiModuleRequest = () =>{
return getRequest("api/backend/api_module/list/")
};
//添加API模块
export const addApiModuleRequest = (data) =>{
return putRequest("api/backend/api_module/", data)
};
//获取单个API模块
export const getSingleApiModuleRequest = (api_project_id) =>{
return getRequest("api/backend/api_module/" + api_project_id + "/")
};
//编辑单个API模块
export const updateSingleApiModuleRequest = (api_project_id, data) =>{
return postRequest("api/backend/api_module/" + api_project_id + "/", data)
};
//删除单个API模块
export const deleteSingleApiModuleRequest = (api_project_id) =>{
return deleteRequest("api/backend/api_module/" + api_project_id + "/")
};
//获取单个API项目中包含得所有API模块
export const getSingleApiProjectModuleRequest = (api_project_id,size_page,page) =>{
return getRequest("api/backend/api_project/api_module/" + api_project_id +"/" + size_page + "/" + page + "/")
};
\ No newline at end of file
import {getRequest, postRequest, deleteRequest,putRequest} from "../common/common";
// 获取所有API项目列表
export const getApiProjectRequest = () =>{
return getRequest("api/backend/api_project/list/")
};
//添加API项目
export const addApiProjectRequest = (data) =>{
return putRequest("api/backend/api_project/", data)
};
//获取单个API项目
export const getSingleApiProjectRequest = (api_project_id) =>{
return getRequest("api/backend/api_project/" + api_project_id + "/")
};
//编辑单个API项目
export const updateSingleApiProjectRequest = (api_project_id, data) =>{
return postRequest("api/backend/api_project/" + api_project_id + "/", data)
};
//删除单个API项目
export const deleteSingleApiProjectRequest = (api_project_id) =>{
return deleteRequest("api/backend/api_project/" + api_project_id + "/")
};
\ No newline at end of file
import {getRequest, postRequest, deleteRequest,putRequest} from "../common/common";
// 获取接口用例的树形结构-获取一级/二级/三级目录
export const getApiScenariosCaseRequest = () =>{
return getRequest("api/backend/api_scenarios_case/list/")
};
// 获取接口用例的树形结构-4级目录获取用例
export const postApiScenariosCaseRequest = (data) =>{
return postRequest("api/backend/api_scenarios_case/list/", data)
};
// 获取接口项目列表
export const getInterfacesProjectListRequest = () =>{
return getRequest("api/backend/InterfacesProjectList/list/")
};
// 创建场景测试用例
export const addApiScenariosCaseRequest = (data) =>{
return putRequest("api/backend/api_scenarios_case/", data)
};
// 获取场景接口用例列表
export const getInterfacesCaseListRequest = (api_management_id) =>{
return getRequest("api/backend/interfaces_scenarios_case/list/" + api_management_id + "/")
};
// 获取单个场景接口用例
export const getSingleScenariosCaseRequest = (scenarios_case_id) =>{
return getRequest("api/backend/api_single_scenarios_case/" + scenarios_case_id + "/")
};
// 复制场景测试用例
export const postCopyScenariosCaseRequest = (data) =>{
return postRequest("api/backend/copy_interfaces_scenarios_case/", data)
};
// 编辑场景接口用例
export const updateScenariosCaseRequest = (scenarios_case_id, data) =>{
return postRequest("api/backend/api_scenarios_case/" + scenarios_case_id + "/", data)
};
// 删除场景接口用例
export const deleteApiScenariosCaseRequest = (scenarios_case_id) =>{
return deleteRequest("api/backend/api_scenarios_case/" + scenarios_case_id + "/")
};
//接口场景用例调试
export const postInterfacesScenariosCaseDeBugRequest = (data) =>{
return postRequest("api/backend/interfaces_scenarios_case/interfaces_scenarios_case_debug/", data)
};
//代表获取 服务、模块、接口、用例关系
export const postServiceModuleInterfacesCaseRelationshipRequest = (data) =>{
return postRequest("api/backend/interfaces_scenarios_case/ServiceModuleInterfacesCaseRelationship/", data)
};
\ No newline at end of file
import {getRequest, postRequest, deleteRequest,putRequest} from "../common/common";
// 获取该模块下所有API测试用例
export const getApiTestCaseListRequest = (api_module_id) =>{
return postRequest("api/backend/api_test_case/list/" + api_module_id + "/")
};
//添加API测试用例
export const addApiTestCaseRequest = (data) =>{
return putRequest("api/backend/api_test_case/", data)
};
//获取单个API测试用例
export const getSingleApiTestCaseRequest = (api_test_case_id) =>{
return getRequest("api/backend/api_test_case/" + api_test_case_id + "/")
};
//编辑单个API测试用例
export const updateSingleApiTestCaseRequest = (api_test_case_id, data) =>{
return postRequest("api/backend/api_test_case/" + api_test_case_id + "/", data)
};
//删除单个API测试用例
export const deleteSingleApiTestCaseRequest = (api_test_case_id) =>{
return deleteRequest("api/backend/api_test_case/" + api_test_case_id + "/")
};
//调试API测试用例
export const deBugApiTestCaseRequest = (data) =>{
return postRequest("api/backend/api_test_case/debug/", data)
};
//上传API测试用例
export const uploadApiTestCaseRequest = (data) =>{
return postRequest("api/backend/api_test_case/upload_test_cases/", data)
};
//API测试用例导入
export const uploadApiCaseImportRequest = (data) =>{
return putRequest("api/backend/api_test_case/upload_api_case_import/", data)
};
\ No newline at end of file
import {getRequest, postRequest, deleteRequest,putRequest} from "../common/common";
//获取该项目下的场景测试用例树形结构
export const getScenariosCaseTreeRequest = (api_management_id) =>{
return getRequest("api/backend/api_test_plan/get_scenarios_case_tree/" + api_management_id + "/")
};
//添加API测试计划
export const addAPITestPlanRequest = (data) =>{
return putRequest("api/backend/api_test_plan/", data)
};
//获取单个Api测试计划
export const getSingleApiTestPlanRequest = (api_test_plan_id) =>{
return getRequest("api/backend/api_test_plan/" + api_test_plan_id + "/")
};
//删除API测试计划
export const deleteSingleApiTestPlanRequest = (api_test_plan_id) =>{
return deleteRequest("api/backend/api_test_plan/" + api_test_plan_id + "/")
};
//获取暂停Api测试计划
export const suspendedApiTestPlanRequest = (data) =>{
return postRequest("api/backend/api_test_plan/suspended/", data)
};
//编辑API测试计划
export const updateSingleApiTestPlanRequest = (api_test_plan_id, data) =>{
return postRequest("api/backend/api_test_plan/" + api_test_plan_id + "/", data)
};
// 获取该项目---API测试计划列表
export const getApiTestPlanRequest = (api_management_id) =>{
return getRequest("api/backend/api_test_plan/list/" + api_management_id + "/")
};
//执行API测试计划
export const postPerformApiPlanRequest = (api_test_plan_id) =>{
return postRequest("api/backend/api_test_plan/perform_api_test_plan/" + api_test_plan_id + "/")
};
//查看API测试计划报告列表
export const getApiPlanResultRequest = (api_test_plan_id, size_page, page) =>{
return getRequest("api/backend/api_test_plan/check_result_list/" + api_test_plan_id + "/" + size_page + "/" + page + "/")
};
//获取API测试报告列表-API测试用例报告列表
export const getApiTestPlanCheckResultListRequest = (api_test_result_id, size_page, page) =>{
return getRequest("api/backend/api_test_plan/check_result/" + api_test_result_id + "/" + size_page + "/" + page + "/")
};
//获取API测试报告列表-API测试用例报告列表-单独APi测试用例报告结果
export const postSingleApiTestPlanCheckResultRequest = (api_test_case_result_id, data) =>{
return postRequest("api/backend/api_test_plan/single_check_result/" + api_test_case_result_id + "/", data)
};
//删除单独API测试用例的所有测试报告
export const deleteApiTestPlanResultRequest = (api_test_result_id) =>{
return deleteRequest("api/backend/api_test_plan/check_result/" + api_test_result_id + "/")
};
//获取API测试报告列表-API测试用例报告-失败列表
export const getApiTestPlanCheckResultErrorListRequest = (api_test_result_id, size_page, page) =>{
return getRequest("api/backend/api_test_plan/check_result/error/" + api_test_result_id +"/" + size_page + "/" + page + "/")
};
\ No newline at end of file
import {getRequest, postRequest, deleteRequest,putRequest} from "../common/common";
// 获取该项目---API测试任务列表
export const getApiTestTaskRequest = (api_project_id) =>{
return getRequest("api/backend/api_test_task/list/" + api_project_id + "/")
};
//添加API测试任务
export const addAPITestTaskRequest = (data) =>{
return putRequest("api/backend/api_test_task/", data)
};
//获取单个Api测试任务
export const getSingleApiTestTaskRequest = (api_test_task_id) =>{
return getRequest("api/backend/api_test_task/" + api_test_task_id + "/")
};
//获取暂停Api测试任务
export const suspendedApiTestTaskRequest = (data) =>{
return postRequest("api/backend/api_test_task/suspended/", data)
};
//编辑单个Api测试任务
export const updateSingleApiTestTaskRequest = (api_test_task_id, data) =>{
return postRequest("api/backend/api_test_task/" + api_test_task_id + "/", data)
};
//删除单个API任务
export const deleteSingleApiTestTaskRequest = (api_task_id) =>{
return deleteRequest("api/backend/api_test_task/" + api_task_id + "/")
};
//获取所有业务测试用例树形结构
export const getApiCaseTreeRequest = (api_task_id) =>{
return getRequest("api/backend/api_test_task/get_api_case_tree/" + api_task_id + "/")
};
//获取单独API测试用例的所有测试报告
export const getApiCaseResultRequest = (api_test_task_id, size_page, page) =>{
return getRequest("api/backend/api_test_task/check_result_list/" + api_test_task_id + "/" + size_page + "/" + page + "/")
};
//删除单独API测试用例的所有测试报告
export const deleteApiCaseResultRequest = (api_test_result_id) =>{
return deleteRequest("api/backend/api_test_task/check_result/" + api_test_result_id + "/")
};
//获取API测试报告列表-API测试用例报告列表
export const getApiCaseCheckResultListRequest = (api_test_result_id, size_page, page) =>{
return getRequest("api/backend/api_test_task/check_result/" + api_test_result_id +"/" + size_page + "/" + page + "/")
};
//获取API测试报告列表-API测试用例报告-失败列表
export const getApiCaseCheckResultErrorListRequest = (api_test_result_id, size_page, page) =>{
return getRequest("api/backend/api_test_task/check_result/error/" + api_test_result_id +"/" + size_page + "/" + page + "/")
};
//获取API测试报告列表-API测试用例报告列表-单独APi测试用例报告结果
export const postSingleApiCaseCheckResultRequest = (api_test_case_result_id, data) =>{
return postRequest("api/backend/api_test_task/single_check_result/" + api_test_case_result_id + "/", data)
};
//执行API测试任务
export const postPerformApiTaskRequest = (api_test_task_id) =>{
return postRequest("api/backend/api_test_task/perform_api_task/" + api_test_task_id + "/")
};
\ No newline at end of file
import axios from 'axios'
axios.defaults.withCredentials=true;
//本地环境
const host = "http://localhost:8000/"
//测试环境
// const host = "http://qa.rd.com/"
export const fileUrl = host
export const getRequest = function(path, data={}) {
return axios.get(host + path, {
params: data,
withCredentials: true
})
};
export const postRequest = function(path, data={}) {
return axios.post(host + path, data)
};
export const putRequest = function(path, data={}) {
data["withCredentials"] = true
return axios.put(host + path, data)
};
export const deleteRequest = function(path, data={}) {
data["withCredentials"] = true
return axios.delete(host + path, data)
};
export const patch_request = function(path, data={}) {
data["withCredentials"] = true
axios.patch(host + path, data)
};
import request from '../utils/request';
export const fetchData = query => {
return request({
url: './table.json',
method: 'get',
params: query
});
};
import {getRequest, postRequest, deleteRequest,putRequest} from "../common/common";
// 获取所有性能测试项目列表
export const getPerformanceProjectRequest = () =>{
return getRequest("api/backend/performance_test/performance_project_list/")
};
//添加性能测试项目
export const addPerformanceProjectRequest = (data) =>{
return putRequest("api/backend/performance_test/performance_project/", data)
};
//获取单个性能测试项目
export const getSinglePerformanceProjectRequest = (performance_project_id) =>{
return getRequest("api/backend/performance_test/performance_project/" + performance_project_id + "/")
};
//编辑单个性能测试项目
export const updateSinglePerformanceProjectRequest = (performance_project_id, data) =>{
return postRequest("api/backend/performance_test/performance_project/" + performance_project_id + "/", data)
};
//删除单个性能测试项目
export const deleteSinglePerformanceProjectRequest = (performance_project_id) =>{
return deleteRequest("api/backend/performance_test/performance_project/" + performance_project_id + "/")
};
\ No newline at end of file
import {getRequest, postRequest, deleteRequest,putRequest} from "../common/common";
// 获取所有性能脚本列表
export const getPerformanceScriptRequest = () =>{
return getRequest("api/backend/api_module/list/")
};
//添加性能脚本
export const addPerformanceScriptRequest = (data) =>{
return putRequest("api/backend/performance_test/performance_script/", data)
};
//获取单个性能脚本
export const getSinglePerformanceScriptRequest = (performance_script_id) =>{
return getRequest("api/backend/performance_test/performance_script/" + performance_script_id + "/")
};
//编辑单个性能脚本
export const updateSinglePerformanceScriptRequest = (performance_script_id, data) =>{
return postRequest("api/backend/performance_test/performance_script/" + performance_script_id + "/", data)
};
//删除单个性能脚本
export const deleteSinglePerformanceScriptRequest = (performance_script_id) =>{
return deleteRequest("api/backend/performance_test/performance_script/" + performance_script_id + "/")
};
//获取单个性能项目中包含得所有性能脚本--弃用
export const getSinglePerformanceProjectScriptRequest = (performance_project_id, size_page, page) =>{
return getRequest("api/backend/performance_test/performance_project_script/" + performance_project_id + "/" + size_page + "/" + page + "/")
};
// 查询性能脚本
export const postQueryPerformanceProjectScriptRequest = (size_page, page, data) =>{
return postRequest("api/backend/performance_test/performance_project_script/" + size_page + "/" + page + "/", data)
};
//性能脚本-暂停运行
export const getPerformanceProjectScriptSuspendedRequest = (performance_script_id) =>{
return getRequest("api/backend/performance_test/performance_project_script/script_suspended/" + performance_script_id + "/")
};
//上传脚本
export const uploadPerformanceScriptRequest = (data) =>{
return postRequest("api/backend/performance_test/performance_project/", data)
};
//执行脚本
export const performPerformanceScriptRequest = (performance_script_id) =>{
return getRequest("api/backend/performance_test/perform_performance_script/" + performance_script_id + "/")
};
//New-执行脚本
export const newPerformPerformanceScriptRequest = (performance_script_id) =>{
return getRequest("api/backend/performance_test/new_perform_performance_script/" + performance_script_id + "/")
};
//单独性能脚本报告
export const performanceScriptReportRequest = (performance_script_id) =>{
return getRequest("api/backend/performance_test/performance_script_report/" + performance_script_id + "/")
};
//New单独性能脚本报告
export const newPerformanceScriptReportRequest = (data) =>{
return postRequest("api/backend/performance_test/performance_script_report/", data)
};
//删除单独性能脚本报告
export const performanceScriptReportDeleteRequest = (report_name, report_id) =>{
return deleteRequest("api/backend/performance_test/performance_script_report/" + report_name + "/" + report_id + "")
};
//性能脚本报告页面
export const performanceScriptReportGetRequest = (performance_report_id) =>{
return getRequest("api/backend/performance_test/performance_script_report_page/" + performance_report_id + "/")
};
\ No newline at end of file
import {getRequest, postRequest, deleteRequest,putRequest} from "../common/common";
// 获取所有项目测试用例
export const getSystemHomePageListRequest = () =>{
return getRequest("api/backend/system_home_page_list/")
};
// 获取API接口自动化统计
export const postSystemHomePageApiStatisticsRequest = (data) =>{
return postRequest("api/backend/system_home_page_list/api_statistics/",data)
};
\ No newline at end of file
import {getRequest, postRequest, deleteRequest,putRequest} from "../common/common";
// 获取所有ui元素操作列表
export const getUiElementOperationRequest = () =>{
return getRequest("api/backend/ui_element_operation/list/")
};
//添加ui元素操作
export const addUiElementOperationRequest = (data) =>{
return putRequest("api/backend/ui_element_operation/", data)
};
//获取单个ui元素操作
export const getSingleElementOperationRequest = (element_operation_id) =>{
return getRequest("api/backend/ui_element_operation/" + element_operation_id + "/")
};
//编辑单个ui元素操作
export const updateUiElementOperationRequest = (element_operation_id, data) =>{
return postRequest("api/backend/ui_element_operation/" + element_operation_id + "/", data)
};
//删除单个ui元素操作
export const deleteSingleElementOperationRequest = (element_operation_id) =>{
return deleteRequest("api/backend/ui_element_operation/" + element_operation_id + "/")
};
\ No newline at end of file
import {getRequest, postRequest, deleteRequest,putRequest} from "../common/common";
// 获取所有页面列表
export const getUiPageRequest = () =>{
return getRequest("api/backend/ui_page/list/")
};
//添加UI页面
export const addUiPageRequest = (data) =>{
return putRequest("api/backend/ui_page/", data)
};
//获取单个ui页面
export const getSingleUiPageRequest = (ui_page_id) =>{
return getRequest("api/backend/ui_page/" + ui_page_id + "/")
};
//编辑单个UI页面
export const updateSingleUiPageRequest = (ui_page_id, data) =>{
return postRequest("api/backend/ui_page/" + ui_page_id + "/", data)
};
//删除单个ui页面
export const deleteSingleUiPageRequest = (ui_page_id) =>{
return deleteRequest("api/backend/ui_page/" + ui_page_id + "/")
};
//获取单个UI项目中包含得所有页面
export const getSingleUiProjectPageRequest = (ui_project_id) =>{
return getRequest("api/backend/ui_page_element/ui_project_page/" + ui_project_id + "/")
};
\ No newline at end of file
import {getRequest, postRequest, deleteRequest,putRequest} from "../common/common";
// 获取所有页面元素列表
export const getUiPageElementRequest = () =>{
return getRequest("api/backend/ui_page_element/list/")
};
//添加UI页面元素
export const addUiPageElementRequest = (data) =>{
return putRequest("api/backend/ui_page_element/", data)
};
//获取单个ui页面元素
export const getSingleUiPageElementRequest = (page_id) =>{
return getRequest("api/backend/ui_page_element/" + page_id + "/")
};
//编辑单个UI页面元素
export const updateSingleUiPageElementRequest = (ui_page_id, data) =>{
return postRequest("api/backend/ui_page_element/" + ui_page_id + "/", data)
};
//删除单个ui页面元素
export const deleteSingleUiPageElementRequest = (page_element_id) =>{
return deleteRequest("api/backend/ui_page_element/" + page_element_id + "/")
};
//获取所有项目-》页面列表
export const getSelectUiPageElementRequest = () =>{
return getRequest("api/backend/ui_page_element/get_ui_page_select_data/")
};
\ No newline at end of file
import {getRequest, postRequest, deleteRequest,putRequest} from "../common/common";
// 获取所有ui定位方式列表
export const getUiPositioningRequest = () =>{
return getRequest("api/backend/ui_positioning/list/")
};
//添加ui定位方式
export const addUiPositioningRequest = (data) =>{
return putRequest("api/backend/ui_positioning/", data)
};
//获取单个ui定位方式
export const getSingleUiPositioningRequest = (element_positioning_id) =>{
return getRequest("api/backend/ui_positioning/" + element_positioning_id + "/")
};
//编辑单个ui定位方式
export const updateUiPositioningRequest = (element_positioning_id, data) =>{
return postRequest("api/backend/ui_positioning/" + element_positioning_id + "/", data)
};
//删除单个ui定位方式
export const deleteSingleUiPositioningRequest = (element_positioning_id) =>{
return deleteRequest("api/backend/ui_positioning/" + element_positioning_id + "/")
};
\ No newline at end of file
import {getRequest, postRequest, deleteRequest,putRequest} from "../common/common";
// 获取所有项目列表
export const getUiProjectRequest = () =>{
return getRequest("api/backend/ui_project/list/")
};
//添加UI项目
export const addUiProjectRequest = (data) =>{
return putRequest("api/backend/ui_project/", data)
};
//获取单个ui项目
export const getSingleUiProjectRequest = (ui_project_id) =>{
return getRequest("api/backend/ui_project/" + ui_project_id + "/")
};
//编辑单个UI项目
export const updateSingleUiProjectRequest = (ui_project_id, data) =>{
return postRequest("api/backend/ui_project/" + ui_project_id + "/", data)
};
//删除单个ui项目
export const deleteSingleUiProjectRequest = (ui_project_id) =>{
return deleteRequest("api/backend/ui_project/" + ui_project_id + "/")
};
\ No newline at end of file
import {getRequest, postRequest, deleteRequest,putRequest} from "../common/common";
// 获取该项目的所有UI测试用例列表
export const getUiTestCaseRequest = (ui_project_id) =>{
return getRequest("api/backend/ui_test_case/list/" + ui_project_id + "/")
};
//添加UI测试用例
export const addUiTestCaseRequest = (data) =>{
return putRequest("api/backend/ui_test_case/", data)
};
//获取单个UI测试用例
export const getSingleUiTestCaseRequest = (ui_test_case_id) =>{
return getRequest("api/backend/ui_test_case/" + ui_test_case_id + "/")
};
//编辑单个UI测试用例
export const updateSingleUiTestCaseRequest = (ui_test_case_id, data) =>{
return postRequest("api/backend/ui_test_case/" + ui_test_case_id + "/", data)
};
//删除单个UI测试用例
export const deleteSingleUiTestCaseRequest = (ui_test_case_id) =>{
return deleteRequest("api/backend/ui_test_case/" + ui_test_case_id + "/")
};
//获取所有项目-》页面列表
export const getSelectUiTestCaseRequest = () =>{
return getRequest("api/backend/ui_test_case/get_ui_test_case_select_data/")
};
//调试测试用例
export const postDebugUiTestCaseRequest = (data) =>{
return postRequest("api/backend/ui_test_case/debug_ui_test_case/", data)
};
\ No newline at end of file
import {getRequest, postRequest, deleteRequest,putRequest} from "../common/common";
// 获取所有UI测试任务列表
export const getUiTestTaskRequest = (ui_project_id) =>{
return getRequest("api/backend/ui_test_task/list/" + ui_project_id + "/")
};
//添加UI测试任务
export const addUiTestTaskRequest = (data) =>{
return putRequest("api/backend/ui_test_task/", data)
};
//获取单个UI测试任务
export const getSingleUiTestTaskRequest = (ui_test_task_id) =>{
return getRequest("api/backend/ui_test_task/" + ui_test_task_id + "/")
};
//编辑单个UI测试任务
export const updateSingleUiTestTaskRequest = (ui_test_task_id, data) =>{
return postRequest("api/backend/ui_test_task/" + ui_test_task_id + "/", data)
};
//删除单个UI测试任务
export const deleteSingleUiTestTaskRequest = (ui_test_task_id) =>{
return deleteRequest("api/backend/ui_test_task/" + ui_test_task_id + "/")
};
//获取所有测试用例树形结构
export const getUiCaseTreeRequest = (ui_project_id) =>{
return getRequest("api/backend/ui_test_task/get_ui_case_tree/" + ui_project_id + "/")
};
//获取单独测试任务的用例树形结构
export const postUiCaseTreeRequest = (ui_test_task_id) =>{
return postRequest("api/backend/ui_test_task/get_ui_case_tree/" + ui_test_task_id + "/")
};
//执行测试任务
export const postPerformUiTaskRequest = (ui_test_task_id) =>{
return postRequest("api/backend/ui_test_task/perform_ui_task/" + ui_test_task_id + "/")
};
//获取单独测试用例的所有测试报告
export const getUiCaseResultRequest = (ui_test_task_id) =>{
return getRequest("api/backend/ui_test_task/check_result_list/" + ui_test_task_id + "/")
};
//获取单独测试用例的-单独的测试报告
export const postUiCaseCheckResultRequest = (ui_test_result_id) =>{
return postRequest("api/backend/ui_test_task/check_result/" + ui_test_result_id + "/")
};
//编辑单个UI测试报告
export const deleteSingleUiTestResultRequest = (ui_test_task_id, ui_test_result_id) =>{
return deleteRequest("api/backend/ui_test_task/check_result_list/" + ui_test_task_id + "/" + ui_test_result_id + "/")
};
//获取单独测试用例的-单独的测试报告异常详情
export const getUiTestAbnormalRequest = (ui_test_abnormal_result_id) =>{
return getRequest("api/backend/ui_test_task/check_result/ui_test_abnormal/" + ui_test_abnormal_result_id + "/")
};
// 下载Web 自动化脚本
export const getDownloadWebScriptRequest = (ui_test_result_id) =>{
return getRequest("api/backend/ui_test_task/check_result/ui_test_web_script/" + ui_test_result_id + "/")
};
\ No newline at end of file
import {getRequest, postRequest, deleteRequest} from "./common/common";
import da from 'element-ui/src/locale/lang/da';
export const loginRequest = (userData) =>{
return getRequest("api/backend/users/", userData)
};
export const registerRequest = (userData) => {
return postRequest("api/backend/users/",userData)
};
export const logoutRequest = () => {
return deleteRequest("api/backend/users/")
};
export const getUserInfoRequest = () => {
return getRequest("api/backend/users/info/")
};
export const test = () => {
return getRequest("test")
};
.header{
background-color: #242f42;
}
.login-wrap{
background: #324157;
}
.plugins-tips{
background: #eef1f6;
}
.plugins-tips a{
color: #20a0ff;
}
.el-upload--text em {
color: #20a0ff;
}
.pure-button{
background: #20a0ff;
}
.tags-li.active {
border: 1px solid #409EFF;
background-color: #409EFF;
}
.message-title{
color: #20a0ff;
}
.collapse-btn:hover{
background: rgb(40,52,70);
}
\ No newline at end of file
[class*=" el-icon-lx"], [class^=el-icon-lx] {
font-family: lx-iconfont!important;
}
\ No newline at end of file
* {
margin: 0;
padding: 0;
}
html,body,#app {
height: 100%;
margin: 0;
padding: 0;
min-width: 1366px;
}
@font-face {
font-family: 'webfont';
font-display: swap;
src: url('//at.alicdn.com/t/webfont_h2zl27npwtp.eot'); /* IE9*/
src: url('//at.alicdn.com/t/webfont_h2zl27npwtp.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('//at.alicdn.com/t/webfont_h2zl27npwtp.woff2') format('woff2'),
url('//at.alicdn.com/t/webfont_h2zl27npwtp.woff') format('woff'), /* chrome、firefox */
url('//at.alicdn.com/t/webfont_h2zl27npwtp.ttf') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/
url('//at.alicdn.com/t/webfont_h2zl27npwtp.svg#Alibaba-PuHuiTi-Regular') format('svg'); /* iOS 4.1- */
}
body {
font-family: 'Helvetica', 'webfont', serif !important;
}
a {
text-decoration: none
}
.content-box {
position: absolute;
left: 250px;
right: 0;
top: 70px;
bottom: 0;
padding-bottom: 30px;
-webkit-transition: left .3s ease-in-out;
transition: left .3s ease-in-out;
background: #f0f0f0;
}
.content {
width: auto;
height: 100%;
padding: 0 10px 0 10px;
overflow-y: scroll;
box-sizing: border-box;
}
.content-collapse {
left: 65px;
}
.container {
padding: 30px;
background: #fff;
border: 1px solid #ddd;
border-radius: 5px;
}
.crumbs {
margin: 10px 0;
}
.el-table th {
background-color: #f5f7fa !important;
}
.pagination {
margin: 20px 0;
text-align: right;
}
.plugins-tips {
padding: 20px 10px;
margin-bottom: 20px;
}
.el-button+.el-tooltip {
margin-left: 10px;
}
.el-table tr:hover {
background: #f6faff;
}
.mgb20 {
margin-bottom: 20px;
}
.move-enter-active,
.move-leave-active {
transition: opacity .5s;
}
.move-enter,
.move-leave {
opacity: 0;
}
/*BaseForm*/
.form-box {
width: 600px;
}
.form-box .line {
text-align: center;
}
.el-time-panel__content::after,
.el-time-panel__content::before {
margin-top: -7px;
}
.el-time-spinner__wrapper .el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default) {
padding-bottom: 0;
}
/*Upload*/
.pure-button {
width: 150px;
height: 40px;
line-height: 40px;
text-align: center;
color: #fff;
border-radius: 3px;
}
.g-core-image-corp-container .info-aside {
height: 45px;
}
.el-upload--text {
background-color: #fff;
border: 1px dashed #d9d9d9;
border-radius: 6px;
box-sizing: border-box;
width: 360px;
height: 180px;
text-align: center;
cursor: pointer;
position: relative;
overflow: hidden;
}
.el-upload--text .el-icon-upload {
font-size: 67px;
color: #97a8be;
margin: 40px 0 16px;
line-height: 50px;
}
.el-upload--text {
color: #97a8be;
font-size: 14px;
text-align: center;
}
.el-upload--text em {
font-style: normal;
}
/*VueEditor*/
.ql-container {
min-height: 400px;
}
.ql-snow .ql-tooltip {
transform: translateX(117.5px) translateY(10px) !important;
}
.editor-btn {
margin-top: 20px;
}
/*markdown*/
.v-note-wrapper .v-note-panel {
min-height: 500px;
}
.header{
background-color: #07c4a8;
}
.login-wrap{
background: rgba(56, 157, 170, 0.82);;
}
.plugins-tips{
background: #f2f2f2;
}
.plugins-tips a{
color: #00d1b2;
}
.el-upload--text em {
color: #00d1b2;
}
.pure-button{
background: #00d1b2;
}
.pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus, .pagination > .active > span, .pagination > .active > span:hover, .pagination > .active > span:focus {
background-color: #00d1b2 !important;
border-color: #00d1b2 !important;
}
.tags-li.active {
border: 1px solid #00d1b2;
background-color: #00d1b2;
}
.collapse-btn:hover{
background: #00d1b2;
}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
/* Logo 字体 */
@font-face {
font-family: "iconfont logo";
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
}
.logo {
font-family: "iconfont logo";
font-size: 160px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* tabs */
.nav-tabs {
position: relative;
}
.nav-tabs .nav-more {
position: absolute;
right: 0;
bottom: 0;
height: 42px;
line-height: 42px;
color: #666;
}
#tabs {
border-bottom: 1px solid #eee;
}
#tabs li {
cursor: pointer;
width: 100px;
height: 40px;
line-height: 40px;
text-align: center;
font-size: 16px;
border-bottom: 2px solid transparent;
position: relative;
z-index: 1;
margin-bottom: -1px;
color: #666;
}
#tabs .active {
border-bottom-color: #f00;
color: #222;
}
.tab-container .content {
display: none;
}
/* 页面布局 */
.main {
padding: 30px 100px;
width: 960px;
margin: 0 auto;
}
.main .logo {
color: #333;
text-align: left;
margin-bottom: 30px;
line-height: 1;
height: 110px;
margin-top: -50px;
overflow: hidden;
*zoom: 1;
}
.main .logo a {
font-size: 160px;
color: #333;
}
.helps {
margin-top: 40px;
}
.helps pre {
padding: 20px;
margin: 10px 0;
border: solid 1px #e7e1cd;
background-color: #fffdef;
overflow: auto;
}
.icon_lists {
width: 100% !important;
overflow: hidden;
*zoom: 1;
}
.icon_lists li {
width: 100px;
margin-bottom: 10px;
margin-right: 20px;
text-align: center;
list-style: none !important;
cursor: default;
}
.icon_lists li .code-name {
line-height: 1.2;
}
.icon_lists .icon {
display: block;
height: 100px;
line-height: 100px;
font-size: 42px;
margin: 10px auto;
color: #333;
-webkit-transition: font-size 0.25s linear, width 0.25s linear;
-moz-transition: font-size 0.25s linear, width 0.25s linear;
transition: font-size 0.25s linear, width 0.25s linear;
}
.icon_lists .icon:hover {
font-size: 100px;
}
.icon_lists .svg-icon {
/* 通过设置 font-size 来改变图标大小 */
width: 1em;
/* 图标和文字相邻时,垂直对齐 */
vertical-align: -0.15em;
/* 通过设置 color 来改变 SVG 的颜色/fill */
fill: currentColor;
/* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
normalize.css 中也包含这行 */
overflow: hidden;
}
.icon_lists li .name,
.icon_lists li .code-name {
color: #666;
}
/* markdown 样式 */
.markdown {
color: #666;
font-size: 14px;
line-height: 1.8;
}
.highlight {
line-height: 1.5;
}
.markdown img {
vertical-align: middle;
max-width: 100%;
}
.markdown h1 {
color: #404040;
font-weight: 500;
line-height: 40px;
margin-bottom: 24px;
}
.markdown h2,
.markdown h3,
.markdown h4,
.markdown h5,
.markdown h6 {
color: #404040;
margin: 1.6em 0 0.6em 0;
font-weight: 500;
clear: both;
}
.markdown h1 {
font-size: 28px;
}
.markdown h2 {
font-size: 22px;
}
.markdown h3 {
font-size: 16px;
}
.markdown h4 {
font-size: 14px;
}
.markdown h5 {
font-size: 12px;
}
.markdown h6 {
font-size: 12px;
}
.markdown hr {
height: 1px;
border: 0;
background: #e9e9e9;
margin: 16px 0;
clear: both;
}
.markdown p {
margin: 1em 0;
}
.markdown>p,
.markdown>blockquote,
.markdown>.highlight,
.markdown>ol,
.markdown>ul {
width: 80%;
}
.markdown ul>li {
list-style: circle;
}
.markdown>ul li,
.markdown blockquote ul>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown>ul li p,
.markdown>ol li p {
margin: 0.6em 0;
}
.markdown ol>li {
list-style: decimal;
}
.markdown>ol li,
.markdown blockquote ol>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown code {
margin: 0 3px;
padding: 0 5px;
background: #eee;
border-radius: 3px;
}
.markdown strong,
.markdown b {
font-weight: 600;
}
.markdown>table {
border-collapse: collapse;
border-spacing: 0px;
empty-cells: show;
border: 1px solid #e9e9e9;
width: 95%;
margin-bottom: 24px;
}
.markdown>table th {
white-space: nowrap;
color: #333;
font-weight: 600;
}
.markdown>table th,
.markdown>table td {
border: 1px solid #e9e9e9;
padding: 8px 16px;
text-align: left;
}
.markdown>table th {
background: #F7F7F7;
}
.markdown blockquote {
font-size: 90%;
color: #999;
border-left: 4px solid #e9e9e9;
padding-left: 0.8em;
margin: 1em 0;
}
.markdown blockquote p {
margin: 0;
}
.markdown .anchor {
opacity: 0;
transition: opacity 0.3s ease;
margin-left: 8px;
}
.markdown .waiting {
color: #ccc;
}
.markdown h1:hover .anchor,
.markdown h2:hover .anchor,
.markdown h3:hover .anchor,
.markdown h4:hover .anchor,
.markdown h5:hover .anchor,
.markdown h6:hover .anchor {
opacity: 1;
display: inline-block;
}
.markdown>br,
.markdown>p>br {
clear: both;
}
.hljs {
display: block;
background: white;
padding: 0.5em;
color: #333333;
overflow-x: auto;
}
.hljs-comment,
.hljs-meta {
color: #969896;
}
.hljs-string,
.hljs-variable,
.hljs-template-variable,
.hljs-strong,
.hljs-emphasis,
.hljs-quote {
color: #df5000;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-type {
color: #a71d5d;
}
.hljs-literal,
.hljs-symbol,
.hljs-bullet,
.hljs-attribute {
color: #0086b3;
}
.hljs-section,
.hljs-name {
color: #63a35c;
}
.hljs-tag {
color: #333333;
}
.hljs-title,
.hljs-attr,
.hljs-selector-id,
.hljs-selector-class,
.hljs-selector-attr,
.hljs-selector-pseudo {
color: #795da3;
}
.hljs-addition {
color: #55a532;
background-color: #eaffea;
}
.hljs-deletion {
color: #bd2c00;
background-color: #ffecec;
}
.hljs-link {
text-decoration: underline;
}
/* 代码高亮 */
/* PrismJS 1.15.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
/**
* prism.js default theme for JavaScript, CSS and HTML
* Based on dabblet (http://dabblet.com)
* @author Lea Verou
*/
code[class*="language-"],
pre[class*="language-"] {
color: black;
background: none;
text-shadow: 0 1px white;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
pre[class*="language-"]::-moz-selection,
pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection,
code[class*="language-"] ::-moz-selection {
text-shadow: none;
background: #b3d4fc;
}
pre[class*="language-"]::selection,
pre[class*="language-"] ::selection,
code[class*="language-"]::selection,
code[class*="language-"] ::selection {
text-shadow: none;
background: #b3d4fc;
}
@media print {
code[class*="language-"],
pre[class*="language-"] {
text-shadow: none;
}
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: .5em 0;
overflow: auto;
}
:not(pre)>code[class*="language-"],
pre[class*="language-"] {
background: #f5f2f0;
}
/* Inline code */
:not(pre)>code[class*="language-"] {
padding: .1em;
border-radius: .3em;
white-space: normal;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: slategray;
}
.token.punctuation {
color: #999;
}
.namespace {
opacity: .7;
}
.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
color: #905;
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
color: #690;
}
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
color: #9a6e3a;
background: hsla(0, 0%, 100%, .5);
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: #07a;
}
.token.function,
.token.class-name {
color: #DD4A68;
}
.token.regex,
.token.important,
.token.variable {
color: #e90;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>iconfont Demo</title>
<link rel="shortcut icon" href="//img.alicdn.com/imgextra/i2/O1CN01ZyAlrn1MwaMhqz36G_!!6000000001499-73-tps-64-64.ico" type="image/x-icon"/>
<link rel="icon" type="image/svg+xml" href="//img.alicdn.com/imgextra/i4/O1CN01EYTRnJ297D6vehehJ_!!6000000008020-55-tps-64-64.svg"/>
<link rel="stylesheet" href="https://g.alicdn.com/thx/cube/1.3.2/cube.min.css">
<link rel="stylesheet" href="demo.css">
<link rel="stylesheet" href="iconfont.css">
<script src="iconfont.js"></script>
<!-- jQuery -->
<script src="https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js"></script>
<!-- 代码高亮 -->
<script src="https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js"></script>
<style>
.main .logo {
margin-top: 0;
height: auto;
}
.main .logo a {
display: flex;
align-items: center;
}
.main .logo .sub-title {
margin-left: 0.5em;
font-size: 22px;
color: #fff;
background: linear-gradient(-45deg, #3967FF, #B500FE);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
</style>
</head>
<body>
<div class="main">
<h1 class="logo"><a href="https://www.iconfont.cn/" title="iconfont 首页" target="_blank">
<img width="200" src="https://img.alicdn.com/imgextra/i3/O1CN01Mn65HV1FfSEzR6DKv_!!6000000000514-55-tps-228-59.svg">
</a></h1>
<div class="nav-tabs">
<ul id="tabs" class="dib-box">
<li class="dib active"><span>Unicode</span></li>
<li class="dib"><span>Font class</span></li>
<li class="dib"><span>Symbol</span></li>
</ul>
<a href="https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=3126418" target="_blank" class="nav-more">查看项目</a>
</div>
<div class="tab-container">
<div class="content unicode" style="display: block;">
<ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont">&#xe710;</span>
<div class="name">cq-zhuzhungtu</div>
<div class="code-name">&amp;#xe710;</div>
</li>
</ul>
<div class="article markdown">
<h2 id="unicode-">Unicode 引用</h2>
<hr>
<p>Unicode 是字体在网页端最原始的应用方式,特点是:</p>
<ul>
<li>支持按字体的方式去动态调整图标大小,颜色等等。</li>
<li>默认情况下不支持多色,直接添加多色图标会自动去色。</li>
</ul>
<blockquote>
<p>注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)</p>
</blockquote>
<p>Unicode 使用步骤如下:</p>
<h3 id="-font-face">第一步:拷贝项目下面生成的 <code>@font-face</code></h3>
<pre><code class="language-css"
>@font-face {
font-family: 'iconfont';
src: url('iconfont.woff2?t=1641803473340') format('woff2'),
url('iconfont.woff?t=1641803473340') format('woff'),
url('iconfont.ttf?t=1641803473340') format('truetype');
}
</code></pre>
<h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
<pre><code class="language-css"
>.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
</code></pre>
<h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3>
<pre>
<code class="language-html"
>&lt;span class="iconfont"&gt;&amp;#x33;&lt;/span&gt;
</code></pre>
<blockquote>
<p>"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
</blockquote>
</div>
</div>
<div class="content font-class">
<ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont icon-cq-zhuzhungtu"></span>
<div class="name">
cq-zhuzhungtu
</div>
<div class="code-name">.icon-cq-zhuzhungtu
</div>
</li>
</ul>
<div class="article markdown">
<h2 id="font-class-">font-class 引用</h2>
<hr>
<p>font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。</p>
<p>与 Unicode 使用方式相比,具有如下特点:</p>
<ul>
<li>相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。</li>
<li>因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。</li>
</ul>
<p>使用步骤如下:</p>
<h3 id="-fontclass-">第一步:引入项目下面生成的 fontclass 代码:</h3>
<pre><code class="language-html">&lt;link rel="stylesheet" href="./iconfont.css"&gt;
</code></pre>
<h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3>
<pre><code class="language-html">&lt;span class="iconfont icon-xxx"&gt;&lt;/span&gt;
</code></pre>
<blockquote>
<p>"
iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
</blockquote>
</div>
</div>
<div class="content symbol">
<ul class="icon_lists dib-box">
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-cq-zhuzhungtu"></use>
</svg>
<div class="name">cq-zhuzhungtu</div>
<div class="code-name">#icon-cq-zhuzhungtu</div>
</li>
</ul>
<div class="article markdown">
<h2 id="symbol-">Symbol 引用</h2>
<hr>
<p>这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇<a href="">文章</a>
这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:</p>
<ul>
<li>支持多色图标了,不再受单色限制。</li>
<li>通过一些技巧,支持像字体那样,通过 <code>font-size</code>, <code>color</code> 来调整样式。</li>
<li>兼容性较差,支持 IE9+,及现代浏览器。</li>
<li>浏览器渲染 SVG 的性能一般,还不如 png。</li>
</ul>
<p>使用步骤如下:</p>
<h3 id="-symbol-">第一步:引入项目下面生成的 symbol 代码:</h3>
<pre><code class="language-html">&lt;script src="./iconfont.js"&gt;&lt;/script&gt;
</code></pre>
<h3 id="-css-">第二步:加入通用 CSS 代码(引入一次就行):</h3>
<pre><code class="language-html">&lt;style&gt;
.icon {
width: 1em;
height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
&lt;/style&gt;
</code></pre>
<h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3>
<pre><code class="language-html">&lt;svg class="icon" aria-hidden="true"&gt;
&lt;use xlink:href="#icon-xxx"&gt;&lt;/use&gt;
&lt;/svg&gt;
</code></pre>
</div>
</div>
</div>
</div>
<script>
$(document).ready(function () {
$('.tab-container .content:first').show()
$('#tabs li').click(function (e) {
var tabContent = $('.tab-container .content')
var index = $(this).index()
if ($(this).hasClass('active')) {
return
} else {
$('#tabs li').removeClass('active')
$(this).addClass('active')
tabContent.hide().eq(index).fadeIn()
}
})
})
</script>
</body>
</html>
@font-face {
font-family: "iconfont"; /* Project id 3126418 */
src: url('iconfont.woff2?t=1641803473340') format('woff2'),
url('iconfont.woff?t=1641803473340') format('woff'),
url('iconfont.ttf?t=1641803473340') format('truetype');
}
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-cq-zhuzhungtu:before {
content: "\e710";
}
!function(t){var e,n,o,i,d,l='<svg><symbol id="icon-cq-zhuzhungtu" viewBox="0 0 1024 1024"><path d="M819.0592 922.8928H960V102.4H819.0592z" fill="#1890FF" ></path><path d="M567.3728 922.8928h140.9408V469.8624H567.3728z" fill="#8BC7FF" ></path><path d="M315.6864 922.8928h140.9408V354.0864H315.6864z" fill="#1890FF" ></path><path d="M64 922.8928h140.9408V625.92H64z" fill="#8BC7FF" ></path></symbol></svg>',c=(c=document.getElementsByTagName("script"))[c.length-1].getAttribute("data-injectcss"),a=function(t,e){e.parentNode.insertBefore(t,e)};if(c&&!t.__iconfont__svg__cssinject__){t.__iconfont__svg__cssinject__=!0;try{document.write("<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>")}catch(t){console&&console.log(t)}}function s(){d||(d=!0,o())}function r(){try{i.documentElement.doScroll("left")}catch(t){return void setTimeout(r,50)}s()}e=function(){var t,e;(e=document.createElement("div")).innerHTML=l,l=null,(t=e.getElementsByTagName("svg")[0])&&(t.setAttribute("aria-hidden","true"),t.style.position="absolute",t.style.width=0,t.style.height=0,t.style.overflow="hidden",e=t,(t=document.body).firstChild?a(e,t.firstChild):t.appendChild(e))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(e,0):(n=function(){document.removeEventListener("DOMContentLoaded",n,!1),e()},document.addEventListener("DOMContentLoaded",n,!1)):document.attachEvent&&(o=e,i=t.document,d=!1,r(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,s())})}(window);
\ No newline at end of file
{
"id": "3126418",
"name": "iconfont",
"font_family": "iconfont",
"css_prefix_text": "icon-",
"description": "",
"glyphs": [
{
"icon_id": "26094420",
"name": "cq-zhuzhungtu",
"font_class": "cq-zhuzhungtu",
"unicode": "e710",
"unicode_decimal": 59152
}
]
}
import axios from 'axios';
import qs from "qs";
// 创建axios实例
const httpService = axios.create({
baseURL: window.location.origin,
timeout: 10 * 60 * 1000,
withCredentials: true // 跨域请求时发送Cookie
});
// request拦截器
httpService.interceptors.request.use(
config => {
return config;
},
error => Promise.reject(error)
)
// response拦截器
httpService.interceptors.response.use(
response => {
// // 后端返回状态码为-10003表示鉴权失败, 直接路由到登陆页
// if (res && res.code === -10003){
// return router.push('/login');
// }
return response.data;
},
error => {
if (error && error.response) {
switch (error.response.status) {
case 400:
error.message = '错误请求';
break;
case 401:
error.message = '未授权,请重新登录';
break;
case 403:
error.message = '拒绝访问';
break;
case 404:
error.message = '请求错误,未找到该资源';
break;
case 405:
error.message = '请求方法未允许';
break;
case 408:
error.message = '请求超时';
break;
case 500:
error.message = '服务器端出错';
break;
case 501:
error.message = '网络未实现';
break;
case 502:
error.message = '网络错误';
break;
case 503:
error.message = '服务不可用';
break;
case 504:
error.message = '网络超时';
break;
case 505:
error.message = 'http版本不支持该请求';
break;
default:
error.message = `未知错误${error.response.status}`;
}
} else {
error.message = "连接到服务器失败";
}
return Promise.reject(error);
}
)
/**
* get请求
* @param url
* @param params
* @returns {Promise<unknown>}
*/
export function get(url, params = {}) {
return new Promise((resolve, reject) => {
httpService({
url: url,
method: 'get',
params: params,
headers: {'Content-Type': 'application/json'}
}).then(response => {
resolve(response);
}).catch(error => {
reject(error);
});
});
}
/**
* post请求, 默认请求头信息为: application/json
* @param url
* @param params
* @returns {Promise<unknown>}
*/
export function post(url, params = {}) {
return new Promise((resolve, reject) => {
httpService({
url: url,
method: 'post',
data: params
}).then(response => {
resolve(response);
}).catch(error => {
reject(error);
});
});
}
/**
* put请求, 默认请求头信息为: application/json
* @param url
* @param params
* @returns {Promise<unknown>}
*/
export function put(url, params = {}) {
return new Promise((resolve, reject) => {
httpService({
url: url,
method: 'put',
data: params
}).then(response => {
resolve(response);
}).catch(error => {
reject(error);
});
});
}
/**
* delete请求, 默认请求头信息为: application/json
* @param url
* @param params
* @returns {Promise<unknown>}
*/
export function deleteApi(url, params = {}) {
return new Promise((resolve, reject) => {
httpService({
url: url,
method: 'delete',
data: params
}).then(response => {
resolve(response);
}).catch(error => {
reject(error);
});
});
}
/**
* post请求, 表单提交, 请求头为: application/x-www-form-urlencoded
* @param url
* @param params
* @returns {Promise<unknown>}
*/
export function postForm(url, params = {}) {
return new Promise((resolve, reject) => {
httpService({
url: url,
method: 'post',
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
data: qs.stringify(params, {skipNulls: true})
}).then(response => {
resolve(response);
}).catch(error => {
reject(error);
});
});
}
/**
* 表单携带文件上传, Post请求, 表单参数与file在同一个对象参数中, 特定文件key为file或者files
* 后端直接对象接收即可或者和文件接收类似的一个个属性接收@RequestParam("files") MultipartFile[] files
* @param url
* @param params
* @returns {Promise<unknown>}
*/
export function postFormData(url, params = {}) {
let formData = new FormData()
for (let [key, value] of Object.entries(params)) {
if ((key === 'file' || key === 'files') && value instanceof Array && value.length !== 0) {
value.forEach(f => {
formData.append(key, f)
})
} else {
if (value !== null && value !== undefined) {
formData.append(key, params[key])
}
}
}
return fileUpload(url, formData);
}
/**
* 表单携带文件上传, Post请求, 表单参数与file分开接收
* 1、后端参数部分使用@RequestPart("param") JacocoVo jacocoVo
* 2、内部根据传入的参数和files 进行formData的填充
* @param url
* @param params
* @param files
* @returns {Promise<unknown>}
*/
export function postFormMulitFile(url, params = {}, files = []) {
let formData = new FormData()
files.forEach(file => {
formData.append('files', file)
})
formData.append('param',
new Blob(
[
JSON.stringify(params)
], {
type: "application/json"
}));
return fileUpload(url, formData);
}
/**
* 文件上传
* @param url
* @param formData 参数需要是一个let formData = new FormData()类型, 后端直接用实体接收文件之外的参数, 文件通过@RequestParam("files") MultipartFile[] files接收
* @returns {Promise<unknown>}
*/
function fileUpload(url, formData = {}) {
return new Promise((resolve, reject) => {
httpService({
url: url,
method: 'post',
data: formData
}).then(response => {
resolve(response);
}).catch(error => {
reject(error);
});
});
}
export default {
get,
post, // json
put, //json
postForm, // 表单
postFormData, // 表单带文件
postFormMulitFile, // 表单带文件, 其他参数为json
deleteApi
}
<template>
<div class="header">
<!-- 折叠按钮 -->
<div class="collapse-btn" @click="collapseChage">
<i v-if="!collapse" class="el-icon-s-fold"></i>
<i v-else class="el-icon-s-unfold"></i>
</div>
<div class="logo">
<a href="#/dashboard">
质量平台
</a>
</div>
<div class="header-right">
<div class="header-user-con">
<!-- 用户名下拉菜单 -->
<el-dropdown class="user-name" trigger="click" @command="handleCommand">
<span class="el-dropdown-link">
欢迎 {{username}}
<i class="el-icon-caret-bottom"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item divided command="loginout">退出登录</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
</div>
</div>
</template>
<script>
import bus from '../common/bus';
export default {
data() {
return {
collapse: false,
fullscreen: false,
name: 'linxin',
message: 2
};
},
computed: {
username() {
let username = localStorage.getItem('ms_username');
return username ? username : this.name;
}
},
methods: {
// 用户名下拉菜单选择事件
handleCommand(command) {
if (command === 'loginout') {
localStorage.removeItem('username');
this.$router.push('/login');
}
},
// 侧边栏折叠
collapseChage() {
this.collapse = !this.collapse;
bus.$emit('collapse', this.collapse);
},
// 全屏事件
handleFullScreen() {
let element = document.documentElement;
if (this.fullscreen) {
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.webkitCancelFullScreen) {
document.webkitCancelFullScreen();
} else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen();
} else if (document.msExitFullscreen) {
document.msExitFullscreen();
}
} else {
if (element.requestFullscreen) {
element.requestFullscreen();
} else if (element.webkitRequestFullScreen) {
element.webkitRequestFullScreen();
} else if (element.mozRequestFullScreen) {
element.mozRequestFullScreen();
} else if (element.msRequestFullscreen) {
// IE11
element.msRequestFullscreen();
}
}
this.fullscreen = !this.fullscreen;
}
},
mounted() {
if (document.body.clientWidth < 1500) {
this.collapseChage();
}
}
};
</script>
<style scoped>
a {
text-decoration: none;
font-size: 20px;
line-height: 56px;
height: 56px;
color: rgb(191, 203, 217);
font-family: 'Helvetica', 'webfont', serif !important;
}
.header {
position: relative;
box-sizing: border-box;
width: 100%;
height: 70px;
font-size: 22px;
color: #fff;
}
.collapse-btn {
float: left;
padding: 0 21px;
cursor: pointer;
line-height: 70px;
}
.header .logo {
float: left;
width: 250px;
line-height: 70px;
}
.header-right {
float: right;
padding-right: 50px;
}
.header-user-con {
display: flex;
height: 70px;
align-items: center;
}
.btn-fullscreen {
transform: rotate(45deg);
margin-right: 5px;
font-size: 24px;
}
.btn-bell,
.btn-fullscreen {
position: relative;
width: 30px;
height: 30px;
text-align: center;
border-radius: 15px;
cursor: pointer;
}
.btn-bell-badge {
position: absolute;
right: 0;
top: -2px;
width: 8px;
height: 8px;
border-radius: 4px;
background: #f56c6c;
color: #fff;
}
.btn-bell .el-icon-bell {
color: #fff;
}
.user-name {
margin-left: 10px;
}
.user-avator {
margin-left: 20px;
}
.user-avator img {
display: block;
width: 40px;
height: 40px;
border-radius: 50%;
}
.el-dropdown-link {
color: #fff;
cursor: pointer;
}
.el-dropdown-menu__item {
text-align: center;
}
</style>
<template>
<div class="wrapper">
<v-head></v-head>
<v-sidebar></v-sidebar>
<div class="content-box" :class="{'content-collapse':collapse}">
<v-tags></v-tags>
<div class="content">
<transition name="move" mode="out-in">
<keep-alive :include="tagsList">
<router-view></router-view>
</keep-alive>
</transition>
<el-backtop target=".content"></el-backtop>
</div>
</div>
</div>
</template>
<script>
import vHead from './Header.vue';
import vSidebar from './Sidebar.vue';
import vTags from './Tags.vue';
import bus from './bus';
export default {
data() {
return {
tagsList: [],
collapse: false
};
},
components: {
vHead,
vSidebar,
vTags
},
created() {
bus.$on('collapse-content', msg => {
this.collapse = msg;
});
// 只有在标签页列表里的页面才使用keep-alive,即关闭标签之后就不保存到内存中了。
bus.$on('tags', msg => {
let arr = [];
for (let i = 0, len = msg.length; i < len; i++) {
msg[i].name && arr.push(msg[i].name);
}
this.tagsList = arr;
});
}
};
</script>
This diff is collapsed.
<template>
<div class="tags" v-if="showTags">
<ul>
<li class="tags-li" v-for="(item,index) in tagsList" :class="{'active': isActive(item.path)}" :key="index">
<router-link :to="item.path" class="tags-li-title">
{{item.title}}
</router-link>
<span class="tags-li-icon" @click="closeTags(index)"><i class="el-icon-close"></i></span>
</li>
</ul>
<div class="tags-close-box">
<el-dropdown @command="handleTags">
<el-button size="mini" type="primary">
标签选项<i class="el-icon-arrow-down el-icon--right"></i>
</el-button>
<el-dropdown-menu size="small" slot="dropdown">
<el-dropdown-item command="other">关闭其他</el-dropdown-item>
<el-dropdown-item command="all">关闭所有</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
</div>
</template>
<script>
import bus from './bus';
export default {
data() {
return {
tagsList: []
}
},
methods: {
isActive(path) {
return path === this.$route.fullPath;
},
// 关闭单个标签
closeTags(index) {
const delItem = this.tagsList.splice(index, 1)[0];
const item = this.tagsList[index] ? this.tagsList[index] : this.tagsList[index - 1];
if (item) {
delItem.path === this.$route.fullPath && this.$router.push(item.path);
}else{
this.$router.push('/');
}
},
// 关闭全部标签
closeAll(){
this.tagsList = [];
this.$router.push('/');
},
// 关闭其他标签
closeOther(){
const curItem = this.tagsList.filter(item => {
return item.path === this.$route.fullPath;
})
this.tagsList = curItem;
},
// 设置标签
setTags(route){
const isExist = this.tagsList.some(item => {
return item.path === route.fullPath;
})
if(!isExist){
if(this.tagsList.length >= 8){
this.tagsList.shift();
}
this.tagsList.push({
title: route.meta.title,
path: route.fullPath,
name: route.matched[1].components.default.name
})
}
bus.$emit('tags', this.tagsList);
},
handleTags(command){
command === 'other' ? this.closeOther() : this.closeAll();
}
},
computed: {
showTags() {
return this.tagsList.length > 0;
}
},
watch:{
$route(newValue, oldValue){
this.setTags(newValue);
}
},
created(){
this.setTags(this.$route);
// 监听关闭当前页面的标签页
bus.$on('close_current_tags', () => {
for (let i = 0, len = this.tagsList.length; i < len; i++) {
const item = this.tagsList[i];
if(item.path === this.$route.fullPath){
if(i < len - 1){
this.$router.push(this.tagsList[i+1].path);
}else if(i > 0){
this.$router.push(this.tagsList[i-1].path);
}else{
this.$router.push('/');
}
this.tagsList.splice(i, 1);
break;
}
}
})
}
}
</script>
<style>
.tags {
position: relative;
height: 30px;
overflow: hidden;
background: #fff;
padding-right: 120px;
box-shadow: 0 5px 10px #ddd;
}
.tags ul {
box-sizing: border-box;
width: 100%;
height: 100%;
}
.tags-li {
float: left;
margin: 3px 5px 2px 3px;
border-radius: 3px;
font-size: 12px;
overflow: hidden;
cursor: pointer;
height: 23px;
line-height: 23px;
border: 1px solid #e9eaec;
background: #fff;
padding: 0 5px 0 12px;
vertical-align: middle;
color: #666;
-webkit-transition: all .3s ease-in;
-moz-transition: all .3s ease-in;
transition: all .3s ease-in;
}
.tags-li:not(.active):hover {
background: #f8f8f8;
}
.tags-li.active {
color: #fff;
}
.tags-li-title {
float: left;
max-width: 80px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
margin-right: 5px;
color: #666;
}
.tags-li.active .tags-li-title {
color: #fff;
}
.tags-close-box {
position: absolute;
right: 0;
top: 0;
box-sizing: border-box;
padding-top: 1px;
text-align: center;
width: 110px;
height: 30px;
background: #fff;
box-shadow: -3px 0 15px 3px rgba(0, 0, 0, .1);
z-index: 10;
}
</style>
import Vue from 'vue';
// 使用 Event Bus
const bus = new Vue();
export default bus;
\ No newline at end of file
import Vue from 'vue';
// v-dialogDrag: 弹窗拖拽属性
Vue.directive('dialogDrag', {
bind(el, binding, vnode, oldVnode) {
const dialogHeaderEl = el.querySelector('.el-dialog__header');
const dragDom = el.querySelector('.el-dialog');
dialogHeaderEl.style.cssText += ';cursor:move;'
dragDom.style.cssText += ';top:0px;'
// 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
const sty = (() => {
if (window.document.currentStyle) {
return (dom, attr) => dom.currentStyle[attr];
} else {
return (dom, attr) => getComputedStyle(dom, false)[attr];
}
})()
dialogHeaderEl.onmousedown = (e) => {
// 鼠标按下,计算当前元素距离可视区的距离
const disX = e.clientX - dialogHeaderEl.offsetLeft;
const disY = e.clientY - dialogHeaderEl.offsetTop;
const screenWidth = document.body.clientWidth; // body当前宽度
const screenHeight = document.documentElement.clientHeight; // 可见区域高度(应为body高度,可某些环境下无法获取)
const dragDomWidth = dragDom.offsetWidth; // 对话框宽度
const dragDomheight = dragDom.offsetHeight; // 对话框高度
const minDragDomLeft = dragDom.offsetLeft;
const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth;
const minDragDomTop = dragDom.offsetTop;
const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomheight;
// 获取到的值带px 正则匹配替换
let styL = sty(dragDom, 'left');
let styT = sty(dragDom, 'top');
// 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px
if (styL.includes('%')) {
styL = +document.body.clientWidth * (+styL.replace(/\%/g, '') / 100);
styT = +document.body.clientHeight * (+styT.replace(/\%/g, '') / 100);
} else {
styL = +styL.replace(/\px/g, '');
styT = +styT.replace(/\px/g, '');
};
document.onmousemove = function (e) {
// 通过事件委托,计算移动的距离
let left = e.clientX - disX;
let top = e.clientY - disY;
// 边界处理
if (-(left) > minDragDomLeft) {
left = -(minDragDomLeft);
} else if (left > maxDragDomLeft) {
left = maxDragDomLeft;
}
if (-(top) > minDragDomTop) {
top = -(minDragDomTop);
} else if (top > maxDragDomTop) {
top = maxDragDomTop;
}
// 移动当前元素
dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`;
};
document.onmouseup = function (e) {
document.onmousemove = null;
document.onmouseup = null;
};
}
}
})
export const messages = {
'zh': {
i18n: {
breadcrumb: '国际化产品',
tips: '通过切换语言按钮,来改变当前内容的语言。',
btn: '切换英文',
title1: '常用用法',
p1: '要是你把你的秘密告诉了风,那就别怪风把它带给树。',
p2: '没有什么比信念更能支撑我们度过艰难的时光了。',
p3: '只要能把自己的事做好,并让自己快乐,你就领先于大多数人了。',
title2: '组件插值',
info: 'Element组件需要国际化,请参考 {action}。',
value: '文档'
}
},
'en': {
i18n: {
breadcrumb: 'International Products',
tips: 'Click on the button to change the current language. ',
btn: 'Switch Chinese',
title1: 'Common usage',
p1: "If you reveal your secrets to the wind you should not blame the wind for revealing them to the trees.",
p2: "Nothing can help us endure dark times better than our faith. ",
p3: "If you can do what you do best and be happy, you're further along in life than most people.",
title2: 'Component interpolation',
info: 'The default language of Element is Chinese. If you wish to use another language, please refer to the {action}.',
value: 'documentation'
}
}
}
\ No newline at end of file
<template>
<div class="error-page">
<div class="error-code">4<span>0</span>3</div>
<div class="error-desc">啊哦~ 你没有权限访问该页面哦</div>
<div class="error-handle">
<router-link to="/">
<el-button type="primary" size="large">返回首页</el-button>
</router-link>
<el-button class="error-btn" type="primary" size="large" @click="goBack">返回上一页</el-button>
</div>
</div>
</template>
<script>
export default {
methods: {
goBack(){
this.$router.go(-1);
}
}
}
</script>
<style scoped>
.error-page{
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
width: 100%;
height: 100%;
background: #f3f3f3;
box-sizing: border-box;
}
.error-code{
line-height: 1;
font-size: 250px;
font-weight: bolder;
color: #f02d2d;
}
.error-code span{
color: #00a854;
}
.error-desc{
font-size: 30px;
color: #777;
}
.error-handle{
margin-top: 30px;
padding-bottom: 200px;
}
.error-btn{
margin-left: 100px;
}
</style>
<template>
<div class="error-page">
<div class="error-code">4<span>0</span>4</div>
<div class="error-desc">啊哦~ 你所访问的页面不存在</div>
<div class="error-handle">
<router-link to="/">
<el-button type="primary" size="large">返回首页</el-button>
</router-link>
<el-button class="error-btn" type="primary" size="large" @click="goBack">返回上一页</el-button>
</div>
</div>
</template>
<script>
export default {
methods: {
goBack(){
this.$router.go(-1);
}
}
}
</script>
<style scoped>
.error-page{
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
width: 100%;
height: 100%;
background: #f3f3f3;
box-sizing: border-box;
}
.error-code{
line-height: 1;
font-size: 250px;
font-weight: bolder;
color: #2d8cf0;
}
.error-code span{
color: #00a854;
}
.error-desc{
font-size: 30px;
color: #777;
}
.error-handle{
margin-top: 30px;
padding-bottom: 200px;
}
.error-btn{
margin-left: 100px;
}
</style>
<template>
<div class="login-wrap">
<div class="ms-login">
<div class="ms-title">自动化测试平台</div>
<el-form :model="loginForm" :rules="rules" ref="loginFormRef" label-width="0px" class="ms-content">
<el-form-item prop="username">
<el-input v-model="loginForm.username" placeholder="username">
<el-button slot="prepend" icon="el-icon-lx-people"></el-button>
</el-input>
</el-form-item>
<el-form-item prop="password">
<el-input
type="password"
placeholder="password"
v-model="loginForm.password"
@keyup.enter.native="login"
>
<el-button slot="prepend" icon="el-icon-lx-lock"></el-button>
</el-input>
</el-form-item>
<div class="login-btn">
<el-button type="primary" @click="login">登录</el-button>
<el-button type="danger" @click="register" style="margin-left: 0px;">注册</el-button>
</div>
<el-alert
v-if="showMessage"
@close="closeMessage"
:title="errorMessage"
type="error"
center
show-icon>
</el-alert>
<p class="login-tips">Tips : 请填写用户名和密码。</p>
</el-form>
</div>
</div>
</template>
<script>
import {loginRequest, registerRequest} from "../../api/users";
export default {
props:{},
data: function() {
return {
showMessage: false,
errorMessage: "错误",
loginForm: {
username: '',
password: '',
},
rules: {
username: [
{ required: true, message: '请输入用户名', trigger: 'blur' },
{ min: 1, max: 30, message: '长度在 1 到 30 个字符', trigger: 'blur' }
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' },
{ min: 1, max: 30, message: '长度在 1 到 30 个字符', trigger: 'blur' }
],
},
};
},
methods: {
closeMessage(){
this.showMessage = false;
},
login(){
console.log(this.$refs.loginFormRef);
this.$refs.loginFormRef.validate(valid => {
if (valid) {
loginRequest(this.loginForm).then(data => {
console.log(data);
if (true === data.data.success){
this.$message.success('登录成功');
localStorage.setItem('ms_username', this.loginForm.username);
localStorage.setItem('last_login', data.data.data.last_login);
this.$router.push('/dashboard');
}else {
this.showMessage = true;
this.errorMessage = data.data.error.message;
}
}).catch(data =>{
console.log(data)
})
} else {
this.$message.error('请输入账号和密码');
console.log('error submit!!');
return false;
}
});
},
register(){
this.$refs.loginFormRef.validate(valid => {
if (valid) {
registerRequest(this.loginForm).then(data => {
console.log(data);
if (true === data.data.success){
this.$message.success('注册成功');
}else {
this.showMessage = true;
this.errorMessage = data.data.error.message;
}
}).catch(data =>{
console.log(data)
})
} else {
this.$message.error('请输入账号和密码');
console.log('error submit!!');
return false;
}
});
},
},
created() {
}
};
</script>
<style scoped>
.login-wrap {
position: relative;
width: 100%;
height: 100%;
background-image: url(../../assets/img/login-bg.jpg);
background-size: 100%;
}
.ms-title {
width: 100%;
line-height: 50px;
text-align: center;
font-size: 20px;
color: #fff;
border-bottom: 1px solid #ddd;
}
.ms-login {
position: absolute;
left: 50%;
top: 50%;
width: 350px;
margin: -190px 0 0 -175px;
border-radius: 5px;
background: rgba(255, 255, 255, 0.3);
overflow: hidden;
}
.ms-content {
padding: 30px 30px;
}
.login-btn {
text-align: center;
}
.login-btn button {
width: 100%;
height: 36px;
margin-bottom: 10px;
}
.login-tips {
font-size: 12px;
line-height: 30px;
color: #fff;
}
</style>
Footer
© 2022 GitHub, Inc.
Footer navigation
Terms
Privacy
Security
Status
Docs
Contact GitHub
Pricing
API
Training
Blog
About
You have no unread notifications
\ No newline at end of file
<template>
<div>
<add-or-edit-api-business-test
:type="opsType"
:apiBusinessTestId="currentApiBusinessTestId"
:apiBusinessTestData="currentApiBusinessTestData"
:apiProjectId = "apiProjectId"
@saveApiBusinessTest="saveApiBusinessTest"
@cancelSaveApiBusinessTest="cancelSaveApiBusinessTest"
v-if="showAddOrEditApiBusinessTest">
</add-or-edit-api-business-test>
<div v-else>
<div class="crumbs">
<el-breadcrumb separator="/">
<el-breadcrumb-item>
<i class="el-icon-lx-calendar"></i> API项目
</el-breadcrumb-item>
<el-breadcrumb-item>API业务测试</el-breadcrumb-item>
</el-breadcrumb>
</div>
<el-row>
<el-button @click="returnProjectList">返回</el-button>
<el-button type="primary" @click="openAddBusinessTest" >创建API业务测试</el-button>
</el-row>
<div>
<el-table
:data="tableData"
style="width: 100%">
<!-- :default-sort = "{prop: 'date', order: 'descending'}">-->
<el-table-column
prop="id"
label="id"
sortable
width="180">
</el-table-column>
<el-table-column
prop="api_project_name"
label="项目名称"
sortable
width="180">
</el-table-column>
<el-table-column
prop="api_business_test_name"
label="Api业务测试"
sortable
width="180">
</el-table-column>
<el-table-column
prop="update_time"
label="更新时间"
width="180">
</el-table-column>
<el-table-column
prop="create_time"
label="创建时间"
width="180">
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button
size="mini"
@click="openEditApiBusinessTest(scope.row)">编辑</el-button>
<el-button
size="mini"
type="danger"
@click="deleteApiBusinessTest(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
</div>
</div>
</template>
<script>
import { getApiBusinessTestRequest, deleteSingleApiBusinessTestRequest} from '../../../../api/apiAutomation/apiBusinessTest';
import addOrEditApiBusinessTest from './addOrEditApiBusinessTest';
export default {
name: 'apiBusinessTest',
props: ['type', 'apiProjectId'],
inject:['reload'],
data() {
return {
tableData: [],
page: {
page: 1,
total: 0,
size: 10,
},
inject:['reload'],
apiBusinessTestId: "",
showAddOrEditApiBusinessTest:false,
opsType: "add",
// 当前currentApiBusinessTestId
currentApiBusinessTestId: 0,
//当前apiBusinessTest数据
currentApiBusinessTestData: {},
rules: {
},
}
},
methods: {
formatter(row, column) {
return row.address;
},
handleEdit(index, row) {
},
handleDelete(index, row) {
},
handleSizeChange(size) {
this.page.size = size;
},
handleCurrentChange(index) {
this.page.page = index;
this.getApiBusinessTestFun()
},
//获取该项目下所有业务测试用例列表
getApiBusinessTestFun() {
let req = {
page: this.page.page,
size: this.page.size,
};
getApiBusinessTestRequest(this.projectId).then(data => {
if (true === data.data.success) {
this.tableData = data.data.data;
} else {
this.$message.error("获取接口失败")
}
})
},
openAddBusinessTest(){
this.opsType = 'add';
this.currentApiBusinessTestId = 0;
this.currentApiBusinessTestData = {};
this.showAddOrEditApiBusinessTest = true
},
openEditApiBusinessTest(data){
this.opsType = 'edit';
this.currentApiBusinessTestId = data.id;
this.currentApiBusinessTestData = data;
this.showAddOrEditApiBusinessTest = true;
},
saveApiBusinessTest(){
this.showAddOrEditApiBusinessTest = false
this.getApiBusinessTestFun();
},
cancelSaveApiBusinessTest(){
this.showAddOrEditApiBusinessTest = false
this.getApiBusinessTestFun();
},
//删除单个业务测试
deleteApiBusinessTest(data){
this.$confirm('此操作将永久删除该业务测试, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.apiBusinessTestId = data.id
deleteSingleApiBusinessTestRequest(this.apiBusinessTestId).then(data => {
if (true === data.data.success) {
this.getApiBusinessTestFun();
this.$message.success("删除测试用例成功")
} else {
this.$message.error("删除测试用例失败")
}
}
);
}).catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
});
});
},
// 返回项目首页列表
returnProjectList() {
this.$parent.returnProject();
},
},
components: {
'add-or-edit-api-business-test': addOrEditApiBusinessTest,
},
created() {
if ('enter' === this.type){
this.projectId = this.apiProjectId
this.getApiBusinessTestFun();
}
}
};
</script>
<style scoped>
</style>
\ No newline at end of file
<template>
<div>
<api-business-test
:type="opsType"
:apiProjectId="currentApiProjectId"
v-if="showApiBusinessTest">
</api-business-test>
<div v-else>
<div class="crumbs">
<el-breadcrumb separator="/">
<el-breadcrumb-item>
<i class="el-icon-lx-calendar"></i> API项目
</el-breadcrumb-item>
<el-breadcrumb-item>API项目</el-breadcrumb-item>
</el-breadcrumb>
</div>
<el-table
:data="tableData"
style="width: 100%">
<el-table-column
prop="id"
label="id"
sortable
width="180">
</el-table-column>
<el-table-column
prop="api_project_name"
label="API项目名称"
sortable
width="180">
</el-table-column>
<el-table-column
prop="describe"
label="项目描述"
width="180">
</el-table-column>
<el-table-column
prop="updata_time"
label="更新时间"
width="180">
</el-table-column>
<el-table-column
prop="create_time"
label="创建时间"
width="180">
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button
size="mini"
@click="enterApiProjectTestCase(scope.row)">进入</el-button>
</template>
</el-table-column>
</el-table>
</div>
</div>
</template>
<script>
import {getApiProjectRequest} from '../../../../api/apiAutomation/apiProject';
import apiBusinessTest from './apiBusinessTest';
export default {
name: 'apiProjectBusinessTest',
data() {
return {
tableData: [],
page: {
page: 1,
total: 0,
size: 10,
},
projectId: "",
opsType: "enter",
showApiBusinessTest: false,
// 当前项目ID
currentApiProjectId: 0,
}
},
methods: {
handleEdit(index, row) {
},
handleDelete(index, row) {
},
handleSizeChange(size) {
this.page.size = size;
this.getApiProjectFun()
},
handleCurrentChange(index) {
this.page.page = index;
this.getApiProjectFun()
},
//获取所有项目列表
getApiProjectFun() {
let req = {
page: this.page.page,
size: this.page.size,
};
getApiProjectRequest(req).then(data => {
if (true === data.data.success) {
this.tableData = data.data.data;
this.page.total = data.data.data.total;
this.page.page = data.data.data.page;
this.page.size = data.data.data.size;
} else {
this.$message.error("获取接口失败")
}
})
},
//进入项目页面
enterApiProjectTestCase(data){
this.opsType = 'enter';
this.currentApiProjectId = data.id;
this.showApiBusinessTest = true;
},
// 返回项目列表
returnProject(){
this.showApiBusinessTest = false;
}
},
components: {
'api-business-test': apiBusinessTest
},
created() {
this.getApiProjectFun();
}
};
</script>
<style scoped>
</style>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment