当前位置: 首页 > news >正文

公共用例库计划--个人版(六)典型Bug页面设计与开发

1、任务概述

  本次计划的核心任务是开发一个,个人版的公共用例库,旨在将各系统和各类测试场景下的通用、基础以及关键功能的测试用例进行系统性地归纳整理,并以提高用例的复用率为目标,力求最大限度地减少重复劳动,提升测试效率。
  计划内容:完成公共用例库的开发实施工作,包括需求分析、系统设计、开发、测试、打包、运行维护等工作。

1.1、 已完成:

  需求分析、数据库表的设计:公共用例库计划–个人版(一)
  主体界面与逻辑设计:公共用例库计划–个人版(二)
  导出Excel功能:公共用例库计划–个人版(三)
  模块选择功能改造与性能优化公共用例库计划–个人版(四)
  QtCharts制作首页饼图与柱状图公共用例库计划–个人版(五)

1.2、 本次待完成:

典型Bug:新增遇见的较典型的bug,进行复盘与经验总结。
  1. bug、图片的库表设计
  2. 典型Bug页面,界面设计
  3. 逻辑代码开发

2、bug、图片的库表设计

  计划创建两张表,一张表存放bug信息,一张表保存bug的图片。
在这里插入图片描述
建表语句:

			# 创建bug表self.cursor.execute("""  CREATE TABLE IF NOT EXISTS bug (  bugid INTEGER PRIMARY KEY AUTOINCREMENT,  --编号title TEXT NOT NULL,  --标题types INTEGER ,  --类型--对应码值表code40-49difficulty INTEGER ,  --难度--对应码值表code30-36moduleid INTEGER ,  --所属模块describe TEXT , --描述think TEXT , --思考severity INTEGER  --严重程度--对应码值表code50-53)""")# 创建图片表self.cursor.execute("""  CREATE TABLE IF NOT EXISTS image (  imageid INTEGER PRIMARY KEY AUTOINCREMENT,  --编号name TEXT NOT NULL,  --名称image_bytes BLOB ,  --图片bugid INTEGER  --所属bug)""")

3、典型Bug页面

主要功能设计介绍:
  左侧使用listWidget显示bug列表,有翻页功能。
在这里插入图片描述
  主体上面,把用例页面的查询条件copy过来改改,选择条件对左边列表的bug进行查询。
在这里插入图片描述
  主体中部,点击左侧列表中bug名称,显示对应bug的详细信息。有图片上传按钮,显示图片、翻页等功能按钮。

  最后建了一个窗口,放一个graphicsView控件,显示大图。(上面页面图片是label显示的,担心显示太小了)
在这里插入图片描述

4、bug新增代码开发

4.1 保存bug

  在设计页面时,对保存按钮增加信号槽,点击保存触发save_bug。
对标题、描述进行 必填验证。如果有获取到bugid,就走编辑流程,没有就新增bug。

    def save_bug(self):"""bug页面,保存"""if not self.lineEdit_4.text() or self.textEdit.toPlainText() == '[步骤]\n\n[结果]\n\n[期望]\n':self.ts.xinxi("标题或描述不能为空!")returnself.save_bug_b.setEnabled(False)  # 保存按钮置灰parts=self.mk_2.currentText().split("—ID:")  # 模块编号if len(parts) == 2:self.mk_2.mkid=parts[1]else:self.mk_2.mkid=''if self.bugid != 0:  # 编辑vlue=(f'{self.lineEdit_4.text()}',tc_sql.codes_dict['mk_types'][f'{self.lileixing_bug_2.currentText()}'],tc_sql.codes_dict['difficulty'][f'{self.nandu_2.currentText()}'],f'{self.mk_2.mkid}', f'{self.textEdit.toPlainText()}',f'{self.textEdit_2.toPlainText()}',tc_sql.codes_dict['severity'][f'{self.nandu_3.currentText()}'], f'{self.bugid}')self.savesql_bug("update bug set title=? ,types=? ,difficulty=?, moduleid=? ,describe = ?,think = ?,severity=? where bugid=?",vlue)else:  # 新增vlue=(f'{self.lineEdit_4.text()}',tc_sql.codes_dict['mk_types'][f'{self.lileixing_bug_2.currentText()}'],tc_sql.codes_dict['difficulty'][f'{self.nandu_2.currentText()}'],f'{self.mk_2.mkid}', f'{self.textEdit.toPlainText()}',f'{self.textEdit_2.toPlainText()}',tc_sql.codes_dict['severity'][f'{self.nandu_3.currentText()}'])self.savesql_bug("INSERT INTO bug VALUES (NULL,?,?,?,?,?,?,?)", vlue)def savesql_bug(self, sql, vlue):"""bug保存sql"""self.case_db.connect()if self.case_db.operate_one(sql, vlue):self.case_db.over()self.chaxun_bug()  # 查询列表self.ts.xinxi("保存成功")logging.info('bug页面,保存')else:self.ts.xinxi("保存失败,请检查")self.save_bug_b.setEnabled(True)  # 保存按钮恢复

