鸿蒙期末项目(4)

day4

页面的设计与编写基本完成,接下来使用我们之前搭建好的服务器与相关的网络接口将鸿蒙中的逻辑真正实现一下。

在实现购物车页面展示功能时,使用了如下代码:

getCartList(uid: number): Promise<CartItem[]> {return new Promise((resolve, reject) => {axios.get(`${this.baseUrl}/cart?uid=${uid}`).then((resp) => {resolve(resp.data)}).catch((error) => {reject(error);})})
}

结果页面并未加载成功,日志显示错误:

随后通过postman测试服务端,显示返回结果为:

与CartItem类属性进行对比

并未发现差错。

进一步通过console.log发现,错误信息并非来自于axios请求,而是在调用model方法的.catch中被捕获的。这时服务器响应的数据已经正确被axios接收到了。

所以问题应当出现在调用的部分:

aboutToAppear() {CartModel.getCartList(CommentConstant.user.id).then((list) => {this.productList = list;this.evalData(this.productList);}).catch((error) => {console.log(error);})
}

在一个偶然的巧合下,我将 this.evalData(this.productList); 注释掉,随后报错消失了。随后我用注释法(注释掉一部分代码看是否还报错)找到了 CartItem 类下的 getProduct() 方法。我使用 new CartItem().gerProduct() 加控制台输出的方式证明了这个方法 的清白 ,然而为什么通过服务器传过来的对象调用这个方法却会报 TypeError 的错呢?

最后的解决办法是从服务器接收数据的时候新创建一个对象,然后把接收对象的属性一条一条放到新对象中在使用。

推测可能的错误原因是,服务器传过来的这个对象仅仅“虚有其表”,仅仅包含了这个类的属性,却没有绑定这个类的方法,所以当尝试调用这个虚有其表的对象的方法时,编译器不会报错,但运行时抛报无法调用的异常。(也许与router传对象参数也无法使用的原因类似?)

最后页面成功显示了数据:

值得一提的是,删除一项时,我最初的想法是将购买数量设为 0,在数据库中添加触发器,当一项变为0后删除该数据:

DELIMITER $$
​
CREATE TRIGGER delete_from_cart_before_update
BEFORE UPDATE ON cart
FOR EACH ROW
BEGINIF NEW.count = 0 THENDELETE FROM cart WHERE uid = NEW.uid AND Did = NEW.Did;SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Row deleted due to count being zero.';END IF;
END$$
​
DELIMITER ;

当我后来用postman测试时,数据库报了这样一个错:

我才意识到这是个愚蠢想法:在update触发器中使用delete是大忌,因为delete会重新触发触发器,导致无限循环或更严重的错误。所以还是应当老老实实写delete语句。

关于同步和异步的问题:在声明周期函数中使用异步调用服务器数据是比较常见的行为,当时如果期望取到了第一个数据再请求第二个数据时,有以下两种办法:

  1. 使用await与async将生命周期内部变为同步,但是依然需要注意的是,虽然使用async将aboutToAppear变为异步,但是程序不会等待aboutToAppear内部代码执行完毕再渲染页面,因为拿到aboutToAppear的Promise是一瞬间完成的。

    async aboutToAppear() {await 请求1.then().catch()await 请求2.then().catch()
    }

  2. 在一个Promise的then中继续下一个请求,这样可以保证请求的执行是顺序的。缺点是代码较乱。

    aboutToAppear() {请求1.then(() => {请求2.then().catch()}).catch()
    }

在查询订单时,需要实现的功能为根据用户编号uid查询所有订单以及订单中第一个商品的信息。使用了较为复杂的多表连结查询和分组查询,使用的sql语句如下:

select store.storeName,dish.sid,orders.state,time,dish.price,dish.dishName,img from orders
join store on orders.sid = store.id
join dish on store.id = dish.sid
join user on orders.uid = user.id
where user.id = 1 and orders.state = 0 and dish.id = (select min(dish.id) from dish where dish.sid = store.id) group by store.id;

实际执行时产生报错:

网上的解释为

在Mysql版本为5.7.25时,在使用使用group by 时,会出现Expression #4 of SELECT list is not in GROUP BY clause and contains nonaggregated...错误,这个错误的原因是 group by后面需要加上,select中的所有字段。不然就会报这个错误。

修改并规范后的sql代码

