LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

WinHttpRequest使用方法,WinHttpRequest演示实例

admin
2012年8月20日 8:44 本文热度 4160

最近经常需要开发API,Microsoft.XMLHttp、MSXML2.XMLHTTP 等组件不能满足我的要求(主要是不能自定义header等信息),通过查资料发现了WinHttp.WinHttpRequest.5.1,但是关于winhttprequest的资料太少了。通过这几天摸索,勉强了解了WinHttpRequest使用方法

WinHttp.WinHttpRequest是一个非常实用的一个组件。作为站长,就会经常关注自己网站的流浪,今天以 免登陆获得cnzz统计信息 和 免登陆获得51.la统计信息 为例,一起了解下WinHttpRequest的使用方法。CNZZ会员系统没有使用验证码,而51.la使用了验证码,针对两种不同的系统,我们分两种方法讨论。

实时获取CNZZ统计信息 ASP版
WinHttp.WinHttpRequest采集无验证码会员系统实例
实时获取51.la统计信息 ASP版
WinHttp.WinHttpRequest采集有验证码会员系统实例


实时获取CNZZ统计信息 ASP版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
'=====================================================================
'=            WinHttpRequest演示实例 - 实时获取CNZZ统计信息          =
'=     Copyright (c) 2011 猫七(QQ:77068320) All rights reserverd.    =
'=              请尊重作者劳动成果,转载请保留代码的完整性           =
'=====================================================================
'= 作者:苗启源(博客:http://www.miaoqiyuan.cn)                       =
'=====================================================================
'=  返回首页站点列表: winhttprequest_demo.asp                       =
'=  返回某站统计数据: winhttprequest_demo.asp?act=data&id=[站点ID]  =
'=====================================================================
'=  文件名:winhttprequest_demo.asp                                  =
'=  功  能:免登陆查看CNZZ 网站流量统计信息                          =
'=====================================================================
 
Dim HttpID,AppName,CNZZ_User,CNZZ_Password
HttpID        = 0
AppName       = "app_cnzz.com_demo"                   '应用程序名前缀,防止感染其他程序Application变量
CNZZ_User     = "kefu@myw3.cn"                        'CNZZ账号
CNZZ_Password = "CNZZTEST"                            'CNZZ密码
 
'函数名:OpenHttp
'功  能:创建Http请求,并返回服务器处理结果
'参  数:url          请求地址
'        PostData     请求数据包,如果是Get请求,请以SENDTYPE=GET开头
'        &strlocation 如果是服务器重定向网址,则返回重定向的地址
'特  点:自动保存/共享cookies,多次请求能保存登录状态
Function OpenHttp(byval url,byval PostData,byref strlocation)
    dim xmlhttp,xmlget,bgpos,endpos,sendtype
    HttpID = HttpID + 1
    if HttpID > 10 then
      response.write "1,连接次数过多"
      response.end
    end if
    strlocation = ""
    sendtype = "SENDTYPE=GET"
    Set xmlhttp = Server.CreateObject("WinHttp.WinHttpRequest.5.1")
    xmlhttp.Option(6)=0
    With xmlhttp
      .setTimeouts 200000,200000,200000,200000
      if left(PostData,len(sendtype)) = sendtype then
        url = url & "?" & replace(PostData,sendtype,"")
        PostData = ""
        .Open "GET", url , False
      else
        .Open "POST", url, False
      end if
      .setRequestHeader "CONTENT-TYPE","application/x-www-form-urlencoded"
      .setRequestHeader "Content-Length",Len(PostData)
      .setRequestHeader "Referer","http://www.miaoqiyuan.cn/p/winhttp-winhttprequest-5-1_demo"
      If Application(AppName & "APIOPcookie")<>"" Then .setRequestHeader "COOKIE", Application(AppName & "APIOPcookie")
      .Send PostData
      If InStr(LCase(.GetAllResponseHeaders),"location:") Then
        strlocation = .GetResponseHeader("location")
      end if
      If InStr(.GetAllResponseHeaders,"Set-Cookie") Then
        If InStr(.getResponseHeader("Set-Cookie"),"PHPSESSID") or InStr(.getResponseHeader("Set-Cookie"),"SPSESSION") then
          Application(AppName & "APIOPcookie") = .getResponseHeader("Set-Cookie")
          Application(AppName & "APIOPcookie") = left(Application(AppName & "APIOPcookie"),instr(1,Application(AppName & "APIOPcookie"),";")-1)
        End if
      End If
      xmlget = bin2str(.responseBody)
    End With
    set xmlhttp = nothing
    OpenHttp = xmlget