4.2 bug查询

  在设计页面时,对每一个查询条件设计信号槽,触发查询按钮,查询按钮触发chaxun_bug。
先获取查询条件的信息,然后通过拼接条件sql,查询出对应的bug,写入bug列表显示。

    def chaxun_bug(self, ye=1):"""bug页面,查询"""parts=self.mk_1.currentText().split("—ID:")if len(parts) == 2:self.mk_1.mkid=parts[1]else:self.mk_1.mkid=''mk_types=tc_sql.codes_dict['mk_types'][f'{self.lileixing_bug.currentText()}'] if self.lileixing_bug.currentText() else ''difficulty=tc_sql.codes_dict['difficulty'][self.nandu.currentText()] if self.nandu.currentText() else ''dic={"bug.types": mk_types,"bug.difficulty": difficulty,"bug.moduleid": self.mk_1.mkid}dic_like={"bug.title": self.biaoti_bug.text()}sql1="select bugid || ':' || title from bug where"  # 拼接sql查询条件sql2="select count(*) from bug where"for k, v in dic.items():if v:sql1+=' ' + k + "= " + str(v) + " and"sql2+=' ' + k + "= " + str(v) + " and"for k, v in dic_like.items():if v:sql1+=' ' + k + " like '%" + v + "%' and"sql2+=' ' + k + " like '%" + v + "%' and"offset=20 * (ye - 1)  # 分页查询sql1=sql1.rstrip('where').rstrip('and') + " order by bug.bugid DESC " + f"LIMIT 20 OFFSET {offset}"sql2=sql2.rstrip('where').rstrip('and')self.case_db.connect()items=self.case_db.query_many(sql1)  # bug查询count=self.case_db.query_one(sql2)self.bugye_count=math.ceil(count[0] / 20)  # 页数计算self.case_db.over()self.listWidget.clear()  # 清空列表self.clear_bug()  # 清空页面if items:for i in range(len(items)):  # 数据写入列表item=QListWidgetItem(items[i][0])item.setToolTip(items[i][0])  # 写入提示self.listWidget.addItem(item)self.label_24.setText(f"总数: {count[0]}条 共: {self.bugye_count}页    ")self.lineEdit_3.setText(f"{ye}")else:self.listWidget.addItem("未查询到数据")  # 查询无数据,加空行self.label_24.setText(f"总数: 0条 共: 0页    ")self.lineEdit_3.setText("0")logging.info('bug页面,查询')

4.3 bug详情

  查询出bug列表后,点击其中的bug,页面显示详情。对列表增加槽函数,点击触发show_bug。
