y2-net2使用技术开发网上书店_第1页
y2-net2使用技术开发网上书店_第2页
y2-net2使用技术开发网上书店_第3页
y2-net2使用技术开发网上书店_第4页
y2-net2使用技术开发网上书店_第5页
已阅读5页,还剩56页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

项目案例:博客系统

第十五章训练的技能点三层架构的搭建和编写创建母版页和站点导航根据母版页创建内容页使用验证控件和脚本对用户输入的数据进行验证使用GridView和DataList显示数据实现数据库分页功能配置文件的使用网站的发布任务描述系统概述实现单人版博客系统用户分类一个默认的管理员,此管理员就是博主会员需要登录匿名用户系统角色程序员、博主、会员、匿名用户任务描述用例图演示示例:博客系统问题分析1:整体开发思路系统开发步骤明确需求设计数据库搭建三层架构编码顺序登录注册配置博客信息发表文章编辑文章显示文章发表评论显示评论首页测试问题分析2:界面交互设计界面交互设计的原则统一性原则界面风格统一:

用相同方式展现相同类型的数据,如:日期类型交互风格统一:

用相同方式完成相同类型的操作,如:录入日期美观性原则界面美观大方易用性原则操作方式自然、易理解演示示例:博客系统静态原型问题分析3:技术框架设计技术框架中需要考虑的问题如何分层,每层的职责层之间的引用关系如何实现数据分页、处理异常命名规范如何完成数据CURD操作,访问Session演示示例:博客系统的三层架构必须登录才能查看文章吗?任何访问博客的浏览者都能发表和管理文章吗?博主发表评论时,是否要记录评论人信息?匿名用户可以完成哪些操作?难点分析1:业务理解难点分析2:数据库设计用户应包含的内容为:用户编号、登录名、登录密码、姓名、地址、联系电话、Mail、性别、用户角色博客类别应包含的内容为:类别编号、类别名称、类别描述博客应包含的内容为:博客编号、标题、子标题、皮肤(外观)、头像图片、博客拥有者文章应包含的内容为:文章编号、标题、概要、内容、创建时间、修改时间、类别、是否发布、是否允许评论、点击次数文章评论应包含的内容为:评论人、评论时间、评论内容、IP地址表之间存在什么关系?难点分析3:使用三层架构开发分层编码,牢记步骤步步为营:Codealittle,debugalittle熟能生巧善于总结并分享经验记录常见错误互相分享开发计划用例1:登录[35分钟]用例2:注册[25分钟]用例3:配置博客信息[35分钟]用例4:发表文章[45分钟]用例5:编辑文章[25分钟]用例6:显示文章[25分钟]用例7:发表评论[45分钟]用例8:显示评论[25分钟]用例9:首页[50分钟]用例1:登录需求说明用户输入用户名和密码,系统检测用户的存在性如果存在,则转入首页;如果不存在,则提示错误信息用例1:登录思路分析搭建系统的三层架构添加层之间的引用编写各层中实现用户登录且验证的代码测试难点提示登录SQL语句可以使用存储过程或参数化SQL登录成功后,用Session存储用户名和密码

