AddedBy, AddedDate
public List<NewsletterDetails> GetNewsletters( string param)
{SqlConnection con = new SqlConnection(connectionString);cmd = new SqlCommand("tbh_Newsletters_GetNewsletters", con);.CommandType = CommandType.StoredProcedure;.Parameters.Add("@param", SqlDbType.NVarChar).Value = "%"+param+"%";
// Создать коллекцию для всех записей
List<NewsletterDetails> newsletter = new List<NewsletterDetails>();
{con.Open();reader = cmd.ExecuteReader();(reader.Read())
{NewsletterDetails newslet = new NewsletterDetails(Convert.ToInt32(reader["NewsletterID"]), Convert.ToDateTime(reader["AddedDate"]), Convert.ToString(reader["AddedBy"]), Convert.ToString(reader["Subject"]), Convert.ToString(reader["HtmlBody"]), Convert.ToBoolean(reader["NewsletterSend"]));.Add(newslet);}.Close();newsletter;}(SqlException err)
{throw new ApplicationException("Ошибка данных");}
finally
{con.Close();}
}
// получить последние 3 новости
{SqlConnection con = new SqlConnection(connectionString);cmd = new SqlCommand("tbh_Newsletters_GetNewsletters3", con);.CommandType = CommandType.StoredProcedure;
// Создать коллекцию для всех записей
List<NewsletterDetails> newsletter = new List<NewsletterDetails>();
{con.Open();reader = cmd.ExecuteReader();(reader.Read())
{NewsletterDetails newslet = new NewsletterDetails(Convert.ToInt32(reader["NewsletterID"]), Convert.ToDateTime(reader["AddedDate"]), Convert.ToString(reader["AddedBy"]), Convert.ToString(reader["Subject"]), Convert.ToString(reader["HtmlBody"]), Convert.ToBoolean(reader["NewsletterSend"]));.Add(newslet);}.Close();newsletter;}(SqlException err)
{throw new ApplicationException("Ошибка данных");}
finally
{con.Close();}
}
// новость отослана подписчикам
public void UpdateNewsletterSend( int id)
{SqlConnection cn = new SqlConnection(connectionString);cmd = new SqlCommand("tbh_Newsletters_UpdateNewsletterSend", cn);.CommandType = CommandType.StoredProcedure;.Parameters.Add("@NewsletterID", SqlDbType.Int).Value = id;
{cn.Open();.ExecuteNonQuery();
}
{cn.Close();}}
// обновить новость
public void UpdateNewsletter(string Subject, string HtmlBody, int id)
{if (Subject == null) { Subject = ""; }(HtmlBody == null) { HtmlBody = ""; }cn = new SqlConnection(connectionString);cmd = new SqlCommand("tbh_Newsletters_UpdateNewsletter", cn);.CommandType = CommandType.StoredProcedure;.Parameters.Add("@Subject", SqlDbType.NVarChar).Value = Subject;.Parameters.Add("@HtmlBody", SqlDbType.NText).Value = HtmlBody;.Parameters.Add("@NewsletterID", SqlDbType.Int).Value = id;
{cn.Open();.ExecuteNonQuery();}
{cn.Close();}}
//удалить новость
public void DeleteNewsletter(int id)
{{con = new SqlConnection(connectionString);cmd = new SqlCommand("tbh_Newsletters_DeleteNewsletter", con);.CommandType = CommandType.StoredProcedure;.Parameters.Add(new SqlParameter("@NewsletterID", SqlDbType.Int));.Parameters["@NewsletterID"].Value = id;
{con.Open();.ExecuteNonQuery();}
{con.Close();
}}}}}
2.4 Страница сайта, отображающая информацию с базы данных Newsletters.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Newsletters.aspx.cs" Inherits="MB.AppliedMathematics.UI.Newsletters" %>
// MainContent расположен на мастер странице
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="Server">
//Подключаем Ajax элементы
<asp:ScriptManager ID="ScriptManager1" runat="server" AsyncPostBackTimeout="86400">
</asp:ScriptManager>
// На событии таймара Timer1_Tick происходит отправка новостей подписчикам
<asp:Timer ID="Timer1" runat="server" Enabled="False" Interval="1" OnTick="Timer1_Tick">
</asp:Timer>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" />
</Triggers>
<ContentTemplate>
<table border="0" width="100%">
<tr>
<td align="left">
<div>
Новости</div>
</td>
// Поиск по новостям
<td width="285px" align="right" valign="top">
<asp:Label ID="Label1" runat="server" Text="Поиск..."></asp:Label>
<asp:TextBox ID="TextBoxSearch" runat="server"></asp:TextBox><asp:ImageButton ID=" ImageButtonSearch "="server" ImageUrl="~/Images/search.png" OnClick=" ImageButtonSearch _Click" />
</td>
</tr>
</table>
<asp:Label ID="Label3" runat="server" Text="Количество записей:"></asp:Label>
<asp:Label ID="LabelCount" runat="server" ForeColor="#CC6600" Font-Bold="true"></asp:Label>
// Панель с ссылкой на добавление новости, видна только администраторам и редакторам
<asp:Panel runat="server" ID="panAdd" Visible="false" Direction="RightToLeft" Enabled="True">
<div id="Div1">
<asp:HyperLink ID="AddNews" Visible="false" runat="server" NavigateUrl="~/Admin/AddEditNewsletters.aspx">Добавить новость</asp:HyperLink>
</div>
</asp:Panel>
//Панель с визуализацией состояния отправки новостей на е-mail
<asp:Panel ID="PanelSendEmail" runat="server" Visible="False">
<table width="100%" border="0">
<tr>
<td align="left">
<asp:Label runat="server" ID="Label2" Text="Количество адресатов:" />
<asp:Label ID="LabelCountAddress" runat="server" ForeColor="#CC6600" Font-Bold="true"></asp:Label>
</td>
</tr>
<tr>
<td align="left">
<asp:Label ID="LabelLetterSendL" runat="server" Text="Количество успешно отправленных: "="False"></asp:Label>
<asp:Label ID="LabelLetterSend" runat="server" ForeColor="#CC6600" Text=""></asp:Label>
</td>
</tr>
<tr>
<td align="left">
<asp:Label ID="LabelLetterNoSendL" runat="server" Text="Количество не оправленных:"="False"></asp:Label>
<asp:Label ID="LabelLetterNoSend" runat="server" ForeColor="#CC6600" Text=""></asp:Label>
</td>
</tr>
</table>
<asp:Panel ID="PanelAnim" runat="server" Visible="false">
<asp:Label ID="Label14" runat="server" Text="Подождите. Идет отправка писем...Обработано"></asp:Label>
 