获取点击的bugID,根据bugid查询出信息,回显到页面。

    def show_bug(self):"""点击bug,显示bug详情"""a=self.listWidget.selectedItems()if a:parts=a[0].text().split(":")if len(parts) == 2:self.bugid=parts[0]else:self.bugid=0returnsql26='''select bug.title,codes1.value as types,codes2.value as difficulty,module.modulename || '—ID:' || module.moduleid,bug.describe,bug.think,codes3.value as severityfrom bug INNER JOINcodes AS codes1 ON bug.types = codes1.id AND codes1.id BETWEEN 40 AND 49 -- 关联类型码值表INNER JOINcodes AS codes2 ON bug.difficulty = codes2.id AND codes2.id BETWEEN 30 AND 36 -- 关联难度码值表INNER JOINcodes AS codes3 ON bug.severity = codes3.id AND codes3.id BETWEEN 50 AND 53LEFT JOINmodule  ON bug.moduleid = module.moduleid where bug.bugid = ? '''self.case_db.connect()items=self.case_db.query_one(sql26, (self.bugid,))  # bug查询self.case_db.over()# bug详情回显self.lineEdit_4.setText(items[0])index=self.lileixing_bug_2.findText(items[1], Qt.MatchFlag.MatchFixedString)self.lileixing_bug_2.setCurrentIndex(index)  # 设置下拉框内容index2=self.nandu_2.findText(items[2], Qt.MatchFlag.MatchFixedString)self.nandu_2.setCurrentIndex(index2)self.mk_2.clear()  # 清空模块下拉self.mk_2.addItem(items[3])self.mk_2.setCurrentIndex(0)  # 设置模块下拉显示self.textEdit.setText(items[4])self.textEdit_2.setText(items[5])index3=self.nandu_3.findText(items[6], Qt.MatchFlag.MatchFixedString)self.nandu_3.setCurrentIndex(index3)logging.info('显示bug详情')

4.4 实现情况

  现在bug新增,查询修改没问题。
在这里插入图片描述

5、图片管理

bug保存后,上传图片。有删除、图片翻页、查看大图功能

5.1 图片上传

  上传图片按钮,触发函数up_image。
对图片大小、格式限制,然后将图片转成Base64格式存入数据库。

    def up_image(self):"""上传bug图片"""if self.bugid == 0:self.ts.xinxi("未获取到bugID,请先选择或者保存bug")returnMAX_IMAGE_SIZE=1.5 * 1024 * 1024  # 图片大小限制(例如:5MB)try:filename, _=QFileDialog.getOpenFileName(self, "选择图片", "","Image Files (*.jpg *.jpeg *.png *.bmp *.gif)")if not filename:        # 未选择图片,退出returnname=filename.split('/')[-1]file_size=os.path.getsize(filename)  # 检查文件大小if file_size > MAX_IMAGE_SIZE:self.ts.xinxi(f'图片大小超过限制({MAX_IMAGE_SIZE / (1024 * 1024)}MB),请上传更小的图片!')else:img=Image.open(filename)img.save(f"_internal/{name}", quality=90)  # 压缩图片with open(f"_internal/{name}", 'rb') as image_file:content=base64.b64encode(image_file.read())  # 转换成Base64格式os.remove(f"_internal/{name}")self.case_db.connect()sql=f"INSERT INTO main.image (name, image_bytes,bugid) VALUES (?, ?, ?);"if self.case_db.operate_one(sql, (name, content, self.bugid)):self.case_db.over()self.show_image(self.bugid)logging.info('上传bug图片')else:self.ts.xinxi("图片上传出错")except Exception as e:self.ts.xinxi(f"上传出错:{e}")logging.error(e)

  数据库中,存入的图片。
数据库

5.2 图片显示

  图片上传后,就触发显示函数。将查询bug的图片,显示到label
