测试需求平台8-Arco组件实现产品增改需求

✍此系列为整理分享已完结入门搭建《TPM提测平台》系列的迭代版,拥抱Vue3.0将前端框架替换成字节最新开源的arco.design,其中约60%重构和20%新增内容,定位为从 0-1手把手实现简单的测试平台开发教程,内容将囊括基础、扩展和实战,由浅入深带你实现测试开发岗位中平台工具技术能力入门和提升

👨‍💻 作者:大奇 MegaQi  
✍️ 专注测试开发实战&车载方向干货分享,欢迎访问长期关注博客和公众号。

1.组件用法学习

1.1 话框 Modal

在当前页面打开一个浮层,承载相关操作,对话框用于关键信息录入或信息确认,唤出对话框时会中断用户当前的任务流程,所以请谨慎使用对话框以避免对用户过度干扰。

Arco Design - 企业级产品的完整设计和开发解决方案

组件构成和类型

  1. 标题(必有):可以是纯文字,也可以在文字前带有icon来明示状态;

  2. 正文(可选):可包含文字描述、表单、表格、步骤条、通知;

  3. 行动按钮(可选):通知类弹窗一般只包含两个按钮,确认或信息录入弹窗一般为两个按钮(一般是“确定、取消”);

  4. 关闭按钮 (可选):点击可关闭弹窗;

  5. 黑色蒙层(必有):黑色蒙层覆盖全页面,蒙层下方的页面内容不响应滚动和点击。

可实现部分相同功能的关联组件还有:抽屉 Drawer气泡确认框 Popconfirm

何时使用建议

  • 要求用户立即响应 :使用对话框请求阻止用户继续操作;

  • 通知用户紧急信息 :使用对话框通知用户有关其当前任务的紧急信息,通常用于报告系统错误或告知结果;

  • 确认用户决定 :使用对话框来确认用户的决定,清楚描述当前行为可能导致的潜在后果,如果该行为具有破坏性或不可逆转性,则使用报错警告色。

其中不建议使用情况:当对话框中内容过多,需要复杂的操作,甚至需要二次跳转时,建议使用 抽屉新开页 ,而非 对话框

基础用法

从下边的基础代码中需要了解几点内容

  • <a-modal> 对话框组件绑定v-model变量,ok确定cancel取消时间

  • 通过变量visible控制显隐,handleClickhandleCancel做其赋值方法

<template>
  <a-button @click="handleClick">Open Modal</a-button>
  <a-modal v-model:visible="visible" @ok="handleOk" @cancel="handleCancel">
    <template #title>
      Title
    </template>
    <div>我是对话框的内容显示</div>
  </a-modal>
</template>

<script>
import { ref } from 'vue';

export default {
  setup() {
    const visible = ref(false);

    const handleClick = () => {
      visible.value = true;
    };
    const handleOk = () => {
      visible.value = false;
    };
    const handleCancel = () => {
      visible.value = false;
    }

    return {
      visible,
      handleClick,
      handleOk,
      handleCancel
    }
  },
}
</script>

1.2 表单 Form

具有数据收集、校验和提交功能的表单,内部组件包含复选框、单选框、输入框、下拉选择框等,根据需要进行自由基础组件组合扩展

基础用法

一个比较简单由input、checkbox、button 组成的表单,在提交时候获取表单项值

例子代码参考如下:

  • <a-form>为表单主包包裹, :mode绑定组值对象

  • <a-form-item>为子项,filed(数据项必填)表单元素在数据对象中的path, label标签的文本

  • @submit 表单提交时触发事件,参数data 等同于mode绑定form集合值

更多API Arco Design Vue

<template>
  <a-form :model="form" :style="{width:'600px'}" @submit="handleSubmit">
    <a-form-item field="name" label="Username">
      <a-input v-model="form.name" placeholder="please enter your username..." />
    </a-form-item>
    <a-form-item field="post" label="Post">
      <a-input v-model="form.post" placeholder="please enter your post..." />
    </a-form-item>
    <a-form-item field="isRead">
      <a-checkbox v-model="form.isRead">
        I have read the manual
      </a-checkbox>
    </a-form-item>
    <a-form-item>
      <a-button html-type="submit">Submit</a-button>
    </a-form-item>
  </a-form>
  {{ form }}