完成时间:35分钟用例1:登录功能测试正确搭建三层架构,添加相关层的引用正确验证用户登录信息能够防止SQL语句注入登录后能够正确显示用户的信息代码审查审查三层架构实现登录的代码互相测试完成的程序功能测试出的缺陷记录在“常见问题列表中”修正缺陷后返测通过,才认为用例开发完成单元测试用例1:登录参考代码表示层的后置代码Useruser;UserManagermanager=newUserManager();if(manager.LogIn(this.txtLoginId.Text,this.txtLoginPwd.Text,outuser)){Session["CurrentUser"]=user;System.Web.Security.FormsAuthentication.SetAuthCookie(user.LoginId,false);

if(Request.QueryString["ReturnUrl"]!=null){Response.Redirect(Request.QueryString["ReturnUrl"].ToString());}Response.Redirect("default.aspx");}else{Page.RegisterClientScriptBlock("alert","<script>alert('用户名或密码不正确,请重新填写!')</script>");}调用业务逻辑层Login()方法在Cookie中,写入身份票据调用JavaScript代码用例1:登录参考代码业务逻辑层的代码publicboolLogIn(stringloginId,stringloginPwd,outUservalidUser){Useruser=newUserService().GetUser(loginId);if(user==null){validUser=null;

returnfalse;}if(user.LoginPwd==loginPwd){validUser=user;returntrue;}else{validUser=null;

returnfalse;}}调用数据访问层GetUser()方法用户名不存在密码错误用例1:登录参考代码数据访问层的代码publicUserGetUser(stringloginId){stringsql="SELECT*FROMUsersWHERELoginId=@LoginId";using(SqlDataReaderreader=SqlHelper.ExecuteReader(this.connection,CommandType.Text,sql,newSqlParameter("@LoginId",loginId))){if(reader.Read()){Useruser=newUser();user.UserId=(int)reader["UserId"];user.LoginId=loginId;user.LoginPwd=(string)reader["LoginPwd"];//……省略登录用户的其他信息returnuser;}else{returnnull;}}}利用SqlParameter对象,防止SQL注入如果找不到登录用户记录,返回null共性问题集中讲解常见调试问题及解决办法代码规范问题共性问题集中讲解用例2:注册需求说明输入如下信息:用户名:要求输入6~18位的字符,其中只能是由英文、数字及下划线组成密码:要求输入6~18位的字符,其中只能是由英文、数字组成确认密码:与上面的密码保持一致性别:选择男或女Email:必须包含@和.字符,且@字符出现在.之前地址手机验证码用例2:注册思路分析编写各层中实现用户注册且验证的代码测试难点提示注册成功之后用户需要登录之后才能使用新用户名要对用户输入的数据进行充分的验证,防止错误数据提交到服务器端完成时间:25分钟用例2:注册功能测试检查点1(25分钟)

正确验证用户输入的注册信息将正确的用户注册信息插入的数据库表中从登录页面正确跳转到注册页面注册成功跳转到首页;否则提示错误信息互相测试完成的程序功能测试出的缺陷记录在“常见问题列表中”修正缺陷后返测通过,才认为用例开发完成单元测试用例2:注册参考代码表示层后置代码——检验验证码protectedvoidPage_Load(objectsender,EventArgse){if(!IsPostBack){this.snCode.Create();}}protectedboolCheckCode(){if(this.snCode.CheckSN(this.txtCode.Text.Trim())){returntrue;}else{this.snCode.Create();returnfalse;}}用例2:注册参考代码表示层后置代码——用户注册protectedvoidbtnSubmit_Click(objectsender,ImageClickEventArgse){//……省略检验验证码的代码Useruser=newUser();//……省略获取页面用户注册信息的代码UserManagermanager=newUserManager();if(!manager.Register(user)){Page.RegisterClientScriptBlock("alert","<script>alert('注册失败,可能用户名已使用,请重新输入!')</script>");}else{Page.RegisterClientScriptBlock("alert","<script>alert('用户注册成功!');window.location='default.aspx'</script>");}}调用业务逻辑层Register()方法,实现用户注册功能用例2:注册参考代码业务逻辑层代码publicboolRegister(Useruser){UserServicesev=newUserService();if(sev.IsUserExist(user.LoginId))

returnfalse;returnnewUserService().AddUser(user);}调用数据访问层IsUserExist()方法,如果返回值为true,则表示该用户已注册调用数据访问层AddUser()方法,将用户注册信息增加到数据库表中用例2:注册参考代码数据访问层代码publicboolIsUserExist(stringloginId){stringsql="SELECTCOUNT(0)FROMUsersWHERELoginId=@LoginId";returnConvert.ToInt32(SqlHelper.ExecuteScalar(this.connection,CommandType.Text,sql,newSqlParameter("@LoginId",loginId)))>0;}共性问题集中讲解常见调试问题及解决办法代码规范问题共性问题集中讲解用例3:配置博客信息

需求说明用户登录博客系统后,才能执行本功能可修改的内容:博客名称、博客描述、我的头像上传自己的头像图片格式只支持jpg、bmp格式,图片大小在100KB以内头像保存到Web服务器指定的文件夹,数据库只存入图片的链接数据验证博客信息显示在博客首页用例3:配置博客信息

思路分析编写各层中实现配置博客信息的代码表示层的后置代码中,根据User实体类成员UserRole,设置在页面导航条中隐藏“配置博客信息”项测试难点提示表示层通过Visible属性控制导航条中显示的菜单项调用Guid.NewGuid()方法全球唯一标识符,并以此为图片文件命名通过FileUpload控件的PostedFile.ContentLength属性判断上传图片文件是否大于100K利用HttpContext.Current.Server.MapPath()方法将头像保存到Web服务器指定的文件夹下完成时间:35分钟用例3:配置博客信息

功能测试检查点1(35分钟)

正确修改博客的配置信息按照要求正确上传头像图片文件,并保存到服务器端指定的文件夹下及时将更新后的博客信息显示在博客首页中互相测试完成的程序功能测试出的缺陷记录在“常见问题列表中”修正缺陷后返测通过,才认为用例开发完成单元测试用例3:配置博客信息

参考代码表示层后置代码——上传头像图片文件stringfileName=fup.FileName;if(fileName.Trim().Trim().Length!=0){if(fup.PostedFile.ContentLength<1024*100){inti=fileName.LastIndexOf('.');stringsuffix=fileName.Substring(i);stringnewFileName=Guid.NewGuid().ToString()+suffix;stringstrpath=HttpContext.Current.Server.MapPath(path+newFileName);fup.PostedFile.SaveAs(strpath);

returnnewFileName;}else{return"文件大于100K";}}获得全球唯一标识符设置图片保存的路径共性问题集中讲解常见调试问题及解决办法代码规范问题共性问题集中讲解用例4:发表文章

需求说明用户需要输入文章中的以下信息标题、摘要、内容、选择文章类型、设置是否允许发表评论对用户输入的数据进行验证标题如果为空,自动补全为当前系统日期文章类型用户可以选择而不用输入将文章信息添加到数据库只有博主能够发表文章难点提示使用FCKeditor在线编辑控件完成编辑功能完成时间:45分钟用例4:发表文章

功能测试检查点1(35分钟)

正确发表文章正确实现用户输入数据的验证将文章信息添加到数据库互相测试完成的程序功能测试出的缺陷记录在“常见问题列表中”修正缺陷后返测通过,才认为用例开发完成单元测试用例4:发表文章

参考代码表示层后置代码PostManagermanager=newPostManager();Postpost=newPost();//……省略获得用户输入的文章信息的代码Categorycate=newCategory();cate.CategoryId=Convert.ToInt32(this.rblCategories.SelectedValue);Useruser=Session["CurrentUser"]asUser;post.Category=cate;post.User=user;post.DateCreated=DateTime.Now;if(manager.AddPost(post))Page.RegisterClientScriptBlock("alert","<script>alert('发表文章成功!')</script>");获得文章类型编号设置外键对象调用业务逻辑层AddPost()方法共性问题集中讲解常见调试问题及解决办法代码规范问题共性问题集中讲解用例5:编辑文章

需求说明用户需要输入修改文章的信息有标题、摘要、内容、类型对用户输入的数据进行验证标题如果为空,自动补全为当前系统日期文章类型用户可以选择而不用输入获取用户输入的修改数据,更新到数据库中不能编辑别人发表的文章编辑完成后更新文章列表将文章信息更新到数据库只有博主能够编辑文章思路分析在发表文章的页面上增加编辑文章的代码完成时间:25分钟用例5:编辑文章

功能测试检查点1(35分钟)

正确完成修改文章的操作正确实现用户输入数据的验证将更新后的文章信息写入数据库的表中互相测试完成的程序功能测试出的缺陷记录在“常见问题列表中”修正缺陷后返测通过,才认为用例开发完成单元测试用例5:编辑文章

参考代码表示层后置代码if(Request.QueryString["postId"]!=null){intpostId=Convert.ToInt32(Request.QueryString["postId"]);post.PostId=postId;post.DateModified=DateTime.Now;if(manager.UpdatePost(post))Page.RegisterClientScriptBlock("alert","<script>alert('更新文章成功!')</script>");}调用业务逻辑层UpdatePost()方法如果文章编号不为null,执行更新操作共性问题集中讲解常见调试问题及解决办法代码规范问题共性问题集中讲解用例6:显示文章列表

需求说明显示最新发表的10篇文章按列表的方式显示标题、类型、评论数、阅读数分页显示文章提供“上一页”、“下一页”的翻页功能思路分析声明一个成员变量用来保存每页显示的文章数,并初始化为10调用存储过程实现分页显示功能完成时间:25分钟文章标题文章的评论数、阅读数、类型、分页显示文章用例6:显示文章列表

功能测试检查点1(25分钟)

正确实现分页显示文章的操作代码审查审查SQLServer中实现分页显示文章的操作互相测试完成的程序功能测试出的缺陷记录在“常见问题列表中”修正缺陷后返测通过,才认为用例开发完成单元测试用例6:显示文章列表

参考代码数据分页存储过程代码ALTERproc[dbo].[sp_QueryPosts]@pageSizeINT,--页大小@CurrentPageIndexINT--当前页索引ASDECLARE@TotalCountINT--总记录数

DECLARE@PageCountINT--总页数

SELECT@TotalCount=COUNT(0)FROMPosts

IF(@TotalCount%@PageSize<>0)

SET@PageCount=@TotalCount/@PageSize+1

ELSE

SET@PageCount=@TotalCount/@PageSize

IF(@CurrentPageIndex<=@PageCount)

BEGIN

SELECTTOP(@pageSize)*FROMPosts

WHEREPostIdNOTIN(

SELECTTOP(@PageSize*(@CurrentPageIndex-1))PostId

FROMPostsORDERBYDateModifiedDESC)

ORDERBYDateModifiedDESC

END按文章更新时间降序排序计算总页数

共性问题集中讲解常见调试问题及解决办法代码规范问题共性问题集中讲解用例7:发表评论

需求说明在文章详细信息页中提供发表评论的功能,将评论显示到文章下面可以匿名评论,也可以登录评论

匿名评论时,匿名用户可设置统一的用户编号如果登录评论,直接登录后获得用户信息并将评论添加到评论表发表评论后,该篇文章的评论数加1显示文章详细内容

发表评论用例7:发表评论

需求说明在用例6完成的显示文章列表的基础上,从每一篇文章下方的超链接将选定的文章编号传递到文章详细信息页,具体要求是:点击“评论”超链接,直接定位到文章详细信息页的发表评论部分点击“阅读”超链接,直接定位到文章开始部分可以对评论内容进行限制:如评论不可少于多少字,评论内容中不能有色情暴力信息等为保证评论的完整性,要求在数据库的评论表中存入评论用户的IP地址、用户ID思路分析调用字符串的方法实现下面功能判断评论的字数不少于5个字检测其所包含的文字,如:混蛋。如果包含指定的文字,则页面显示提示信息,且不发表评论用例7:发表评论

思路分析文章详细信息页面分为上下两部分,其中:上半部分显示指定的文章下半部分则是发表评论的部分从显示文章列表页面成功跳转到文章详细信息页面时,利用<a>的name属性到达页面中指定的位置提示可以对评论内容进行限制:如评论不可少于多少字,评论内容中不能有色情暴力信息等为保证评论的完整性,要求在数据库的评论表中存入评论用户的IP地址、用户ID评论完成及时更新文章列表完成时间:45分钟用例7:发表评论

功能测试检查点1(45分钟)

正确显示指定文章的详细内容正确接收用户输入的评论内容,并验证正确将验证后的评论信息增加到数据库表中从显示文章列表正确跳转到文章详细信息页面互相测试完成的程序功能测试出的缺陷记录在“常见问题列表中”修正缺陷后返测通过,才认为用例开发完成单元测试用例7:发表评论

参考代码表示层publicstringFormatUser(objectoUser){if(oUser!=null)return(oUserasUser).Name;return"匿名用户";}判断发表评论用户的类型

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论