End Function
 
'函数名:bin2str
'功  能:将2进制值转换为GB2312编码的字符串
'参  数:binstr       要转换的字符
Function bin2str(byval binstr)
    Const adTypeBinary = 1
    Const adTypeText = 2
    Dim BytesStream,StringReturn
    Set BytesStream = Server.CreateObject("ADODB.Stream")
    With BytesStream
    .Type = adTypeText
    .Open
    .WriteText binstr
    .Position = 0
    .Charset = "GB2312"
    .Position = 2
    StringReturn = .ReadText
    .close
    End With
    Set BytesStream = Nothing
    bin2str = StringReturn
End Function
 
'函数名:OpenRegExp
'功  能:创建正则对象,如果已经创建,则不重复创建
'参  数:&re       要创建的正则对象变量名称
function OpenRegExp(byref re)
  if not isobject(re) then
    set re = new RegExp
    re.ignorecase = true
    re.global     = true
  end if
end function
 
'函数名:OnlyTd
'功  能:去掉字体样式、换行符、空格
'参  数:html      要处理的Html代码
function OnlyTd(byval Html)
  Html = replace(Html,vbCrlf,"")
  Html = replace(Html,"<br />","")
  Html = replace(Html,"<br>","")
  Html = replace(Html,"<br/>","")
  Html = replace(Html,"</font>","")
  Html = replace(Html,"&nbsp;","")
  call OpenRegExp(re)
  Html = re.replace(Html,"")
  re.pattern = "<font([^<]*)>"
  Html = re.replace(Html,"")
  OnlyTd = Html
end function
 
'函数名:NotLink
'功  能:去掉所有链接
'参  数:html      要处理的Html代码
function NotLink(byval Html)
  call OpenRegExp(re)
  Html = replace(Html,"</a>","")
  re.pattern = "<a([^<]*)>"
  Html = re.replace(Html,"")
  NotLink = Html
end function
 
'函数名:notImage
'功  能:去掉所有图片标签
'参  数:html      要处理的Html代码
function notImage(byval Html)
  call OpenRegExp(re)
  re.pattern = "<img([^<]*)>"
  Html = re.replace(Html,"")
  notImage = Html
end function
 
'函数名:midtrim
'功  能:去掉所有多余的空格
'参  数:html      要处理的Html代码
function midtrim(byval s)
  s = trim(s)
  s = replace(s," ","")
  for k = 0 to 50
    s = replace(s,"  "," ")
  next
  midtrim = s
end function
 
'函数名:Connect
'功  能:连接CNZZ并返回处理结果,如果没有登录,自动重新登录
'参  数:act      操作名称,主要简化代码量("http://new.cnzz.com/[ACT].php")
'        str      请求的数据
Function Connect(byval act,byval str)
  dim html
  html = OpenHttp("http://new.cnzz.com/" & act & ".php",str,strlocation)
  '如果未登录状态
  if instr(html,"已超时,请重新登录")>0 then
    '重新登陆
    login = OpenHttp("http://new.cnzz.com/user/login.php","username=" & CNZZ_User & "&password=" & CNZZ_Password & "&list=1&remuser=1",strlocation)
    if strlocation <> "/v1/main.php?s=site_list" then
      response.write "//账号认证失败"
    end if
    Connect = Connect(act,str)
  else
    Connect = html
  end if
End Function
 
'方法名:getData
'功  能:从CNZZ返回某站点数据
Sub getData()
  dim id,html
  id = request("id")
  if trim(id) = "" or not isnumeric(id) then
    response.write "//非法请求"
  else
    id = cLng(id)
    html = Connect("v1/data/site_list_data","SENDTYPE=GETsiteid=" & id)
    html = "var data_arr = " & html & ";" & _
           "var data_obj = document.getElementById('" & id & "_ty').getElementsByTagName('td');" & _
           "data_obj[5].colSpan = 1;" & _
           "var data_cel = data_obj[5].parentNode;" & _
           "data_cel.insertCell();" & _
           "data_cel.insertCell();" & _
           "var outstr = '<table width=""100%"">';" & _
           "data_obj[1].innerHTML = data_arr[0][0];" & _
           "data_obj[2].innerHTML = data_arr[0][1];" & _
           "data_obj[3].innerHTML = data_arr[0][2];" & _
           "data_obj[5].innerHTML = data_arr[1][0];" & _
           "data_obj[6].innerHTML = data_arr[1][1];" & _
           "data_obj[7].innerHTML = data_arr[1][2];" & _
           ""
    response.write html
  end if