</template>

<script>
import { reactive } from 'vue';

export default {
  setup() {
    const form = reactive({
      name: '',
      post: '',
      isRead: false,
    })
    const handleSubmit = (data) => {
      console.log(data)
    }

    return {
      form,
      handleSubmit
    }
  },
}
</script>

表单支持三种布局方式: horizontal - 水平排列 (默认), vertical - 垂直排列, inline - 行内排列。通过form属性layout=""设置.

1.3 输入框 Input

光标位于输入框时,允许用户输入或编辑文本内容的基本表单组件。

Arco Design - 企业级产品的完整设计和开发解决方案

组件构成

  1. 容器 :承载文本内容的容器,通过包裹文本并与文本在颜色上形成对比来提高输入区域的可发现性;

  2. 标签文字 :容器顶部或左侧的简短说明文字,用于说明需要输入的内容,尽量不超过6个汉字;

  3. 辅助文字 :容器底部的帮助性文字,动态展示能够帮助用户完成输入的相关信息;

  4. 占位文字 :容器中的次级提示文字,提供与输入内容相关的提示或例子,一般为不带标点符号的陈述句,不应包含完成任务所需的重要信息;

  5. 前缀图标:用于描述输入框中可输入的内容及格式(如:电话、日期图标);

  6. 后缀图标:根据不同场景具有多样的功能,常用场景如下:

  7. 错误提示,可与辅助文字中的错误提示结合出现;

  8. 内容清除按钮,可点击一键清除输入框中已输入的内容;

  9. 语音输入按钮,点击触发语音输入功能;

  10. 密码隐藏按钮;

  11. 前后置标签 :在输入框前后添加的预置内容,常见标签有网址前后信息和计数单位.

组件类型

  • 单行输入框 : 仅可输入一行文本,需当输入内容超出输入框时,内容截断;

  • 多行输入框: 高度自适应的输入框,支持输入多行文本,当输入多行文本时,输入框容器随内容向下扩展;

  • 文本域:可拉动右下角调节标来调节宽高尺寸的多行文本输入框;

基本用法

使用方法很简单,一般在对应父组件内引用<a-input/>并配置对应的属性或者方法,比如allow-clear支持清空输入,其他更多参考API。

<template>
    <a-input placeholder="请输入内容" allow-clear />
</template>

1.4 按钮 Button

一种命令组件,可发起一个即时操作,通用组件。

Arco Design Vue

按钮类型

此组件是最基本的组件之一,几乎页面交互的事件动作都要通过按钮完成,在Arco样式除了默认按钮,还包含但不限于如下类型:

  • 图标按钮按钮可以嵌入图标。在只设置图标时,按钮的宽高相等

  • 样式按钮 可以指定大小、形状和状态、线性、文本等

  • 组合按钮 通过 <a-button-group> 组件使按钮以组合方式出现。可用在同级多项操作中

基本用法

在需要渲染位置上引用<a-button></a-button>,其<>内为Props`Events\Slots`配置,><内为文本

<template>
  <a-space>
    <a-button type="primary">主要按钮</a-button>
    <a-button>次要按钮</a-button>
    <a-button type="dashed">虚线按钮</a-button>
    <a-button type="outline">线性按钮</a-button>
    <a-button type="text">文本按钮</a-button>
  </a-space>
</template>

以上基本参考官方文档给与使用方法,在后续的开发文章中对于初期使用的组件还会采用此方式,目的主要是牢固掌握正确的使用方法。

2.应用与需求实现

上述几个组将成为本篇实现产品管理的核心组件,将利用这几个组件完成增、改、删的交互操作。

2.1 产品添加实现

通过按钮、对话框、表单带大家一步步分解实现产品添加的功能。

步骤1: 完成基础对话框

