项目实战:ASP.NET:C/S架构 大学BBS论坛项目(推荐★★★)
目录
项目实战:ASP.NET:C/S架构 大学BBS论坛项目(推荐★★★)
编辑环境:
win10_x64 /VS2015/ SqlServer2012
项目:
asp.net
项目简介:
这是我写的三个asp.net项目面写的费时间最长, 耗费精力最大,使用MVC三层架构开发,其中在DAO控制层和Servicer业务层开发耗费力气比较大,我觉得其中里面比较重点的知识点有:分页代码查询,多条件查询,多表查询,且有些功能比较重要,登录采用MD5加密,和验证码验证,还有勾选记住我,可以免密码登录在一定日期中,且普通用户具有发帖,评论等功能。版主具有回帖,发帖,删帖,修改个人信息等功能,管理员可以从右下角后台管理进入,登录,对大板块,小板块进行增加,批量删除,普通用户封号,添加还有整体的换肤,等功能。
其他:
写的真的好累,每天都在写, 终于把最近一段时间写的4个项目全部整理了一遍,发了博客,该睡觉了喏
==================================================================
1.项目运行效果
==================================================================
==================================================================
2.项目思路分析:
==================================================================
3.分析与建模
系统业务流程图
4.可行性分析
(1) 法律可行性
该湖北理工学院的BBS论坛系统是为了方便湖北理工学院的大学生进行学习、生活、考研、就业、二手交易、心得体会交流的交流社区网上系统,且规范相关部门工作流程,也可以解决现阶段所大学生一些存在的许多问题,没有违反国家相关法律法规,该项目在法律上是完全可行的。
(2) 技术可行性
湖北理工学院的BBS论坛系统,采用SQL Server数据库作为系统的数据存储容器,其强大的备份恢复机制保证了数据的安全性。同时,还是具有高效的结构化查询语言的支持,让系统可以在庞大的数据中很容易得到所需要的统计与分析。前台采用HTML+CSS+JavaScript+ASP.NET等技术,实现了较为友好的人机交互。目前,该项目所需的技术都已经有对应的产品,因此该项目在技术上是可行的。
(3) 经济可行性
经过有效的成本/效益分析所计算,得到的净现值是正数,说明该项目收益率为正数,有投资的价值。并且使用该湖北理工BBS论坛系统可大大的增加我校理工的大学生在衣食住行学的多个方面的及时沟通,还可以与附近的湖北师范大学的学生一起进行思想上面的沟通,生活上面的便利交流。最为关键的是相当提供了一个有效的信息沟通平台。增加了许多的便利和一些事情的公开与透明。同时大提高学生学习的效率,缩短信息处理周期,也可以教学质量更上一个台阶,。且在还可以在成功运行试水之后,合适的话,到其他的大学进行推广。从而收取部分经济效益。达到回本和盈利的目的。综合以上分析,该系统的开发在经济上是可行的。
(4) 操作可行性
BBS论坛系统是完全根据我校大学生的具体需求量身定制了,在工作流上完全细心周到的服务 。此外,系统的用户交互设计较为友好,功能分明,操作简单,且提供了较为详细的用户简介使用手册和具有良好的新手指导功能。因此,该系统在操作上是可行的。
5.功能需求分析与建模
任何一个软件系统本质上都是信息处理系统,对软件设计有深远影响,因此,必须分析系统的数据要求, 而这里为了把用户的数据要求清楚、准确地描述出来,我通过建立E-R图来进行描述,表示的是系统的E-R图。
6.数据需求分析与建模
任何一个软件系统本质上都是信息处理系统,对软件设计有深远影响,因此,必须分析系统的数据要求,而这里为了把用户的数据要求清楚、准确地描述出来,我通过建立E-R图来进行描述,表示的是系统的E-R图。
7.系统设计
功能结构设计
8.数据库设计
一.实体以及相关的属性
用户表(t_user):
用户编号(唯一,自增长),邮箱,头像,手机号码,网名,密码,注册时间(唯一),性别,真实姓名,身份标识
小板块表(t_section):
小板块编号(唯一,自增长),所属大板块编号,用户编号,小版块名称,小版块标志
大板块表(t_zone):
大板块编号(唯一,自增长),大板块名称,大板块简介
帖子表(t_topic):
帖子编号(唯一,自增长),用户编号,小版块编号,帖子内容,修改帖子时间,第一次发帖时间,帖子标题,帖子点赞数,帖子置顶标记
回帖表(t_reply):
回复帖编号(唯一,自增长),最后回帖时间,回帖时间,回帖内容,回复的帖子标题
实体之间的联系
一个用户可以发表多个帖子(一对多的关系);
一个用户也可以有回复多个回帖(一对多的关系);
一个用户可以是多个小板块的版主(一对多的关系);
一个小板块只能够是属于一个大板块空间的(一对一的关系);
一个大板块空间是可以有多个小板块的(一对多的关系);
一个帖子可以有多个回复的帖子(一对多的关系)
9.物理模型图
一.生成的属性信息等关系
所有的表
序号 | 中文 | 名称 | 代码 | 数据类型 | 说明 |
1 | 回帖 | t_reply | t_reply | 表 |
|
2 | 小板块 | t_section | t_section | 表 |
|
3 | 帖子 | t_topic | t_topic | 表 |
|
4 | 用户 | t_user | t_user | 表 |
|
5 | 大板块 | t_zone | t_zone | 表 |
|
所有表的属性
序号 | 中文 | 名称 | 代码 | 数据类型 | 说明 |
1 | 编号 | id | id | int |
|
2 | 名称 | name | name | Variable characters (100) |
|
3 | 描述 | description | description | Variable characters (200) |
|
4 | 标号 | id | id | int |
|
5 | 邮箱 | | | Variable characters (100) |
|
6 | 头像 | face | face | Variable characters (200) |
|
7 | 手机号 | mobile | mobile | Char(11) |
|
8 | 网名 | nickname | nickname | Variable characters (50) |
|
9 | 密码 | password | password | Char (20) |
|
10 | 注册时间 | regtime | regtime | Data&Time |
|
11 | 性别 | sex | sex | Char(2) |
|
12 | 真实姓名 | truename | truename | Char(20) |
|
13 | 身份类型 | type | type | Char(4) |
|
14 | 编号 | id | id | int |
|
15 | 大板块编号 | t_z_id | t_z_id | int |
|
16 | 用户编号 | t_u_id | t_u_id | int |
|
17 | 名称 | name | name | Char(50) |
|
18 | 标志图片 | logo | logo | Char(20) |
|
19 | 编号 | id | id | int |
|
20 | 用户编号 | t_u_id | t_u_id | int |
|
21 | 大板块编号 | t_s_id | t_s_id | int |
|
22 | 内容 | content | content | Variable characters (1000) |
|
23 | 修改时间 | modifytime | modifytime | Data&Time |
|
24 | 回复时间 | publishtime | publishtime | Data&Time |
|
25 | 标题 | title | title | Variable characters (100) |
|
26 | 点赞数 | good | good | Char(4) |
|
27 | 置顶标记 | top | top | Char(4) |
|
28 | 编号 | id | id | int |
|
29 | 帖子编号 | t_t_id | t_t_id | int |
|
30 | 用户编号 | t_u_id | t_u_id | int |
|
31 | 最后回复时间 | modifytime | modifytime | Data&Time |
|
32 | 恢复时间 | publishtime | publishtime | Data&Time |
|
33 | 内容 | content | content | Variable characters (100) |
|
34 | 标题 | title | title | Variable characters (1000) |
|
==================================================================
10.项目主要源码部分:
==================================================================
//登录页面,是由三部分组成的
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="WebApplication.Index" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>论坛首页</title>
<link href="/bootstrap/css/bootstrap.css" rel="stylesheet" />
<link href="/bootstrap/css/bootstrap-responsive.css" rel="stylesheet" />
<script src="/bootstrap/js/jquery.js"></script>
<script src="/bootstrap/js/bootstrap.min.js"></script>
<script src="/bootstrap/js/bootstrap.js"></script>
</head>
<body>
<div id="header" class="wrap" style="width: 1200px; margin: 0 auto;">
<% Server.Execute("/common/Top.aspx"); %>
</div>
<div id="content" style="width: 1200px; margin: 0 auto;">
<% Server.Execute("/common/Default.aspx"); %>
</div>
<div id="footer" style="width: 1200px; margin: 0 auto;">
<% Server.Execute("/common/Footer.aspx"); %>
</div>
</body>
</html>
//后台处理程序
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 List<Zone> zoneList { set; get; }
public List<Section> 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("<h1>"+zone.name+ "</h1><br>");
// foreach (Section section in sectionList)
// {
// if(zone.id == section.t_z_id)
// {
// Response.Write(section.name + "<br>");
// }
// }
//}
}
}
}
//TopicService.cs
//***********************************************
//置顶帖子
//通过板块id(外键id)进行数据查询
//获得回帖数, 最后回帖人和回帖时间, 普通帖子的发帖人
//***********************************************
public ArrayList FindStickTopic(int sectionId)
{
DataSet dataSet = dal.GetList("t_s_id='" + sectionId + "' and [top] = '1'");
//将ds对象 转换 成List集合
List<Topic> ZdTopicList = DataTableToList(dataSet.Tables[0]);
//保存每个贴子的回复作者与回复时间
Dictionary<int, Reply> topicLastReply = new Dictionary<int, Reply>();
//保存每个贴子的回复数
Dictionary<int, int> topicReplyCount = new Dictionary<int, int>();
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<Topic> topicList = DataTableToList(dataSet.Tables[0]); //将里面数据进行转化为List<Topic>类型 //只收了第一页的数据
//创建一个,使用键值对的方式
//获取每一个帖子的 回复数
Dictionary<int, int> topicReplyCount = new Dictionary<int, int>();
//获取每一个帖子的 最后回复(人和时间)
Dictionary<int, Reply> topiclastReply = new Dictionary<int, Reply>();
//查询普通贴子
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)
{
//开启事务
//查询出此主题下的所有板块对象
List<Section> sectionList = sectionService.GetModelList("t_z_id='" + zoneId + "'");
foreach (Section section in sectionList)
{
List<Topic> 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<Zone> findAllZone(int pageNumber)
{
DataSet ds = this.GetListByPage("", "", (pageNumber - 1) * 5 + 1, pageNumber * pageCount);
List<Zone> zoneList = this.DataTableToList(ds.Tables[0]);
return zoneList; ;
}
//查询所以主题信息时也将此主题下相应的板块信息查询出来
public List<Zone> GetZoneSectionList()
{
DataSet ds = dal.GetList("");
List<Zone> zoneList = this.DataTableToList(ds.Tables[0]);
//注意:下面代码就是重点
foreach (Zone zone in zoneList)
{
DataSet ds2 = sectionDao.GetList("t_z_id = '" + zone.id + "'");
List<Section> sectionList = sectionService.DataTableToList(ds2.Tables[0]);
zone.sectionList = sectionList;
}
return zoneList;
}
//RepyService.cs
/// <summary>
/// 通过主帖的id和页码, 查询回复帖子人的相关信息, 和分页(链接)代码
/// </summary>
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 集合转换为列表集合
List<Reply> replyList = 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;
}
==================================================================
11.源码下载:
==================================================================
=================更新时间2019-03==================
源码下载:
ASP.NET:C/S架构 大学BBS论坛项目
==================================================================
12.项目视频演示:
==================================================================
https://www.bilibili.com/video/av45528410