2012年度课程设计---新闻发布系统(小结)
-----Presented By muximuxi@Achilles
Tips:因本课程设计大部分代码皆有本人短时间仓促码成,界面恶心,代码丑陋.唯一优点便是: 全部代码都已贴上,并且全部都已注释.另外与Asp.net教程结合恰当,通俗易懂,容易上手.
需求
新闻发布系统需求III
NewsPublish(简称NP)
功能说明
本项目用于对新闻发布进行管理。
1、查看新闻
所有新闻按时间按降序排列;
用户登录后在自己主页可以查看自己当前所发布的所有新闻,在系统首页可以查看系统中所有的新闻;
游客可以查看当前系统所发布的所有新闻。
2、发布新闻
用户登录后,通过填写表单,添加附件或者不添加附件,指定接收人进行新闻发布;
接收人可以为联系人中的某几个人或所有人,其中所有人包括游客。表单见表一。
NewsPublish(简称NP)
功能说明
本项目用于对新闻发布进行管理。
1、查看新闻
所有新闻按时间按降序排列;
用户登录后在自己主页可以查看自己当前所发布的所有新闻,在系统首页可以查看系统中所有的新闻;
游客可以查看当前系统所发布的所有新闻。
2、发布新闻
用户登录后,通过填写表单,添加附件或者不添加附件,指定接收人进行新闻发布;
接收人可以为联系人中的某几个人或所有人,其中所有人包括游客。表单见表一。
表一:表单
标题 xxxxxxx
接收人 XXX
发布人 XXX 添加附件 xxx
正文 xxxxxxx
简单需求分析
简单分析:
名词:新闻,用户,主页,表单,附件,接收人,联系人,游客.
抽取名词建立实体类:新闻类(News),用户类(User),附件类(FileService),联系人类(Contact),添加了联系人的新闻类(NewsHaveSetContact)(为了不改变原来的代码,这个类建立应该是很丑陋恶心的,这应该用到设计模式的,这里主要为了展示三层架构就不从设计模式展开,-)_(-)
名词:新闻,用户,主页,表单,附件,接收人,联系人,游客.
抽取名词建立实体类:新闻类(News),用户类(User),附件类(FileService),联系人类(Contact),添加了联系人的新闻类(NewsHaveSetContact)(为了不改变原来的代码,这个类建立应该是很丑陋恶心的,这应该用到设计模式的,这里主要为了展示三层架构就不从设计模式展开,-)_(-)

底层之数据库






项目文件夹部分截图