在产品管理vue文件中<template>继续一个按钮和对话框组件,并分别绑定事件,对话框的显示和隐藏通过v-model: visible控制。

<template>
  <a-button type="primary" @click="addButtonClick">添加产品线</a-button>
  <a-modal v-model:visible="addModalVisible" title="添加产品"  @before-ok="addModalOk" @cancel="addModalCancel">
    <div>todo...</div>
  </a-modal>
  <a-table :columns="columns" :data="renderList" :pagination="false" />
</template>

步骤2: 定义变量和方法

在<script lang="ts" setup>定义addModalVisible,实现addButtonClick触发赋值true(显示对话框),addModalCancel触发赋值为false(关闭对话框),其addModalOk将会实现表单提交暂时写个日志打印,证明测试触发有效。

/* 产品添加对话框start */
  const addModalVisible = ref(false); // 控制显示和隐藏布尔值,默认为flase
  const addButtonClick = () => {  // 添加产品线按钮触发事件
    addModalVisible.value = true; // 赋值为True显示
  };
  const addModalOk = () => { // 对话框确定按钮,提交数据操作
    console.log("todo添加接口请求处理")
  };
  const addModalCancel = () => { // 对话框取消按钮,赋值使其关闭对话框
    addModalVisible.value = false;
  }
  /* 产品添加对话框end */

步骤3: 添加模版显关测试

测试通过点击“添加产品线”按钮触发显示对话框,点击取消关闭对话框,再次打开点击确定按钮确认日志有输出。

步骤4: Madel增加表单项

表单数据需要绑定的数据,所以需要先在<script>中定义个JSON对象,所有默认为空。

// 定义产品表单数据对象
const productForm = { 
    id: undefined,
    title: undefined,
    keyCode: undefined,
    desc: undefined,
    operator: ""
};

// 为了验证表单数据有效,将点击OK事件打印换成输出productForm
const addModalOk = () => { 
    console.log(productForm)
};

接着实现form及内表单项用<a-input>,Model的表单整体数据绑定通过 :model,各项通过v-model指定产品表单数据属性,代码里有个描述项是用的<a-textarea>文本域,虽然在组件学习中没有讲,但其实完全可以看成多行的input。

Arco Design Vue

<a-modal v-model:visible="addModalVisible" title="添加产品"  @before-ok="addModalOk" @cancel="addModalCancel">
    <a-form :model="productForm">
      <a-form-item field="title" label="名称">
        <a-input v-model="productForm.title" placeholder="产品线名称"/>
      </a-form-item>
      <a-form-item field="keyCode" label="唯一吗">
        <a-input v-model="productForm.keyCode" placeholder="keycode不可重复"/>
      </a-form-item>
      <a-form-item field="desc" label="备注">
        <a-textarea v-model="productForm.desc" placeholder="一些备注说明"/>
      </a-form-item>
    </a-form>
</a-modal>

代码保存后自动编译,如果没有页面或者终端输出错误,点击“添加产品线”按钮可以看到增加了表单后的最终效果。

步骤5: 表单数据落库

在实现真正的添加前,先验证下对话框表单正确输入内容后表单数据能否正常打印,从Console打印日志来看符合预期。

需要先完成 src/api/product.ts 创建接口定义,因为我们目前使用的TypeScript所以一般都会同步定义interface即面向对象的编程,它定义了行为和动作规范。

export interface productData {
  id: number;
  title: string;
  keyCode: string;
  desc: string;
  operator: string;
};

export function apiProductAdd(data: productData) {
  return axios.post('/api/product/create', data);
}

完善添加方法,将最终的表单数据调用接口,实现新增产品数据的落库,代码逻辑中不能忘记接口返回成功后调用fetchData()刷新下产品里表。

import { apiProductAdd } from '@/api/product';

const addModalOk = async () => { // 对话框确定按钮,提交数据操作
    const res = await apiProductAdd(productForm);
    if (res.code === 20000) {
      addModalVisible.value = false; // 关闭对话框
      fetchData(); // 添加成功重新请求列表
    } else {
      console.log("产品添加失败")
    }
  };