首先对图像显示区域进行清理,如果查询到图片,将显示图片、名称、页数。

    def show_image(self, bugid, number=0):"""根据bugID,查询bug图片"""self.label_image.setText('暂无图片')  # 清空bug图片区域数据self.pushButton_10.setVisible(False)  # 删除图片按钮,隐藏self.label_15.clear()self.label_34.clear()self.imageid=Noneself.case_db.connect()sql=f"SELECT image_bytes,imageid,name FROM image WHERE bugid=? LIMIT 1 OFFSET {number} "value=self.case_db.query_one(sql, (bugid,))count=self.case_db.query_one(f"SELECT count(*) FROM image WHERE bugid=? ", (bugid,))self.case_db.over()if value:                       # 显示图片、数量、名称self.imageid=value[1]str_encode=base64.b64decode(value[0])  # base64编码对应的解码(解码完字符串)pixmap=QPixmap()pixmap.loadFromData(str_encode)self.label_image.clear()scaled_pixmap=pixmap.scaled(self.label_image.size(), Qt.AspectRatioMode.KeepAspectRatio)self.label_image.setPixmap(scaled_pixmap)self.label_15.setText(f"{number + 1}/{count[0]}")  # 数量self.label_34.setText(f"{value[2]}")self.pushButton_10.setVisible(True)  # 删除图片按钮,显示logging.info('bug图片显示')

5.3 图片上传实现

在这里插入图片描述

5.4 大图窗口

  点击页面图片,触发大图窗口。

    def image_clicked(self, event):"""点击图片,打开图片窗口"""if self.imageid:self.case_db.connect()sql=f"SELECT image_bytes FROM image WHERE imageid=?"value=self.case_db.query_one(sql, (self.imageid,))self.case_db.over()str_encode=base64.b64decode(value[0])if not self.child_windows:image_max=Image_bug(str_encode)self.child_windows.append(image_max)  # 将新打开的窗口添加到子窗口列表else:self.child_windows[0].update_image(str_encode)  # 已有窗口,更新图片logging.info('bug图片,大图窗口')

  大图窗口,继承界面设计好的窗口。
使用单例模式,只允许打开一个窗口,再次点击图片就更新窗口图片显示。
对鼠标滚轮进行重写,实现放大缩小图片。

class Image_bug(QWidget, Ui_imagemax):"""图片页面"""_instance=Nonedef __new__(cls, str_encode, parent=None):if cls._instance is None:instance=super().__new__(cls)instance.__init__(str_encode, parent)cls._instance=instance  # 保存到类变量以便后续使用return instanceelse:cls._instance.update_image(str_encode)  # 更新现有实例的图像数据return cls._instancedef __init__(self, str_encode, parent=None):if self._instance:  # 避免多次初始化同一个实例returnsuper().__init__(parent)self.str_encode=str_encodeself.setupUi(self)self.init_image()def init_image(self):"""窗口加载图片显示"""pixmap=QPixmap()pixmap.loadFromData(self.str_encode)scene=QGraphicsScene()# 创建图形视图、场景及图像项目item=QGraphicsPixmapItem(pixmap)scene.addItem(item)self.graphicsView.setScene(scene)# 设置视图与场景self.graphicsView.wheelEvent=self.wheelEvent_handler    # 重写滚轮事件处理函数self.show()def update_image(self, new_str_encode):"""更新窗口图片"""self.str_encode=new_str_encodeself.init_image()   # 重新加载图片数据self.activateWindow()  # 激活窗口self.raise_()       # 提升窗口至最前面def wheelEvent_handler(self, event):"""滚轮放大缩小图片"""zoom_in_factor=1.25zoom_out_factor=1 / zoom_in_factordelta=event.angleDelta().y() / 120if delta > 0:factor=zoom_in_factorelif delta < 0:factor=zoom_out_factorelse:return# 获取当前鼠标位置在视图坐标系中的位置mouse_pos_scene = self.graphicsView.mapToScene(QPoint(int(event.position().x()), int(event.position().y())))# 记录原始视图中心点old_center=self.graphicsView.viewport().rect().center()# 缩放视图self.graphicsView.scale(factor, factor)# 计算新的视图中心点,并确保鼠标下的内容不变new_center = self.graphicsView.mapFromScene(mouse_pos_scene).toPointF()self.graphicsView.centerOn(new_center)

5.5 大图窗口,放大缩小图片实现

在这里插入图片描述

相关文章:

公共用例库计划--个人版(六)典型Bug页面设计与开发