SELECT store.storeName,store.id AS sid, -- 明确sid来源并使用AS给列一个别名以避免混淆orders.state,orders.time, -- 假设time是orders表的列dish.price,dish.dishName,dish.img AS img -- 假设img是store表的列,明确了来源
FROM orders
JOIN store ON orders.sid = store.id
JOIN dish ON store.id = dish.sid AND dish.id = (SELECT MIN(dish.id) FROM dish WHERE dish.sid = store.id)
JOIN user ON orders.uid = user.id
WHERE user.id = 1 AND orders.state = 0
GROUP BY store.storeName, store.id, orders.state, orders.time, dish.price, dish.dishName, dish.img;

一个订单有可能包含多个商品,由axios将商品信息一个一个传递给服务端无疑是最低效的方法。而将所有数据一次性传递给服务器端,则需要使用post请求,将传递的商品信息放在TCP报文的数据段。这就要求了服务器需要能够处理 json 数据并具备一次性插入多条数据至数据库的功能。

该功能可以使用xml字符串拼接完成:

@Insert("<script> " +"insert into od " +"values " +"<foreach collection=\"items\" index=\"index\" item=\"item\" separator=\",\"> " +"(#{item.Oid},#{item.Did},#{item.count})" +"</foreach> " +"</script>")public int insertOD(@Param("items") List<Od> items);

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

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

相关文章

MTK平台Android13实现三方launcher为默认

一、前言 目前有遇到客户的定制需求,希望使用三方的launcher作为默认的launcher使用,一般情况下直接将三方launcher通过内置到系统并通过overlay机制即可很方便的实现launcher的替换,但是存在一个问题,需要增加ROM的维护成本。本文通过设备在使用前联网通过后台下发三方lau…

基于SpringBoot的财务管理系统

根据您提供的论文内容和模板要求&#xff0c;以下是定制化的文章输出&#xff1a; 你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a; Java 数据库&#xff1a; MySQL 技术&#xff1a; SpringBoot…

沙龙圆满举行 | 数据资产入表新动向·驱动企业新质生产力!

近日&#xff0c;由四川智慧城市发展联盟、璞华科技有限公司等公司主办的“数据治理与入表专题沙龙会”在成都圆满落幕。璞华科技有限公司作为数据治理、数据资产入表领域的领军企业&#xff0c;为此次盛会贡献了我们的专业见解与实战经验。 沙龙现场&#xff0c;业内精英齐聚一…

Redis优化之持久化

目录 1.Redis高可用 2.Redis持久化 2.1 RDB持久化 2.1.1 触发条件 2.1.2 执行流程 2.1.3 启动时加载 2.2 AOF持久化 2.2.1 开启AOF 2.2.2 执行流程 2.2.3 文件重写触发方式 2.2.4 文件重写的流程 2.2.5 启动时加载 2.3 RDB和AOF的优缺点 3.Redis性能管理 3.1 查看…

btrace使用记录

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 未经允许不得转载 目录 一、导读二、使用三、 推荐阅读 一、导…

Vivo手机怎么录屏?分享2种录屏方法

“新换的Vivo手机还挺好用的&#xff0c;但是今天看到一个视频想录下来保存&#xff0c;但找不到录屏功能啊&#xff0c;想问问大家Vivo手机的录屏功能怎么打开啊&#xff1f;还有Vivo手机能不能录制出高质量的视频呢&#xff1f;” 随着智能手机的普及&#xff0c;录屏功能已…

C++系统编程篇——Linux第一个小程序--进度条

&#xff08;1&#xff09;先引入一个概念&#xff1a;行缓冲区 \r和\n \r表示回车 \n表示回车并换行 ①代码一 #include<stdio.h> #include<unistd.h> int main()…

深度学习 --- stanford cs231学习笔记五(训练神经网络之数据的预处理)

数据的预处理(Data Preprocessing) 2 Data Preprocessing数据的预处理 数据预处理的几种方法 2&#xff0c;1 数据的零点中心化 数据的零点中心化的目的就是为了把数据的整体分布拉回到原点附近&#xff0c;也就是让数据的整体均值变为0。 ​ 2&#xff0c;2 数据的标准化 数据…

必应bing搜索广告投放介绍,投放的广告形式和效果

必应Bing搜索广告以其独特的市场定位、高质量的用户群体和强大的全球覆盖能力&#xff0c;成为众多企业拓展业务、提升品牌影响力的重要渠道。作为微软旗下的一款搜索引擎&#xff0c;必应不仅在美国市场占据重要份额&#xff0c;其在全球范围内的影响力也不容小觑。对于寻求国…

数据资产与云计算深度融合:借助云计算技术,优化数据存储、高效处理并创新应用,驱动企业数字化转型

