鸿蒙期末项目(4)

server/2024/10/18 21:21:04/

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.ppmy.cn/server/53197.html

相关文章

LeetCode //Bash - 192. Word Frequency

192. Word Frequency Write a bash script to calculate the frequency of each word in a text file words.txt. For simplicity sake, you may assume: words.txt contains only lowercase characters and space ’ ’ characters.Each word must consist of lowercase ch…

大数据面试题之Zookeeper面试题

目录 1、介绍下Zookeeper是什么? 2、Zookeeper有什么作用?优缺点?有什么应用场景? 3、Zookeeper的选举策略&#xff0c;leader和follower的区别? 4、介绍下Zookeeper选举算法 5、Zookeeper的节点类型有哪些?分别作用是什么? 6、Zookeeper的节点数怎么设置比较好? …

全国公共汽车、出租车拥有情况及客运量、货运量数据

基本信息. 数据名称: 全国公共汽车、出租车拥有情况及客运量、货运量数据 数据格式: Shp、Excel 数据时间: 2020-2022年 数据几何类型: 面 数据坐标系: WGS84 数据来源&#xff1a;中国城市统计年鉴 数据可视化. 2022年全年公共汽车客运总量数据示意图 2022年公路客…

Spark SQL 的总体工作流程

Spark SQL 是 Apache Spark 的一个模块,它提供了处理结构化和半结构化数据的能力。通过 Spark SQL,用户可以使用 SQL 语言或 DataFrame API 来执行数据查询和分析。这个模块允许开发者将 SQL 查询与 Spark 的数据处理能力结合起来,实现高效、优化的数据处理。下面是 Spark S…

udp协议 服务器

1 TCP和UDP基本概念 TCP:(Transmission Control Protocol)是一种面向连接、可靠的基于字节流的传输层通信协议。并且提供了全双工通信&#xff0c;允许两个应用之间建立可靠的链接以进行数据交换 udp:(User Datagram Protocol):是一种无链接、不可靠、基于数据报文传输层协议&…

Linux 常用命令

文章目录 Linux 常用命令开机、重启和用户登录注销用户管理帮助指令文件目录类时间日期类搜索查找类压缩和解压类组管理与文件管理网络管理进程管理服务管理防火墙管理定时任务 Linux 常用命令 开机、重启和用户登录注销 shutdown –h now&#xff1a;立即进行关机。shutdown…

网络构建和设计方法_3. 网络设计

1.层次化网络模型设计 层次化网络设计模型&#xff0c;可帮助设计者按照层次设计网络架构&#xff0c;并对不同层次赋予特定网络功能&#xff0c;选择适合的设备/系统。在典型层次化网络结构中&#xff0c;核心层通常选用具备高可用性和性能优化的高端路由器/交换机&#xff1b…

Linux运维:MySQL数据库(1)

1.信息与数据&#xff1a; 数据是信息的载体&#xff0c;信息是数据的内涵。数据库就是存储数据的仓库&#xff0c;并长期存储在计算机磁盘中&#xff0c;可由多个用户和应用程序共享的数据集合&#xff0c;就是数据库。 2.数据库中的数据的特点&#xff1a; 2.1.数据是按照某…