步骤6 测试验证

上述页面步骤代码一路顺下vue检查和变编译没有报错的话,此处大奇通过一个gif演示下正向操作的效果。

2.2 产品修改实现

在实现产品线添加的前端交互功能上详细做了分步讲解,对于产品的修改对话框功能上,除了编辑内容数据要做个初始化外几乎可以套用,因此这里不在做分步讲解,只给出不一样的地方以及最参考代码,大家可按照2.1步骤自行分解,争取熟练掌握组件使用和交互的开发。

表行编辑菜单

产品线修改是对列表数据行的操作,对此需要增加一个行菜单按钮,方式是通过Table组件自定义渲染,具体表格组件的时候将在后边详细讲,这里先参考下图进行功能添加。

稍微解释下slot表示插槽,template中{record}便是所在行数据,即在点击编辑处方法时将整行数据透传过去,增加了操作列后的成果如下:

代码实现与演示

编辑产品逻辑代码中需要注意两点,其余直接参考实现代码:

  • 需要对productFrom做reactive包裹,因为它是Vue3中提供响应式的方法,而vue2中是直接通过defineProperty实现,这个逻辑很不同注意区分。

  • 编辑对话框需要额外增加一个表单项ID,并且不可编辑

代码1: src/api/product.ts

export function apiProductUpdate(data: productData) {
  return axios.post('/api/product/update', data);
}

代码2:src/views/product/index.vue

<template>
  ...省略...
  <a-modal v-model:visible="editModalVisible" title="编辑产品"  @before-ok="editModalOk" @cancel="editModalCancel">
    <a-form :model="productForm">
      <a-form-item field="id" label="编号" disabled>
        <a-input v-model="productForm.id" />
      </a-form-item>
      <a-form-item field="title" label="名称">
        <a-input v-model="productForm.title" placeholder="产品线名称"/>
      </a-form-item>
      <a-form-item field="keyCode" label="唯一吗">
        <a-input v-model="productForm.keyCode" placeholder="keycode不可重复"/>
      </a-form-item>
      <a-form-item field="desc" label="备注">
        <a-textarea v-model="productForm.desc" placeholder="一些备注说明"/>
      </a-form-item>
    </a-form>
  </a-modal>
  <a-table :columns="columns" :data="renderList" :pagination="false" >
    <template #optional="{ record }">
      <a-button type="text" @click="editButtonClick(record)">编辑</a-button>
    </template>
  </a-table>
</template>

<script lang="ts" setup>
  // 注意引入编辑接口方法
  import { apiProductList, apiProductAdd, apiProductUpdate } from '@/api/product';
  // 从vue引入reactive
  import { ref, reactive } from 'vue';
  ...省略...

  // 添加或编辑使用表单对象vue3使用reactive使其对象编程响应式,否则form表单不会反填数据
  const productForm=reactive({
    id: undefined,
    title: undefined,
    keyCode: undefined,
    desc: undefined,
    operator: 'Mega Qi'
  })

  /* 产品编辑部分start */
  // 控制显示和隐藏编辑对话框布尔值,默认为flase
  const editModalVisible = ref(false); 
  // 修改产品线按钮触发事件  
  const editButtonClick = (record) => {  
    // 将行数据数据赋值给productForm
    productForm.id = record.id;
    productForm.title = record.title;
    productForm.keyCode = record.keyCode;
    productForm.desc = record.desc;
    // 编辑显隐赋值为True显示
    editModalVisible.value = true; 
  };
   // 编辑对话框确定按钮,提交数据操作
  const editModalOk = async () => {
    const res = await apiProductUpdate(productForm);
    if (res.code === 20000) {
      editModalVisible.value = false; 
      // 修改成功重新请求列表
      fetchData(); 
    } else {
      console.log("产品修改失败");
    }
  };
  // 编辑对话框取消按钮,赋值使其关闭对话框
  const editModalCancel = () => { 
    editModalVisible.value = false;
  }
  /* 产品编辑部分end */

</script>

演示:对产品编辑操作做个测试