End Sub
 
'方法名:Main
'功  能:从CNZZ返回站点列表
Sub Main()
  dim html
  html = Connect("v1/main","SENDTYPE=GETs=site_list")
  html = onlyTd(html)
  html = notlink(html)
  html = notImage(html)
  Call OpenRegExp(re)
  html = replace(html,"获取代码 | 设置 | 清零 | 删除","-")
  html = replace(html,"cellspacing=""0"" cellpadding=""0""","cellspacing=""1"" cellpadding=""1""")
  re.pattern = "<span style=""float:right;padding-top:5px; padding-left:8px;""></span></div>       </div>(.*)<tr>              <td height=""40"" colspan=""5"" style=""text-align:center;"">如希望继续添加站点,请点击此处"
  set p = re.execute(html)
  if p.count > 0 then
    MainUI p(0).submatches(0)
  else
    response.write "对不起,CNZZ改版了。请访问:http://www.miaoqiyuan.cn/p/WinHttp-WinHttpRequest-5-1_DEMO 获取最新版本"
  end if
End Sub
 
'方法名:MainUI
'功  能:友好的显示处理结果
'参  数:body     输出正文内容
Sub MainUI(byval body)
  dim html
  body = midtrim(body)
  html = "<html>" & _
         "<head><meta http-equiv=""Content-Type"" content=""text/html;charset=gb2312"">" & _
         "<title>WinHttpRequest DEMO by Miaoqiyuan.cn - 实时获取CNZZ统计信息</title>" & _
         "<script type=""text/javascript"">" & _
         "function site_data(id){var s = document.createElement('script');s.src = '?act=data&id=' + id;document.getElementsByTagName('head')[0].appendChild(s);}" & _
         "</script>" & _
         "<style type=""text/css"">" & _
         ".list_box{width:900px;background:#666;};" & _
         ".list_box td,.list_box th{background:#FFF;line-height:25px;text-align:center;};" & _
         ".tr-bg4 td,.tr-bg4 th{background:#666;line-height:25px;};" & _
         "</style>" & _
         "</head>" & _
         "<body><center><h1>WinHttpRequest DEMO by Miaoqiyuan.cn</h1><h2>实时获取CNZZ统计信息</h2><hr />" & _
         body & _
         "</table><hr />Copyright: miaoqiyuan.cn 2011-" & year(now) & "" & _
         "</center></body></html>"
  response.write html
End Sub
 
'入口
select case request("act")
  case "data"
    Call getData()
  case else
    Call Main()
end select


实时获取51.la统计信息 ASP版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
'=======================================================================
'=            WinHttpRequest演示实例 - 实时获取51.la统计信息            =
'=     Copyright (c) 2011 猫七(QQ:77068320) All rights reserverd.      =
'=              请尊重作者劳动成果,转载请保留代码的完整性               =
'=======================================================================
'= 作者:苗启源(博客:http://www.miaoqiyuan.cn)                          =
'=======================================================================
'=  返回首页站点列表: winhttprequest_demo_51la.asp                     =
'=  读取并输出验证码: winhttprequest_demo_51la.asp?act=getcode         =
'=  显示数据验证码框: winhttprequest_demo_51la.asp?act=login           =
'=  验证验证码并登陆: winhttprequest_demo_51la.asp?act=dologin         =
'=======================================================================
'=  文件名:winhttprequest_demo_51la.asp                               =
'=  功  能:免登陆查看51.la 网站流量统计信息                             =
'=======================================================================
 
Dim HttpID,AppName,CNZZ_User,CNZZ_Password
HttpID        = 0
AppName       = "app_51.la_demo"                      '应用程序名前缀,防止感染其他程序Application变量
La51_User     = "myw3demo"                            '51.la账号
La51_Password = "la51test"                            '51.la密码
 
