任务51系 统 简 介5.1.1开发工具简介1. 系统架构浏览器/服务器(Browser/Server,B/S)结构模式,是Web兴起后的一种网络结构模式,Web浏览器是客户端最主要的应用软件。B/S结构模式统一了客户端,将系统功能实现的核心部分集中到服务器上,简化了系统的开发、维护和使用。 B/S结构模式最大的优点就是可以在任何地方进行操作而不用安装任何专门的软件,只要有一台能上网的计算机就能使用,客户端零安装、零维护,扩展非常容易。 2. 部署环境需求 (1) 软件环境: SQL Server 2017或更高版本的数据库管理系统;IIS;ASP.NET 4.0组件。 (2) 硬件环境: 1GB或以上的内存,1GHz或以上的CPU。 数据库案例与应用开发项目教程(SQL Server 2017 +Visual Studio 2017综合开发)学习情境5网络论坛设计与开发5.1.2系统功能图 使用“网络论坛”网站的用户有普通用户和管理员两种身份,系统功能如图51所示。 图51系统功能 任务52数据库设计5.2.1创建数据库“网络论坛”网站的后台数据库名为weblt,数据库管理系统版本为SQL Server 2017,数据库中创建了用户表、讨论区表等数据表,详见5.2.2。 5.2.2数据表设计1. 用户(users)表users表用于存储“网络论坛”网站的用户信息,各字段名称及其说明如表51所示。 创建users表的创建语句如下: CREATE TABLE users (表51users表各字段名称及其说明字 段 名数据类型(宽度)说明uidVARCHAR(16)主键,用户名pwdVARCHAR(16)密码,不允许空lbVARCHAR(2)用户类别,user_lb表外键nicknameVARCHAR(20)昵称realnameVARCHAR(20)真实姓名sexVARCHAR(2)性别picVARCHAR(20)用户头像,要求只能用jpg格式jfINT用户积分telVARCHAR(11)联系电话emailVARCHAR(50)电子邮箱zxBIT是否在线,0代表不在线,1代表在线IPVARCHAR(50)登录的IP地址login_timeDATETIME登录时间last_timeDATETIME上次登录时间btimeDATETIME用户注册时间uid VARCHAR(16) PRIMARY KEY, pwd VARCHAR(16) NOT NULL, lb VARCHAR(2) NOT NULL default 1, nickname VARCHAR(20) default '待定', realname VARCHAR(20) default '待定', sex CHAR(2) default '男', pic VARCHAR(20) default 'default.jpg', jf INT DEFAULT 20, tel VARCHAR(11) default '待定', email VARCHAR(50) default '待定', zx BIT DEFAULT 1, IP VARCHAR(50), login_time DATETIME default GETDATE(), last_time DATETIME default GETDATE(), btime DATETIME DEFAULT GETDATE() )2. 用户表类别(user_lb)表 user_lb表用于存储“网络论坛”网站用户的类别信息,各字段名称及其说明如表52所示。表52user_lb表各字段名称及其说明字 段 名数据类型(宽度)说明lbVARCHAR(2)主键,类别编号lbnameVARCHAR(10)类别名user_lb表的创建语句如下: CREATE TABLE user_lb ( lb VARCHAR(2) PRIMARY KEY, lbm VARCHAR(10) )图52user_lb表中记录 user_lb表中记录如图52所示。 3. 讨论区(domain)表 domain表用于存储“网络论坛”网站中讨论区的信息,各字段名称及其说明如表53所示。表53domain表各字段名称及其说明字 段 名数据类型(宽度)说明idINT讨论区编号,主键nameVARCHAR(40)讨论区名称(唯一键,不允许重复)descripNVARCHAR(200)讨论区描述uidVARCHAR(16)讨论区版主,users表的外键btimeDATETIME讨论区创建时间picVARCHAR(15)讨论区主题图片Domain表的创建语句如下:CREATE TABLE domain ( id INT IDENTITY(1,1) PRIMARY KEY, name VARCHAR(40) unique, descrip NVARCHAR(200), uid VARCHAR(16), btime DATETIME DEFAULT GETDATE(), pic VARCHAR(10) default 'default.jpg' )4. 讨论区留言(ly)表 ly表用于存储“网络论坛”网站留言的信息,各字段名称及其说明如表54所示。表54ly表各字段名称及其说明字 段 名数据类型(宽度)说明idINT留言编号ly_contentNVARCHAR(800)留言内容uidVARCHAR(16)留言者, users表外键domainidINT所属讨论区,domain表外键btimeDATETIME留言发布时间listcountINT被浏览次数postcountINT被回复次数ly表的创建语句如下: CREATE TABLE ly ( id INT IDENTITY(1,1) PRIMARY KEY, ly_content NVARCHAR(800), uid VARCHAR(16) NOT NULL, domainid INT NOT NULL, btime DATETIME DEFAULT GETDATE(), listcount INT DEFAULT 0, postcount INT DEFAULT 0 )5. 留言回复(lypost)表 lypost表用于存储“网络论坛”网站留言的回复信息,各字段名称及其说明如表55所示。表55lypost表各字段名称及其说明字 段 名数据类型(宽度)说明idINT回复留言编号post_contentNVARCHAR(800)回复内容uidVARCHAR(16)回复者,users表外键lyidINT所回复留言编号,ly表外键btimeDATETIME回复时间lypost表的创建语句如下: CREATE TABLE lypost ( id INT IDENTITY(1,1), post_content NVARCHAR(800), uid VARCHAR(16) NOT NULL, lyid INT NOT NULL, btime DATETIME DEFAULT GETDATE() )6. 版主申请(domain_apply)表 domain_apply表用于存储“网络论坛”网站讨论区的版主申请信息,各字段名称及其说明如表56所示。表56domain_apply表各字段名称及其说明字 段 名数据类型(宽度)说明idINT申请编号domainidINT申请版块,domain表外键uidVARCHAR(16)申请者, users表外键summaryNVARCHAR(800)个人简介btimeDATETIME申请时间flagCHAR(1)是否审核通过,0表示未审核,1表示审核通过,2表示审核未通过domain_apply表的创建语句如下: CREATE TABLE domain_apply ( id INT IDENTITY(1,1) PRIMARY KEY, domainid INT, uid VARCHAR(16), summary NVARCHAR(800), btime DATETIME, flag CHAR(1) DEFAULT 0 )7. 私信(message)表 message表用于存储用户之间私下交流的数据,各字段名称及其说明如表57所示。表57message表各字段名称及其说明字 段 名数据类型(宽度)说明idINT私信编号titleNVARCHAR(30)私信标题,不超过30字contentNVARCHAR(200)私信内容,不超过200字senderVARCHAR(16)私信发送者,users表外键touserVARCHAR(16)私信接收者,users表外键isreadBIT是否已读,0表示未读btimeDATETIME发送时间message表的创建语句如下: CREATE TABLE message ( id INT IDENTITY(1,1) PRIMARY KEY, title NVARCHAR(30), content NVARCHAR(200), sender VARCHAR(16) NOT NULL, touser VARCHAR(16) NOT NULL, isread BIT DEFAULT 0, btime DATETIME DEFAULT GETDATE() )5.2.3数据关系图 数据表间的主要关系如图53所示,部分数据表涉及嵌套引用而无法实现,可使用触发器实现完整性功能。 图53数据表间的主要关系 5.2.4视图设计1. 显示留言细节视图lydetail视图lydetail用于查询用户留言的详细信息,创建视图的TSQL语句如下:CREATE VIEW lydetail AS SELECT id lyid,ly_content ,nickname ,ly.uid ,domainid,ly .btime lydate,lbm,jf,IP,pic FROM ly,users,user_lb WHERE ly .uid =users .uid AND user_lb .lb =users.lb2. 显示回复留言的细节视图postdetail 视图postdetail用于查询留言回复的详细信息,创建视图的TSQL语句如下:CREATE VIEW postdetail AS SELECT ly .id lyid,lypost .id postid,post_content , lypost .uid postuser,lbm,jf,ip,lypost.btime postdate,pic FROM ly,lypost, users,user_lb WHERE ly .id=lypost .lyid AND users.uid =lypost .uid AND users.lb=user_lb .lb3. 显示私信细节视图messagedetail 视图messagedetail用于查询私信的基本信息,创建视图的TSQL语句如下:CREATE VIEW messagedetail AS SELECT message.id, message.title, message.\[content\], message.sender, message.touser, message.isread, message.btime FROM users INNER JOIN message ON users.uid = message.sender5.2.5存储过程设计1. 用户登录存储过程UserLogin将用户登录的实时数据更新到数据表,创建存储过程的TSQL语句如下,论坛规定每天登录赠送5积分。CREATE PROCEDURE UserLogin @uid VARCHAR(16),@userip VARCHAR(50)--两个参数 AS DECLARE @last DATETIME--定义局部变量@last --将当前用户的上次登录时间赋值给局部变量 SELECT @last =(SELECT last_time FROM users WHERE uid =@uid) --更新当前用户的登录时间、上次登录时间、登录IP、在线状态信息 UPDATE users SET login_time =GETDATE(),last_time =login_time,ip=@userip,zx=1 WHERE uid =@uid if(DATEDIFF(day,@last,GETDATE())>0)--如果当前登录时间和上次登录时间的天数不同 UPDATE users SET jf=jf+5 WHERE uid =@uid--当前用户积分加52. 添加留言存储过程Add_ly 将留言内容添加到留言表,创建存储过程的TSQL语句如下:CREATE PROC Add_ly @ly_content NVARCHAR(800),@uid VARCHAR(16),@domainid INT--三个参数 AS INSERT ly(ly_content,uid,domainid) VALUES (@ly_content,@uid ,@domainid )3. 回复留言存储过程Add_lypost 将回复内容添加到留言回复表,并更新留言的回复量值,创建存储过程的TSQL语句如下:CREATE PROC Add_lypost @post_content NVARCHAR(800), @uid VARCHAR(16),@lyid INT AS --将回复内容添加到lypost表 INSERT lypost(post_content,uid,lyid) VALUES (@post_content,@uid ,@lyid ) --ly表中的回复量加1 UPDATE ly SET postcount= postcount+1 WHERE id=@lyid4. 获取最新注册的15位用户的存储过程Get_NewUsers 创建存储过程的TSQL语句如下:CREATE PROC Get_NewUsers AS SELECT TOP 15 uid,nickname,convert(char,btime,5) regtimeFROM users ORDER BY btime desc5. 获取积分最高的15位用户的存储过程Get_MaxJfUsers 创建存储过程的TSQL语句如下:CREATE PROC Get_MaxJfUsers AS SELECT TOP 15 uid,nickname,jf,convert(char,btime,5) regtime FROM users ORDER BY jf DESC5.2.6触发器过程设计 使用触发器完成数据表间的完整性设计。 1. 删除用户的触发器tr_users 该触发器的作用是“当删除users表中的记录时,相应地删除其他表中的对应记录”,创建触发器的TSQL语句如下: CREATE TRIGGER tr_users ON users FOR DELETE AS DELETE ly WHERE uid=(SELECT uid FROM deleted)--删除留言表中对应记录 DELETE lypost WHERE uid=(SELECT uid FROM deleted)--删除留言回复表中对应记录 DELETE domain_apply WHERE uid=(SELECT uid FROM deleted)--删除版主申请表中对应记录 --删除消息表中的对应记录 DELETE message where sender=(SELECT uid FROM deleted) or touser=(SELECT uid FROM deleted) --将所负责的讨论区版主清空 UPDATE domain SET uid='' WHERE uid=(SELECT uid FROM deleted)2. 删除讨论区的触发器tr_domain 该触发器的作用是“当删除domain表中的记录时,将ly表、domain_apply表中的对应记录删除”, 创建触发器的TSQL语句如下: CREATE TRIGGER tr_domain ON domain FOR DELETE AS --删除留言表中该讨论区对应的所有留言 DELETE ly WHERE domainid=(SELECT id FROM deleted) --删除版主申请表中对应的记录 DELETE domain_apply WHERE domainid=(SELECT id FROM deleted)3. 删除留言的触发器tr_ly 该触发器的作用是“当删除ly表中的记录时,将lypost表中的对应记录删除”,创建触发器的TSQL语句如下: CREATE TRIGGER tr_ly ON ly FOR DELETE