至此本篇通过组件使用方法学习和项目实战应用,实现了产品管理中基本的增加和修改功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/423407.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HCIA-Datacom实验指导手册:8 网络编程与自动化基础

HCIA-Datacom实验指导手册&#xff1a;8 网络编程与自动化基础 一、实验介绍&#xff1a;二、实验拓扑&#xff1a;三、实验目的&#xff1a;四、配置步骤&#xff1a;步骤 1 完成交换机的 Telnet 预配置步骤 2 Python 代码编写 五、结果验证六、windows 计划任务程序配置七、 …

大数据权限认证 Kerberos 部署

文章目录 1、什么是 Kerberos2、Kerberos 术语和原理2.1、Kerberos 术语2.1、Kerberos 原理 3、Kerberos 服务部署3.1、前置条件3.2、安装依赖3.3、配置 krb5.conf3.4、配置 kdc.conf3.5、配置 kadm5.acl3.6、安装 KDC 数据库3.7、启动服务3.8、创建 Kerberos 管理员3.9、创建普…

qsort的使用与实现

c语言常见的排序方法大概有这些&#xff0c;今天我们所讲的是就是qsort快排的讲解 头文件 qsort的使用 我们先使用msdn查看他的相关资料&#xff0c;得知这个函数的传参请情况 1.void *base 翻译过来就是将要排序的函数的起始位置/数组首元素地址 2.size_t num 翻译过来就是数…

vue项目获取拼音首字母

工具包 pinyin-pro npm install pinyin-pro 官方地址 pinyin-pro | pinyin-pro性能优异、转换准确的 js 中文转拼音工具https://pinyin-pro.cn/示例代码(获取每个汉字的拼音首字母) import {pinyin} from pinyin-pro;function getPinyinInitial(name){if (name) {let py p…

redis实战笔记汇总

文章目录 1 NoSQL入门概述1.1 能干嘛&#xff1f;1.2 传统RDBMS VS NOSQL1.3 NoSQL数据库的四大分类1.4 分布式数据库CAP原理 BASE原则1.5 分布式集群简介1.6 淘宝商品信息的存储方案 2 Redis入门概述2.1 是什么&#xff1f;2.2 能干嘛&#xff1f;2.3 怎么玩&#xff1f;核心…

高性能MySQL 第4版

第一章MySQL架构 MySQL提供了多种锁的颗粒度&#xff0c;每种MySQL存储引擎都可以实现自己的锁策略和锁力度。 行级锁是在存储引擎而不是在服务器中实现的。 隔离界别 READ UNCOMMITTED - 脏读 在事务中可以可以查看到其他事务中还没有提交的修改。实际中很少用。 READ C…

运筹学_1.1.4 线性规划问题-解的概念

1.1.4 线性规划问题-解的概念 一、可行解与最优解二、基的概念三、基变量、基向量&#xff1b;非基变量、非基向量&#xff1b;基解、基可行解&#xff1b;四、最优解与可行解、基可行解的关系五、用例题&#xff08;枚举法&#xff09;巩固基解、基可行解、最优解三个概念1、例…

鸿蒙Harmony应用开发—ArkTS声明式开发(点击事件)

组件被点击时触发的事件。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 onClick onClick(event: (event: ClickEvent) > void) 点击动作触发该回调。 卡片能力&#xff1a; 从API version 9开始…

【python】`assert`断言语句

assert是一个断言语句&#xff0c;用于在代码中检查某个条件是否为真。 如果条件为假&#xff0c;将触发AssertionError 异常&#xff0c;从而指示存在错误。

【博图TIA-Api】通过Excel自动新建文件夹和导入FB块

【博图TIA-Api】通过Excel自动新建文件夹和导入FB块 说明思路准备获取Excel表格内文件名和FB块名等信息新建文件夹部分筛分获取的文件夹数据&#xff0c;去掉重复内容创建文件夹 导入FB块导出FB块的xml文件查找需要放置的文件夹导入块 说明 续上一篇文章&#xff0c;这次是根据…