'函数名:OpenHttp
'功  能:创建Http请求,并返回服务器处理结果
'参  数:url          请求地址
'        PostData     请求数据包,如果是Get请求,请以SENDTYPE=GET开头
'        &strlocation 如果是服务器重定向网址,则返回重定向的地址
'特  点:自动保存/共享cookies,多次请求能保存登录状态,新增二进制获取
Function OpenHttp(byval url,byval PostData,byref strlocation)
    dim xmlhttp,xmlget,bgpos,endpos,sendtype,imgtype,isbinstr
    HttpID = HttpID + 1
    if HttpID > 10 then
      response.write "1,连接次数过多"
      response.end
    end if
    strlocation = ""
    '与CNZZ的实例对比,增加了获取验证码的功能
    sendtype = "SENDTYPE=GET"
    imgtype  = "GETTYPE=IMAGE"
    isbinstr = false
    Set xmlhttp = Server.CreateObject("WinHttp.WinHttpRequest.5.1")
    xmlhttp.Option(6)=0
    With xmlhttp
      .setTimeouts 200000,200000,200000,200000
      if left(PostData,len(sendtype)) = sendtype or left(PostData,len(imgtype)) = imgtype then
        if left(PostData,len(sendtype)) = sendtype then
          url = url & "?" & replace(PostData,sendtype,"")
        else
          url = url & "?" & replace(PostData,imgtype,"")
          isbinstr = true
        end if
        PostData = ""
        .Open "GET", url , False
      else
        .Open "POST", url, False
      end if
      .setRequestHeader "CONTENT-TYPE","application/x-www-form-urlencoded"
      .setRequestHeader "Content-Length",Len(PostData)
      .setRequestHeader "Referer","http://www.miaoqiyuan.cn/p/winhttp-winhttprequest-5-1_demo"
      If Application(AppName & "APIOPcookie")<>"" Then .setRequestHeader "COOKIE", Application(AppName & "APIOPcookie")
      .Send PostData
      If InStr(LCase(.GetAllResponseHeaders),"location:") Then
        strlocation = .GetResponseHeader("location")
      end if
      '阿江的Cookies比较变态,有3个Set-Cookie,因为这个问题,浪费了好几个小时
      If InStr(.GetAllResponseHeaders,"Set-Cookie") Then
          Application(AppName & "APIOPcookie") = getAJiangCookies(.GetAllResponseHeaders)
      End If
      if isbinstr then
        xmlget = .responseBody
      else
        xmlget = bin2str(.responseBody)
      end if
    End With
    set xmlhttp = nothing
    OpenHttp = xmlget
End Function
 
'函数名:bin2str
'功  能:将2进制值转换为GB2312编码的字符串
'参  数:binstr       要转换的字符
Function bin2str(byval binstr)
    Const adTypeBinary = 1
    Const adTypeText = 2
    Dim BytesStream,StringReturn
    Set BytesStream = Server.CreateObject("ADODB.Stream")
    With BytesStream
    .Type = adTypeText
    .Open
    .WriteText binstr
    .Position = 0
    .Charset = "GB2312"
    .Position = 2
    StringReturn = .ReadText
    .close
    End With
    Set BytesStream = Nothing
    bin2str = StringReturn
End Function
 
'函数名:getAJiangCookies
'功  能:从http头中返回多个cookies值
'参  数:strHeader    HTTP头
Function getAJiangCookies(byval strHeader)
  dim tmp,ltmp,sck
  tmp = ""
  sck = "Set-Cookie:"
  for each ltmp in split(strHeader,vbCrlf)
    if left(ltmp,len(sck)) = sck then
      if tmp <> "" then tmp = tmp & ";"
      ltmp = mid(ltmp,len(sck) + 2)
      tmp = tmp & split(ltmp,"; ")(0)
    end if
  next
  tmp = tmp & "; expires=Tue, 23-Sep-2014 16:00:00 GMT; path=/"
  getAJiangCookies = tmp
End Function
 
'函数名:OpenRegExp
'功  能:创建正则对象,如果已经创建,则不重复创建
'参  数:&re       要创建的正则对象变量名称
Function OpenRegExp(byref re)
  if not isobject(re) then
    set re = new RegExp
    re.ignorecase = true
    re.global     = true
  end if
End Function
 
'函数名:NotLink
'功  能:去掉所有链接
'参  数:html      要处理的Html代码
Function NotLink(byval Html)
  call OpenRegExp(re)
  Html = replace(Html,"</a>","")
  re.pattern = "<a([^<]*)>"
  Html = re.replace(Html,"")
  NotLink = Html
End Function
 
'函数名:notImage
'功  能:去掉所有图片标签
'参  数:html      要处理的Html代码
function notImage(byval Html)
  call OpenRegExp(re)
  re.pattern = "<img([^<]*)>"
  Html = re.replace(Html,"")
  notImage = Html
end function
 
'函数名:midtrim
'功  能:去掉所有多余的空格
'参  数:html      要处理的Html代码
Function midtrim(byval s)
  s = trim(s)
  s = replace(s," ","")
  for k = 0 to 50
    s = replace(s,"  "," ")
  next
  midtrim = s
End Function
 
