一、测试平台原型图
前端的三大组件 vutify--前端布局展示 router--链接的跳转、axios--与服务器的交互,前后端的链接
二、vue ui 初始化项目
- 安装 vue 脚手架工具:
npm install -g @vue/cli
- 启动 vue ui:
vue ui
- 新建项目:test_fronted
- 配置项目:选择默认
- 安装插件:router
- 安装插件:vuetify
- 安装依赖:axios
- 详细安装步骤 参考:20230409-测试平台实战二 - 霍格沃兹测试学院校内交流 - 测试人社区
- 用vs code 打开项目
scr-asset--是放置图片,用来放置一些静态资源的
scr-component---用来放置组件,放置一些公共组件
scr-plugins---放置插件,现在只有vuetify
scr-router---放置路由,路由相关配置都在router中的index.js中实现
scr-vue --功能组件,相关的组件都放在vue中. app.vue是一个根组件,是所有界面的起点;main.js项目的入口,全局性的配置都放在这里
三、Vuetify 搭建主界面 Layout
在此之前要进行vuetify的安装
详细可以参考中的测试平台-前端ui总结大全_kayliu09的博客-CSDN博客中的1、Vue页面组件-Vuetify这部分内容
- 新建 LayOut.vue
- 主页布局模板
- 选择快速入门
- 选择预置布局
- 找到符合需求的布局页面
- 复制示例代码
- 修改对应的功能
- Vuetify — A Material Design Framework for Vue.js
- 点击快速入门-预设布局-base
复制代码
粘贴代码至LayOut.vue (首字母要大写)
注册路由
在相应的界面输入对应的网址,主页面搭建完成(布局完成)
三、Vuetify 搭建测试用例界面
- 新建 TestCase.vue
- 测试用例模板
- 选择 UI 组件
- 选择 Tables(表格)
- 找到符合需求的表格
- 复制示例代码
- 修改对应的功能
- 对应组件路径
Vuetify — A Material Design Framework for Vue.js
找到数据表格-选择一个有增删查改的crud-点击复制源代码
-
复制代码至对应的vue
找到有标红的地方,修改成<template v-slot:[`item.actions`]="{ item }">
只是语法方面的规范
注册路由
访问对应的网页
<template>
<v-data-table
:headers="headers"
:items="desserts"
sort-by="calories"
class="elevation-1"
>
<template v-slot:top>
<v-toolbar
flat
>
<v-toolbar-title>测试用例</v-toolbar-title>
<v-divider
class="mx-4"
inset
vertical
></v-divider>
<v-spacer></v-spacer>
<v-dialog
v-model="dialog"
max-width="500px"
>
<template v-slot:activator="{ on, attrs }">
<v-btn
color="primary"
dark
class="mb-2"
v-bind="attrs"
v-on="on"
>
New Item
</v-btn>
</template>
<v-card>
<v-card-title>
<span class="text-h5">{{ formTitle }}</span>
</v-card-title>
<v-card-text>
<v-container>
<v-row>
<v-col
cols="12"
sm="6"
md="4"
>
<v-text-field
v-model="editedItem.name"
label="Dessert name"
></v-text-field>
</v-col>
<v-col
cols="12"
sm="6"
md="4"
>
<v-text-field
v-model="editedItem.calories"
label="Calories"
></v-text-field>
</v-col>
<v-col
cols="12"
sm="6"
md="4"
>
<v-text-field
v-model="editedItem.fat"
label="Fat (g)"
></v-text-field>
</v-col>
<v-col
cols="12"
sm="6"
md="4"
>
<v-text-field
v-model="editedItem.carbs"
label="Carbs (g)"
></v-text-field>
</v-col>
<v-col
cols="12"
sm="6"
md="4"
>
<v-text-field
v-model="editedItem.protein"
label="Protein (g)"
></v-text-field>
</v-col>
</v-row>
</v-container>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn
color="blue darken-1"
text
@click="close"
>
Cancel
</v-btn>
<v-btn
color="blue darken-1"
text
@click="save"
>
Save
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
<v-dialog v-model="dialogDelete" max-width="500px">
<v-card>
<v-card-title class="text-h5">Are you sure you want to delete this item?</v-card-title>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="blue darken-1" text @click="closeDelete">Cancel</v-btn>
<v-btn color="blue darken-1" text @click="deleteItemConfirm">OK</v-btn>
<v-spacer></v-spacer>
</v-card-actions>
</v-card>
</v-dialog>
</v-toolbar>
</template>
<template v-slot:[`item.actions`]="{ item }">
<v-icon
small
class="mr-2"
@click="editItem(item)"
>
mdi-pencil
</v-icon>
<v-icon
small
@click="deleteItem(item)"
>
mdi-delete
</v-icon>
</template>
<template v-slot:no-data>
<v-btn
color="primary"
@click="initialize"
>
Reset
</v-btn>
</template>
</v-data-table>
</template>
<script>
export default {
data: () => ({
dialog: false,
dialogDelete: false,
headers: [
{
text: 'Dessert (100g serving)',
align: 'start',
sortable: false,
value: 'name',
},
{ text: 'Calories', value: 'calories' },
{ text: 'Fat (g)', value: 'fat' },
{ text: 'Carbs (g)', value: 'carbs' },
{ text: 'Protein (g)', value: 'protein' },
{ text: 'Actions', value: 'actions', sortable: false },
],
desserts: [],
editedIndex: -1,
editedItem: {
name: '',
calories: 0,
fat: 0,
carbs: 0,
protein: 0,
},
defaultItem: {
name: '',
calories: 0,
fat: 0,
carbs: 0,
protein: 0,
},
}),
computed: {
formTitle () {
return this.editedIndex === -1 ? 'New Item' : 'Edit Item'
},
},
watch: {
dialog (val) {
val || this.close()
},
dialogDelete (val) {
val || this.closeDelete()
},
},
created () {
this.initialize()
},
methods: {
initialize () {
this.desserts = [
{
name: 'Frozen Yogurt',
calories: 159,
fat: 6.0,
carbs: 24,
protein: 4.0,
},
{
name: 'Ice cream sandwich',
calories: 237,
fat: 9.0,
carbs: 37,
protein: 4.3,
},
{
name: 'Eclair',
calories: 262,
fat: 16.0,
carbs: 23,
protein: 6.0,
},
{
name: 'Cupcake',
calories: 305,
fat: 3.7,
carbs: 67,
protein: 4.3,
},
{
name: 'Gingerbread',
calories: 356,
fat: 16.0,
carbs: 49,
protein: 3.9,
},
{
name: 'Jelly bean',
calories: 375,
fat: 0.0,
carbs: 94,
protein: 0.0,
},
{
name: 'Lollipop',
calories: 392,
fat: 0.2,
carbs: 98,
protein: 0,
},
{
name: 'Honeycomb',
calories: 408,
fat: 3.2,
carbs: 87,
protein: 6.5,
},
{
name: 'Donut',
calories: 452,
fat: 25.0,
carbs: 51,
protein: 4.9,
},
{
name: 'KitKat',
calories: 518,
fat: 26.0,
carbs: 65,
protein: 7,
},
]
},
editItem (item) {
this.editedIndex = this.desserts.indexOf(item)
this.editedItem = Object.assign({}, item)
this.dialog = true
},
deleteItem (item) {
this.editedIndex = this.desserts.indexOf(item)
this.editedItem = Object.assign({}, item)
this.dialogDelete = true
},
deleteItemConfirm () {
this.desserts.splice(this.editedIndex, 1)
this.closeDelete()
},
close () {
this.dialog = false
this.$nextTick(() => {
this.editedItem = Object.assign({}, this.defaultItem)
this.editedIndex = -1
})
},
closeDelete () {
this.dialogDelete = false
this.$nextTick(() => {
this.editedItem = Object.assign({}, this.defaultItem)
this.editedIndex = -1
})
},
save () {
if (this.editedIndex > -1) {
Object.assign(this.desserts[this.editedIndex], this.editedItem)
} else {
this.desserts.push(this.editedItem)
}
this.close()
},
},
}
</script>
四、Vuetify 搭建侧边栏
- 侧边栏模板
- 选择 UI 组件
- 选择 Navigation drawers(导航抽屉)
- 找到符合需求的侧边栏
- 复制示例代码
- 修改对应的功能
、
页面布局页预留了导航栏的位置
故就复制v-list-item对应的代码
修改对应的代码
<template>
<v-app id="inspire">
<v-navigation-drawer
v-model="drawer"
app clipped
>
<v-list-item>
<v-list-item-content>
<v-list-item-title class="text-h6">
测试平台
</v-list-item-title>
<v-list-item-subtitle>
测试专用
</v-list-item-subtitle>
</v-list-item-content>
</v-list-item>
<v-divider></v-divider>
<v-list
dense
nav
>
<v-list-item
v-for="item in items"
:key="item.title"
link
>
<v-list-item-icon>
<v-icon>{{ item.icon }}</v-icon>
</v-list-item-icon>
<v-list-item-content>
<v-list-item-title>{{ item.title }}</v-list-item-title>
</v-list-item-content>
</v-list-item>
</v-list>
<!-- -->
</v-navigation-drawer>
<v-app-bar app clipped-left>
<v-app-bar-nav-icon @click="drawer = !drawer"></v-app-bar-nav-icon>
<v-toolbar-title>测试平台</v-toolbar-title>
</v-app-bar>
<v-main>
<!-- -->
</v-main>
</v-app>
</template>
<script>
export default {
data: () => ({ drawer: null, items: [
{ title: '测试用例', icon: 'mdi-view-dashboard' },
{ title: '测试任务', icon: 'mdi-image' },
{ title: '测试报告', icon: 'mdi-help-box' },
],
right: null,
}),
}
</script>
展示效果