1、任务概述 本次计划的核心任务是开发一个&#xff0c;个人版的公共用例库&#xff0c;旨在将各系统和各类测试场景下的通用、基础以及关键功能的测试用例进行系统性地归纳整理&#xff0c;并以提高用例的复用率为目标&#xff0c;力求最大限度地减少重复劳动&#xff0c;提升…...

impala与kudu进行集成

文章目录 概要Kudu与Impala整合配置Impala内部表Impala外部表Impala sql操作kuduImpala jdbc操作表如果使用了Hadoop 使用了Kerberos认证&#xff0c;可使用如下方式进行连接。 概要 Impala是一个开源的高效率的SQL查询引擎&#xff0c;用于查询存储在Hadoop分布式文件系统&am…...

链表经典算法(+OJ刷题)

文章目录 前言一、移除链表元素二、链表的中间节点三.反转链表四.合并两个有序链表五.分割链表六.环形链表的约瑟夫问题总结 创作不易&#xff0c;点赞收藏一下呗&#xff01;&#xff01;&#xff01; 前言 在上一节&#xff0c;我们介绍了单链表的增&#xff0c;删&#xff…...

网络原理TCP/IP(4)

文章目录 面向字节流粘包问题异常情况TCP小结 面向字节流 创建⼀个TCP的socket,同时在内核中创建⼀个发送缓冲区和⼀个接收缓冲区; • 调⽤write时,数据会先写⼊发送缓冲区中; • 如果发送的字节数太⻓,会被拆分成多个TCP的数据包发出; • 如果发送的字节数太短,就会先在缓…...

【C/C++ 11】贪吃蛇游戏

一、题目 贪吃蛇游戏机制是通过控制蛇上下左右移动并吃到食物得分。 蛇头碰到墙壁或者碰到蛇身就游戏结束。 食物随机生成&#xff0c;蛇吃到食物之后蛇身变长&#xff0c;蛇速加快。 二、算法 1. 初始化游戏地图并打印&#xff0c;地图的边缘是墙&#xff0c;地图的每个坐…...

【日常总结 - java】list 与 字符串(用逗号隔开)相互转换

一、list 转 字符串 第一种&#xff1a;使用谷歌Joiner方法 (推荐) 第二种&#xff1a;循环插入逗号 第三种&#xff1a;stream流 (推荐) 第四种&#xff1a;lambda表达式遍历并加入逗号 二、字符串 转 list 方法一&#xff1a;使用split()方法 方法二&#xff1a;使用C…...

《幻兽帕鲁》好玩吗?幻兽帕鲁能在Mac上运行吗?

最近一款叫做《幻兽帕鲁》的新游戏走红&#xff0c;成为了Steam游戏平台上&#xff0c;连续3周的销量冠军&#xff0c;有不少Mac电脑用户&#xff0c;利用Crossover成功玩上了《幻兽帕鲁》&#xff0c;其实Crossover已经支持很多3A游戏&#xff0c;包括《赛博朋克2077》《博德之…...

