Commit 3e56bc3a authored by Wallen姚文辉's avatar Wallen姚文辉

UI自动化版本

parent 03cd23a1
This diff is collapsed.
...@@ -14,6 +14,8 @@ import TestReport from '@/views/tool/TestReport'; ...@@ -14,6 +14,8 @@ import TestReport from '@/views/tool/TestReport';
import ReportLsit from '@/views/tool/ReportLsit'; import ReportLsit from '@/views/tool/ReportLsit';
import AduitReportList from '@/views/tool/AduitReportList'; import AduitReportList from '@/views/tool/AduitReportList';
import TestCase from '@/views/autotest/TestCase.vue'; import TestCase from '@/views/autotest/TestCase.vue';
import RequestsTemplate from '@/views/tool/RequestsTemplate.vue';
import MoveUIRun from '@/views/autotest/MoveUIRun.vue';
import Echarts from "vue-echarts"; import Echarts from "vue-echarts";
import 'echarts'; import 'echarts';
import ViewUIPlus from 'view-ui-plus'; import ViewUIPlus from 'view-ui-plus';
...@@ -85,7 +87,16 @@ const routers = [ ...@@ -85,7 +87,16 @@ const routers = [
path: 'testcase', path: 'testcase',
name: 'testcase', name: 'testcase',
component: TestCase component: TestCase
} },{
path:'moveuirun',
name:'moveuirun',
component: MoveUIRun
},
// {
// path:'requestsTemplate',
// name:'requestsTemplate',
// component:RequestsTemplate
// },
] ]
axios.interceptors.request.use(function (config) { axios.interceptors.request.use(function (config) {
......
This diff is collapsed.
...@@ -22,9 +22,10 @@ ...@@ -22,9 +22,10 @@
<Col :lg="4" span="0"> <Col :lg="4" span="0">
</Col> </Col>
<Col :lg="10" span="0"> <Col :lg="10" span="0">
<Card v-if="choiceId" style="height: 600px;"> <Card v-if="choiceId" style="height: 700px">
<Form > <Form>
<FormItem> <FormItem>
<div style="background-color: blue;height: 600px;overflow:auto">
<Table :show-header="false" row-key="id" :columns="menu_columns" <Table :show-header="false" row-key="id" :columns="menu_columns"
@on-selection-change="(a) => { select_menu = a }" :data="choicePermissions"> @on-selection-change="(a) => { select_menu = a }" :data="choicePermissions">
<template #name="{ row }"> <template #name="{ row }">
...@@ -38,6 +39,7 @@ ...@@ -38,6 +39,7 @@
{{ item.name }}</Tag> {{ item.name }}</Tag>
</template> </template>
</Table> </Table>
</div>
</FormItem> </FormItem>
<FormItem style="text-align: right;"> <FormItem style="text-align: right;">
<Button type="primary" @click="updatePermissions(choiceId)">确认</Button> <Button type="primary" @click="updatePermissions(choiceId)">确认</Button>
...@@ -69,7 +71,7 @@ export default { ...@@ -69,7 +71,7 @@ export default {
props: ['isCollapsed',], props: ['isCollapsed',],
data() { data() {
return { return {
page_id:16, page_id: 16,
title: "角色管理", title: "角色管理",
modlShow: false, modlShow: false,
addinfo: { addinfo: {
...@@ -109,7 +111,7 @@ export default { ...@@ -109,7 +111,7 @@ export default {
align: 'center' align: 'center'
} }
], ],
elements:[] elements: []
} }
}, },
methods: { methods: {
...@@ -147,7 +149,7 @@ export default { ...@@ -147,7 +149,7 @@ export default {
this.$request("get", "/identity/meun_list", null, this, (data) => { this.allPermissions = data.data }) this.$request("get", "/identity/meun_list", null, this, (data) => { this.allPermissions = data.data })
}, },
getRolePermissions(id_) { getRolePermissions(id_) {
if (this.elements.indexOf("3-3")==-1) return if (this.elements.indexOf("3-3") == -1) return
this.$request("get", "/identity/get_permissions/" + id_, null, this, (data) => { a(data.data) }) this.$request("get", "/identity/get_permissions/" + id_, null, this, (data) => { a(data.data) })
this.select_element = [] this.select_element = []
const a = (Permissions) => { const a = (Permissions) => {
...@@ -187,7 +189,7 @@ export default { ...@@ -187,7 +189,7 @@ export default {
// } // }
// 编辑权限2,删除权限3,操作栏4 // 编辑权限2,删除权限3,操作栏4
elements(value) { elements(value) {
if (value.indexOf('3-2') != -1 && this.columns.findIndex(each=>{return each.title=='编辑'})==-1) { if (value.indexOf('3-2') != -1 && this.columns.findIndex(each => { return each.title == '编辑' }) == -1) {
this.columns.push({ this.columns.push({
title: '编辑', title: '编辑',
slot: 'action', slot: 'action',
...@@ -201,7 +203,7 @@ export default { ...@@ -201,7 +203,7 @@ export default {
} }
}, },
created() { created() {
this.$getElements(this.page_id,this,(data)=>this.elements=data.data) this.$getElements(this.page_id, this, (data) => this.elements = data.data)
this.getMenu(); this.getMenu();
this.getRole(); this.getRole();
} }
......
<template>
<div class="dnd-flow" @drop="onDrop" :nodes="nodes" @dragover="onDragOver" @dragleave="onDragLeave">
<VueFlow>
<div class="dropzone-background" :style="{
backgroundColor: isDragOver ? '#e7f3ff' : 'transparent',
transition: 'background-color 0.2s ease',
}">
<Background :size="2" :gap="20" pattern-color="#BDBDBD">
<div class="overlay">
<slot></slot>
</div>
</Background>
<!-- <template #node-apinode="{aprops}">
<ApiNode :data="aprops.data"></ApiNode>
</template> -->
<!-- <template #node-whilenode="props">
<WhileNode :data="props.data"></WhileNode>
</template> -->
<Controls />
<p v-if="isDragOver">移动到此处</p>
</div>
</VueFlow>
<aside>
<Tabs>
<TabPane label="节点" icon="logo-apple">
<div class="nodes">
<div class="vue-flow__node-input" :draggable="true" @dragstart="onDragStart($event, 'input')">
输入</div>
<div class="vue-flow__node-default" :draggable="true"
@dragstart="onDragStart($event, 'apinode')">接口
</div>
<div class="vue-flow__node-default" :draggable="true"
@dragstart="onDragStart($event, 'default')">数据库
</div>
<div class="vue-flow__node-default" :draggable="true"
@dragstart="onDragStart($event, 'default')">for each
</div>
<div class="vue-flow__node-output" :draggable="true" @dragstart="onDragStart($event, 'whilenode')">
循环
</div>
</div>
</TabPane>
<TabPane label="块" icon="logo-windows">标签二的内容</TabPane>
<TabPane label="线" icon="logo-tux">标签三的内容</TabPane>
<TabPane label="导出" icon="logo-tux">标签三的内容</TabPane>
</Tabs>
</aside>
</div>
</template>
<script setup>
import { ref, watch } from 'vue'
import { VueFlow, useVueFlow } from '@vue-flow/core'
import {ApiNode } from './myNodeTypes/ApiNode.vue'
import {WhileNode } from './myNodeTypes/WhileNode.vue'
import { Background } from '@vue-flow/background'
import { Controls } from '@vue-flow/controls'
// import SpecialNode from './components/SpecialNode.vue'
// import SpecialEdge from './components/SpecialEdge.vue'
const { onConnect, addEdges, addNodes, screenToFlowCoordinate, onNodesInitialized, updateNode } = useVueFlow()
const nodes = ref([])
onConnect(addEdges)
let id = 0
function getId() {
return `测试节点${id++}`
}
const state = {
draggedType: ref(null),
isDragOver: ref(false),
isDragging: ref(false)
}
const { draggedType, isDragOver, isDragging } = state
watch(isDragging, (dragging) => {
document.body.style.userSelect = dragging ? 'none' : ''
})
function onDragStart(event, type) {
if (event.dataTransfer) {
event.dataTransfer.setData('application/vueflow', type)
event.dataTransfer.effectAllowed = 'move'
}
draggedType.value = type
isDragging.value = true
document.addEventListener('drop', onDragEnd)
}
function onDragOver(e) {
e.preventDefault()
if (draggedType.value) {
isDragOver.value = true
if (e.dataTransfer) {
e.dataTransfer.dataTransfer = 'move'
}
}
}
function onDragLeave() {
isDragOver.value = false
}
function onDragEnd() {
isDragging.value = false
isDragOver.value = false
draggedType.value = null
document.removeEventListener('drop', onDragEnd)
}
function onDrop(event) {
const position = screenToFlowCoordinate({
x: event.clientX,
y: event.clientY,
})
const nodeId = getId()
const newNode = {
id: nodeId,
type: draggedType.value,
position,
data: { label: nodeId }
}
const { off } = onNodesInitialized(() => {
updateNode(nodeId, node => ({
position: { x: node.position.x - node.dimensions.width / 2, y: node.position.y - node.dimensions.height / 2 },
}))
off()
})
addNodes(newNode)
}
// these are our edges
</script>
<style>
/* import the necessary styles for Vue Flow to work */
@import '@vue-flow/core/dist/style.css';
/* import the default theme, this is optional but generally recommended */
@import '@vue-flow/core/dist/theme-default.css';
@import '@vue-flow/node-resizer/dist/style.css';
@import '@vue-flow/controls/dist/style.css';
html,
body,
#app {
margin: 0;
height: 100%;
}
/* #app {
text-transform: uppercase;
font-family: 'JetBrains Mono', monospace;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
} */
.vue-flow__minimap {
transform: scale(75%);
transform-origin: bottom right;
}
.dnd-flow {
flex-direction: column;
display: flex;
height: 100%
}
.dnd-flow aside {
color: #fff;
font-weight: 700;
border-right: 1px solid #eee;
padding: 15px 10px;
font-size: 12px;
background: #10b981bf;
-webkit-box-shadow: 0px 5px 10px 0px rgba(0, 0, 0, .3);
box-shadow: 0 5px 10px #0000004d
}
.dnd-flow aside .nodes>* {
margin-bottom: 10px;
cursor: grab;
font-weight: 500;
-webkit-box-shadow: 5px 5px 10px 2px rgba(0, 0, 0, .25);
box-shadow: 5px 5px 10px 2px #00000040
}
.dnd-flow aside .description {
margin-bottom: 10px
}
.dnd-flow .vue-flow-wrapper {
flex-grow: 1;
height: 100%
}
@media screen and (min-width: 640px) {
.dnd-flow {
flex-direction: row
}
.dnd-flow aside {
min-width: 25%
}
}
@media screen and (max-width: 639px) {
.dnd-flow aside .nodes {
display: flex;
flex-direction: row;
gap: 5px
}
}
.dropzone-background {
position: relative;
height: 100%;
width: 100%
}
.dropzone-background .overlay {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
z-index: 1;
pointer-events: none
}
</style>
\ No newline at end of file
...@@ -10,10 +10,14 @@ ...@@ -10,10 +10,14 @@
</div> </div>
</Upload> </Upload>
<div> <div>
<Select filterable v-model="project" style="width:200px" placeholder="项目"> <Select filterable v-model="project" style="width:200px" placeholder="项目" @on-change="getview">
<Option v-for="item in projects" :value="item.id" :key="item.id">{{ <Option v-for="item in projects" :value="item.id" :key="item.id">{{
item.name }}</Option> item.name }}</Option>
</Select> </Select>
<Select filterable v-model="views" style="width:200px" placeholder="面板">
<Option v-for="item in views" :value="item.id" :key="item.id">{{
item.name }}</Option>
</Select>
<Button type="primary" @click="upload()" style="margin-left: 10px;">上传</Button> <Button type="primary" @click="upload()" style="margin-left: 10px;">上传</Button>
</div> </div>
<div style="margin-top: 10px;"> <div style="margin-top: 10px;">
...@@ -38,6 +42,7 @@ ...@@ -38,6 +42,7 @@
</template> </template>
<script> <script>
export default { export default {
props: ['isCollapsed',], props: ['isCollapsed',],
data() { data() {
...@@ -46,7 +51,9 @@ export default { ...@@ -46,7 +51,9 @@ export default {
title: "上传用例", title: "上传用例",
file: null, file: null,
project: null, project: null,
view: null,
projects: [], projects: [],
views: [],
uploadhistory: [], uploadhistory: [],
runupload: [], runupload: [],
total: 0, total: 0,
...@@ -69,8 +76,10 @@ export default { ...@@ -69,8 +76,10 @@ export default {
const formData = new FormData(); const formData = new FormData();
if (!this.file) return this.$Message.error("请上传xmind用例文件"); if (!this.file) return this.$Message.error("请上传xmind用例文件");
if (!this.project) return this.$Message.error("请选择项目"); if (!this.project) return this.$Message.error("请选择项目");
if (!this.view) return this.$Message.error("请选择面板");
formData.append('file', this.file); formData.append('file', this.file);
formData.append("project", this.project); formData.append("project", this.project);
formData.append("view", this.view);
formData.append("projectName", this.projects[this.projects.findIndex(ele => { return ele.id == this.project })].name); formData.append("projectName", this.projects[this.projects.findIndex(ele => { return ele.id == this.project })].name);
this.$http.post('/tool/testcase/upload', formData, { this.$http.post('/tool/testcase/upload', formData, {
headers: { headers: {
...@@ -86,6 +95,9 @@ export default { ...@@ -86,6 +95,9 @@ export default {
getprojects() { getprojects() {
this.$request('get', '/tool/testport/getproject', null, this, (data) => { this.projects = data.data }) this.$request('get', '/tool/testport/getproject', null, this, (data) => { this.projects = data.data })
}, },
getview(project) {
this.$request('get', 'tool/testport/view/' + project, null, this, (data) => { this.views = data.data })
},
getuploadhistory() { getuploadhistory() {
this.$request('get', '/tool/testcase/uploadhistory', this.pageinfo, this, (data) => { this.uploadhistory = data.data.rows; this.total = data.data.total }) this.$request('get', '/tool/testcase/uploadhistory', this.pageinfo, this, (data) => { this.uploadhistory = data.data.rows; this.total = data.data.total })
} }
...@@ -115,6 +127,13 @@ export default { ...@@ -115,6 +127,13 @@ export default {
this.runupload = a this.runupload = a
} }
}, },
project:{
Handle(value){
if (this.view){
this.view=null
}
}
},
runupload(newvalue, oldvalue) { runupload(newvalue, oldvalue) {
newvalue.forEach(ele => { newvalue.forEach(ele => {
if (!oldvalue.includes(ele)) this.$socket.emit("join", ele) if (!oldvalue.includes(ele)) this.$socket.emit("join", ele)
......
<script setup>
import { computed } from 'vue'
import { BaseEdge, EdgeLabelRenderer, getBezierPath, useVueFlow } from '@vue-flow/core'
const props = defineProps()
const { removeEdges } = useVueFlow()
const path = computed(() => getBezierPath(props))
</script>
<script>
export default {
inheritAttrs: false,
}
</script>
<template>
<BaseEdge :path="path[0]" />
<EdgeLabelRenderer>
<div
:style="{
pointerEvents: 'all',
position: 'absolute',
transform: `translate(-50%, -50%) translate(${path[1]}px,${path[2]}px)`,
}"
class="nodrag nopan"
>
<button class="edgebutton" @click="removeEdges(id)">×</button>
</div>
</EdgeLabelRenderer>
</template>
<style>
.edgebutton {
border-radius: 999px;
cursor: pointer;
}
.edgebutton:hover {
box-shadow: 0 0 0 2px pink, 0 0 0 4px #f05f75;
}
</style>
<script setup>
import { Handle, Position } from '@vue-flow/core'
import { ref } from 'vue'
const counter = ref(0)
</script>
<template>
<div class="custom-node">
<Handle type="target" :position="Position.Top" />
<button class="increment nodrag" @click="counter++">遥远的东方</button>
<div v-if="counter > 0" class="counter">
<div class="count" v-for="count of counter" :key="`count-${count}`">{{ count }}</div>
</div>
</div>
</template>
<style>
.custom-node {
min-width: 100px;
gap: 4px;
padding: 8px;
background: white;
border: 1px solid black;
border-radius: 4px;
}
.increment {
border-radius: 4px;
background: #42b983;
font-size: 10px;
color: #fff;
cursor: pointer;
border: none;
}
.increment:hover {
box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
}
.counter {
margin-top: 8px;
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 4px;
}
.count {
font-size: 6px;
color: #ff0072;
border: 1px solid rgba(0, 0, 0, 0.3);
border-radius: 8px;
}
</style>
<script setup>
import { useVueFlow } from '@vue-flow/core'
const props = defineProps({
id: {
type: String,
required: true,
},
data: {
type: Object,
required: true,
},
})
const { updateNodeData } = useVueFlow()
function onSelect(color) {
updateNodeData(props.id, { color, isGradient: false })
const connectedEdges = getConnectedEdges(props.id)
for (const edge of connectedEdges) {
edge.style = {
stroke: color,
}
}
}
</script>
<template>
<div>接口哈哈哈</div>
</template>
\ No newline at end of file
<script setup>
import { useVueFlow,Handle,Position } from '@vue-flow/core'
const props = defineProps({
id: {
type: String,
required: true,
},
data: {
type: Object,
required: true,
},
})
const { updateNodeData } = useVueFlow()
function onSelect(color) {
updateNodeData(props.id, { color, isGradient: false })
const connectedEdges = getConnectedEdges(props.id)
for (const edge of connectedEdges) {
edge.style = {
stroke: color,
}
}
}
</script>
<template>
<div>接口哈哈哈</div>
<Handle type="target" :position="Position.Top" />
<Handle type="source" :position="Position.Bottom" />
</template>
\ No newline at end of file
...@@ -12,6 +12,7 @@ module.exports = defineConfig({ ...@@ -12,6 +12,7 @@ module.exports = defineConfig({
} }
}, },
devServer: { devServer: {
allowedHosts: "all",
proxy: { proxy: {
'/api': { '/api': {
target: 'http://localhost:8080', target: 'http://localhost:8080',
......
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