项目实战:ASP.NET:C/S架构 大学BBS论坛项目
编辑环境:win10_x64 /VS2015/ SqlServer2012
项目:asp.net
项目简介:这是我写的三个asp.net项目面写的费时间最长, 耗费精力最大,使用MVC三层架构开发,其中在DAO控制层和Servicer业务层开发耗费力气比较大,我觉得其中里面比较重点的知识点有:分页代码查询,多条件查询,多表查询,且有些功能比较重要,登录采用MD5加密,和验证码验证,还有勾选记住我,可以免密码登录在一定日期中,且普通用户具有发帖,评论等功能。版主具有回帖,发帖,删帖,修改个人信息等功能,管理员可以从右下角后台管理进入,登录,对大板块,小板块进行增加,批量删除,普通用户封号,添加还有整体的换肤,等功能。
其他:写的真的好累,每天都在写, 终于把最近一段时间写的4个项目全部整理了一遍,发了博客,该睡觉了喏
项目运行效果
==================================================================
==================================================================
项目思路分析:
==================================================================
==================================================================
项目主要源码部分:
==================================================================
//登录页面,是由三部分组成的 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="WebApplication.Index" %><% Server.Execute("/common/Top.aspx"); %><% Server.Execute("/common/Default.aspx"); %><% Server.Execute("/common/Footer.aspx"); %>//后台处理程序 using hua_bbs.BLL; using hua_bbs.Model; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace WebApplication.common { public partial class Default : System.Web.UI.Page { public ListzoneList { set; get; } public List sectionList { set; get; } protected void Page_Load(object sender, EventArgs e) { ZoneService zOneService= new ZoneService(); zOneList= zoneService.GetZoneSectionList(); SectionService sectiOnService= new SectionService(); sectiOnList= sectionService.GetModelList(""); //foreach(Zone zone in zoneList) //{ // Response.Write(" "+zone.name+ "
"); // foreach (Section section in sectionList) // { // if(zone.id == section.t_z_id) // { // Response.Write(section.name + "
"); // } // } //} } } }
//TopicService.cs //*********************************************** //置顶帖子 //通过板块id(外键id)进行数据查询 //获得回帖数, 最后回帖人和回帖时间, 普通帖子的发帖人 //*********************************************** public ArrayList FindStickTopic(int sectionId) { DataSet dataSet = dal.GetList("t_s_id='" + sectionId + "' and [top] = '1'"); //将ds对象 转换 成List集合 ListZdTopicList = DataTableToList(dataSet.Tables[0]); //保存每个贴子的回复作者与回复时间 Dictionary topicLastReply = new Dictionary (); //保存每个贴子的回复数 Dictionary topicReplyCount = new Dictionary (); foreach (Topic topic in ZdTopicList) { //获取(封装)发贴人的用户信息到贴子对象中去 topic._topicUser = userDao.GetModel(topic.t_u_id); //通过主帖id进行查询回复的贴子对象.但是我们只需要最后回复的那一条 dataSet = replyDao.GetList(1, "t_t_id='" + topic.id + "'", "publishtime desc"); if (dataSet.Tables[0].Rows.Count > 0) { Reply reply = replyDao.DataRowToModel(dataSet.Tables[0].Rows[0]);//将查询出来的回贴DataSet转换成Reply对象 ////获取(封装)回帖人的用户信息到回贴对象中去 reply._replyuser = userDao.GetModel(reply.t_u_id); topicLastReply.Add(topic.id, reply);//主贴ID为key , 回贴对象为value //得到此主贴下的回贴数 int count = replyDao.GetRecordCount("t_t_id='" + topic.id + "'"); topicReplyCount.Add(topic.id, count);//主贴ID为key , 回贴数为value } } ArrayList mylist = new ArrayList(); mylist.Add(topicReplyCount);//0下标:回帖数 mylist.Add(topicLastReply);//1下标:回帖作者与回帖时间 mylist.Add(ZdTopicList);//2下标:保存的置顶的主贴 return mylist; } //*********************************************** //普通帖子 //通过板块id(外键id)进行数据查询并且分页, //获得回帖数, 最后回帖人和回帖时间, 普通帖子的发帖人 //*********************************************** public ArrayList FindTopic(int sectionId, int pageNumber) { int pageCount = 4; //一页显示的帖子(普通帖)个数 //通过帖子所属于模块,的主键ID, 查询 发帖者和 所属于 大板块的 信息 Section section = sectionDao.GetModel(sectionId);//通过主键ID查询板块信息 section._user = userDao.GetModel(section.t_u_id); section._zOne= zoneDao.GetModel(section.t_z_id); //查询主贴的记录数 int recordCount = dal.GetRecordCount("t_s_id='" + sectionId + "'and [top]='0'"); int maxPage = 0; if (recordCount % pageCount == 0) { maxPage = recordCount / pageCount; } else { maxPage = recordCount / pageCount + 1; } if (pageNumber > maxPage) { pageNumber = maxPage; } //主贴分页链接 string pageCode = PageUtil.GenPagination("/topic/TopicList.aspx", recordCount, pageNumber, pageCount, "sectiOnId=" + sectionId); //分页查询数据.返回dataset DataSet dataSet = GetListByPage("t_s_id='" + sectionId + "'and [top]='0'", "", (pageNumber-1)*pageCount, pageNumber* pageCount); //分页获得所有符合条件的数据列表 List topicList = DataTableToList(dataSet.Tables[0]); //将里面数据进行转化为List 类型 //只收了第一页的数据 //创建一个,使用键值对的方式 //获取每一个帖子的 回复数 Dictionary topicReplyCount = new Dictionary (); //获取每一个帖子的 最后回复(人和时间) Dictionary topiclastReply = new Dictionary (); //查询普通贴子 foreach(Topic topic in topicList) { //获取(封装)发贴人的用户信息到贴子对象中去 topic._topicUser = userDao.GetModel(topic.t_u_id); //通过主帖id进行查询回复的贴子对象.但是我们只需要最后回复的那一条 dataSet = replyDao.GetList(1, "t_t_id = '" + topic.id + "'", "publishtime desc"); // if (dataSet.Tables[0].Rows.Count > 0) { Reply reply = replyDao.DataRowToModel(dataSet.Tables[0].Rows[0]);//将查询出来的回贴DataSet转换成Reply对象 //获取(封装)回帖人的用户信息到回贴对象中去 reply._replyuser = userDao.GetModel(reply.t_u_id); //*******************reply.t_u_id 回帖人 ??? topiclastReply.Add(topic.id, reply);//主贴ID为key , 回贴对象为value //得到此主贴下的回贴数 int count = replyDao.GetRecordCount("t_t_id='" + topic.id + "'"); topicReplyCount.Add(topic.id, count);//主贴ID为key , 回贴数为value } } ArrayList mylist = new ArrayList(); mylist.Add(topicReplyCount);//0下标:回帖数 mylist.Add(topiclastReply);//1下标:回帖作者与回帖时间 mylist.Add(topicList);//2下标:普通的主贴对象 mylist.Add(pageCode);//3下标:保存分页的连接 mylist.Add(section);//4下标:保存的是板块对象 return mylist; }
//ZoneService.cs //此删除方法会删除主题下的所有板块 与 贴子 与 回贴 public bool mydelete(int zoneId) { //开启事务 //查询出此主题下的所有板块对象 ListsectiOnList= sectionService.GetModelList("t_z_id='" + zoneId + "'"); foreach (Section section in sectionList) { List topicList = topicService.GetModelList("t_s_id='" + section.id + "'"); foreach (Topic topic in topicList) { replyService.DeleteByTid(topic.id);//删除此主贴下的所有回帖 } topicDao.DeleteByTsid(section.id);//删除此板块下的所有主贴 } //删除此主题下的所有板块 sectionDao.DeleteByTzid(zoneId); //删除此主题 return this.Delete(zoneId);//事务 //事务提交 //结束事务 } public List findAllZone(int pageNumber) { DataSet ds = this.GetListByPage("", "", (pageNumber - 1) * 5 + 1, pageNumber * pageCount); List zOneList= this.DataTableToList(ds.Tables[0]); return zoneList; ; } //查询所以主题信息时也将此主题下相应的板块信息查询出来 public List GetZoneSectionList() { DataSet ds = dal.GetList(""); List zOneList= this.DataTableToList(ds.Tables[0]); //注意:下面代码就是重点 foreach (Zone zone in zoneList) { DataSet ds2 = sectionDao.GetList("t_z_id = '" + zone.id + "'"); List sectiOnList= sectionService.DataTableToList(ds2.Tables[0]); zone.sectiOnList= sectionList; } return zoneList; }
//RepyService.cs ////// 通过主帖的id和页码, 查询回复帖子人的相关信息, 和分页(链接)代码 /// public ArrayList FindReplyInfoByTopicId(int topicId, int pageNumber) { //1通过主帖id 查询出 回复帖子id 和 发帖者id 和 回帖者id //2通过这个id得到回帖者详细信息 和 回帖的 int pageCount = 4; Topic topic = topicDao.GetModel(topicId); topic._topicUser = userDao.GetModel(topic.t_u_id); //获得分页显示的代码,DataSet dataSet 看做一个集合(游标)==>得到回帖者的List集合 DataSet dataSet = dal.GetListByPage("t_t_id = '" + topicId + "'", "publishtime asc", (pageNumber - 1) * pageCount + 1, pageNumber * pageCount); //将dataSet 集合转换为列表集合 ListreplyList = DataTableToList(dataSet.Tables[0]); //将回帖人的信息全部封装到reply对象中去 foreach (Reply reply in replyList) { User user = userDao.GetModel(reply.t_u_id); reply._replyuser = user; } //得到总的记录数 int maxRecord = dal.GetRecordCount("t_t_id = '" + topicId + "'"); //生成分页的连接 string pageCode = PageUtil.GenPagination("/topic/TopicDetails.aspx", maxRecord, pageNumber, pageCount, "topicID=" + topicId); Section section = sectionDao.GetModel(topic.t_s_id); ArrayList mylist = new ArrayList(); mylist.Add(topic); //将主贴对象设置到0下标 mylist.Add(replyList); //将回帖的集合设置到1下标 mylist.Add(pageCode); //将分页的连接设置到2下标 mylist.Add(section);//将板块信息设置到3下标 return mylist; }
==================================================================
项目源码:
==================================================================