ASP的一些自定义函数整理第1/2页
程序员文章站
2022-07-02 07:49:43
<% '=========================================================================...
<%
'============================================================================================================================
'函数列表:
'1: 建立数据库的连接 connopen(databaseconnectstr,dbtype,conn_object)
'2: 断开数据库的连接 connclose(conn_object)
'3: 防止sql注入 saferequest(paraname,paratype)
'4: 格式化日期 dateformat(datestr,datetype)
'5: 显示错误提示 showerr(errstr)
'6: 查询字符串中特定数据 selectstr(contentstr,patternstr,patternnum)
'7: 过滤指定字符 leach(contentstr,badwords)
'8: 远程文件内容抓取 seize(urlstr)
'9: 数据流编码处理 bytestobstr(body,cset)
'10: 编码cookies codecookie(contentstr)
'11: 解码cookies decodecookie(contentstr)
'12: 检验数据提交来源是否合法 chkpost()
'13: 个性化加密 myencrypt(strpassword)
'14: 禁止浏览器缓存本页 nobuffer()
'15: 网页格式化输入文本 htmlencode(fstring)
'16: 从头部截取字符串的指定长度(按字符数算) gottopic(str,strlen)
'17: 检测验证码 checkradompass(radompass)
'18: 生成验证码 getcode()
'19: 获取客户端操作系统版本 getsystem()
'20: 数据库事务处理 connmanage(conn_object)
'21: 快速排序(递归) quicksort(arr,low,high)
'22: 将数组的元素以特定字符串连起来 arr_join(arr,character)
'23: 返回字符串以某分割符分割的数目 count_character(str,character)
'24: 截取含有分割符的字符串中指定数目的字符串 inter_str_by_character_num(str,character,start,num)
'25: 利用stream下载文件 downloadfile(strfile)
'26: 返回信息 send_back(resultwords)
'27: 获取错误信息 get_err()
'28: 与saferequest相反 saferesponse(content)
'29: 保存远程图片 saveremotefile(localfilename,remotefileurl)
'30: ...
dim language_arr(10)
language_arr(0) = "数据库连接的参数设置错误!"
language_arr(1) = "数据库连接的类型参数设置错误!"
language_arr(2) = "数据库连接失败!"
language_arr(3) = "非法的参数值!"
language_arr(4) = "参数值不是有效的日期格式!"
language_arr(5) = "操作失败!"
language_arr(6) = "栏目有重名!"
language_arr(7) = "栏目名称为空!"
language_arr(8) = "栏目文件夹创建失败!"
language_arr(9) = "您没有此权限!"
'============================================================================================================================
'函数id:1
'函数作用:建立数据库的连接
'作者名称:茫仔 xiamangmang@gmail.com 博客:blog.mzoe.com
'建立时间:2006-2-15 10:28
'修改时间:
'传人参数:
' connectstr:数据库连接字符串
' connecttype:数据库类别-数字型,0为access,1为ms sql
'返回值:
'============================================================================================================================
sub connopen(databaseconnectstr,dbtype,conn_object)
set conn_object = server.createobject("adodb.connection")
if databaseconnectstr = "" then call showerr(language_arr(0))
if dbtype = 0 then
conn_object.open "driver={microsoft access driver (*.mdb)};dbq=" & databaseconnectstr
elseif dbtype = 1 then
conn_object.open "provider=sqloledb.1;" & databaseconnectstr
else
call showerr(language_arr(1))
end if
err.clear
end sub
'============================================================================================================================
'函数id:2
'函数作用:断开数据库的连接
'作者名称:茫仔 xiamangmang@gmail.com 博客:blog.mzoe.com
'建立时间:2006-2-16 15:10
'修改时间:
'传人参数:
'返回值:
'============================================================================================================================
sub connclose(conn_object)
conn_object.close
set conn_object = nothing
end sub
'============================================================================================================================
'函数id:3
'函数作用:防止sql注入
'作者名称:http://news.dvbbs.net/infoview/article_2906.html
'建立时间:2006-2-16 15:32
'修改时间:
'传人参数:
' paraname:参数名称-字符型
' paratype:参数类型-数字型(1表示以上参数是数字,0表示以上参数为字符)
'返回值:
' 过滤后的字符串
'============================================================================================================================
function saferequest(paraname,paratype)
dim paravalue
paravalue = request(paraname)
select case paratype
case 0
paravalue = replace(paravalue,"'","[system:34]")
paravalue = replace(paravalue,"=","[system:61]")
case 1
if not isnumeric(paravalue) then call showerr(language_arr(3))
case -1
if not isnumeric(paravalue) then call showerr(language_arr(3))
if paravalue = "" then paravalue = 0
case else
if len(paravalue) > paratype then call showerr(language_arr(3))
paravalue = replace(paravalue,"'","[system:34]")
paravalue = replace(paravalue,"=","[system:61]")
end select
saferequest = paravalue
end function
'============================================================================================================================
'函数id:4
'函数作用:格式化日期
'作者名称:茫仔 xiamangmang@gmail.com 博客:blog.mzoe.com
'建立时间:2006-2-16 15:45
'修改时间:
'传人参数:
' datestr:日期字符串
' paratype:日期类型-数字型
'返回值:
' 格式化后的日期
'============================================================================================================================
function dateformat(datestr,datetype)
dim datestring
if isdate(datestr) = false then
call showerr(language_arr(4))
end if
select case datetype
case "1"
datestring = year(datestr)&"-"&month(datestr)&"-"&day(datestr)
case "2"
datestring = year(datestr)&"."&month(datestr)&"."&day(datestr)
case "3"
datestring = year(datestr)&"/"&month(datestr)&"/"&day(datestr)
case "4"
datestring = month(datestr)&"/"&day(datestr)&"/"&year(datestr)
case "5"
datestring = day(datestr)&"/"&month(datestr)&"/"&year(datestr)
case "6"
datestring = month(datestr)&"-"&day(datestr)&"-"&year(datestr)
case "7"
datestring = month(datestr)&"."&day(datestr)&"."&year(datestr)
case "8"
datestring = month(datestr)&"-"&day(datestr)
case "9"
datestring = month(datestr)&"/"&day(datestr)
case "10"
datestring = month(datestr)&"."&day(datestr)
case "11"
datestring = month(datestr)&language_arr(6)&day(datestr)&language_arr(7)
case "12"
datestring = day(datestr)&language_arr(7)&hour(datestr)&language_arr(8)
case "13"
datestring = day(datestr)&language_arr(7)&hour(datestr)&language_arr(8)
case "14"
datestring = hour(datestr)&language_arr(8)&minute(datestr)&language_arr(9)
case "15"
datestring = hour(datestr)&":"&minute(datestr)
case "16"
datestring = year(datestr)&language_arr(5)&month(datestr)&language_arr(6)&day(datestr)&language_arr(7)
case else
datestring = datestr
end select
dateformat = datestring
end function
'============================================================================================================================
'函数id:5
'函数作用:显示错误提示
'作者名称:茫仔 xiamangmang@gmail.com 博客:blog.mzoe.com
'建立时间:2006-2-16 16:29
'修改时间:
'传人参数:
' errstr:错误提示-字符型
'返回值:返回提交页面
'============================================================================================================================
sub showerr(errstr)
response.write("<script>alert("""&errstr&""");location.href=""javascript:history.back()"";</script>")
response.end
end sub
'============================================================================================================================
'函数id:6
'函数作用:查询字符串中特定数据
'作者名称:茫仔 xiamangmang@gmail.com 博客:blog.mzoe.com
'建立时间:2006-2-16 16:40
'修改时间:
'传人参数:
' contentstr:查询字符串
' patternstr:匹配式字符串
' patternnum:查询定位-数字型
'返回值:
' 找不到返回false
' patternnum为-1返回所有匹配字符串并以[10]隔开
' 否则返回指定位置的字符串
'============================================================================================================================
function selectstr(contentstr,patternstr,patternnum)
dim objregexp,matches,matche
if contentstr = "" then
call showerr(language_arr(12))
end if
set objregexp=new regexp '建立正则表达式
objregexp.pattern = patternstr '设置模式
objregexp.ignorecase =false '设置是否区分字符大小写
objregexp.global=true '设置全局可用性
objregexp.pattern = patternstr '匹配式
if objregexp.test(contentstr) = false then '全局匹配
selectstr = false
else
set matches = objregexp.execute(contentstr) '执行搜索
if patternnum = -1 then
for each matche in matches
selectstr = selectstr &"[10]"& matche.value
next
else
selectstr = matches.item(patternnum).value
end if
end if
set objregexp=nothing
end function
'============================================================================================================================
'函数id:7
'函数作用:过滤指定字符
'作者名称:茫仔 xiamangmang@gmail.com 博客:blog.mzoe.com
'建立时间:2006-2-16 16:59
'修改时间:
'传人参数:
' contentstr:源字符串
' badwords:要过滤的字符串,若数目大于1则用英文状态的"^"隔开
'返回值:
' 返回过滤后的字符串
'============================================================================================================================
function leach(contentstr,badwords)
dim badwordsarr,i
badwordsarr = split(badwords,"^")
for i = 0 to ubound(badwordsarr)
contentstr = replace(contentstr,badwordsarr(i),"")
next
leach = contentstr
end function
'============================================================================================================================
'函数id:8
'函数作用:远程文件内容抓取
'作者名称:茫仔 xiamangmang@gmail.com 博客:blog.mzoe.com
'建立时间:2006-2-16 17:24
'修改时间:
'传人参数:
' urlstr:远程文件地址
'返回值:
' 返回远程文件内容
'============================================================================================================================
function seize(urlstr)
dim connect
if urlstr = "" then
call showerr(language_arr(13))
else
set connect = createobject("microsoft.xmlhttp") '建立xmlhttp对象
connect.open "get",urlstr,false '设置参数,通信方式为get,请求为同步,后面还有两个可选属性:userid,password用于用户验证
connect.send() '数据发送,send方法的参数类型可以是字符串、dom树或任意数据流
seize = bytestobstr(connect.responsebody,"gb2312") '返回信息,编码为中文
set connect = nothing
end if
end function
'============================================================================================================================
'函数id:9
'函数作用:数据流编码处理
'作者名称:茫仔 xiamangmang@gmail.com 博客:blog.mzoe.com
'建立时间:2006-2-16 17:30
'修改时间:
'传人参数:
' body:数据内容
' cset:编码格式
'返回值:
' 编码处理后的信息
'============================================================================================================================
function bytestobstr(body,cset)
dim objstream
set objstream = server.createobject("adodb.stream")
objstream.type = 1 '以二进制模式打开
objstream.mode =3
objstream.open
objstream.write body
objstream.position = 0
objstream.type = 2
objstream.charset = cset
bytestobstr = objstream.readtext
objstream.close
set objstream = nothing
end function
'============================================================================================================================
'函数id:10
'函数作用:编码cookies
'作者名称:茫仔 xiamangmang@gmail.com 博客:blog.mzoe.com
'建立时间:2006-2-16 17:36
'修改时间:
'传人参数:
' contentstr:数据内容
'返回值:
' 编码处理后的信息,字符以"a"隔开
'============================================================================================================================
function codecookie(contentstr)
dim i,returnstr
for i = len(contentstr) to 1 step -1
returnstr = returnstr & ascw(mid(contentstr,i,1))
if (i <> 1) then returnstr = returnstr & "a"
next
codecookie = returnstr
end function
'============================================================================================================================
'函数id:11
'函数作用:解码cookies
'作者名称:茫仔 xiamangmang@gmail.com 博客:blog.mzoe.com
'建立时间:2006-2-17 16:58
'修改时间:
'传人参数:
' contentstr:数据内容
'返回值:
' 解码处理后的信息
'============================================================================================================================
function decodecookie(contentstr)
dim i
dim strarr,strrtn
strarr = split(contentstr,"a")
for i = 0 to ubound(strarr)
if isnumeric(strarr(i)) = true then
strrtn = chrw(strarr(i)) & strrtn
else
strrtn = contentstr
exit function
end if
next
decodecookie = strrtn
end function
'============================================================================================================================
'函数id:12
'函数作用:检验数据提交来源是否合法
'作者名称:茫仔 xiamangmang@gmail.com 博客:blog.mzoe.com
'建立时间:2006-2-18 18:55
'修改时间:
'传人参数:
'
'返回值:
' boolean
'============================================================================================================================
function chkpost()
dim server_v1,server_v2
chkpost=false
server_v1=cstr(request.servervariables("http_referer"))
server_v2=cstr(request.servervariables("server_name"))
if mid(server_v1,8,len(server_v2))=server_v2 then chkpost=true
end function
'============================================================================================================================
'============================================================================================================================
'函数列表:
'1: 建立数据库的连接 connopen(databaseconnectstr,dbtype,conn_object)
'2: 断开数据库的连接 connclose(conn_object)
'3: 防止sql注入 saferequest(paraname,paratype)
'4: 格式化日期 dateformat(datestr,datetype)
'5: 显示错误提示 showerr(errstr)
'6: 查询字符串中特定数据 selectstr(contentstr,patternstr,patternnum)
'7: 过滤指定字符 leach(contentstr,badwords)
'8: 远程文件内容抓取 seize(urlstr)
'9: 数据流编码处理 bytestobstr(body,cset)
'10: 编码cookies codecookie(contentstr)
'11: 解码cookies decodecookie(contentstr)
'12: 检验数据提交来源是否合法 chkpost()
'13: 个性化加密 myencrypt(strpassword)
'14: 禁止浏览器缓存本页 nobuffer()
'15: 网页格式化输入文本 htmlencode(fstring)
'16: 从头部截取字符串的指定长度(按字符数算) gottopic(str,strlen)
'17: 检测验证码 checkradompass(radompass)
'18: 生成验证码 getcode()
'19: 获取客户端操作系统版本 getsystem()
'20: 数据库事务处理 connmanage(conn_object)
'21: 快速排序(递归) quicksort(arr,low,high)
'22: 将数组的元素以特定字符串连起来 arr_join(arr,character)
'23: 返回字符串以某分割符分割的数目 count_character(str,character)
'24: 截取含有分割符的字符串中指定数目的字符串 inter_str_by_character_num(str,character,start,num)
'25: 利用stream下载文件 downloadfile(strfile)
'26: 返回信息 send_back(resultwords)
'27: 获取错误信息 get_err()
'28: 与saferequest相反 saferesponse(content)
'29: 保存远程图片 saveremotefile(localfilename,remotefileurl)
'30: ...
dim language_arr(10)
language_arr(0) = "数据库连接的参数设置错误!"
language_arr(1) = "数据库连接的类型参数设置错误!"
language_arr(2) = "数据库连接失败!"
language_arr(3) = "非法的参数值!"
language_arr(4) = "参数值不是有效的日期格式!"
language_arr(5) = "操作失败!"
language_arr(6) = "栏目有重名!"
language_arr(7) = "栏目名称为空!"
language_arr(8) = "栏目文件夹创建失败!"
language_arr(9) = "您没有此权限!"
'============================================================================================================================
'函数id:1
'函数作用:建立数据库的连接
'作者名称:茫仔 xiamangmang@gmail.com 博客:blog.mzoe.com
'建立时间:2006-2-15 10:28
'修改时间:
'传人参数:
' connectstr:数据库连接字符串
' connecttype:数据库类别-数字型,0为access,1为ms sql
'返回值:
'============================================================================================================================
sub connopen(databaseconnectstr,dbtype,conn_object)
set conn_object = server.createobject("adodb.connection")
if databaseconnectstr = "" then call showerr(language_arr(0))
if dbtype = 0 then
conn_object.open "driver={microsoft access driver (*.mdb)};dbq=" & databaseconnectstr
elseif dbtype = 1 then
conn_object.open "provider=sqloledb.1;" & databaseconnectstr
else
call showerr(language_arr(1))
end if
err.clear
end sub
'============================================================================================================================
'函数id:2
'函数作用:断开数据库的连接
'作者名称:茫仔 xiamangmang@gmail.com 博客:blog.mzoe.com
'建立时间:2006-2-16 15:10
'修改时间:
'传人参数:
'返回值:
'============================================================================================================================
sub connclose(conn_object)
conn_object.close
set conn_object = nothing
end sub
'============================================================================================================================
'函数id:3
'函数作用:防止sql注入
'作者名称:http://news.dvbbs.net/infoview/article_2906.html
'建立时间:2006-2-16 15:32
'修改时间:
'传人参数:
' paraname:参数名称-字符型
' paratype:参数类型-数字型(1表示以上参数是数字,0表示以上参数为字符)
'返回值:
' 过滤后的字符串
'============================================================================================================================
function saferequest(paraname,paratype)
dim paravalue
paravalue = request(paraname)
select case paratype
case 0
paravalue = replace(paravalue,"'","[system:34]")
paravalue = replace(paravalue,"=","[system:61]")
case 1
if not isnumeric(paravalue) then call showerr(language_arr(3))
case -1
if not isnumeric(paravalue) then call showerr(language_arr(3))
if paravalue = "" then paravalue = 0
case else
if len(paravalue) > paratype then call showerr(language_arr(3))
paravalue = replace(paravalue,"'","[system:34]")
paravalue = replace(paravalue,"=","[system:61]")
end select
saferequest = paravalue
end function
'============================================================================================================================
'函数id:4
'函数作用:格式化日期
'作者名称:茫仔 xiamangmang@gmail.com 博客:blog.mzoe.com
'建立时间:2006-2-16 15:45
'修改时间:
'传人参数:
' datestr:日期字符串
' paratype:日期类型-数字型
'返回值:
' 格式化后的日期
'============================================================================================================================
function dateformat(datestr,datetype)
dim datestring
if isdate(datestr) = false then
call showerr(language_arr(4))
end if
select case datetype
case "1"
datestring = year(datestr)&"-"&month(datestr)&"-"&day(datestr)
case "2"
datestring = year(datestr)&"."&month(datestr)&"."&day(datestr)
case "3"
datestring = year(datestr)&"/"&month(datestr)&"/"&day(datestr)
case "4"
datestring = month(datestr)&"/"&day(datestr)&"/"&year(datestr)
case "5"
datestring = day(datestr)&"/"&month(datestr)&"/"&year(datestr)
case "6"
datestring = month(datestr)&"-"&day(datestr)&"-"&year(datestr)
case "7"
datestring = month(datestr)&"."&day(datestr)&"."&year(datestr)
case "8"
datestring = month(datestr)&"-"&day(datestr)
case "9"
datestring = month(datestr)&"/"&day(datestr)
case "10"
datestring = month(datestr)&"."&day(datestr)
case "11"
datestring = month(datestr)&language_arr(6)&day(datestr)&language_arr(7)
case "12"
datestring = day(datestr)&language_arr(7)&hour(datestr)&language_arr(8)
case "13"
datestring = day(datestr)&language_arr(7)&hour(datestr)&language_arr(8)
case "14"
datestring = hour(datestr)&language_arr(8)&minute(datestr)&language_arr(9)
case "15"
datestring = hour(datestr)&":"&minute(datestr)
case "16"
datestring = year(datestr)&language_arr(5)&month(datestr)&language_arr(6)&day(datestr)&language_arr(7)
case else
datestring = datestr
end select
dateformat = datestring
end function
'============================================================================================================================
'函数id:5
'函数作用:显示错误提示
'作者名称:茫仔 xiamangmang@gmail.com 博客:blog.mzoe.com
'建立时间:2006-2-16 16:29
'修改时间:
'传人参数:
' errstr:错误提示-字符型
'返回值:返回提交页面
'============================================================================================================================
sub showerr(errstr)
response.write("<script>alert("""&errstr&""");location.href=""javascript:history.back()"";</script>")
response.end
end sub
'============================================================================================================================
'函数id:6
'函数作用:查询字符串中特定数据
'作者名称:茫仔 xiamangmang@gmail.com 博客:blog.mzoe.com
'建立时间:2006-2-16 16:40
'修改时间:
'传人参数:
' contentstr:查询字符串
' patternstr:匹配式字符串
' patternnum:查询定位-数字型
'返回值:
' 找不到返回false
' patternnum为-1返回所有匹配字符串并以[10]隔开
' 否则返回指定位置的字符串
'============================================================================================================================
function selectstr(contentstr,patternstr,patternnum)
dim objregexp,matches,matche
if contentstr = "" then
call showerr(language_arr(12))
end if
set objregexp=new regexp '建立正则表达式
objregexp.pattern = patternstr '设置模式
objregexp.ignorecase =false '设置是否区分字符大小写
objregexp.global=true '设置全局可用性
objregexp.pattern = patternstr '匹配式
if objregexp.test(contentstr) = false then '全局匹配
selectstr = false
else
set matches = objregexp.execute(contentstr) '执行搜索
if patternnum = -1 then
for each matche in matches
selectstr = selectstr &"[10]"& matche.value
next
else
selectstr = matches.item(patternnum).value
end if
end if
set objregexp=nothing
end function
'============================================================================================================================
'函数id:7
'函数作用:过滤指定字符
'作者名称:茫仔 xiamangmang@gmail.com 博客:blog.mzoe.com
'建立时间:2006-2-16 16:59
'修改时间:
'传人参数:
' contentstr:源字符串
' badwords:要过滤的字符串,若数目大于1则用英文状态的"^"隔开
'返回值:
' 返回过滤后的字符串
'============================================================================================================================
function leach(contentstr,badwords)
dim badwordsarr,i
badwordsarr = split(badwords,"^")
for i = 0 to ubound(badwordsarr)
contentstr = replace(contentstr,badwordsarr(i),"")
next
leach = contentstr
end function
'============================================================================================================================
'函数id:8
'函数作用:远程文件内容抓取
'作者名称:茫仔 xiamangmang@gmail.com 博客:blog.mzoe.com
'建立时间:2006-2-16 17:24
'修改时间:
'传人参数:
' urlstr:远程文件地址
'返回值:
' 返回远程文件内容
'============================================================================================================================
function seize(urlstr)
dim connect
if urlstr = "" then
call showerr(language_arr(13))
else
set connect = createobject("microsoft.xmlhttp") '建立xmlhttp对象
connect.open "get",urlstr,false '设置参数,通信方式为get,请求为同步,后面还有两个可选属性:userid,password用于用户验证
connect.send() '数据发送,send方法的参数类型可以是字符串、dom树或任意数据流
seize = bytestobstr(connect.responsebody,"gb2312") '返回信息,编码为中文
set connect = nothing
end if
end function
'============================================================================================================================
'函数id:9
'函数作用:数据流编码处理
'作者名称:茫仔 xiamangmang@gmail.com 博客:blog.mzoe.com
'建立时间:2006-2-16 17:30
'修改时间:
'传人参数:
' body:数据内容
' cset:编码格式
'返回值:
' 编码处理后的信息
'============================================================================================================================
function bytestobstr(body,cset)
dim objstream
set objstream = server.createobject("adodb.stream")
objstream.type = 1 '以二进制模式打开
objstream.mode =3
objstream.open
objstream.write body
objstream.position = 0
objstream.type = 2
objstream.charset = cset
bytestobstr = objstream.readtext
objstream.close
set objstream = nothing
end function
'============================================================================================================================
'函数id:10
'函数作用:编码cookies
'作者名称:茫仔 xiamangmang@gmail.com 博客:blog.mzoe.com
'建立时间:2006-2-16 17:36
'修改时间:
'传人参数:
' contentstr:数据内容
'返回值:
' 编码处理后的信息,字符以"a"隔开
'============================================================================================================================
function codecookie(contentstr)
dim i,returnstr
for i = len(contentstr) to 1 step -1
returnstr = returnstr & ascw(mid(contentstr,i,1))
if (i <> 1) then returnstr = returnstr & "a"
next
codecookie = returnstr
end function
'============================================================================================================================
'函数id:11
'函数作用:解码cookies
'作者名称:茫仔 xiamangmang@gmail.com 博客:blog.mzoe.com
'建立时间:2006-2-17 16:58
'修改时间:
'传人参数:
' contentstr:数据内容
'返回值:
' 解码处理后的信息
'============================================================================================================================
function decodecookie(contentstr)
dim i
dim strarr,strrtn
strarr = split(contentstr,"a")
for i = 0 to ubound(strarr)
if isnumeric(strarr(i)) = true then
strrtn = chrw(strarr(i)) & strrtn
else
strrtn = contentstr
exit function
end if
next
decodecookie = strrtn
end function
'============================================================================================================================
'函数id:12
'函数作用:检验数据提交来源是否合法
'作者名称:茫仔 xiamangmang@gmail.com 博客:blog.mzoe.com
'建立时间:2006-2-18 18:55
'修改时间:
'传人参数:
'
'返回值:
' boolean
'============================================================================================================================
function chkpost()
dim server_v1,server_v2
chkpost=false
server_v1=cstr(request.servervariables("http_referer"))
server_v2=cstr(request.servervariables("server_name"))
if mid(server_v1,8,len(server_v2))=server_v2 then chkpost=true
end function
'============================================================================================================================
1
上一篇: 使用FSO把文本信息导入数据库
下一篇: 博欢心