… ………………………………… ………………… 实用第一 智慧密集 部门设备管理系统设计 朱建兴 摘 要:基于部门设备管理的特点和运作流程,采用ASP动态网页编程技术和Microsoft Access 2003数据库.开发基于CRM模式的学校部门设备管理系统,探索CRM管理模式在部门设备管 理中应用,完成了部门设备基本信息管理、报表打印、设备信息查询、客户(用户)信息管理等 功能,成功实现了部门设备的管理需求。 关键词:CRM;部门设备管理;ASP;数据库 1 引言 CRM是英文Customer Relationship Management的缩写,即 客户(或用户)关系管理。CRM是一套先进的管理思想及技 术手段,它通过将人力资源、业务流程与专业技术进行有效的 整合,使企业(或部门)与客户(或用户)建立起基于学习型 关系基础上的一对一模式,从而提高管理运作流程的自动化程 度.降低管理成本,提高管理效率。 部门设备管理系统是一个典型的数据库应用程序.由设备 基本信息维护、设备信息查询、设备编号的生成、用户信息管 理等模块构成,其流程如图l所示。由于本系统是一个简单的 应用系统,因此,在选择数据库时,应考虑数据库应用的特点 及适用范围,本系统采用数据库为Access2003。本系统基于 Web浏览器,采用C/S模式,方便实用。 4关键技术 2 CRM模式 基于部门设备管理的特点和运作流程,借鉴企业CRM系 4・’ 信息批量录入 当部门采购了设备以后,在分配给各个科室使用之前要先 进行设备信息录入.而设备信息是由管理员进行录入的,在本 系统中也支持Access和Excel的数据导人。 统开发模式.开发出适合部门设备管理的管理模式,改善“设 备采购一设备分配一设备管理”整个运作流程,实现设备管理 流程的自动化,规范化,高效化。 基于网络B/S(Blowser/Sever)模式,采用ASP网络编程技术和 'Microsoft Access 2003数据库.服务器端只需要有一台PC做为服务 器.客户端用户只需会用IE浏览器即可,系统搭建简单方便实用。 当部门采购了一批设备后,最常见的情况是,可能这批设 备里有好多种类别,比如:采购了一批设备,其中笔记本3 台、交换机4台、投影仪2台。那么如何实现设备的批量录入 呢?本系统采用数组的方法,先将设备信息存放到数组中,然 后利用循环实现设备的批量入库,其实现的核心代码如下: Function addinfo(Gname,Gstd,Gprice,.Gnums,.Gshop) —3设计流程 if not isarrav(session(‘'arr_rk"))Then "session(''arr_rk'。)不是数组 dim arr(0 4} arr(0,O)=Gname arr(O,1)=Gstd arr(0,2)=Gprice arr(O.3)=Gnums arr(O,4)=Gshop Else Session("arr_rk”)是数组时 arr=session(“are rk ) UB=ubound《arr,1)+1 redim arr(UB,4) 图1程序流程图 sessionairr=session(''arr_rk'。) 与I|E …… FORU啊………………………… ………………………………………… ……………… ………………… 将新添加的商品信息保存 arr(UB,0)=Gname arr(UB,1)=Gstd arr(U B,2)=Gprice arr(UB.3)=Gnums arr(UB,4】=Gshop 应用循环将保存在seesion( arr_rk”)数组中的商品 信息添加到arr中 For I=0 To ubound(sess onar 1) For J=0 To 4 arr(I J)=sessionarr(I,J) Next Next end if session(“arr_ rk)=arr End Function 利用循环向数据库里添加记 录==2====================:=============== If Not Isempty(Request( store ))Then txt.area=request.FOrm( txt_area ) txt_depart=request.Formf t)(t depart“) t)(t—hander=request.Form( txt—hander ) tXLuser=request.Form(Htxt_user“) t)(Lchecker=request.FOrm{。txt_checker ) txt_buydate=request.Form( txt_buy date’) if txt_area<>“And txt_depart<>“And txt_hander<>。” And t×t__user<> And tXt checker<> and txt buy_date<> And sarray(sessjon(。store“))Then 将session的内容赋给arr_goods数组 arLgOods=sessiOn(“store”) goods_type=ubound(arr_goods,1)+1 For._0 to ubound(arr_goods, 前6个字段为数组 arr_goods的内容,中间6个字段直接从表单获取,剩余的3个 字段为系统信息。 sqlstr=“insert into shoplist(name std。price,nums;cash, shop,info,depart,checker,buy_date。hander,user,store—date, bill—sort,bill—id,operator) values ( &arr goods {l,0)&“ , &arr_goods(i,1)& , &arr_goods(i,2)&”,“&arr_goods(1,3)& , &arr goods {i。4)&“。 &arr_goods 5)& 。 &txt_area& 。 &txt_depart&"',"&txt_checker&",#。&txtbuy_date& #. 。 &txt_hander&"'."&t×Luser& ,# &date()&“栉,0,"&Clng(session( intno ))&“, &session(”operator )& )。 db.Execute(sqlstr) Next session(“are rk“)= session( store“l=” session( intno )= response.Write(“<script language='javascript >alert( 商 品入库成功l! );window.1ocation。href='center_search.asp :</ script> ) end if end if 其实现效果如图2。 }_辩曩叠藩f嚣'生 f 枣舅咻 i蠢耐 … t Bo。 2 3㈣j莲 ■:厂_一『__——■ ■ 塑臼 蝴鼙n: 掰_三l荼妁^:广一黼 :广一 :r~鏊螋日 :广 —一 j鞫 l ~ 图2 4.2多类别用户登录验证 不同类别的用户具有不同的使用权限,本系统把用户分为 3种类别:管理员、超级用户、一般用户。 管理员具有系统最大权限。负责设备管理,包括设备信息 批量录入、设备信息修改、删除等;用户管理,包括用户的创 建、删除、用户信息修改、冻结用户等。 超级用户一般对应着部门的主管,要求能对整个部门的所 有设备进行信息查询。同时可以修改用户密码。 一般用户具有最小的权限,只能查询本部门的设备信息, 一般对应着具体科室的负责人,同时可以修改自己的密码。 为了实现这一点,需要实现在登录界面加入用户类别判 断,以便根据不同的权限进人不同的系统界面;具体登录验证 代码如下,并存为一个单独文件login.asp。 其次,为了系统信息的安全,当用户在一段时间内没有登 录时,管理员应将其帐户冻结。这就需要实现在登录界面加入 用户状态判断。 具体代码如下: if isempty(session(”Passed”))then session( Passed )=False end.f if session(。Passed“)=False then if request( Iogin ): ok’Then Dim username.userpwd username=myReplace(request.FOm1{。user- name”)) userpwd=md5(myReplace(request.F0rm( userp- wd“))) 表单验证开始 用户名或密码没有填写 if username= 。or userpwd=。。then 给出提示,并返回到前一页 response,write <script>alert( 请输入用户名和密 码! );history.back();</script>’ respOnse.end end If 输入的验证码为空 ……… …… …… … ・…, ……hJ……¨t ………… 实用第一 智慧密集 If Trim(request.Form(“code”))= “Then response.write <script>alert( 请输入验证码! history.back0;</script>‘ 。response.End End if 输入的验证码非数字 If not IsNumeric(Request.Form(“code”))Then Response,Write <script>alert( 你输入的验证码为 非数字! );history.back0;</script>。 Response.End End If 表单验证结束 If(int(Session(”pSN ))=int(Request.Form(”code“))) Then 建立RecordSet对象 Set NArs=Server.CreateObject Adodb.Record— Set ) 从数据库中查找Admin列的值为user,pwd列的 值为pass的记录 sql= Select frOm user where username= 。& username& and password= ‘&userpwd& “ 执行查询操作,并将结果保存在NArs中 NArs.open sql,db,1 If Not(NArs.bof and NArs.eof)Then 用户存在 If NArs( userstate )=1 Then 且未被冻结则登录成功 if NArs(”usertype”)=O Then session(”usertype“)=O Session(“Passed“)=True Session( operator“)=NArs(”username ) 把操作员的名字存放到session中 Response.Redirect ../operator/opera— tot_menu.asp 页面转到留言管理界面 response.expires=3 设置登录页面立即失效 elseif NArs( usertype“)=1 Then session( usertype )=1 Session( Passed“l=True session(“id“)=NArs(“id ) 将用户ID保存到Session中,便于修改密码 Session( username )=NArs(“username”) Response.Redirect ../super_user/su— permenu.asp” response.expires=3 设置登录页面立即失效 Else session( usertype )=2 Session( Passed )=True session( id )=NArs( id”) 将用户lD保存到Session中,便于修改密码 Session(“username )=NArs( username”) session(“depart )=NArs( depart ) 将用户所属 部门存入session,只显示本部门的设备 Response.Redirect ../useduseLmenu.asp” :40 /; I函 鑫与簟 response.expires=3 设置登录页面立即失效 end If Else Response.Write(“<script>alert( 登录失败!、n 原因可能是下列任意一个:\n您输入的用户已经被冻结l\n您输 入的用户不存在!\n密码错误!\n验证码错误! );history.back ()</script> ) Response.End NArs.Close 关闭RecordSet对象 Set NArs=nothing End if Else 不存在满足条件的记录,给出提示,返回到前一页 Response.Write(”<script>alert( 登录失败!\n原因 可能是下列任意一个:\n您输入的用户不存在!\n您输入的用户 已经被冻结!kn密码错误!\n验证码错误! );history.back()</ script>“) Response.End NArs.Close 关闭RecordSet对象 Set NArs=nothing End If End If End If End If 登录界面效果如图3。 图3 4.3限制普通用户权限 为了系统安全,不仅要使用登录验证文件login.asp防止未 登录用户访问某些网页,还要防止已登录用户访问权限之外的 网页,因此如何限制普通用户的权限是一个平常重要的问题。 本系统实现方法如下: 本系统用户分为管理员、超级用户、一般用户3类,并为 每类用户编写一套应用程序。当用户登录后会自动转向相应的 程序页面。为了防止已登录用户访问权限之外的网页,在每个 网页要加上用户类别判断语句。 FORU啊 例如:指定管理员的用户类 ̄J1]-usertype--O,则在管理员 操作的每个页面加类别判断语句,具体代码如下: If NArs(”usertype“)=0 Then EIse Response.Write( <script>alert( 您没有相关权限! );his— tory.backO</script>。) response.end End If 4.4用户数据库的设计 要在数据库用户表USER中,添加用户类另IJ字段usertype、 用户状态字段userstate如图4。 图4 具体的用户管理界面如图5。 ■ 扪她 鼢 艟髑 接 隅≈ 榈P 诗活葡 2 彗葭誊码 广 liu 协女趣 用f口 诗活 2 ̄-25 疆 涨P I_=I zzz 中心办公 一艘用户 薏活 2008。2-9鳖塑坚 f._ I鞣体骞 一般用P 强浯 2008—2—5量墨董坚 广缆 图5 实现冻结用户的代码如下: <% }f session(”Passed”)=True Then If NArs(。usertype”l-0 Then response.write(…‘&session(。username )& ,登陆成功{< center> } %> <% Dim ID ID=Request.QueryString(。lD ) strSql= Select From user where ID= &ID&“ ‘ Set rs=db.Execute(strSq1) If Not Isempty(Request( save。))Then user_type=Request.Form(¨user type。l user_depart=Request.Form(”user_depart。) userstate=Request.FOrm《“userstate。) end if %> <head> <meta http—equiv= Content-Type”content:“text/htm charset=gb231 2”/> <title>用户信息修改</title> <style type=。text/css“> <!一一 ,STYLE2{font—size:9pt} 一一> </style> </head> <body> <h2 align=center>) ̄户信息修改</h2> <form name= f0rm1 method=“post action=“> <table width=“452’‘border=”0 align= center cellpadding= 0 cellspacing= 0“> <tr> <td width= 420“bgcolor=。#566CDB“><img src= ../im— ages/DispStati0n—H.g width=。1 1“height=’24‘/> ̄/J1]用户</ td> </tr> <,table> <table width=。452 border=。0。align= center‘cellpadding=” 0 cellspacing= 0“> <tr> <td width= 83 align= right bgcolor= #E l F5FF style=。 border:#99ccff 1 px solid ><span class=。STYLE2 >用户名:< /span><Ad> <td width= 363 style= border:#99ccff 1px solid ><%= rs(。username’)%><,td> </tr> <tr> <td align: right bgcolor=“#E l F5FF。style;“border: #99ccff 1 px solid ><span class=“STYLE2。>类型:</span></ td> <td style=。border:#99cc什1 px solid > <select name=“useLtype’> <option value=1<%If rs( usertype。)=1 Then Re- sponse.Write‘Selected %>>超级用户</a> <option value:2<%If rs(。usertype )=2 Then Re- sponse.Write。Selected。%>>一般用户<,a> </select> <span class=,STYLE2 > 请选择用户类型</span>< /td> </tr> <tr> <td align= right bgcolor=“#El F5FF style: border: #99ccff 1 px solid ><span class= STYLE2。>部门:</span><, td> <td style=。border:#99ccff 1 px solid。><span class=。 STYLE2‘> <select name=。user_depart,> <option value=“网络部 <%}f rs(”depa ̄。):。 ‘_ 、 实用第 一 网络部 then%>selected<%end if%>>网络部</option> <option value= 公共机房”<%_f rs(”depart ) =。公共机房“then%>selected<%end if%>>公共机房</op. tion> <option value= 三维培训 <%If rs(,de part ) 三维培训。then%>selected<% end if%>>三维培训</op- t ̄on> <option value=“多媒体部“<%if rs(“depart )=”多媒体 部 then%>selected<%end If%>>多媒体部</option> <option value=,电教部’<%_f『s(“depart“)=“电教部。 then%>selected<%end_f%>>电教部</olption> <option value= 中心办公“<%讳rs(“depart“)=“中心办 公。then%>selected<%end if%>>中心办 ̄</option> <Iselect> 请选择用户所属部l'1</span></td> </tr> <tr> <td align= right“bgcolor=“舟E1 FSFF style= border: #99ccff 1px solid ><span class= STYLE2 >帐号激活:</ span></td> <td style=。border:#99ccff 1 px soild“> <span class= STYLE2“> <input type=”radio name= user_state‘value=1l<% _f rs(”userstate )= then response.Write( checked )%>> 激活 <i÷nput type= radio name= user_state value=0<%if rs(。userstate。)=0 then response.Write( checked )%>> 冻结<Is.pan></td> </tr> <tr align= center > <td colspan=。2。> </td> </tr> <tr align=。center > <td colspan=。2。> <!一一在单击时验证一一> <input type=。submit name= save value=“保存“> </ tr> <% if useLtype<> and user=depart<>“and US— er_state<>“”then if user state=1 then str.up= update user set usertype=cint(” &user_Wpe&。),depart= &user—depart&。 。userstate=1 where id: &}D& else str_up= update USer set usertype=cint(“ &useLtype&。),depart= &user_depart&, ,userstate=O where id= &ID&… end.f set rs=db.execute(str_up) response.Write (“ <script language = "javascript >alert( 用户信息修改成功l );window.Iocation.href= 2o 1 0越. 9 l二_ 技巧 鹣 … 智 ……………… ……………………………………e慧密集 user_list.asp :</script> ) end-f %> </table> </form> </body> </htmI> <% Else Response.Write(。<script>alert( 您没有相关权限! ): history.backO</script>”) response.end End If NArs.close Set NArs=Nothing db.close End %> 效果如图6所示。 用尸名:zzz :类型:I, 一般用户 ¥诗选择用尸类型 …一I… 部门:I中心办公习 请选择用户所属部门 ~… 一’’-…………一’ ’帐号戳活: {:_激活r冻结 图6 5数据库安全 由于Access数据库容易被人直接修改.所以要考虑数据 库的安全问题。有许多人认为给数据库加上密码,但效果不 大,因为破解的软件比比皆是,如图7所示。 图7 …… FORU啊 ………… …………………………………… ……………………… ……… ……… ………… 其实最关键的是防下载、防暴库和防SQL注入l这对于 数据库安全是最重要的。 那么基本措施有3个: (1)将数据库放到网站根目录以外防止下载。 例如: 网站根目录为: x:\www\web 则数据库的目录应设置为: x:\www\data (2)在数据库里链接文件里加上一句ON ERROR RE— SUME NEXT防止暴库.并把相对路径改为绝对路径。 那么数据库链接代码如下: <% on error resume next dim db set db=server.createobject( ADODB.CONNECTION J db.open “DBQ=x:\www\datakxx.mdb;DRIVER=(Mi— crosoft Access Driver( .mdb)):“ %> (3)要防止SQL语句注入,可以编写一个字符过滤函数, 供其他页面调用。函数代码如下: <% Function myReplace(myString) myString=Replace(myString,"& , &arap; ) 替换&为字符实体& myString=Replace(myString,"<‘,”&It=¨) 替换<为字符实体&ft myString=Replace(myString,"> ,“&gt:“) 替换>为字符实体&gt: myString=Replace(myString,chr(1 3), <br> ) 替换回车符为换行标记<br> myString=Replace(myString,chr(32),“&nbsp:“J 替换空格符为字符实体  myString=Replace(myString,chr(9)JH  &nb- sp;  ) 替换Tab缩进符为 myString=Replace(myString,chr(39L”´。) 替换单引号为字符实体´ myString=Replace(myString,chr(34),"" ) 替换双弓1号为字符实体" myReplace=myString 返回函数值 End Function %> 6系统主界面 本系统基于Web浏览器,操作维护都很方便。由于不同 的用户登录后的界面不同,以管理员登录后的界面为例,如图 8所示,可以很方便地对设备信息维护、设备查询、用户信息 维护等模块进行操作。 图8 7 结语 本系统是结合学院的设备管理的要求基于CRM模式进行 开发的,整个系统具有良好的实用性、扩展性、可靠性和稳定 性。已经在各个系部门使用,由于是基于Web,在使用推广上 都很方便,只需要用户会基本的网页操作即可。该系统投入使 用后提高了学院管理信息化水平,增强了设备管理的透明度, 具有较好的通用性和推广利用的价值。 参考文献 『11顼字峰,马军编著.ASP网络编程从入门到精通.清华大学 出版社.2006. [2]尚俊杰,秦卫中著.网络程序设计ASP案例教程.清华大学 出版社.20o5. 『3]求是科技编著.ASP开发CRM系统实例导航.人民邮电出版 社.2005. ≥ 快乐英语,有问必应 微软必应推出必应词典,提供中英文翻译搜索服务2 氮 近13,微软MSN宣布,为了给中国用户提供更好的搜I{ 索体验,实现“快乐搜索,有问必应”,同时也为了方便中≥ 国用户更加直接的在搜索过程中学习英语,微软必应 (Bing)于4月7日起正式推出融合了微软亚洲研究院英库 (Engkoo)创新技术的中英文垂直翻译搜索服务,即必应首 页和搜索页面中的“必应词典”功能。中英文翻译垂直服务《 融合了英库强大的翻译功能和创新技术,让用户可以在搜索 和中英文翻译之间进行无障碍切换。全面的整合了必应和英 库的技术和功能特点,当用户搜索目标检索词时,不但可以 在结果页中找到与之相对应的网页、视频、图片或地图等信 息,还可以同时查询与该检索词相对应的最地道的中英文翻 译,真正做到快乐搜索,有问必应。 石^ 二;v ; 蜀三石 . ! 石 ; =; 石 . :石^. 。 ‘ ‘ .