目录 一、引言 二、数据资产与云计算深度融合的必要性 1、数据资产的重要性 2、云计算技术的优势 三、云计算技术在数据资产管理中的应用 1、数据存储的优化 2、数据处理的高效性 3、数据应用的创新 四、云计算驱动企业数字化转型的实践案例 案例一&#xff1a;金融行…

Docker(九)-Docker运行redis6.0.8容器实例

1.宿主机新建目录存放redis.conf文件 目的&#xff1a;运行redis容器实例时使用自己的配置文件2.运行redis容器实例 docker run -d -p 6379:6379 --privilegedtrue -v 【宿主机配置文件目录】:/etc/redis/redis.conf -v 【宿主机数据目录】:/data --nameredis6.0.8 redis:6.0…

神经网络实战2-损失函数和反向传播

其实就是通过求偏导的方式&#xff0c;求出各个权重大小 loss函数是找最小值的&#xff0c;要求导&#xff0c;在计算机里面计算导数是倒着来的&#xff0c;所以叫反向传播。 import torch from torch.nn import L1Lossinputstorch.tensor([1,2,3],dtypetorch.float32) targe…

驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法

在连接数据库的时候出现了下面图面中的错误&#xff0c;尝试集中方法后终于解决了这个问题。 1.修改驱动程序版本 出现这种错误可能是因为你的驱动程序版本不兼容&#xff0c;我们可以尝试修改版本解决。而我们的驱动程序往往是以依赖的形式导入&#xff0c;因此可以在maven仓…

实际项目开发:Spring集成Redis,并实现短信登录功能

redis新手&#xff0c;学了几种基本数据类型&#xff0c;却不知道怎么使用&#xff1f; 总是一边学一边忘&#xff1f; 学会了Redis的大多数使用命令&#xff0c;却不知道如何在项目中使用&#xff1f; 本文将从实际出发&#xff0c;为大家解决这些问题。 我是蚊子码农&#xf…

初学51单片机之长短键应用定时炸弹及扩展应用

51单片机RAM区域划分 51单片机的RAM分为两个部分&#xff0c;一块是片内RAM&#xff0c;一块是片外RAM。 data&#xff1a; 片内RAM从 0x00 ~0x7F 寻址范围&#xff08;0-127&#xff09; 容量共128B idata: 片外RAM从 0x00~0xFF 寻址范围(0-255) 容量共256B pdata&am…

昇思25天学习打卡营第1天|初学教程

文章目录 背景创建环境熟悉环境打卡记录学习总结展望未来 背景 参加了昇思的25天学习记录&#xff0c;这里给自己记录一下所学内容笔记。 创建环境 首先在平台注册账号&#xff0c;然后登录&#xff0c;按下图操作&#xff0c;创建环境即可 创建好环境后进入即可&#xff0…

基于elastic stack的docker-compose部署的ELK与LDAP集成

说明&#xff1a; ldap信息配置到es配置文件上&#xff0c;然后kibana读取es的配置信息 用户与角色的关系通过role_mapping.yml文件配置获取 角色与权限的关系通过elastic stack提供的DevTools或API进行维护 一、前置条件&#xff1a; 1.1 es已开启xpack&#xff08;已开启…

机器学习-数据预处理-聚类-回归-分类-单车数据集

机器学习-数据预处理-聚类-回归-分类-单车数据集 前言一、数据预处理1. 导入数据集2. 数据预处理3. 处理缺失值4. 生成特征用于后续进一步的分析 二、数据分布可视化1. 骑行时长分布2. 起始站和终点站分布可视化3. 高峰期与非高峰期骑行频次分布 三、聚类分析1. K-means聚类 四…

Android高级面试_2_IPC相关

Android 高级面试-3&#xff1a;语言相关 1、Java 相关 1.1 缓存相关 问题&#xff1a;LruCache 的原理&#xff1f; 问题&#xff1a;DiskLruCache 的原理&#xff1f; LruCache 用来实现基于内存的缓存&#xff0c;LRU 就是最近最少使用的意思&#xff0c;LruCache 基于L…

Vue3 + Element-plus + TS —— 动态表格自由编辑

前期回顾 《 穿越时空的代码、在回首&#xff1a;Evil.js两年后的全新解读 》-CSDN博客 Vue3 TS Element-Plus 封装Tree组件 《亲测可用》_ https://blog.csdn.net/m0_57904695/article/details/131664157?spm1001.2014.3001.5501 态表格 自由编辑 目录 ♻️ 效果图…