'函数名:Connect
'功  能:连接51.la并返回处理结果,如果没有登录,自动重新登录
'参  数:act      操作名称,主要简化代码量("http://www.51.la/[ACT].asp")
'        str      请求的数据
Function Connect(byval act,byval str)
  dim html
  html = OpenHttp("http://www.51.la/" & act & ".asp",str,strlocation)
  '如果未登录状态,则进入登录页面
  if strlocation = "../login.asp" then
    response.redirect "?act=login"
  elseif strlocation <> "" then
    Connect = strlocation
  else
    Connect = html
  end if
End Function
 
'方法名:getCode
'功  能:获取验证码
Sub getCode()
  dim html
  Response.Expires = -9999
  Response.AddHeader "Pragma","no-cache"
  Response.AddHeader "cache-ctrol","no-cache"
  Response.ContentType = "Image/BMP"
  response.binarywrite Connect("user/vcode","GETTYPE=IMAGE")
End Sub
 
'方法名:Main
'功  能:从51.la返回站点列表
Sub Main()
  dim html,pe,pa,pm,re,ra,rm
  html = Connect("user/index","SENDTYPE=GETall=yes")
  html = notImage(html)
  html = notLink(html)
  Call OpenRegExp(re)
  Call OpenRegExp(ra)
  Call OpenRegExp(rm)
  re.pattern = "[\S\s]*点击“查看统计报表”可查看实时数据。"
  ra.pattern = "\( 合计当前显示的[\S\s]*"
  rm.pattern = "<div class=""sitelist_o"">[^<]*</div>"
  set pe = re.execute(html)
  set pa = ra.execute(html)
  set pm = rm.execute(html)
  if pe.count = 0 or pa.count = 0  or pm.count = 0 then
    response.write "对不起,51.la改版了。请访问:http://www.miaoqiyuan.cn/p/WinHttp-WinHttpRequest-5-1_DEMO 获取最新版本"
  else
    html = re.replace(html,"")
    html = ra.replace(html,"")
    html = rm.replace(html,"")
    html = "<div>" & html & "</div>"
    Call MainUI(html)
  end if
End Sub
 
'方法名:Login
'功  能:获取登录界面
Sub Login()
  dim html
  html = "<form action=""?act=dologin"" method=""POST"">" & _
         "第一次访问的时候,需要输入验证码:" & _
         "<input name=""vcode"" size=""4"" />" & _
         " <img src=""?act=getcode&timer=" & timer() & """ /> " & _
         "<input type=""submit"" value=""提交""/>" & _
         "</form>"
  Call MainUI(html)
End Sub
 
'方法名:doLogin
'功  能:登录51.la
Sub doLogin()
  dim html,vcode,sendStr
  vcode   = request("vcode")
  sendStr = "uname=" & La51_User & _
            "&upass=" & La51_Password & _
            "&vcode=" & vcode & _
            "&remb=yes"
  html = Connect("login",sendStr)
  if html = "user/" then
    response.redirect "?act=list"
  elseif instr(html,"验证码不正确") then
    Call MainUI("<a href=""?act=login"">验证码不正确,请重新登录</a>")
  else
    Call MainUI("<a href=""?act=login"">账号或密码错误,请修改配置并重新登录</a>")
  end if
End Sub
 
'方法名:MainUI
'功  能:友好的显示处理结果
'参  数:body     输出正文内容
Sub MainUI(byval body)
  dim html
  body = midtrim(body)
  html = "<html>" & _
         "<head><meta http-equiv=""Content-Type"" content=""text/html;charset=gb2312"">" & _
         "<title>WinHttpRequest DEMO by Miaoqiyuan.cn - 实时获取51.la统计信息</title>" & _
         "<style type=""text/css"">" & _
         ".sitelist_n{height:35px;width:620px;background:#CCC;color:#000;line-height:35px;text-align:left;text-indent:10px;font-weight:800;}" & _
         ".sitelist_s{height:35px;width:620px;color:#666;line-height:35px;font-size:13px;text-align:left;text-indent:20px;}" & _
         "</style>" & _
         "</head>" & _
         "<body><center><h1>WinHttpRequest DEMO by Miaoqiyuan.cn</h1><h2>实时获取51.la统计信息</h2><hr />" & _
         body & _
         "<hr />Copyright: miaoqiyuan.cn 2011-" & year(now) & "" & _
         "</center></body></html>"
  response.write html
End Sub
 
'入口
select case request("act")
  case "getcode"
    Call getCode()
  case "login"
    Call Login()
  case "dologin"
    Call doLogin()
  case else
    Call Main()
end select


该文章在 2012/8/20 8:44:33 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved