一位高人的QTP学习笔记
转贴一个高人的QTP笔记供大家学习。
文章比较长,一共三部分:
1、连接数据库查询例子,无参数化
//查询收文操作,通过数据库查询记录数是否正确
//1、输出记录数值,例如78条 2、获取输出的记录数值 3、连接数据库,查询记录数
4、输出记录数值和从数据库中查询记录数值,相比较,相等则成功,不等则失败
Browser("湛江信息化测试登录").Page("湛江东兴石油企业有限公司办公自动化系统").Frame("mainFrame").Output CheckPoint("78")
Dim mm
'mm=DataTable.GlobalSheet.GetParameter("mainFrameOutput_Text_out").Value
//注释,获取datatable值与DataTable("mainFrameOutput_Text_out",
dtGlobalSheet)一致
mm=DataTable("mainFrameOutput_Text_out",
dtGlobalSheet)
MsgBox mm
Dim res,cmd,sql
Set res=createobject("adodb.recordset")
Set cmd=createobject("adodb.command")
Cmd.activec
Cmd.CommandType = 1
sql="select count(*) from oa_receivebumfwhere BUMFNAME like '%收文测试%'"
'sql="selectcount(*)from
oa_receivebumfwhere BUMFNAME='"&nn&"'"
//注释,sql语句,等于时sql语句
// sql="selectcount(*)from
oa_receivebumfwhere BUMFNAME like '%nn%'" //like时sql语句
Cmd.CommandText = sql
Set res = Cmd.Execute()
//msgbox res("name")
MsgBox res(0)
If Cstr(res(0)) = Cstr(mm)Then
Reporter.ReportEvent micPass, "test",
"查询成功"
else
Reporter.ReportEvent micfail, "test", "查询失败"
End If
Set res = nothing
Set cmd.ActiveConnection = nothing
Set Cmd= nothing
2、登记用户,查看是否登记成功
//登记用户,查询用户是否存在在数据库中
1、 参数化 2、取参数化值3、查询语句中,赋值给查询条件
4、从数据库中查询出用户名,与参数化中值做比较
脚本如下:
Browser("测试登录").Page("办公自动化系统").Frame("mainFrame_2").WebEdit("addressVO.name").Set DataTable("p_Text", dtGlobalSheet)
Dim xname
xname=DataTable("p_Text", dtGlobalSheet)
MsgBoxxname
Dim res,cmd,sql
Set res=createobject("adodb.recordset")
Set cmd=createobject("adodb.command")
Cmd.activec
Cmd.CommandType = 1
sql="selectname from address_list t where name ='"&xname&"'"
Cmd.CommandText = sql
Set res = Cmd.Execute()
'msgbox res("name")
MsgBox res(0)
Set res = nothing
Set cmd.ActiveConnection = nothing
Set Cmd= nothing
第二部分
1、Datatable方法GetRowCount
DataTable.GetSheet("Action1").GetRowCount //获取总行数
使用如:
CountNum=DataTable.GetSheet("Action1").GetRowCount
2、Datatable方法SetNextRow
DataTable.GetSheet("Action1").SetNextRow
//取得下一行
datatable.setcurrentrow(n) //取得某一行
3、Datatable方法getcurrentrow //获得当前行数
例如:datatable.getcurrentrow
4、获取datatable值
4.1DataTable("p_Text",
dtLocalSheet)//取得datatable中参数名称为:p_Text的值
4.2DataTable.GlobalSheet.GetParameter("p_Text").Value
//获取参数值方法和DataTable("p_Text",
dtLocalSheet)一样
例如:xname为变量,dim xname
xname=DataTable("p_Text", dtLocalSheet)
xname=DataTable.GlobalSheet.GetParameter("p_Text").Value
5、datatable.value("num")只在global形式下的一种省略形式;完整形式是:
datatable.value("num",dtlocalsheet)
-----向某一列的单元格赋值:
datatable.value("column_name",dtlocalsheet)="nanjing"
6、字符转换Cstr
dim mm
Cstr(mm)
7、获取对象属性名称用法:
GetRoProperty----从应用程序界面上获取对象属性(即,是脚本运行时,获取的对象动态属性值)
例如:获取对象库中index属性值,似乎只能用GetToProperty,因为应用程序界面上对象没有该属性,只是
QTP为识别该对象创立的描述属性;
GetToproperty----从对象库中描述对象的属性,静态值
GetToProperties----获取用于标识对象的属性集;对于这个集合,有count等属性方法
8、如果弹出对话框就获取上面提示信息并与表中的信息对比,不统一证明弹出的提示出错,主要用来验证
if browser("web_name").dialog("dialog_name").exist(1) then'如果不出现=false
error_message=browser("web_name").dialog("diaglog_name").static("用户密码错误!".getRoproperty("text")
if
error_message<>(datatable.value("error_info"))then
msgbox(error_message)
end if
browser("web_name").dialog("diaglog_name").close
end if
这里总结了两点技巧:
一是:对于dialog中,虽然提示信息对象名称是"用户密码错误",但如果信息对象名称是“该用户不存在”,不用更改会自动识别,我想主要是录制第一遍时,“用户密码错误”只是让运行时能找到这个控制,而不管它是什么内容,因为在对象仓库中,text不是决定该对象的属性
二是:如果对于提示信息比较长的,可以用mid(error_message,n,m)取一部份特征提示信息进行验证,这样我想可以节省处理时间,又可以避免长度以及空格等字符的处理
9、数据库检查点模块:
sub database_check
set con=createobject("adodb.connection")
con.open "Description=IBM_ODBC;DRIVER=SQL
Server;SERVER=IBM;UID=sa;"&_
"PWD=123456;APP=Quick Test
Pro;WSID=IBM;DATABASE=IBM_table"
'access方式:con.open
"DRIVER={Microsoft Access Driver (*.mdb)};DBQ=d:\test.mdb"
'Orocle方式:con.open
"DRIVER={Oracle in
OraHome92};SERVER=CESHI;UID=CND_TEST;PWD=CND;DBQ=CESHI;DBA=W;APA=T;EXC=F;XSM=Default;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=Lo;BAM=IfAllSuccessful;MTS=F;MDI=Me;CSR=F;FWC=F;PFC=10;TLO=O;"
set record=createobject("adodb.recordset")
sql="select*from ibm_one_table"
record.open sql,con
DO
if(record("ibm_table_column")="kai")then'//查找表格中有多少kai
num=num+1;
end if
record.movenext
loop until record.eof=true
record.close
set record=nothing
con.close
set con=nothing
end sub
10、"is+*"类型function
isarray'是否是数组
isconnected'判断QTP是否连接到TD
isdate'是否是合法的日期类型
isempty'判断是否初始化
isNull'判断是否为空值
isNumeric'判断是否是数字型
isobject'判断是否一个功能对象
isready'判断设备是否准备就绪
isRootFolder'是否是根目录
11、for方法1,参数化时选择:dtLocalSheet
Dim CountNum
CountNum=DataTable.GetSheet("Action1").GetRowCount
For i=0 to CountNum-1
----xunhuanti------
DataTable.GetSheet("Action1").SetNextRow //使用SetNextRow方法
Next
12、for方法2,参数化时选择:dtLocalSheet
dim countNum
countNum = DataTable.GetSheet("Action1").GetRowCount
For i=1 to countNum
DataTable.GetSheet("Action1").SetCurrentRow(i)//使用SetCurrentRow(i)方法
―――ddd―――
next
13、while方法1,参数化时选择:dtLocalSheet
Dim CountNum,i
i=1
CountNum=DataTable.GetSheet("Action1").GetRowCount
While i<=CountNum
------xuhuanti---
DataTable.GetSheet("Action1").SetNextRow
i = i+1
Wend
14、while方法2,参数化时选择:dtLocalSheet
Dim CountNum,i
i=1
CountNum=DataTable.GetSheet("Action1").GetRowCount
While i<=CountNum
DataTable.GetSheet("Action1").SetCurrentRow(i)
----xuhuanti---
i = i+1
Wend
第三部分
15、Do while方法
Dim i,RowCount '定义两个变量
i=0
RowCount=DataTable.GetSheet("Action1").GetRowCount '设置RowCount等于Action1中的行数。
msgbox RowCount
Do while i<rowcount
i=i+1 '第一次进入循环,执行这句后,i=1
'DataTable.GetSheet("Action1").SetCurrentRow(i)这句话被我注释掉了,正确的写法应该是下面这样,分开写。
datatable.getsheet("Action1")
datatable.setcurrentrow(i)
----xunhuanti----
loop
16、取对象属性(Property)值
Dim usname
usname =Browser("测试登录").Page("办公自动化系统").Frame("mainFrame_2").WebEdit("addressVO.name").GetRoProperty("Value")
'获取对象属性(Property)值,如Property为Value
MsgBox usname
17、取得要删除的id,并删除
'url在查看该新增记录的信息页面对象中取得,所以录制的时候,登记,查看(修改),删除
Dim strUserid,id,strId
id=Browser("测试登录").Page("办公自动化系统").Frame("mainFrame_4").GetROProperty("url")
'在url这个属性值中存在我需要删除记录的ID信息
strId=Mid (id,instr(60,id,"=")+1)'这一步是把需要的id值取了出来,例如:strId=Mid (id,instr(1,id,"=")+1)
strUserid =strId'strUserid是我要删除的记录前的复选框属性值当中的ID信息
Browser("测试登录").Page("办公自动化系统").Frame("mainFrame").WebCheckBox("value:="&strUserid).Set
"ON" 这样就把想删除的记录选中了。
Browser("测试登录").Page("办公自动化系统").Frame("mainFrame").WebButton("删 除").Click '这样就删除掉啦,呵呵
17.2通过数据库取得id值,并赋值进行删除
Browser("测试登录").Page("办公自动化系统").Frame("mainFrame_2").WebEdit("addressVO.name").Set
DataTable("p_Text", dtGlobalSheet)
Browser("测试登录").Page("办公自动化系统").Frame("mainFrame_2").WebEdit("addressVO.address").Set
DataTable("p_Text1", dtGlobalSheet)
Browser("测试登录").Page("办公自动化系统").Frame("mainFrame_2").WebEdit("addressVO.unitTel").Set
DataTable("p_Text2", dtGlobalSheet)
Dim xname,address,unitTel
xname=DataTable("p_Text", dtGlobalSheet) '从datatable中取值
address=DataTable("p_Text1", dtGlobalSheet)
unitTel=DataTable("p_Text2", dtGlobalSheet)
Dim res,cmd,sql
Set res=createobject("adodb.recordset")
Set cmd=createobject("adodb.command")
Cmd.activeconnection="DRIVER={Oracle in
OraHome92};SERVER=HKORACLE;UID=USER22;PWD=ZJLH;DBQ=HKORACLE;DBA=W;APA=T;EXC=F;XSM=Default;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;BTD=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=Me;CSR=F;FWC=F;FBS=60000;TLO=O;"
Cmd.CommandType = 1
'sql="selectaddressid from address_list t where name
='"&xname&"'"
'sql="selectaddressid from address_list t where name
='"&xname&"'
sql="selectaddressid from address_list t where name
='"&xname&"' and
address='"&address&"'and
unitTel='"&unitTel&"'"
Cmd.CommandText = sql
Set res = Cmd.Execute()
MsgBox res(0)'打印res(0)
DataTable("addressid", dtGlobalSheet)=Cstr(res(0)) '输出值到datatable中
Browser("测试登录").Page("办公自动化系统").Frame("mainFrame").WebCheckBox("value:="&res(0)).Set
"ON"
Set res = nothing
Set cmd.ActiveConnection = nothing
Set Cmd= nothing
18、赋值语句有:
1:Browser("测试登录").Page("办公自动化系统").Frame("mainFrame").WebCheckBox("value:="&strUserid).Set
"ON"
2:Browser("湛江信息化测试登录").Page("湛江东兴石油企业有限公司办公自动化系统").Frame("mainFrame").WebCheckBox("value:="&res(0)).Set
"ON"
3:Browser("测试登录").Page("办公自动化系统").Frame("mainFrame").WebCheckBox("IDS").SetTOProperty
"value",Cstr(res(0)) 'Cstr为转换成小数方法
4: Browser("测试登录").Page("办公自动化系统").Frame("mainFrame").WebCheckBox("IDS").SetTOProperty
"value",strUserid
19、取字符串方法:
1:instr方法
InStr([start, ]string1, string2[, compare])
这个函数需要的的参数是起始位置、主体字符串、要查找的字符串;Compare是可选参数。指定字符串比较。此compare参数是可以省略的,也可以是 0, 1或 2。
指定0(缺省)做二进制比较。指定1做不区分大小写的文本比较。例如我们要查找在字符串“abcdefg”中是否存在“cd”并返回其位置,则使用下面的语句就可以实现:
pos=InStr(1,"abcdefg","cd") 则pos会返回3表示查找到并且位置为第三个字符开始。这就是“查找”的实现,而“查找下一个”功能的实现就是把当前位置作为起始位置继续查找。
或者:id=87444=ddddd
instr(1,id,"="),从位置为第一个字符起,查找=字符
2:mid方法
Mid(string, start[, length])
如:MyVar
=Mid("VB Script is fun!", 4, 6)'MyVar contains
"Script".从第4位字符开始,后面6位字符
例如:MyVar2=Mid("VB
Script is fun",4)'MyVar contains "Script is fun!"
'从第4位字符开始,后面的字符
3:Right方法
Right(string, length)
例子:
Dim AnyString, MyStr
AnyString = "Hello World" ' Define string.
MyStr = Right(AnyString, 1) ' Returns "d".
MyStr = Right(AnyString, 6) ' Returns " World".
MyStr = Right(AnyString, 20) ' Returns "Hello World".
20、datatable方法
1:AddSheet方法
DataTable.AddSheet(SheetName)
如:Variable=DataTable.AddSheet
("MySheet").AddParameter("Time", "8:00")
在global中,添加sheet,并在sheet添加列和列值
2:DeleteSheet方法
DataTable.DeleteSheet SheetID
例如:DataTable.DeleteSheet
"MySheet"
3:Export方法
DataTable.Export(FileName)
例如:DataTable.Export
("C:\flights.xls")
4:ExportSheet方法
DataTable.ExportSheet(FileName, DTSheet) 'DTSheet 为sheet的index
例如:DataTable.ExportSheet
"C:\name.xls" ,1
5:GetCurrentRow
DataTable.GetCurrentRow
例子:row =
DataTable.GetCurrentRow
Reporter.ReportEvent 1, "Row Number", row
6:GetRowCount
DataTable.GetRowCount
例子:
rowcount = DataTable.GetSheet("MySheet").GetRowCount
Reporter.ReportEvent 2, "There are " &rowcount, "rows in the
data sheet."
7:GlobalSheet
Property方法
DataTable.GlobalSheet
例如:DataTable.GlobalSheet.AddParameter
"Time", "5:45"
8:Import方法
DataTable.Import(FileName)
例子:DataTable.Import
("C:\flights.xls")
9:ImportSheet方法
DataTable.ImportSheet(FileName, SheetSource, SheetDest)
例子:
DataTable.ImportSheet "C:\name.xls" ,1 ,"name"
'从name.xls导入sheet,index为1,sheet名称为:name
10:LocalSheet
Property 方法
DataTable.LocalSheet
例子:DataTable.LocalSheet.AddParameter("Time",
"5:45")
11:SetCurrentRow方法
DataTable.SetCurrentRow(RowNumber)
例子:DataTable.SetCurrentRow
(2)
例子2:DataTable.SetCurrentRow (i)
12:SetNextRow方法
DataTable.SetNextRow
例子:
DataTable.SetNextRow
13:Value
Property方法
1:DataTable.Value(ParameterID
[, SheetID]) 或者
DataTable(ParameterID [, SheetID])
2:DataTable.Value(ParameterID
[, SheetID])=NewValue
或者
DataTable(ParameterID [, SheetID]) =NewValue
例子1:DataTable.Value ("Destination",
"ActionA")="New York"
例子2:DataTable("addressid",
dtGlobalSheet)=Cstr(res(0))
'Cstr(res(0))为一变量,addressid为sheet一列名称
14:取datatable中某一行值
datatable.getsheet(“global”).getparameter("列名").valuebyrow(i)
如果想取第一行,就将i变为1
21、ReportEvent
Method 方法
Reporter.ReportEvent EventStatus, ReportStepName, Details [, in]
'EventStatus状态:pass:0,失败:1,done:2,警告:3,
状态:0 or
micPass,1 or micFail,2 or micDone,3 or micWarning:
ReportStepName为Name of
the intended step in the report (object name)
例子1:
Reporter.ReportEvent micFail, "Custom Step", "The user-defined
step failed."
例子2:
row = DataTable.GetCurrentRow
Reporter.ReportEvent 1, "Row Number", row
row为一变量
22、reusable
action参数的传递方法1
注:action1和action2都是reusable action,在action3中调用action1和action2
1:action1中参数化,datatable参数名称为:p_Text,Global类型的
2:action2中,编写代码如下:
Dim name1
name1=DataTable.value("p_Text","Global")
Browser("测试登录").Page("办公自动化系统_2").Frame("mainFrame").Link("收文名称001").SetTOProperty "text",name1
//text为对象的属性
3:在action3中,直接调用action1和action2就可以。多个reusable也类似这么做。
23、action 参数传递方法2(没有验证过)
不知道你是不是想把Action2的一些值传递给Action3。
Action Param 既可以作输入也可以作输出,所以他们之间的参数传递是很简单的。
在Action1里面只要实现如下代码就可以了:
RunAction "Action2", oneIteration, InputParamToAction2,
OutputParamFromAction2
RunAction "Action3", oneIteration, OutputParamFromAction2
上面的变量OutputParamFromAction2就同时作为Action2的输出和Action3的输入。
23、action 参数传递方法3(没有验证过)
Action级别的参数调用:
1: 设置参数
ActionProperters >> Action Parameter
增加input的参数和output的参数
2: Action 1
的脚本:
parameter("output")="Action1 Output"
msgbox("Action1 Input:"¶meter("input"))
msgbox("Action1 Output:"¶meter("output"))
3:Action 2 的脚本:
RunAction "Action1", oneIteration,"Action2 Input",action2
msgbox("Output in Action2:"&action2)
我们不难发现在QTP的Action之间关系
作为被调用Action1,都是使用parameter("参数名")来使用的。
作为调用Action1的Action2而言,input参数是可以往被调用Action1的操作输入的参数。Output的参数是从被调用的Action1返回的值。
24、关于datatable和Sheet例子
datatable.AddSheet("husheet") 'datatable添加一个sheet
datatable.ImportSheet
"c:\test.xls","testsheet","husheet"'从外部导入一EXCEl为test.xls
Dim i,RowCount '定义两个变量
i=0
RowCount=datatable.GetSheet("husheet").GetRowCount '设置RowCount等于51sheet中的行数。
msgbox RowCount
Do while i<rowcount
i=i+1 '第一次进入循环,执行这句后,i=1
'datatable.getsheet("51sheet").setcurrentrow(i)这句话被我注释掉了,正确的写法应该是下面这样,分开写。
datatable.getsheet("husheet")
datatable.setcurrentrow(i)
'执行过上面两句后,CurrentRow是第一行。
tempData=DataTable.GetSheet("husheet").GetParameter("Name").Value
'现在,我们调用msgbox看看下面得到的是什么值?每次循环都能得到每行的值,下次循环得到的是第二行
msgbox "GetParameter-Name:"&tempData '这里弹出我们要看的值。
'下面我们用另外一种方法来得到。
msgbox
"GetParameter-i:"&DataTable.GetSheet("husheet").GetParameter(1).Value
'这里我用GetParameter(1)去得到sheet中第一列的值。
loop
分享到:
相关推荐
在"一位高人的QTP学习笔记"中,我们可以期待获取以下关键知识点: 1. **QTP基础**:了解QTP的基本架构,包括其工作原理、安装与配置、环境设置等。学习如何启动QTP,创建新测试,以及理解和使用工具栏中的各项功能...
Main_Users_Guide.pdf中文 QTP9.0编程常用方法及实例心得.doc QTP Excel函数.docX QTP:EXCEL报告输出格式,源码.docx qtp常用方法.txt QTP代码参考框架.txt ...一位高人的QTP学习笔记.doc 在QTP中如何使用Class.txt
55links友情链接网址跟踪器,放在桌面,每次直接打开就可以访问55links友情链接交易平台,方便快捷。
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
moore_01_0909
FIBR English learning
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
OIF_IEEE802.3_liaison_19OCt09
做网络安全FTP内容的实验必备
nagarajan_01_1107
AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
mellitz_3cd_01_0318
PyQt6实战派 配套代码
陕西省省级非物质文化遗产经纬度数据统计表 统计内容包含以下字段: 1. 项目名称 2. 遗产类别 3. 入选批次 4. 所属地区 5. 申报地区/单位 6. 地理经度 7. 地理纬度 该统计表系统记录了陕西省省级非物质文化遗产的地理空间信息,为文化遗产的数字化保护与研究工作提供了重要的数据支撑。
ran_3ck_02a_0918
毕业设计_基于springboot+vue开发的汽车租赁管理系统【源码+sql+可运行】【50308】.zip 全部代码均可运行,亲测可用,尽我所能,为你服务; 1.代码压缩包内容 代码:springboo后端代码+vue前端页面代码; 脚本:数据库SQL脚本 效果图:运行结果请看资源详情效果图 2.环境准备: - JDK1.8+ - maven3.6+ - nodejs14+ - mysql5.6+ - redis 3.技术栈 - 后台:springboot+mybatisPlus+Shiro - 前台:vue+iview+Vuex+Axios - 开发工具: idea、navicate 4.功能列表 - 系统设置:用户管理、角色管理、资源管理、系统日志 - 业务管理:汽车管理、客户管理、租赁订单 3.运行步骤: 步骤一:修改数据库连接信息(ip、port修改) 步骤二:找到启动类xxxApplication启动 4.若不会,可私信博主!!!
# Runcorder - 跑步训练管理系统 Runcorder 是一款专为跑步爱好者、马拉松运动员及高校体育生设计的本地化跑步训练管理工具,基于 Python 开发,结合 Tkinter 图形界面与强大的数据处理能力,为用户提供从训练记录到数据分析的全方位支持。无论是初学者还是专业跑者,Runcorder 都能帮助你科学规划训练、精准追踪进度,并通过可视化图表直观呈现训练成果,让你的跑步训练更智能、更高效! - **多用户管理**:支持创建、加载和删除用户档案,每个用户的数据独立存储,确保隐私与安全。 - **科学训练记录**:全维度记录跑步数据,包括日期、里程、配速、自评和晨跑标记,支持智能输入校验,避免数据错误。 - **多维数据分析**:通过动态可视化图表展示跑步里程趋势、平均配速曲线,支持自定义 Y 轴范围,帮助用户深入理解训练效果。 - **高阶功能**:提供 4 种科学训练模式(有氧/无氧/混合),支持历史记录修改与删除,数据以 JSON 格式持久化存储,跨平台兼容。
paatzsch_01_0708
AnythingLLM是一个全栈应用程序,您可以使用流行的开源大语言模型,再结合向量数据库解决方案构建个人本地AI大模型知识库