三层架构代码
Model层
Model层之NewsModel
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace NewsPublish.Model
{
/// <summary>
/// 封装News的字段和属性
/// </summary>
public class NewsModel
{
#region NewsModel构造函数
/// <summary>
/// NewsModel构造函数
/// </summary>
/// <param name="title">新闻标题</param>
/// <param name="date">新闻发布日期</param>
/// <param name="content">新闻内容</param>
/// <param name="newsID">新闻ID(key)</param>
/// <param name="fileID">新闻所含的上传附件ID(or not)</param>
public NewsModel(string title, DateTime date, string content, int newsID,int fileID)
{
this._title = title;
this._date = date;
this._content = content;
this._newsID = newsID;
this._fileID = fileID;
}
/// <summary>
/// 其实建立这个构造函数是为了弥补这个缺陷的:没有绑定用户名;
/// 不过话说是每一个model只是含有这个样例的
/// </summary>
public NewsModel()
{
}
#endregion
#region 设置新闻类的属性
//News标题
private string _title;
//News发布时间
private DateTime _date;
//发布人
private string _userName;
//News内容
private string _content;
//与主键相对应的字段
private int _newsID;
private int _fileID;
#endregion
#region 设置成员属性访问器
public string Title
{
set
{
_title = value;
}
get
{
return _title;
}
}
public DateTime Date
{
set
{
_date = value;
}
get
{
return _date;
}
}
public string UserName
{
set
{
_userName = value;
}
get
{
return _userName;
}
}
public string Content
{
set
{
_content = value;
}
get
{
return _content;
}
}
public int NewsID
{
set
{
_newsID = value;
}
get
{
return _newsID;
}
}
public int FileID
{
set
{
_fileID = value;
}
get
{
return _fileID;
}
}
#endregion
}
}
Model层之UserModel层
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace NewsPublish.Model
{
/// <summary>
/// 封装User的字段和属性
/// </summary>
public class UserModel
{
#region UserModel构造函数
/// <summary>
/// UserModel构造函数
/// </summary>
/// <param name="userID">用户ID</param>
/// <param name="userName">用户名</param>
/// <param name="password">用户密码</param>
public UserModel(string userID, string userName, string password)
{
this._userID = userID;
this._userName = userName;
this._password = password;
}
public UserModel()
{
}
#endregion
#region 定义用户类的属性(注意是private)
private string _userID;
private string _userName;
private string _password;
#endregion
#region 设置成员属性访问器
public string UserID
{
set
{
_userID = value;
}
get
{
return _userID;
}
}
public string Password
{
set
{
_password = value;
}
get
{
return _password;
}
}
public string UserName
{
set
{
_userName = value;
}
get
{
return _userName;
}
}
#endregion
}
}
Model层之FileServiceModel
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace NewsPublish.Model
{
public class FileServiceModel
{
#region NewsModel构造函数
/// <summary>
/// NewsModel构造函数
/// </summary>
/// <param name="fileID">该新闻上传的附件的ID</param>
/// <param name="fileTitle">附件标题</param>
/// <param name="fileContent">附件内容</param>
/// <param name="fileType">附件格式,这是和附件以二进制流的形式存在数据库的内容紧密相关的,不懂度娘去(附件上传数据库)</param>
public FileServiceModel(int fileID,string fileTitle,byte[] fileContent ,string fileType )
{
this._fileID = fileID;
this._fileTitle = fileTitle;
this._fileContent = fileContent;
this._fileType = fileType;
}
public FileServiceModel()
{
}
#endregion
#region 设置新闻类的属性
private int _fileID;
private string _fileTitle;
private byte [] _fileContent;
private string _fileType;
#endregion
#region 设置成员属性访问器
public int FileID
{
set
{
_fileID = value;
}
get
{
return _fileID;
}
}
public string FileTitle
{
set
{
_fileTitle = value;
}
get
{
return _fileTitle;
}
}
public byte[] FileContent
{
set
{
_fileContent = value;
}
get
{
return _fileContent;
}
}
public string FileType
{
set
{
_fileType = value;
}
get
{
return _fileType;
}
}
#endregion
}
}
Model层之ContactModel
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace NewsPublish.Model
{
public class ContactModel
{
#region ContactModel构造函数
/// <summary>
/// ContactModel的构造函数
/// </summary>
/// <param name="contactName">联系人</param>
/// <param name="userName">用户</param>
public ContactModel(string contactName,string userName)
{
this._contactName = contactName;
this._userName = userName;
}
public ContactModel()
{
}
#endregion
#region 设置新闻类的属性
//用户的联系人
private string _contactName = null;
//用户名
private string _userName = null;
#endregion
#region 设置成员属性访问器
public string ContactName
{
set
{
_contactName = value;
}
get
{
return _contactName;
}
}
public string UserName
{
set
{
_userName = value;
}
get
{
return _userName;
}
}
#endregion
}
}
Model层之NewsHaveSetContactModel
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace NewsPublish.Model
{
public class NewsHaveSetContactModel
{
#region NewsHaveSetContactModel构造函数
public NewsHaveSetContactModel(string contactName, int newsID)
{
this._contactName = contactName;
this._newsID = newsID;
}
public NewsHaveSetContactModel()
{
}
#endregion
#region 设置已添加联系人的新闻类成员变量
private string _contactName = "VISITOR";//!!!!
private int _newsID ;
#endregion
#region 设置成员变量访问器
public string ContactName
{
set
{
_contactName = value;
}
get
{
return _contactName;
}
}
public int NewsID
{
set
{
_newsID = value;
}
get
{
return _newsID;
}
}
#endregion
}
}
IDAL层
IDAL层之INewsDAL
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NewsPublish.Model;
namespace NewsPublish.IDAL
{
public interface INewsDAL
{
//建立接口,是为了上一层依赖于这个一层的抽象而不是实现(也就是不必知道具体的方法怎么执行)
//只需要知道传什么参数返回什么东西即可..接口无限强大,什么函数都调用(C#语法书没看,摸黑过来,百度后推测应该是这样)
/// <summary>
/// 得到所有新闻列表,主要用于主页显示
/// </summary>
/// <returns>所有新闻列表</returns>
List<NewsModel> GetAllNewsList();
/// <summary>
/// 根据用户名,得到用户已发布的新闻列表
/// </summary>
/// <param name="userName">用户名</param>
/// <returns>用户已发布的新闻列表</returns>
List<NewsModel> GetUserNewsListByUserName(string userName);
/// <summary>
/// 发布新闻
/// </summary>
/// <param name="title">新闻标题</param>
/// <param name="date">发布新闻系统时间</param>
/// <param name="userName">用户名(新闻,和用户名都有这么一个属性)</param>
/// <param name="content">新闻内容</param>
/// <param name="fileID">新闻附件ID</param>
/// <returns>返回插入的新闻ID,这对后续处理很有帮助,good</returns>
int PublishNews(string title, DateTime date, string userName, string content,int fileID);
/// <summary>
/// 由新闻Id得到具体新闻内容
/// </summary>
/// <param name="newsID">新闻ID</param>
/// <returns>详细新闻</returns>
NewsModel GetDetailNewsByNewsID(int newsID);
}
}
IDAL层之IUserDAL
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NewsPublish.Model;
namespace NewsPublish.IDAL
{
public interface IUserDAL
{
/// <summary>
/// 登录
/// </summary>
/// <param name="userName">用户名</param>
/// <param name="password">密码</param>
/// <returns>登录是否成功</returns>
bool Login(string userName, string password);
/// <summary>
/// 注册
/// </summary>
/// <param name="userName">用户名</param>
/// <param name="password">密码</param>
/// <returns>注册是否成功,只不过用int类型更好的变化://flag=1,2,3 分别为:用户名已存在/注册成功/注册失败</returns>
int Register(string userName, string password);
}
}
IDAL层之IFileServiceDAL
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
namespace NewsPublish.IDAL
{
public interface IFileServiceDAL
{
/// <summary>
/// 上传附件
/// </summary>
/// <param name="fileTitle">附件标题</param>
/// <param name="fileContent">附件内容</param>
/// <param name="fileType">附件格式</param>
/// <returns>返回附件插入数据库的即时ID</returns>
int UpLoadFile(string fileTitle, byte[] fileContent, string fileType);
/// <summary>
/// 通过fileID下载新闻附件
/// </summary>
/// <param name="fileID">附件ID</param>
/// <returns>通过DataTable类型返回文件</returns>
DataTable GetHadUpLoadFileByFileID(int fileID);
/// <summary>
/// 通过newsID获取fileID;
/// </summary>
/// <param name="newsID">新闻ID</param>
/// <returns>附件ID</returns>
int GetFileIDByNewsID(int newsID);
}
}
IDAL层之IContactDAL
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NewsPublish.Model;
namespace NewsPublish.IDAL
{
public interface IContactDAL
{
/// <summary>
/// 通过用户名获取联系人
/// </summary>
/// <param name="userName">用户名</param>
/// <returns>联系人列表</returns>
List<ContactModel> GetMyContactByUserName(string userName);
/// <summary>
/// 根据用户名和联系人添加联系人
/// </summary>
/// <param name="newContact">用户名</param>
/// <returns>添加是否成功</returns>
bool AddContact(string userName, string newContact);
}
}
IDAL层之INewsHaveSetContactDAL
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NewsPublish.Model;
namespace NewsPublish.IDAL
{
public interface INewsHaveSetContactDAL
{
/// <summary>
/// 得到将我加入联系人的新闻的新闻ID列表--------未登录主页+个人中心
/// </summary>
/// <returns>将我加入联系人的新闻的新闻ID列表</returns>
List<NewsHaveSetContactModel> GetNewsIDOfNewsHaveAddMeIntoContact(string contactName);
/// <summary>
/// 根据相应逻辑获取到的新闻ID列表(根据联系人来分) 然后得到相应逻辑的新闻列表
/// </summary>
/// <returns>将我加入联系人的新闻列表</returns>
List<NewsModel> GetNewsListOfNewsHaveAddMeIntoContact(List<NewsHaveSetContactModel> newsIDList);
/// <summary>
/// 得到将游客和我作为接收人的新闻的新闻ID列表---------登录主页
/// 其实一开始我还忘了我本人发布的新闻也放在登录主页呢..囧..
/// </summary>
/// <param name="contactName">作为联系人的名字---"我"</param>
/// <returns>得到将游客,我作为接收人,以及我发布的新闻的ID列表</returns>
List<NewsHaveSetContactModel> GetNewsIDOfVisitorAndMe(string contactName);
/// <summary>
/// 从联系人添加新闻接收人到具体新闻
/// </summary>
/// <param name="newsID">新闻ID</param>
/// <param name="contactName">联系人名字</param>
/// <returns>添加是否成功</returns>
bool AddNewsReceiver(int newsID, string contactName);
}
}
DAL层
DAL层之SQLHelper(这个是作为数据库操作写的辅助类,对减少冗余代码起了不少作用,不过是从老师课题笔记那摘过来的,网上也有一大堆下载)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace NewsPublish.DAL
{
public class SQLHelper
{
string connectionString = ConfigurationManager.ConnectionStrings["conn"].ConnectionString;
/// <summary>
/// 构造函数
/// </summary>
public SQLHelper()
{
}
/// <summary>
/// ExecuteNonQuery操作,对数据库进行 增、删、改 操作((1)
/// </summary>
/// <param name="sql">要执行的SQL语句 </param>
/// <returns> </returns>
public int ExecuteNonQuery(string sql)
{
return ExecuteNonQuery(sql, CommandType.Text, null);
}
/// <summary>
/// ExecuteNonQuery操作,对数据库进行 增、删、改 操作(2)
/// </summary>
/// <param name="sql">要执行的SQL语句 </param>
/// <param name="commandType">要执行的查询类型(存储过程、SQL文本) </param>
/// <returns> </returns>
public int ExecuteNonQuery(string sql, CommandType commandType)
{
return ExecuteNonQuery(sql, commandType, null);
}
/// <summary>
/// ExecuteNonQuery操作,对