实习手记(8):增删改查

上周又偷懒了没有按时写博客(扣大分啊啊!)但是好像也没有人看呢~其实最开始也只是想着记录一下实习历程,怕自己之后回过头想关于实习的都想不起来了,个人还是喜欢记录有关自己的学习生活的,就算没啥人看但回过头看不觉得这一段是空白的。

本周总结:

  • 重构
  • 新增模特弹框
  • 更多模特弹框
  • 新增场景弹框
  • 更多场景弹框

其实是重构了一个项目,老代码一个页面写了一千多行看着好费劲(密密麻麻)。然后现在是按照页面结构还有功能将其抽离成不同的组件了。当然,我,就只是写了很小一部分,大部分还是师父写的(怎么感觉我好像在拖后腿......)。这里就记录一下数据请求之增删改查和一些要注意的点了。

一、查

场景:点击不同的页码显示不同的数据

思路:获取到你点击的页码》将这些参数发送给后端》将后端返回的数据重新赋值到原来的数据》添加页码改变的回调:请求数据列表

(1)获取到你点击的页码

  • Ant Design Vue 这里用到的组件是antdv
  • 当收集相应的数据时,查找一下对应的API与事件

const tableSet = reactive({currentPage: 1,//默认perPage: 35,//默认totalPage: 0,});
......
<APaginationv-model:current="tableSet.currentPage"v-model:page-size="tableSet.perPage"show-quick-jumper:total="tableSet.totalPage"@change="onChange"
/>

(2)将这些参数转化为后端接收的字段发送GET请求给后端,后端返回我们需要的数据

  • 这里就自己查看接口文档了看需要携带什么参数,记得将收集到的数据转化为后端需要的字段
const sceneData = async () => {const path = '/resource/xxxx';const params = {per_page: tableSet.perPage,page: tableSet.currentPage,};const res = await Http.get(path, params);return {currentPage: res.data.list.current_page,perPage: res.data.list.per_page,totalPage: res.data.list.total,};};

(3)将后端返回的数据重新赋值到原来的数据

const getSceneLIst = async () => {const {currentPage, perPage, totalPage } = await sceneData();tableSet.currentPage = currentPage;tableSet.perPage = perPage;tableSet.totalPage = totalPage;};

(4)添加页码改变时的回调

const onChange = (page, pageSize) => {getSceneLIst();};

二、删

场景:点击选中需要删除的选项,将其从列表中移除,且提示删除成功

思路:获取选项id》携带参数发送请求》刷新列表

(1)获取选项id

  • 怎么删除某个选项,一定是根据他的唯一标识来代表他(当然了看后端需要什么参数我们就找)
  • 引用的自定义组件
<PicItemv-for="picInfo in state.dataList":key="picInfo.id":pic-info="picInfo":checked="state.checked.id === picInfo.id"@update:checked="(b) => onChecked(picInfo, b)"@model-deleted="modelDeleted"/>

(2)携带参数发送请求

  • 如果你想的单单是带个参数发个请求就OK了 但是不会这么简单的
  • 点击删除图标=选中选项,发送删除请求虽然把他删了,但这个选项已经是选中状态了,在最后提交的时候会把这个选项也提交上去!这是不可以的!一定要记得清空鸭
  • 最后记得刷新列表获取最新数据哦
const modelDeleted = async (sceneInfo: SceneInfo) => {state.remove = true;const path = '/resource/delete';const params = {id: sceneInfo.id,};await Http.post(path, params);if (sceneInfo.id === state.checked.id) {state.checked.id = '';}getSceneLIst();_message.success("sucess");};const onChecked = (picInfo: SceneInfo, b: boolean) => {state.checked = picInfo;
};

三、增

场景:点击提交按钮将自定义的人物信息提交到列表最前方

思路:怎么收集数据发请求就不说了,重点说一下提交时候的一些细节逻辑

  • 首先记得表单校验哇
  • 为了优化用户体验,记得给点提示!提交按钮添加loading效果
  • 其实这里最后逻辑是传给了父组件一并处理的(emits('submitAdd'); 忘了是啥)
  • 设计网络请求的多使用try catch finally 更方便捕捉错误
 const submitModel = async () => {try {if (state.agreement === false) {_message.error("error");}await formRef.value.validate().then(validState);state.loading = true;const path = '/resource/create';const params = {name: state.name,type: state.type,age: state.ageCheckedList[0].id,...};const res = await Http.post(path, params);emits('submitAdd');} catch (err) {console.error(err);} finally {state.loading = false;}};

说完了增删改查再来看一下其他比较麻烦的点吧。

四、选择变换

场景:选择不同的性别类型切换对应的年龄选项以及要展示的人物图片。

思路1:先说说之前一个比较笨的想法,给这两种类型对应的菜品写两个数组存放,通过v-if判断控制显示隐藏;对应的图片使用选择的回调来显示,但是这样的话要写九种不同的选择对应的九张图片,其实实际场景会有更多图片!

  • 可以看到这样写逻辑很繁琐,代码也很冗长
<script setup>const womanFileUrl ='https://images.pexels.com/photos/22708188/pexels-photo-22708188.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2';const womanFile = await urlToFile(womanFileUrl);const KidFileUrl = 'https://cdn.pixabay.com/photo/2022/11/09/21/12/candle-7581472_1280.jpg';console.log('kidGirl444444');const kidFile = await urlToFile(KidFileUrl);console.log('kidGirl555555');const selectFile = ref(womanFile);const updateFile = () => {console.log('kidGirl66666');console.log('state.sexCheckedList[0]', state.sexCheckedList[0]);console.log('state.ageCheckedList[0]', state.ageCheckedList[0]);// 业务// 代码if (!state.sexCheckedList.length || !state.ageCheckedList.length) return (selectFile.value = womanFile);if (state.sexCheckedList[0].id === 'Woman' && state.ageCheckedList[0].id === 'Youth') {selectFile.value = womanFile;} else if (state.sexCheckedList[0].id === 'KidGirl' && state.ageCheckedList[0].id === 'Infant') {console.log('kidGirl');selectFile.value = kidFile;}};const selectFile = ref();const updateFile = async () => {selectFile.value = await getDigitModelFile(state.sexCheckedList[0]?.id, state.ageCheckedList[0]?.id);};
</script>
<template><Upload:file="selectFile"/>
</template>

思路2:第二种是通过枚举和映射的方式

  • 枚举类型定义:定义了 AgeType 枚举,用于表示不同的年龄段。
  • 数据结构映射:创建了一个 data 对象,用于映射性别和年龄到图片路径
  • 图片获取函数:定义异步函数 getDigitModelFile,根据传入的性别和年龄返回对应的图片文件

(1)枚举类型定义

enum AgeType {Youth = 'Youth',YoungAdult = 'YoungAdult',Adult = 'Adult',Elderly = 'Elderly',Infant = 'Infant',Toddler = 'Toddler',Child = 'Child',
}export default AgeType;

sexType同理。

(2)数据结构映射

import AgeType from '../definition/AgeType';
import SexType from '../definition/SexType';
import digit_kidboy_africa from '../../assets/digit_kidboy_africa.png';
......
import { localToFile, urlToFile } from '@software/tools/file';const data = {[SexType.Woman]: {[AgeType.Youth]: digit_kidboy_asia,},
};/*** 返回一个 对应特定性别和年龄的图片* @param sex* @param age* @returns*/
export const getDigitModelFile = async (sex?: SexType, age?: AgeType): Promise<File> => {if (!sex || !age) return await localToFile(digit_kidboy_africa);const path = data?.[sex]?.[age];return await localToFile(path);
};

(3)使用

这里堆砌的代码就少了很多!

<script setup>const selectFile = ref();const updateFile = async () => {selectFile.value = await getDigitModelFile(state.sexCheckedList[0]?.id, state.ageCheckedList[0]?.id);};
</script>
<template><Upload:file="selectFile"/>
</template>

五、用户体验优化

(一) 中间自适应布局,超出的使用scorlloy

  • 上方是一个表单名称以及选择框,下方是两个按钮。如果上下也随页面滚动的话,会找不到选择项和按钮,优化体验,应该将上下固定,中间展示区域可以滑动查看。
<style>.container {display: flex;flex-direction: column;height: 100vh; }.header {height: 60px; /* 固定高度 */}.content {display:flex;flex: 1;flex-direction: column;height: calc(100vh); overflow: hidden;.scrollable-content {flex: 1;overflow-y: scroll; }}.footer {height: 60px; }</style>

六、写在最后

  • 本周感觉稍微好了一丢丢丢,开心哈哈哈但我写的还是好慢呐!
  • 现在有点困,but第二篇还没写啊救救我~

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch安装 Kibana安装

安装Elasticsearch 一、拉取镜像或者上传 docker pull Elasticsearch 二、将上传的镜像导入(在仓库拉取的这一步跳过) docker load -i es.tar docker load -i 三、创建容器 1.Elasticsearch 注意修改到自己的网络&#xff08;第八行&#xff09; docker run -d \--nam…

ES 支持乐观锁吗?如何实现的?

本篇主要介绍一下Elasticsearch的并发控制和乐观锁的实现原理&#xff0c;列举常见的电商场景&#xff0c;关系型数据库的并发控制、ES的并发控制实践。 并发场景 不论是关系型数据库的应用&#xff0c;还是使用Elasticsearch做搜索加速的场景&#xff0c;只要有数据更新&…

“Docker中部署Kibana:步骤与指南“

博主这篇文章是跟Elasticsearch那篇文章是有关系的&#xff0c;建议大家先去看&#xff1a; 轻松上手&#xff1a;Docker部署Elasticsearch&#xff0c;高效构建搜索引擎环境_docker 启动 es-CSDN博客 这篇博文&#xff0c;还有镜像下载不下来的情况&#xff0c;大家可以去看…

pikachu-ssrf_redis

目录 SSRF 1、SSRF漏洞介绍&#xff1a; 2、SSRF漏洞原理&#xff1a; 3、SSRF漏洞利用手段&#xff1a; 4、SSRF漏洞绕过方法&#xff1a; SSRF(curl)用法 1、通过网址访问链接 2、利用file协议查看本地文件 3、dict协议扫描内网主机开放端口 4.gopher&#xff1a;威…

计算机网络基础 - 应用层(1)

计算机网络基础 应用层网络应用的体系结构C/S 体系结构P2P 体系结构C/S 和 P2P 体系结构的混合体 进程通信概述套接字&#xff08;Socket&#xff09;TCP socketUDP socket 应用层协议应用层需要传输层提供的服务Web 与 HTTP概念非持续连接和持续连接HTTP报文格式请求报文响应报…

vs code中编写html的配置,插件安装

首先安装vs code 插件安装下面三个&#xff1a; 功能分别是&#xff1a; html css support &#xff1a;就是支持html环境&#xff0c;因为vs code就是一个文本编辑器 live server&#xff1a;自动更新编写的文件在浏览器刷新 auto rename tag&#xff1a;自动修改另一半标签…

Postman接口自动化测试:从入门到实践!

前言 在软件开发过程中&#xff0c;接口测试是确保软件各组件之间正确交互的关键环节。Postman作为一款强大的API开发工具&#xff0c;不仅支持接口请求的发送与调试&#xff0c;还提供了丰富的自动化测试功能&#xff0c;使得接口自动化测试变得更加高效和便捷。本文将从Post…

音频采集spring_ws_webrtc (html采集麦克风转gb711并发送广播播放)完整案例

下载地址&#xff1a;http://www.gxcode.top/code 项目说明 springbootwebscoektwebrtc 项目通过前端webrtc采集麦克风声音&#xff0c;通过websocket发送后台&#xff0c;然后处理成g711-alaw字节数据发生给广播UDP并播放。 后台处理项目使用线程池(5个线程)接受webrtc数据并…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《极端冰雪天气下计及孤岛划分与融合的配电网故障恢复》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

【计算机三级-数据库技术】操作题大题(第八套)

第46题 &#xff08;1&#xff09; 1 (2) create table ( a1 int, a6 int, a10 int, Primary Key(a1, a6), Constraint fk_PerOrders Foreign Key (a1) References T1(a1), Constraint fk_PerOrders Foreign Key (a6) References T3(a6) ) 第47题 答案&#xff1a; [1]Pro…

给Go+Sciter开发的桌面客户端软件添加系统托盘图标

在桌面端软件开发中&#xff0c;系统托盘图标是提升用户体验的重要元素。托盘图标不仅能提供直观的状态反馈&#xff0c;还能让软件在后台运行时依然保持与用户的交互。通过托盘图标&#xff0c;用户可以轻松最小化软件、退出程序&#xff0c;甚至弹出通知&#xff0c;从而避免…

PG数据库导致断电/重启无法正常启动

一、问题 数据库断电后&#xff0c;启动PG数据库后无法正常启动&#xff0c;报”psql: could not connect to server: No such file or directory”的错误&#xff0c;错误图片如下&#xff1a; 二、背景分析 数据库是单机版&#xff0c;使用k8s进行部署运行在指定节点&#…

K8S系列——(二)、K8S部署RocketMQ集群

1、环境准备 要将RocketMQ部署到K8S上&#xff0c;首先你需要提前准备一个K8S集群环境&#xff0c;如图我已经准备好了一个版本为 v1.28.13 的 K8S 集群&#xff08;其他版本也没问题&#xff09;&#xff1a; 角色IPMaster192.168.6.220Node-1192.168.6.221Node-2192.168.6.…

Vue中的methods方法与computed计算属性的区别

在创建的 Vue 应用程序实例中&#xff0c;可以通过 methods 选项定义方法。应用程序实例本身会代理 methods 选项中的所有方法&#xff0c;因此可以像访问 data 数据那样来调用方法。在模板中绑定表达式只能用于简单的运算。如果运算比较复杂&#xff0c;可以使用 Vue.js 提供的…

科技在日常生活中的革新

在科技日新月异的今天&#xff0c;‌我们的生活正经历着前所未有的变革。‌从智能家居到可穿戴设备&#xff0c;‌科技已经渗透到我们生活的每一个角落&#xff0c;‌深刻地影响着我们的生活方式和社会经济的发展。‌ 智能家居系统的出现&#xff0c;‌无疑是科技改变生活的典…

C语言函数介绍(上)

函数概念库函数标准库和头文件库函数的使用方法头文件包含库函数文档的一般格式 自定义函数函数的语法形式函数例子 形参和实参实参形参实参和形参的关系 return 语句数组做函数参数 函数概念 数学中我们其实就见过函数的概念&#xff0c;比如&#xff1a;一次函数 ykxb &…

【Python进阶(十)】——Matplotlib基础可视化

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

IOS 11 通用Base控制器封装

整体规划 BaseController&#xff1a;把viewDidLoad逻辑拆分为三个方法&#xff0c;方便管理。 BaseCommonController&#xff1a;不同项目可以复用的逻辑&#xff0c;例如&#xff1a;设置背景颜色方法等 BaseLogicController&#xff1a;本项目的通用逻辑&#xff0c;主要…

使用css如何获取最后一行的元素?使用css解决双边框问题

一、项目场景&#xff1a; 在小程序上需要实现一个如下图的ui效果图 需要满足以下条件 一行放不下 自动换行最后一行或者只有一行时&#xff0c;文字底部不能有线 二、初版实现 按照上面的要求&#xff0c;最开是的实现代码如下 我是给每一个元素都添加了一个下边框&#x…

测量 Redis 服务器的固有延迟

redis-cli --intrinsic-latency redis-cli --intrinsic-latency 命令用于测量 Redis 服务器的固有延迟。 固有延迟指的是 Redis 服务器处理一个命令所需的最短时间&#xff0c;不包括网络延迟。通过这个测量&#xff0c;我们可以了解 Redis 服务器本身的性能&#xff0c;而不…