【数据分享】1929-2023年全球站点的逐日平均能见度(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;说到常用的降水数据&#xff0c;最详细的降水数据是具体到气象监测站点的降水数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2023年全…...

浅谈——开源软件的影响力

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 ✨特色专栏&#xff1a…...

MySQL-事务(TRANSACTION)

文章目录 1. 事务概述2. 事务的四大特性&#xff08;ACID&#xff09;3. 控制事务4. 并发事务产生的问题5. 事务的隔离级别6. 拓展6.1 InnoDB如何解决幻读&#xff1f;6.2 MySQL实现事务的原理&#xff1f; 1. 事务概述 定义&#xff1a;数据库的事务&#xff08; Transaction…...

Vue 实现动态路由

Vue 实现动态路由 Vue中实现动态路由主要涉及到两个方面&#xff1a;一是路由的动态添加&#xff0c;二是基于路由的参数变化来动态渲染组件。这通常在使用Vue Router时进行配置和实现。以下是实现动态路由的一些基本步骤和概念&#xff1a; 安装和设置Vue Router npm insta…...

docker elasticsearch8启动失败

docker elasticsearch8.12.0启动后提示这个&#xff0c;并且始终无法访问localhost:9200 received plaintext http traffic on an https channel, closing connection Netty4HttpChannel 解决方案&#xff1a;重新创建 elasticsearch容器&#xff0c;加上 -e xpack.security.…...

《Python 网络爬虫简易速速上手小册》第1章:Python 网络爬虫基础(2024 最新版)

文章目录 1.1 网络爬虫简介1.1.1 重点基础知识讲解1.1.2 重点案例&#xff1a;社交媒体数据分析1.1.3 拓展案例1&#xff1a;电商网站价格监控1.1.4 拓展案例2&#xff1a;新闻聚合服务 1.2 网络爬虫的工作原理1.2.1 重点基础知识讲解1.2.2 重点案例&#xff1a;股票市场数据采…...

使用 IntelliJ IDEA 配合 Docker 对 Weblogic 中间件进行远程调试

使用idea对jar包远程调试&#xff1a; 打开一个springboot的项目进行远程调试设置&#xff1a; 运行&#xff1a; 其实我不太明白远程调试的意义&#xff0c;本地直接debug不好嘛。。。 点击debug的按钮&#xff0c;打断点测试&#xff1a; 跑到断点处&#xff1a; 远程de…...

ArcGIS学习(三)数据可视化

ArcGIS学习(三)数据可视化 1.矢量数据可视化 需要提前说明的是,在ArcGIS中,所有的可视化选项设置都是在“图层属性”对话框里面的“符号系统”中实现的。 对于矢量数据的可视化,主要有四种可视化方式: 按“要素”可视化按“类别”可视化按“数量”可视化按“图表”可视…...

【使用 Python 进行 NLP】 第 2 部分 NLTK

一、说明 Python 有一些非常强大的 NLP 库&#xff0c;NLTK — 自然语言工具包 — NLTK 是一个强大的开源库&#xff0c;用于 NLP 的研究和开发。它内置了 50 多个文本语料库和词汇资源。它支持文本标记化、词性标记、词干提取、词形还原、命名实体提取、分割、分类、语义推理。…...

【软件设计师笔记】深入探究操作系统

【软件设计师笔记】计算机系统基础知识考点(传送门) &#x1f496; 【软件设计师笔记】程序语言设计考点(传送门) &#x1f496; &#x1f413; 操作系统的作用 1.通过资源管理提高计算机系统的效率 2.改善人机界面向用户提供友好的工作环境 &#x1f413; 操作系统的特征 …...

python常用pandas函数nlargest / nsmallest及其手动实现

目录 pandas库 Series和DataFrame nlargest和nsmallest 用法示例 代替方法 手动实现 模拟代码 pandas库 是Python中一个非常强大的数据处理库,提供了高效的数据分析方法和数据结构。它特别适用于处理具有关系型数据或带标签数据的情况,同时在时间序列分析方面也有着出…...

web前端-------弹性盒子(2)

上一讲我们谈的是盒子的容器实行&#xff0c;今天我们来聊一聊弹性盒子的项目属性&#xff1b; *******************&#xff08;1&#xff09;顺序属性 order属性&#xff0c;用于定义容器中项目的出现顺序。 顺序属性值&#xff0c;为整数&#xff0c;可以为负数&#xff…...

图论练习4

内容&#xff1a;染色划分&#xff0c;带权并查集&#xff0c;扩展并查集 Arpa’s overnight party and Mehrdad’s silent entering 题目链接 题目大意 个点围成一圈&#xff0c;分为对&#xff0c;对内两点不同染色同时&#xff0c;相邻3个点之间必须有两个点不同染色问构…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...

WebRTC调研

WebRTC是什么&#xff0c;为什么&#xff0c;如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...

Xcode 16 集成 cocoapods 报错

基于 Xcode 16 新建工程项目&#xff0c;集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...