• asp毕业设计——基于asp+sqlserver的电子论坛系统设计与实现(毕业论文+程序源码)——电子论坛系统


    基于asp+sqlserver的电子论坛系统设计与实现(毕业论文+程序源码

    大家好,今天给大家介绍基于asp+sqlserver的电子论坛系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。

    文章目录:

    1、项目简介

    1. 电子论坛即BBS已经是互联网上的一种极为常见的互动交流服务。论坛可以为网友提供开放性的分类讨论区专题服务,网友们可以在此发表自己的观感,交流某些技术,经验等。论坛也可以作为用户和商家交流的渠道,商家也可以在此回答用户提出的问题或发布某些消息。
    2. 本系统使用ASP进行开发,数据库采用Microsoft SQL Server 。本文描述了电子论坛系统的设计与实现。首先对系统的需求进行了分析,建立系统工作流程图,设计系统数据库,对数据库结构进行了详细分析。然后划分系统功能模块,最后详细描述了各个功能模块实现的方法,并给出相应代码。

    2、资源详情

    项目难度:中等难度
    适用场景:相关题目的毕业设计
    配套论文字数:11290个字36页
    包含内容:整套源码+完整毕业论文
    资源文件目录简图如下:
    请添加图片描述


    3、关键词:

    电子论坛系统;ASP;SQL Server

    4、毕设简介

    提示:以下为毕业论文的简略介绍,项目源码及完整毕业论文下载地址见文末。

    1 引言
    1.1 课题背景
    省略

    1.2 国内外研究现状
    省略

    1.3 本课题的研究意义
    省略

    2 系统分析
    2.1 系统需求分析
    首先找出论坛针对的对象,得出一个简洁的例表:

    1. 用户:论坛的使用人员,进行某些操作时需要注册。
    2. 版面:表明发言内容的类型。
    3. 公共信息:与论坛相关的信息。
    4. 帖子:论坛中单个观点的讨论。
    5. 管理员:与论坛服务的人员。

    论坛的对象不是孤立的,它们是紧密联系的,下面是论坛各个对象之间的关联表,关联是单向的,是指左侧对象对上方对象的活动。无关联的用×表示,如果两者只要单向关联,那么在另一个对象关联时用√表示。

    表1 各对象之间的关系表
    在这里插入图片描述

    至此,论坛的需要分析完成,接下来是论坛的功能设计。

    2.2 系统功能描述
    2.2.1 主要功能
    首先从用户开始,用户关联的对象是自身,版面,公共信息,帖子。分别根据用户与这些对象的联系给出一个明确的菜单
    表2 用户功能表
    在这里插入图片描述

    接下来的版面,公共信息,帖子都没有和其他对象的关联,它们在论坛中是被动对象,是被其它对象所操作。因此针对它们的主要功能是由其它对象产生,例如浏览版面就是用户的功能。

    管理员是论坛的一个特殊群体,它们的主要工作是保证论坛的正常运行,他们可以和论坛的所有对象产生联系,因此他们的功能也很丰富

    表3 管理员功能表
    在这里插入图片描述

    现在分析各个对象的相关操作,设计为对象的功能实现接口,即为对象的操作方法。各个板块有浏览列表和管理两个方法,管理方法又可以分为添加,修改,删除3个子方法。

    帖子有浏览,发帖,回帖,搜索和管理5个方法,浏览方法又分为列表和查看两个子方法,管理方法分为编辑,删除,置顶,移动,指定精华5个子方法,如图。
    在这里插入图片描述

    图1 帖子对象的相关关系
    用户有注册、登录2个方法,管理用户方法又分为删除和设置权限2个子方法,如图。

    在这里插入图片描述

    图2 用户对象的相关关系
    这样分析完后,前面列出的功能列表就有了各自的归属对象。
    论坛一般存在两种用户:注册用户和管理员。用户的权限是向下覆盖的,既上级权限包含下级权限,在论坛中,管理员是上级权限。
    论坛的3大基本功能的相互关系如下图所示。

    在这里插入图片描述

    图3 论坛基本功能的关系
    本系统还有一些是论坛的内容更加丰富的扩展功能。

    2.2.2 论坛扩展功能
    下面是个一个论坛扩展功能表。

    表4 扩展功能表
    在这里插入图片描述

    添加了这几个扩展功能后,论坛就显得平易近人多了,也更具有使用性。

    3 系统设计
    3.1 功能模块
    根据上一节给出论坛所必须的功能,划分模块。模块的划分主要是按照每一个对象的操作来归类。论坛操作的对象是上一节所归纳的5个。下面就针对这5个对象划分功能模块。
    用户:有两个模块,一个是用户注册,登录,修改信息等功能组合,是用户对用户自身的操作;另一个是管理员对用户进行删除,授权,是管理员对用户的操作,如表5。
    在这里插入图片描述
    在这里插入图片描述

    另外,对于用户使用的模块称为前台模块,管理员使用的模块称为后台模块。系统总体功能划分如图4。
    在这里插入图片描述

    图4 系统总体功能划分
    3.2 数据库设计
    本论坛使用Microsoft SQL Server 数据库,下面列出是数据库设计的详细。
    1.建立数据表间的关系
    本论坛数据库共有11个数据表,具体如表10所示。
    表10 论坛数据表
    在这里插入图片描述

    下面是数据表之间的关系图,如图5。
    在这里插入图片描述

    图5 数据表关系
    2.数据表结构的详细设计
    在这里插入图片描述
    在这里插入图片描述

    在用户信息表里保存的是在论坛注册用户的信息,用户编号和用户名在论坛中是不能重复的,用户名不能重复还使用用户编号的原因是计算机对数字检索速度更快。
    在这里插入图片描述

    表12和13是版面信息表,这里使用两个表是为了编程方便,父版面和子版面是通过areaid字段关联的。
    在这里插入图片描述
    在这里插入图片描述

    以上两张表是紧密关联的,论坛主题信息表记载了论坛中主题帖的信息,建立这个表的原因是用户在浏览论坛中的帖子时先应看到的是主题列表,如果主题能够吸引用户,用户才会去看其中的内容,否则用户一进来就看到帖子内容,会使用户感觉非常的杂乱。这两个表是通过topicid字段联系起来的,parentid字段是用来针对特定的帖子回复。
    接下来几张表是论坛的其它功能需要的数据表。
    在这里插入图片描述
    在这里插入图片描述

    4 系统实现
    4.1 首页
    当用户打开论坛时,首先看到的是论坛首页,用户从首页可以看到和论坛相关的并且能激起用户兴趣的东西。比如发帖数,在线用户数以及论坛板块的情况,如图6所示。
    在这里插入图片描述

    图6论坛首页
    首页分为3个部分,最上面的导航条为一部分,中间的公共信息为一部分,下面的版面为一部分。将导航条部分单独写入文件top.asp作为公共程序,以后任何一个页面需要就使用 来调用。下面是top.asp的程序。

    1 <% If Session("userid") = "" Then %>
    这里显示的是游客的导航条
    2 <% Else %>
    这里显示的注册用户的导航条
    3 <% End If %>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    程序说明:用户登录后将用户名存入session对象来判断用户状态。
    公共信息部分是显示了论坛和当前用户的状态,该部分的详细内容将在后面的公共信息部分讨论。

    版面部分显示了版面的列表,该部分的详细内容将在后面的版面部分讨论。
    至此,首页的主要程序已经介绍了,以后章节是各个模块的主要程序。

    4.2 数据库连接函数
    SQL Server数据连接要求提供用户名,密码,数据库名及数据库服务器地址,下面是使用ADO连接数据库的代码:

    1 <% dim conn’打开数据库连接
        2  set conn = server.CreateObject("adodb.connection")
        3  conn.open = "dirver ={sql server};server=(服务器地址);uid=用户名;pwd=密码;database=数据库名; " %>
    4 <% conn.close’关闭数据库连接
        5   Set conn=nothing %>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4.3 用户模块
    4.3.1 用户登录
    下面是一个用户登录的界面,如图7。
    在这里插入图片描述

    图7 用户登录界面
    下面是对用户登录页面的表单处理程序

    1  <% '验证码处理
    2  If trim(request.form("validatecode"))=empty or 
    Trim(Session("cnbruce.com_ValidateCode"))<>Trim(Request.Form("validatecode")) Then
    3  response.write("请注意正确输入验证码")
    4  response.end
    5  end if
    6  session("user")=request.Form("username")
    7  user=request.Form("username")
    8  session("pwd")=request.Form("userpwd")
    9  pwd=request.Form("userpwd")
    10  ishidden=request.Form("hidden")
    11  set rs = server.CreateObject("adodb.recordset")
    12 sql="select * from user_t where username='"&session("user")&"' and userpassword='"&session("pwd")&"'"
    13   rs.open sql,conn,3,3
    14   if rs.eof and rs.bof then '判断用户是否存在
    15   response.Redirect("login_error.asp")
    16   else
    17   session("userid")=rs("userid")
    18 sql1="update user_t set userhidden='"&ishidden&"' where userid='"&session("userid")&"'"'用户是否隐身
    19    conn.execute(sql1)
    20    select case request("usercookie")'把用户信息写入Cookie
    21      case "1"
    22	   response.Cookies("user")("username")=user
    23	   response.Cookies("user")("userpassword")=pwd
    24	   response.Cookies("user").expires=date()+1
    25	   case "2"
    26	   response.Cookies("user")("username")=user
    27	   response.Cookies("user")("userpassword")=pwd
    28	   response.Cookies("user").expires=date()+7
    29	   case "3"
    30	   response.Cookies("user")("username")=user
    31	   response.Cookies("user")("userpassword")=pwd
    32	   response.Cookies("user").expires=date()+365
    	33	   end select
    34    session("name")=request.Form("username")
    	35    response.Write(">")
    	36    response.Write(session("name"))	
    	37	   response.Write("!欢迎你回来!")
    	38    response.Write("两秒钟后自动转入首页")
    	39    end if
    	40    rs.close
    	41    set rs=nothing  %>
    
    • 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

    程序说明:第1~5行是对验证码的处理;第6~10行是将从表单获取的数据存入变量;第11~14行是依据输入的用户名和密码为条件对用户信息表user_t进行查找,如果没有查找到记录说明该用户输入的用户名或密码错误;第15行转到错误处理页面;第18~19行是将用户是否隐身登录标记,即是对用户信息表中的userhidden字段标记;第20~33行是将用户信息写入Cookie。

    4.3.2 用户注册
    用户注册,首先要检查的就是用户填写的信息,其中包括:

    1. 字段是否空白,若空白则不接受。
    2. 输入的E-mail是否正确,若E-mail中没有@,@符号位于E-mail的第一个字符或者@位于E-mail的最后一个字符都算错误。
    3. 两次输入的密码是否一致。
    4. 用户名是否被使用。
    5. 电子邮件是否被使用。
      在这里插入图片描述

    图8用户注册各个页面与数据库的关系
    下面是验证用户注册信息的程序:

    1  <% a=instr(request("userpassword"),"*")
      2  b=instr(request("userpassword")," ")
    3  if username=""or useremail=""or userquestion=""or useranswer=""or userpassword=""or userpassword1=""then
    4  response.Write("必填信息不能为空,请填完!")
    5  elseif userpassword<>userpassword1 then
    6	response.Write("两次输入密码不一致,请重新输入!")
    7  elseif len(username)>10 then
    8	response.Write("你输入的用户名太长,请重新输入!")
    9	elseif len(userpassword)<6 or len(userpassword)>18 then
    10	 response.Write("密码不符合要求,请重新输入!")
    11	 elseif   not isvalidemail(useremail) then
    12	 response.Write("电子邮件地址错误,请重新输入")
    13  elseif  a<>0 or b<>0 then
    14	 response.Write("请不要将‘*’和‘ ’等符号作为密码!")
    15  elseif  useronly(username,useremail) then
    16  response.Write("用户名被占用!")
    17	 else  
     18  验证通过后将用户信息写入用户信息表user_t
     19  end if  %>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    程序说明:第1~2行是取出密码中“*”和“ ”在字符串中的位置;第11行调用了isvalidmail函数,该函数是验证电子邮件地址正确性;第15行调用了useronly函数,该函数是验证用户名和电子邮件唯一性;下面给出验证电子邮件正确性的程序:

    1  function isvalidemail(email)
    2         dim names,named,I,c
    	3	      isvalidemail=true
    	4	      names=split(email,”@”)
    	5	      if ubound(names)<>1 then
    	6	      isvalidemail=false
    	7	      exit function
     8	      end if
    	9	      for each named in names
    	10	      if len(named)<=0 then
    	11		  isvalidemail=false
    	12		  exit function
    	13		  end if
    	14		   for i=1 to len(named)
    	15		      c=lcase(mid(named,I,1))
    	16			  if instr(“abcdefghijklmnopqrstuvwxyz_-.”,c)<=0 and not isnumericI then
    	17			  isvalidemail=false
    	18			  exit function
    	19			  end if
    	20		    next
    	21		    if left(named,1)=”.” Or right(named,1)=”.” Then
    	22		     isvalidemail=false
    	23			 exit function
    	24		    end if
    	25	        next
    	26	       if instr(names(1),”.”)<=0 then
    	 27		     isvalidemail=false
    	 28			 exit function
    	 29		   end if
    	 30		   i=len(names(1))-instrrev(names(1),”.”)
    	 31		   if i<>2 and i<>3 then
    	 32		   isvalidemail=false
    	 33		   exit function
    	 34		   end if  
    	 35		   if instr(email,”..)>0 then
    	 36		   isvalidemail=false
    	 37		   end if	 	 	  
    38  end function
    
    • 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

    下面是验证用户和电子邮件唯一性的程序:

    1   function useronly(user,email)
         2             set rs = server.CreateObject("adodb.recordset")
    	3	           sql="select * from user_t where username='"&user&"' or useremail='"&email&"'" 
         4             rs.open sql,conn,3,3
    	 5	           if rs.eof and rs.bof then
    	 6	              useronly=false
    	 7	           else
    	 8	              useronly=true
    	 9	           end if
    	 10	           rs.close
    	 11	           set rs=nothing
    	 12	 end function
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    它包括修改信息(upadate_userinfo.asp)和修改密码(update_pwd.asp)两个页面。两个页面都是更新用户信息表user_t里的特定字段,这里就不再列出具体程序。

    4.3.3 与其他用户联系
    站内用户通过短消息与其他用户联系,下面是用户收/发短消息的页面:
    在这里插入图片描述

    图9 用户收/发短消息页面
    该功能包括了发短消息,发件箱和收件箱三部分,发短消息是向短消息表(message_t)添加记录,发件箱和收件箱都是从message_t表读取记录。
    标记短消息是否已读是对数据表message_t中的flag字段操作。下面是标记短消息已读的程序:

    1 <% '标记短消息已读
        2  abc=request("mid")
        3  set rsmessage = server.CreateObject("adodb.recordset")
        4 rsmessage.open "select * from message_t where mid='"&abc&"'",conn'	exec="update message_t set flag='1' where mid='"&abc&"'"
    	5  conn.execute(exec) 
    	6  rsmessage.close
    	7  set rsmessage=nothing
    	8  conn.close
    	9  set conn=nothing
    	10 response.Redirect("messageInceptCon.asp?mid="&abc&"") %>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    下面是统计未读消息数的程序:

    1 <%  '统计未读消息数
    2 set rsmessage1 = server.CreateObject("adodb.recordset")
    	3 rsmessage1.open "select * from message_t where flag='0' and incept='"&session("user")&"'",conn
    	4	if rsmessage1.bof or rsmessage1.eof then
    	5	session("flag")=0
    	6	else
    	7	k=0
    	8	do while not rsmessage1.eof
    	9	k=k+1
    	10	session("flag")=k
    	11	rsmessage1.movenext
    	12	loop
    	13	rsmessage1.close
    	14	set rsmessage1=nothing
    	15	end if
        16  conn.close
        17  set conn=nothing %>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    4.3.4 找回密码
    当用户忘记密码时,可以使用找回密码功能。这就要用到用户信息表user_t里的userquestion和useranswer两个字段。系统根据用户名给出密码问题,用户给出密码答案,若匹配,系统会将用户的密码发至用户注册时填写的电子邮箱中。系统给出密码问题和用户给出密码答案是对数据表user_t的读/写操作,前面已经介绍过类似的程序,就不再讨论,这里给出系统是如何将密码发至用户邮箱的程序:

    1  <%  Set jmail = Server.CreateObject("JMAIL.SMTPMail") '创建一个JMAIL对象 
    2       jmail.silent = true 'JMAIL不会抛出例外错误,返回的值为FALSE跟TRUE 
    3       jmail.logging = true '启用使用日志 
    4       jmail.Charset = "GB2312" '邮件文字的代码为简体中文 
    5       jmail.ContentType = "text/html" '邮件的格式为HTML的 
    6       jmail.ServerAddress = "smtp.163.com" '发送邮件的服务器 
    7       jmail.AddRecipient username '邮件的收件人 
    8       jmail.SenderName = "地狱男爵" '邮件发送者的姓名 
    9       jmail.Sender = "rambo-1984@163.com" '邮件发送者的邮件地址 
    10      jmail.Priority = 1 '邮件的紧急程序,1 为最快,5 为最慢, 3 为默认值 
    11      jmail.Subject = "找回你的密码" '邮件的标题 
    12      jmail.Body = "你的密码是:"&userpwd '邮件的内容 
    13      jmail.AddRecipientBCC email '密件收件人的地址 
    14      jmail.AddRecipientCC  admin'邮件抄送者的地址 
    15      jmail.Execute() '执行邮件发送 
    16      jmail.Close '关闭邮件对象 %>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    4.3.5 用户登录添加验证码
    使用验证码,用户每次登录时都不一样,这样做的目的是为了防止有人利用破解程序,暴力破解用户的密码。验证码的处理程序已经讨论过,这里给出生成验证码的程序:

    1 <%  Option Explicit
    2 Response.Buffer = True
    3 Response.Expires = -1
    4 Response.AddHeader "Pragma","no-cache"
    5 Response.AddHeader "cache-ctrol","no-cache"
    6 Dim RndNum,ImgFileContent
    7 Randomize Timer
    8 RndNum = Cint(7999*Rnd+1000)
    9 Session("cnbruce.com_ValidateCode") = Cstr(RndNum)
    10 ImgFileContent=NumCode(RndNum)
    11 Response.ContentType = "image/BMP"
    12 Response.BinaryWrite ImgFileContent
    13 Function NumCode(NumS)
        14 Dim NumI,NumJ
        15 Dim AdoM,AdoN
        16 Dim Arr_Img(4),NStr
        17    NStr=Cstr(NumS)
        18    For NumI=0 To 3
        19        Arr_Img(NumI)=Cint(Mid(NStr,NumI+1,1))
        20    Next
        21 Dim Position
        22 Set AdoM=Server.CreateObject("Adodb.Stream")
        23    AdoM.Mode=3
        24    AdoM.Type=1
        25    AdoM.Open
        26   Set AdoN=Server.CreateObject("Adodb.Stream")
        27   AdoN.Mode=3
        28   AdoN.Type=1
        29   AdoN.Open
        30   AdoM.LoadFromFile(Server.Mappath("validatebody.fix"))
        31   AdoN.Write AdoM.Read(1280)
        32   For NumI=0 To 3
        33       AdoM.Position=(9-Arr_Img(NumI))*320
         34       AdoN.Position=NumI*320
         35       AdoN.Write AdoM.Read(320)
         36   Next    
         37   AdoM.LoadFromFile(Server.Mappath("validatehead.fix"))
         38   Position=Lenb(AdoM.Read())
         39   AdoM.Position=Position
         40   For NumI=0 To 9 Step 1
         41       For NumJ=0 To 3
         42           AdoN.Position=NumI*32+NumJ*320
         43           AdoM.Position=Position+30*NumJ+NumI*120
         44           AdoM.Write AdoN.Read(30)
         45       Next
         46   Next
         47   AdoM.Position = 0
         48   NumCode = AdoM.Read()
         49   AdoM.Close:Set AdoM=Nothing
         50   AdoN.Close:Set AdoN=Nothing
    51 End Function %>
    
    • 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

    4.4 版面/公共信息模块
    4.4.1 版面模块
    版面浏览指的是版面列表,下面是一个显示版面的程序,用了一个循环的嵌套来显示父版面和子版面,使用了表area_t和表board_t。

    1 <%  set rs = server.CreateObject("adodb.recordset")
    2    rs.open "select * from area_t order by areaid",conn    
    3    Do While Not rs.Eof’创建一个对象实例,打开表area_t
    4    response.Write(rs("areaname"))’显示父版面名
    5    set rj = server.CreateObject("adodb.recordset")
    6    rj.open "select * from board_t where areaid='"&rs("areaid")&"' order by boardid",conn
    7   do while not rj.eof %>’打开表board_t
    8   <a href= "showTitle.asp?boardid=<%=rj ("boardid") %>"><% response.Write (rj("boardname")) %></a>’显示子版面名,并作为进入子版面主题列表的链接
    9   <%  if not rj.eof then rj.movenext
    10    loop
    11    rj.close 
    12    set rj=nothing
    13    if not rs.eof then rs.movenext
    14    loop
    15    rs.close
        16    set rs=nothing %>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    4.4.2 公共信息模块
    公共信息部分的程序publicInfo.asp显示论坛和当前用户的状态,下面是一个统计在线人数的程序。

    1 <%
    2 dim refreshtime,idletime,totalusers,onlineuser(),tmp(),num,i,id
    3 refreshtime=30
    4 idletime=refreshtime*3
    5 application.Lock()
    6 if application(session.SessionID&"lastaccesstime")=empty then
    7   if application("totalusers")=empty then application("totalusers")=0
    8      redim tmp(application("totalussers")+1)
    9      num=0
    10   if application("totalusers")>0 then
    11 for i=lbound(application("onlineuser")) to lbound(application("onlineuser"))
    12	      id=application("onlineuser")(i)
    13		  if id<>session.SessionID then
    14		      tmp(num)=id
    15			  num=num+1
    16		 end if
    17	  next
    18	 end if
    19	 tmp(num)=session.SessionID
    20	 application("totalusers")=num+1
    21	 redim preserve tmp(application("totalusers"))
    22	 application("onlineuser")=tmp
    23   end if
    24   application(session.SessionID & "lastaccesstime") =timer
    25   redim tmp(application("totalusers"))
    26   num=0
    27   for i=0 to application("totalusers")-1
    28   id=application("onlineuser")(i)
    29   if (timer-application(id & "lastaccesstime"))<idletime then
    30      tmp(num)=id
    31	  num=num+1
    32	  else
    33	  application(id & "lastaccesstime") =empty
    34	  end if
    35    next
    36    if num<>application("totalusers") then
    37    redim preserve tmp(num)
    38    application("onlineuser") =tmp
    39    application("totalusers")=num
    40    end if
    41   application.UnLock    %>
    
    • 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

    4.5 帖子模块
    4.5.1 发布/删除/修改帖子模块
    网络技术的发展日新月异,现在用户发言时使用的格式也是丰富多彩。例如:用户可以上传文件,可以粘贴多媒体等。下面是一个帖子的发布页面,如图10。
    在这里插入图片描述

    图10 帖子发布页面
    1.文件长传部分
    文件上传可以分为组件上传和无组件上传,本论坛使用的是无组件上传,它的好处是不受系统环境的影响。并且将文件上传到文件夹,将文件信息写入文件信息数据表file_t中。首先分析上传数据格式,在标签中增加enctype="multipart/from-data"属性后,上传的数据是一个长长的二进制字符串,其中包含了文件浏览框的名字,文件的客户端路径,文件的MIME类型,文件内容,文本框的名称,文本框的值等信息。同时表单提交的是二进制字符串,需要转换为文本字符串才能在页面上显示。下面是获取上传文件信息的函数:

    1 Function GetFileInfo(FormName)
    2 Dim strTemp,dataStart,dataEnd,dataLen,temp,intFlag
    3 strTemp=StringToBinary("Content-Disposition: form-data; name=""" & FormName & """; filename=""")
    4 intFlag=InstrB(formData,Divider & bncrlf & strTemp)
    	 5 Dim arrayTemp()
    	 6 If intFlag>0 Then
    7 Redim arrayTemp(4)
    8 dataStart=intFlag+LenB(Divider & bncrlf & strTemp) '定位到第1个字符
    	 9 dataend=InstrB(datastart,formdata,bncrlf)-2  '定位到最后1个字符
    	 10 dataLen=dataend-datastart+1    '返回要取信息的长度
    	 11 arrayTemp(0)=MidB(formdata,datastart,datalen)    '返回文件路径
    	 12 arrayTemp(0)=BinaryToString(arrayTemp(0))      '转换为文本字符串
    13 arrayTemp(1)=Mid(arrayTemp(0),InstrRev(arrayTemp(0),"\")+1)
    		'返回文件的扩展名,其实只要从文件名称中分析出文件扩展名即可
    	 14 arrayTemp(2)=Mid(arrayTemp(1),InstrRev(arrayTemp(1),".")+1)
    		'下面获取文件的MIME类型
    	 15 temp=dataend      '记住当前位置
    	 16 datastart=temp+18     '定位到第1个字符
    	 17 dataend=InstrB(datastart,formdata,bncrlf & bncrlf)-1     '定位到最后1个字符
    	 18 dataLen=dataend-datastart+1      '返回要取信息的长度
    	 19 arrayTemp(3)=MidB(formdata,datastart,datalen)    '返回MIME类型
    	 20 arrayTemp(3)=BinaryToString(arrayTemp(3))     '转换为文本字符串
    	 21 temp=dataend '下面获取文件大小
    	 22 datastart=dataend+5         '定位到第1个字符
    	 23 dataend=InstrB(datastart,formdata,divider)-3      '定位到最后1个字符
    	 23 arrayTemp(4)=dataend-datastart+1           '返回文件大小
    	 25 Else
    	 26 	Redim arrayTemp(0)
    	 27 	arrayTemp(0)="0"
    	 28 End If '下面返回函数值
    	 29 GetFileInfo=arrayTemp
    30 End Function
    
    • 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

    2.帖子内容实现部分
    要实现帖子内容多样化可以使用UBB码。UBB码上HTML的一个变种,是Ultimate Bulletin Board采用的一种特殊的TAG。为了避免用户无意或者有意使用HTML代码对论坛进行攻击。各种论坛基本上都屏蔽了HTML代码。但是为了使得论坛更加“多姿多彩”,论坛也会相应地开放一些自定义的TAG标签,类似于HTML中的TAG。这种自定义的TAG就是俗称的UBB代码。可以使用免费的UBB编辑器来自动生成UBB代码。
    修改和发布帖子差不多,而删除相对简单,这里就不在讨论了。

    4.5.2 帖子浏览模块
    帖子浏览模块部分最重要的是对数据库的操作,如帖子的分页列表,首先来看帖子的分页是如何实现的,下面是几个和分页浏览有关的属性:

    1. AbsolutePage: 当Recordset对象有设置分页时,AbsolutePage会返回目前的页码。
    2. PageCount: 返回Recordset对象的分页总数。
    3. PageSize: 当Recordset对象有设置分页时,PageSize为每页的记录条数。
      有了这几个属性,在使用for……next循环就可以以分页的方式显示帖子了。具体的程序和版面浏览模块相似,这里就不给出程序了。

    4.5.3 帖子搜索模块
    该部分的帖子显示和浏览模块的帖子显示基本一致,这里重点讨论ASP如何操作SQL语句,以及SQL语句是如何工作的。下面先来看下搜索条件。
    在这里插入图片描述

    图11 帖子搜索页面
    从上图可以看出帖子的搜索条件:首先要选择版面,搜索方式分为标题和作者,搜索时间是附加搜索条件。帖子搜索本质上是有条件的对数据表查找,所以要满足以上条件的搜索应该使用下面的SQL语句:

    1 select * from topic_t where "&kind&" like '%"&keyword&"%' and boardid='"&boardid&"' and DateAndTime > '"&posttime&"' order by DateAndTime desc
    
    • 1

    4.5.4 其它功能

    1. 帖子评价
      对于未注册的用户如果想要吸引他们来到论坛,就需要给他们一个互动的权利,对于每个主题开启一个评价好坏的功能,即使未注册的用户也可以使用。同时,增加注册用户发帖的积极性,使他们获得更多的积分和相应的等级。
    2. 论坛收藏
      随着论坛的内容逐渐丰富,用户在论坛中查找信息就会变得越来越困难,特别是对于自己喜欢的内容,每次都要去查找,对此我们提供一个收藏夹,用户可以把自己喜欢的东西收藏起来,方便以后查阅。
    3. 添加好友
      可以将站内的注册用户加为好友,方便查看好友的信息和联系。
      以上功能虽然不是论坛的必须功能,但是它让论坛更加人性化,其实现的方法都类似,都是对数据库的读/写操作。

    4.6 管理员模块
    4.6.1 用户管理
    管理员对用户的管理主要包括用户的批量删除和用户授权。

    1. 用户的批量删除
      实现用户的批量删除,与以往的单个删除不同,主要使用了数组循环:
    1  <%   if request("checkbox")="" then
    2 response.Write("

    你没选用户!

    "
    ) 3 response.Write("") 4 else 5 set rs=server.CreateObject("adodb.recordset") 6 rs.open "select * from user_t ",conn 7 for each i in request("checkbox") 8 exec="delete from user_t where userid='"&i&"'" 9 conn.execute(exec) 10 next 11 rs.close 12 set rs=nothing 13 conn.close 14 set conn=nothing 15 response.Write("

    用户删除成功!

    "
    ) 16 response.Write("") 17 end if %>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    1. 用户授权
      用户授权即指定版主,将用户授予版主的权限首先应该判断用户是否存在,然后在选择相应的版面来作为该版的版主,具体操作是将版面信息表boardid中的master字段更新为指定用户的用户名,其代码与其它写入数据库的代码类似。

    4.6.2 版面管理
    版面管理包括版面的添加,删除和修改。其具体实现方法均是对父版面信息表area_t和子版面信息表board_t操作。其三者主要不同之处在于SQL语句的不同,添加版面需要使用insert,删除版面需要使用delete,修改版面需要使用update。

    4.6.3 帖子管理
    管理员对帖子管理包括批量删除帖子和批量移动帖子。而版主对帖子的管理包括删除单个帖子,移动单个帖子,置顶帖子,指定精华帖。批量删除帖子与批量删除用户类似。而批量移动帖子不同之处使用下面的SQL语句:
    update topic_t set boardid=‘“&request(“boardid”)&”’ where TopicID=‘“&i&”’

    4.6.4 数据库备份和恢复
    下面是数据备份程序:

    1  <%   '备份数据库
        2  sql="backup   database   bbs   to    disk='"&request("path")&"'   with   init"   
        3  set   conn=server.createobject("adodb.connection")   
              conn.open = "driver={sql server};server=(local);uid=sa;pwd=123456;database=bbs;"   
              conn.Execute(sql)   
        4  on   error   resume   next   
        5  if   err<>0   then   
        6  response.Write("

    数据备份失败!

    "
    )&err.Descripting 7 conn.close 8 set conn =nothing 9 response.Write("") 10 else 11 response.Write("

    数据备份成功!

    "
    ) 12 path=request("path") 13 dim objfso,objts'将数据库备份文件地址保存到文件 14 set objfso=server.CreateObject("scripting.filesystemobject") 15 set objts=objfso.opentextfile(server.MapPath("path.txt"),2,true) 16 objts.write(path) 17 objts.close 18 set objts=nothing 19 set objfso=nothing 20 conn.close 21 set conn =nothing 22 response.Write(">") 23 end if %>
    • 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

    下面是数据库恢复程序:

    1  <%  '断开用户到数据库的连接
        2 sqla="declare hcforeach cursor global for select 'kill '+rtrim(spid) from master.dbo.sysprocesses where dbid=db_id('bbs') exec sp_msforeach_worker '?'"  
        3  sqlb="restore   database   bbs   from   disk='"&request("pathname")&"'"
        4  set   conn=server.createobject("adodb.connection")   
              conn.open = "driver={sql server};server=(local);uid=sa;pwd=123456;database=master;"  '数据库在连接时不能恢复,所以要连接到master数据库 
        5    conn.Execute(sqla)
    	6	  conn.Execute(sqlb)      
        7    on   error   resume   next   
        8    if   err<>0   then   
        9    response.Write("

    数据恢复错误!

    "
    )&err.Descripting 10 conn.close 11 set conn=nothing 12 response.Write("") 13 else 14 response.Write("

    数据恢复成功!

    "
    ) %> 15 conn.close 16 set conn=nothing 17 response.Write("") 18 end if %>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    结 论
    至此,本论文从设计到实现展示了一个简单的BBS系统。从宏观上分析,功能不过于用户管理,发帖,回复及论坛管理等几个最常用的功能。同时,在系统的实现过程中首要的是对需求的分析。然后,是对数据库的设计,只要设计好数据库,就做好了实现系统的基础,同时也方便对系统功能的扩展,在此看来,做一个好的系统首先要设计一个好的数据库。接下来是对各个功能模块的具体实现,其实现的方法都大体类似。总之,从设计到实现这个电子论坛系统,可以学到研究这一类Web系统的通用方法,为以后研究其它Web系统打下基础。

    参考文献
    [1] 方睿,刁仁宏, 吴四九.网络数据库的原理及应用[M].成都:四川大学出版社,2005。
    [2] 邓文渊, 陈惠贞, 陈俊荣. ASP与网络数据库技术[M].北京:中国铁道出版社,2003。
    [3] 明日科技. ASP程序开发范例宝典[M].北京:人民邮电出版社,2006。
    [4] 顼宇峰,马军. ASP网络编程入门到精通[M].北京:清华大学出版社,2006。
    [5] 王恩波, 张露, 刘柄兴. 网络数据库实用教程[M].北京:高等教育出版社,2003。
    [6] 郭晶,孙伟娟. ASP网站开发四“酷”全书[M].北京:电子工业出版社,2006。
    [7] 尚俊杰. ASP无组件上传原理简明教程[EB/OL].http://www.jjshang.com/,2005。

    致 谢
    省略


    5、资源下载

    本项目源码及完整论文如下,有需要的朋友可以点击进行下载

  • 相关阅读:
    PATA 1010 Radix(进制转换)
    使用Spring Boot双数据源和PageHelper实现无缝分页查询
    Appium自动化测试基础 — APPium基础操作API(一)
    asp.net田径运动会管理系统
    机器学习入门教学——可解释性
    用node写后端环境运行时报错Port 3000 is already in use
    【Redis】Redis的持久化
    【css揭秘】- 47个不可不知的 css 技巧(上篇0-19)
    蓄电池为什么要巡检?智能电池巡检箱监控系统方案帮您解答
    奇偶链表问题
  • 原文地址:https://blog.csdn.net/m0_66238867/article/details/125910302