<asp:Label ID="LabelSendCurrent" runat="server" Text="0"></asp:Label>
 
<asp:Label ID="Label15" runat="server" Text="писем." SkinID="LabelIUD"></asp:Label>
<asp:Image ID="Image1" runat="server" Width="40px" ImageUrl="~/Images/ClockAnim.gif" />
</asp:Panel>
<asp:Button ID="ButtonOK" runat="server" Text="Ok" Visible="false" OnClick="ButtonOK_Click" />
</asp:Panel>
<br />
//подключение к объекту с данными
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"="GetNewsletters"="MB.AppliedMathematics.DAL.SqlClient.SQLNewsletterProvider">
<SelectParameters>
<asp:Parameter DefaultValue="" Name="param" Type="String" />
</SelectParameters>
</asp:ObjectDataSource>
<div align="center">
//отображение новостей в ListView
<asp:ListView ID="ListView1" runat="server" DataSourceID="ObjectDataSource1"="2" onitemcommand="ListView1_ItemCommand" >
<LayoutTemplate>
<table runat="server" width="100%">
<tr runat="server">
<td runat="server">
<table ID="groupPlaceholderContainer" runat="server" border="0"="10" style="font-family: Verdana, Arial, Helvetica, sans-serif;" width="100%">
<tr ID="groupPlaceholder" runat="server">
</tr>
</table>
</td>
</tr>
<tr runat="server">
<td runat="server"="text-align: center; font-family: Verdana, Arial, Helvetica, sans-serif;color: #333333;" >
</td>
</tr>
</table>
</LayoutTemplate>
<EmptyItemTemplate>
<td runat="server" />
</EmptyItemTemplate>
<GroupTemplate>
<tr ID="itemPlaceholderContainer" runat="server">
<td ID="itemPlaceholder" runat="server">
</td>
</tr>
</GroupTemplate>
<EmptyDataTemplate>
<table runat="server">
<tr>
<td>
Таких новостей не найдено.</td>
</tr>
</table>
</EmptyDataTemplate>
<ItemTemplate>
<td runat="server" >
<a ID='<%# Eval("ID") %>'></a>
<div>
<asp:Literal ID="lblAddedDate" runat="server"='<%# Eval("AddedDate", "{0:D}") %>' />
<asp:Literal ID="lblTitle" runat="server" Text='<%# Eval("Subject") %>' />
<div ID="Div2" runat="server">
Добавлено
<asp:Literal ID="lblAddedBy" runat="server" Text='<%# Eval("AddedBy") %>' />
</div>
</div>
<div>
<asp:Literal ID="lblBody" runat="server" Text='<%# Eval("HtmlBody") %>' />
<br />
//панель редактирования новости видна только администраторам и редакторам
<asp:Panel ID="panEdit" runat="server" HorizontalAlign="Right"="<%# UserCanEdit %>">
<asp:Label ID="LabelNewsletter" runat="server"='<%#Eval("NewsletterSend") %>' Visible="false"></asp:Label>
<asp:Image ID="ImageNewsletter" runat="server" />
<asp:ImageButton ID="ImageSendNewsletter" runat="server"='<%# Eval("ID") %>' CommandName="Send"="~/Images/SendNews.png"="if (confirm('Разослать новость по подписке?') == false) return false;"
ToolTip="Разослать новость по подписке" />
<asp:HyperLink ID="lnkEdit" runat="server" ImageUrl="~/Images/Edit.gif"='<%# "~/Admin/AddEditNewsletters.aspx?ID=" + Eval("ID") %>'="Изменить новость" />
<asp:ImageButton ID="btnDelete" runat="server" AlternateText="Удаление новости"='<%# Eval("ID") %>' CommandName="Del"="~/Images/Delete.gif"="if (confirm('Вы действительно хотите удалить эту новость?') == false) return false;"="Удалить" />
</asp:Panel>
</div>
</td>
</ItemTemplate>
</asp:ListView>
<br />
//компонент DataPager для перелистывания страниц с новостями
<asp:DataPager ID="DataPager1" runat="server" PagedControlID="ListView1"="10" QueryStringField="page">
<Fields>
<asp:NextPreviousPagerField ButtonType="Button" FirstPageText="В начало"="В конец" NextPageText="Далее" PreviousPageText="Назад"="True" ShowLastPageButton="True" />
</Fields>
</asp:DataPager>
</div>
<br />
</ContentTemplate>
</asp:UpdatePanel>
</asp:Content>
2.5 Страница сайта, отображающая информацию с базы данных Newsletters.cs
using System;System.Data;System.Configuration;System.Collections;System.Web;System.Web.Security;System.Web.UI;System.Web.Profile;System.Web.UI.WebControls;System.Web.UI.WebControls.WebParts;System.Web.UI.HtmlControls;System.Data.SqlClient;MB.AppliedMathematics.DAL.Details;MB.AppliedMathematics.DAL.SqlClient;System.IO;System.Net.Mail;System.Net;System.Text;System.Net.Mime;System.Web.Configuration;System.Net.Configuration;System.Collections.Generic;MB.AppliedMathematics.UI
{partial class Newsletters : BasePage
{bool _userCanEdit = false;bool UserCanEdit
{{ return _userCanEdit; }{ _userCanEdit = value; }
}void Page_Init(object sender, EventArgs e)
{= (this.User.Identity.IsAuthenticated &&
(this.User.IsInRole("Administrators") || this.User.IsInRole("Editors")));
}void Page_Load(object sender, EventArgs e)
{
// панели для редактирования новости видны только администраторам и редакторам
if (!this.IsPostBack)
{ if (this.User.Identity.IsAuthenticated &&
(this.User.IsInRole("Administrators") || this.User.IsInRole("Editors")))
{ panAdd.Visible = true;.Visible = true; }(TextBoxSearch.Text); }();
}
// показываем в виде картинки состояние новости, разослана она или нет подписчикам
protected void ImageSendGreed()
{ for (int i = 0; i < ListView1.Items.Count; i++)
{ Image ImageNewsletter = (Image)ListView1.Items[i].FindControl("ImageNewsletter");LabelNewsletter = (Label)ListView1.Items[i].FindControl("LabelNewsletter");(LabelNewsletter.Text == "False")
{ImageNewsletter.ToolTip = "Новость еще не разослана";.ImageUrl = "~/Images/Envelope.png";}
{ImageNewsletter.ToolTip = "Новость разослана";.ImageUrl = "~/Images/OpenEnvelope.png";}
} }
// формируем DataSet с именами и e-mail подписчиков
protected DataSet Addresset()
{Address = new DataSet();.Tables.Add("Table");.Tables["Table"].Columns.Add("User");.Tables["Table"].Columns.Add("eMail");allUsers = Membership.GetAllUsers();(MembershipUser user in allUsers)
{ProfileCommon profile = new ProfileCommon();= Profile.GetProfile(user.UserName);(profile.Preferences.Newsletter == "Да")
{DataRow dr = Address.Tables["Table"].NewRow();["User"] = user.UserName;["eMail"] = user.Email;.Tables["Table"].Rows.Add(dr);
}}
return Address;
}
// процедура отправки письма с новостью
protected int SendMail(string user, string email, string subject, string bodyText)
{try
{Configuration config = WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath);settings = (MailSettingsSectionGroup)config.GetSectionGroup("system.net/mailSettings");Smtp = new SmtpClient(settings.Smtp.Network.Host, settings.Smtp.Network.Port);.Credentials = new NetworkCredential(settings.Smtp.From, settings.Smtp.Network.Password);
// оправляем сообщение
MailMessage msg = new MailMessage();.IsBodyHtml = false;.From = new MailAddress(settings.Smtp.From);.To.Add(new MailAddress(email, ""));.IsBodyHtml = true;.Subject = string.Format(Globals.Settings.ContactForm.MailSubject, subject);body = "Здравствуйте " + user + "!"+"\n";= body + bodyText;.Body = body;.Send(msg);1;
}(Exception ex)
{ return 0; }
}
// отправка писем происходит в событии таймера
protected void Timer1_Tick(object sender, EventArgs e)
{DataSet Addres = (DataSet)Application["Address"];index = (int)Application["index"];zap = (NewsletterDetails)Application["Newsletter"];(index < Addres.Tables[0].Rows.Count)
{DataRow dr = Addres.Tables[0].Rows[index];.Text = (index + 1).ToString();["LetterSend"] = (int)Application["LetterSend"] + SendMail(dr["User"].ToString(), dr["eMail"].ToString(), "Новости", "\n"+"Тема новости: "+zap.Subject+"\n"+zap.HtmlBody);["index"] = (int)Application["index"] + 1;
}
{SQLNewsletterProvider MyDb = new SQLNewsletterProvider();.UpdateNewsletterSend(zap.ID);.Enabled = false;LetterSend = (int)Application["LetterSend"];LetterNoSend = Addres.Tables[0].Rows.Count - LetterSend;.Visible = true;.Visible = true;.Text = LetterSend.ToString();.Text = LetterNoSend.ToString();.Visible = false;.Visible = true;(TextBoxSearch.Text);();
}}void clear()
{LabelLetterSendL.Visible = false;.Visible = false;.Text = "";.Text = "";.Text = "0"; }void ButtonOK_Click(object sender, EventArgs e)
{PanelSendEmail.Visible = false;}
//кнопка поиска
protected void ImageButtonSearch_Click(object sender, ImageClickEventArgs e)
{Data(TextBoxSearch.Text);}
//заполнение данными ListView с новостями
protected void Data(string param)
{SQLNewsletterProvider myDB = new SQLNewsletterProvider();<NewsletterDetails> zaps = new List<NewsletterDetails>();= myDB.GetNewsletters(param);.SelectParameters["param"] = new Parameter("param", TypeCode.String, TextBoxSearch.Text);.DataBind();.Text = zaps.Count.ToString();.Text = "";
}
// команды в записях ListView
protected void ListView1_ItemCommand(object sender, ListViewCommandEventArgs e)
{ if (e.CommandName == "Send")
{();MyDb = new SQLNewsletterProvider();zap = new NewsletterDetails();id = Convert.ToInt32(e.CommandArgument.ToString());= MyDb.GetNewsletterByID(id);["Newsletter"] = zap;Address = new DataSet();= Addresset();["Address"] = Address;["index"] = 0;["LetterSend"] = 0;["LetternoSend"] = 0;.Text = Address.Tables["Table"].Rows.Count.ToString();.Visible = true;.Enabled = true;.Visible = true;
}(e.CommandName == "Del")
{MyDb = new SQLNewsletterProvider();.DeleteNewsletter(Convert.ToInt32(e.CommandArgument.ToString()));(TextBoxSearch.Text);();
}}}}
2.6 Страница добавления (изменения) информации из базы данных AddEditNewsletters.cs
namespace MB.AppliedMathematics.UI.Admin
{partial class AddEditNewsletters : BasePage
{int id = 0;bool isNewNewsLetter = false;bool isEditingNewsletter = false;connectionString = WebConfigurationManager.ConnectionStrings["LocalSqlServerConnection"].ConnectionString;sqlNewsletterProvider = new SQLNewsletterProvider();void Page_Load(object sender, EventArgs e)
{
// если страница была загружена в первый раз, то
if (!this.IsPostBack)
{= 0;((!string.IsNullOrEmpty(this.Request.QueryString["ID"])))
{= int.Parse(this.Request.QueryString["ID"]);
}
//определяем, будем добавлять, или изменять новость
isNewNewsLetter = (id == 0 || id == null);= (id != 0);.BasePath = this.BaseUrl + "FCKeditor/";
// если новость изменяем, то
if (isEditingNewsletter)
{
// загружаем новость по ее идентификатору
NewsletterDetails newslet = sqlNewsletterProvider.GetNewsletterByID(id);
lblEditNews.Visible = true;.Visible = false;.Text = "Обновить";.Text = newslet.Subject;.Value = newslet.HtmlBody;
}
// если новость будет добавляться, то
else if (isNewNewsLetter)
{.Visible = true;.Visible = false;.Text = "Добавить";
} } }
// процедура кнопки на изменении (добавлении) новости
protected void btnSubmit_Click1(object sender, EventArgs e)
{if (btnSubmit.Text == "Обновить")
{= int.Parse(this.Request.QueryString["ID"]);body = txtBody.Value;.UpdateNewsletter(txtTitle.Text, body, id);.Visible = false;.Text = " Ваша новость успешно изменена!";.Visible = true;
}
{DateTime AddedDate = DateTime.Now;AddedBy = this.User.Identity.Name;.InsertNewsletter(AddedDate, AddedBy, txtTitle.Text, txtBody.Value);.Visible = false;.Text = " Ваша новость успешно добавлена!";.Visible = true;
} }void ButtonCanсel_Click(object sender, EventArgs e)
{
Response.Redirect("~/Newsletters.aspx");
} }}
Заключение
Разработанный сайт отвечает всем требованиям, которые необходимы для сайта с подобным содержанием. В нем представлена информация о:
общей информацией о кафедре; научной работе кафедры; истории кафедры; членах кафедры, которые могут подразделяться на сотрудников (преподавателей, лаборантов), студентов, аспирантов и магистрантов;
чтением лекций по дисциплинам или проведением практических и семинарских занятий сотрудниками, курсовых и дипломных работ студентов с их научными руководителями;
магистерских диссертаций магистрантов с их научными руководителями;
кандидатских диссертаций аспирантов с их научными руководителями;
публикациях членов кафедры;
дисциплинах кафедры, с выложенными по ним документами; документах кафедры.
Также разработаны для сайта модули: форумов, статей, голосования и новостей. Новости могут отправляться на e-mail подписчика.
В web-приложении используется каркас Membership API, который предоставляет полный набор готовых функций для управления пользователями. С помощью его и специально разработанных элементов управления происходит регистрация новых пользователей. При этом у администраторов есть возможность извлечь подробную информацию о каждом их них, редактировать их профиль, добавить им роль.
В случае утраты пользователем пароля, последний будет выслан ему на e-mail.
Для облегчения перемещения информации в базу данных и обратно созданы специальные классы, которые представляют все поля из таблиц базы данных в виде открытых свойств. Также разработаны служебные классы, выполняющие операции над данными в базе. Эти классы используют как хранимые процедуры, так и запросы SQL. Они инкапсулирует весь код доступа к данным и специфичные для конкретной базы детали.
Разработанное web- приложение является удобным в использовании, как обычным пользователям, так и администраторам.
На большинстве страниц сайта, там, где необходимо, предусмотрен частично-поисковый поиск, с помощью которого можно быстро найти необходимую информацию по данным расположенным на странице.
Также на страницах используются элементы Ajax (ScriptManager, UpdatePanel), которые позволяют выполнить частичное обновление страницы, избавляя её от «моргания».
Web-приложение предоставляет возможность просмотреть на одной странице всю информацию о выбранном сотруднике. А именно: его биографию, дисциплины, которые он читает, публикации, у каких студентов, магистрантов и аспирантов по каким работам, является научным руководителям. Также у выбранного студента можно посмотреть его курсовые, дипломные работы и его публикации. Аналогично и у магистрантов, аспирантов.
Кроме этого предусмотрены страницы с поиском со всеми:
·публикациями сотрудников, студентов, магистрантов и аспирантов;
·курсовыми, дипломными работами студентов;
·научными работами магистрантов и аспирантов;
·преподавательской деятельности сотрудников.
По выбранной дисциплине можно скачать предоставленные по ней документы. Кроме этого эти же документы и общие документы кафедры можно найти на одноименной странице.
Разработана консоль администрирования с защитой от несанкционированного доступа для удобного изменения данных, добавления или удаления. Также администратор может отредактировать необходимые данные с любой станицы web-приложения, перейдя по ссылкам видимым только ему.
Были разработаны и пользовательские элементы управления необходимые для работы web-приложения, его визуализации.
Также были созданы несколько тем дизайна сайта, с возможностью добавления новых.
Список использованных источников
1.Беллиньясо М. Разработка Web-приложений в среде ASP.NET 2.0: задача-проект-решение/ М. Беллиньясо. - пер. с англ. - Москва-Санкт-Петербург-Киев:- ООО «И.Д. Вильямс», 2007. - 640с.
2.Мак-Дональд М. Microsoft ASP.NET 2.0 с примерами на C# 2005 для профессионалов/ М. Мак-Дональд, М. Шпушта. - пер. с англ. - Москва-Санкт-Петербург-Киев:- ООО «И.Д. Вильямс», 2006. - 1408с.
.Сеппа Д. Microsoft ADO.NET/ Д. Сеппа. - Москва: «И.Д. Русская Редакция», 2003. - 640с
.Сеппа Д. Программирование на Microsoft ADO.NET 2.0. Мастер-класс/ Д. Сеппа. - Москва: «И.Д. Русская Редакция», 2007. -784с
.Пауэрс Л. Microsoft Visual Studio 2008 / Л. Пауэрс, М.Снелл. - пер. с англ. - Санкт-Петербург: «БХВ-Петербург», 2009.-1200
6.Библиотека MSDN (по-русски) [Электронный ресурс]. - 1999. - Режим доступа: <http://msdn.microsoft.com/ru-ru/library/>.
7.DotSite [Электронный ресурс]. - 2000. - Режим доступа <http://www.dotsite.ru/Publications/Publication1.aspx>.
8.Microsoft TechNet [Электронный ресурс]. - 2012. - Режим доступа <http://technet.microsoft.com/ru-ru/library/cc775831.aspx>.
.Википедия [Электронный ресурс]. - 2001. - Режим доступа <http://ru.wikipedia.org/wiki/Microsoft_Visual_Studio>.
.Википедия [Электронный ресурс]. - 2001. - Режим доступа <http://ru.wikipedia.org/wiki/C_Sharp>.