C++ //练习 10.19 用stable_partition重写前一题的程序,与stable_sort类似,在划分后的序列中维持原有元素的顺序。

C Primer&#xff08;第5版&#xff09; 练习 10.19 练习 10.19 用stable_partition重写前一题的程序&#xff0c;与stable_sort类似&#xff0c;在划分后的序列中维持原有元素的顺序。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim …

【buuctf-gakki】

binwalk 查看图片&#xff0c;发现有 rar 文件&#xff0c;提取后如上图所示&#xff08;flag.txt为已经解压后出来的&#xff09;其中这个 rar 需要用 archpr爆破一下 打开后一个 flag.txt 一堆杂乱无章的字符&#xff0c;需要用到 python 脚本进行词频统计&#xff0c;我们…

专家教你学汽车美容护理,汽车美容师职业技能教学

一、教程描述 本套汽车美容教程&#xff0c;大小2.52G&#xff0c;61个文件。 二、教程目录 01-大家跟我学汽车美容&#xff08;共30课时&#xff09; 02-汽车内外饰物的安装&#xff08;共15课时&#xff09; 03-汽车必需设施的安装&#xff08;共13课时&#xff09; 04…

测开新手:pytest+requests+allure自动化测试接入Jenkins学习

最近在这整理知识&#xff0c;发现在pytest的知识文档缺少系统性&#xff0c;这里整理一下&#xff0c;方便后续回忆。 在python中&#xff0c;大家比较熟悉的两个框架是unittest和pytest&#xff1a; Unittest是Python标准库中自带的单元测试框架&#xff0c;Unittest有时候…

图论 - Trie树(字符串统计、最大异或对)

文章目录 前言Part 1&#xff1a;Trie字符串统计1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 Part 2&#xff1a;最大异或对1.题目描述输入格式输出格式数据范围输入样例输出样例 2.算法 前言 本篇博客将介绍Trie树的常见应用&#xff0c;包括&#xff1a;Trie…

实验室记账项目(java+Mysql+jdbc)

前言&#xff1a; 因为自己学习能力有限和特殊情况必须要找一个项目来做&#xff0c;但是上网搜的那些项目有两种&#xff08;一种是技术太多&#xff0c;自己能力不够&#xff1b;一种是技术太少&#xff0c;项目太简单&#xff09;导致都不适合本人&#xff0c;本人现有技术只…

店务管理系统:都有哪些功能,是否是高效管理店面的神器

hello&#xff0c;我是贝格前端工场&#xff0c;直接给大家介绍了各类通用的B端管理系统&#xff0c;受到了大家的欢迎。本次开始介绍针对具体行业的管理系统该如何设计和开发&#xff0c;这次分享——店务管理系统&#xff0c;欢迎大家持续关注、点赞&#xff0c;如有系统定制…

使用python实现一个SCP小工具

源码地址&#xff1a; ssh_scp 工具截图&#xff1a; 一个简易的scp文件上传下载小工具&#xff0c;用来上传或下载一些小文件。 目前只适用于windows&#xff0c; 使用方法&#xff1a; 前提&#xff1a; 工具同级目录&#xff0c;创建一个ssh_commands.json文件。用来存储配…

网络攻防之CVE-2020-15778漏洞的复现及修复详细过程

目录 漏洞描述 实验环境 漏洞复现 漏洞修复 漏洞扩展 漏洞描述 (1)漏洞编号:CVE-2020-15778 (2)CVE官网对该漏洞的解释 (3)漏洞简介:2020年6月9日,研究人员Chinmay Pandya在Openssh中发现了一个漏洞,于7月18日公开。OpenSSH的8.3p1中的scp允许在scp.c远程功能中注入命…

Sqli-labs靶场第14关详解[Sqli-labs-less-14]

Sqli-labs-Less-14 #手工注入 post传参了 根据题目看&#xff0c;像一个登录页面&#xff0c;尝试使用布尔型盲注测试能否登录网站 1. Username输入a" 测试是否会有报错&#xff0c;burp抓包 报错&#xff1a;syntax to use near "a"" and password&q…