Главная Случайная страница


Категории:

ДомЗдоровьеЗоологияИнформатикаИскусствоИскусствоКомпьютерыКулинарияМаркетингМатематикаМедицинаМенеджментОбразованиеПедагогикаПитомцыПрограммированиеПроизводствоПромышленностьПсихологияРазноеРелигияСоциологияСпортСтатистикаТранспортФизикаФилософияФинансыХимияХоббиЭкологияЭкономикаЭлектроника






Элементы управления группы Login

Мы уже создавали формы регистрации. Это было только упражнение, так как элементы управления этой группы могут брать на себя регистрацию и авторизацию пользователей, восстановления пароля и другие функции, взаимодействуя при этом с системой Membership и Roles. Группа Login находится в панели инструментов.

Элемент управления LoginName позволяет показать имя пользователя:

Заходите еще, <asp:LoginName ID="FCLoginName" Runat="server" />

Отображаемый текст можно форматировать с помощью FormatString:

<asp:LoginName ID="HelloLoginName" Runat="server" FormatString="Hello, {0}" />.</p>

LoginStatus — это умный элемент управления. Если пользователь не аутентифицирован, отображается гиперссылка Login на страницу входа на сайт. Если пользователь авторизован, это ImageButton с командой Logout. Если ее нажать, то пользователь выходит из системы. Текст ссылок можно менять в свойствах LoginText и LogoutText или использовать изображения:

<asp:LoginStatus ID="LoginStatus1" runat="server"

LoginText="Вход" LogoutText="Выход" />

<asp:LoginStatus ID="LoginStatus2" runat="server"

LogoutAction="Redirect" LogoutPageUrl="~/Default.aspx"

LoginImageUrl="~/Images/arrow_next.gif"

LogoutImageUrl="Images/arrow_prev.gif" />

Нажатие на ссылку Logout в этом случае перенаправит пользователя на страницу Default.aspx.

Элемент управления LoginView состоит из двух шаблонов: AnonymousTemplate и LoggedInTemplate. Который из них используется для отображения, зависит от того, просматривает ли страницу анонимный пользователь или авторизованный.

СreateUserWizard позволяет создавать пользователей, используя службу Membership. Естественно, в нем происходит валидация введенных данных. Например, длина пароля должна быть не меньше 7 знаков и в нем должен присутствовать хотя бы один символ — не буква и не цифра. Обязательно заполнение контрольного вопроса и ответа, по которым можно будет восстановить пароль, если он забыт, или изменить пароль

Персонализация

Многие сайты собирают информацию о пользователях, чтобы подстроить показ информации под их личные вкусы. Часто для этого используют файлы-cookie, объекты приложения и сессии.

В ASP .NET 2.0 появились новые удобные способы хранить пользовательскую информацию. Это функция персонализации. Механизм персонализации позволяет установить прямую связь между пользователем и всеми данными, относящимися к нему. При этом его настройки хранятся не в файлах-cookie на компьютере пользователя, которые он может стереть, а на сервере. Их можно поместить в любое хранилище данных.

Модель персонализации проста и расширяема.

В файле web.config содержится информация о том, какие данные о пользователе необходимо хранить. Она записывается в секции <configuration><system.web> перед секцией authentication:

<profile>

<properties>

<add name="FirstName" />

<add name="LastName" />

<add name="LastVisited" />

<add name="Age" />

<add name="Member" />

</properties>

</profile>

Профиль персонализации может хранить данные об авторизированном пользователе, но может обслуживать и анонимного пользователя. По умолчанию анонимная персонализация выключена. Чтобы ее включить, нужно в файле web.config создать запись

<anonymousIdentification enabled="true" />

(также в секции <system.web>).

Когда анонимная персонализация включена, ASP .NET хранит уникальный идентификатор для каждого анонимного пользователя. Он посылается вместе с любым запросом. Идентификатор хранится в файле-cookie пользователя, а дополнительные данные, которые удалось собрать о его предпочтениях, — на сервере. По умолчанию имя файла-cookie — .ASPXANONYMOUS. Его можно поменять с помощью атрибута cookieName элемента anonymousIdentification:

<anonymousIdentification enabled="true" cookieName=".intuit"/>

Время хранения файла-cookie в минутах определяется атрибутом cookieTimeout.

По умолчанию оно равно 100 000 минутам (69,4 дня).

От использования cookie можно отказаться, например, написав

cookieless="UseUri"

В таком случае идентификатор передается через строку URL:

cookieless="AutoDetect"

В этом случае определяются настройки пользователя. Если возможность хранить cookie выключена, используется строка URL.

Анонимный идентификатор по своей сути представляет собой GUID (32-байтное число, алгоритм генерации которого гарантирует глобальную уникальность). Свойство AnonymousId объекта Request страницы позволяет получить к нему доступ.

Для того чтобы определить, какие данные можно хранить для анонимного пользователя, в элемент add name определяют атрибут allowAnonymous:

<add name="LastVisited" allowAnonymous="true"/>

Пример использование компонентов Login , UserWizard

для авторизации пользователей (Toolbox - Login)

       
   
 

 


«LoginStatus»: Cвойства (EnableViewState – True). «Login»: Свойство (CreateUser Text – Create new)


Для Log In :

 

 

public partial class _Default : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

 

}

protected void Login1_LoggedIn(object sender, EventArgs e)

{

bool is_admin = Roles.IsUserInRole(Login1.UserName, "admin");

 

if (is_admin) Response.Redirect("~/admin/admin.aspx");

else Response.Redirect("~/user/user.aspx");

 

}

}

 

На формеRegist/ login.aspxиспользование компонента«UserWizard»:

СвойствоContinueDestinitionPageUrlи FinishDestinitionPageUrl : ~/Default.aspx

 

Для события CreatedUserвыбрать CreateUserWizard1

 

protected void CreateUserWizard1_CreatedUser(object sender, EventArgs e)

{

Roles.AddUserToRole(CreateUserWizard1.UserName, "user");

 

}

Настройка доступа и пользователей: ASP.NET Configuratio:

 

 

 

 

Назначить пользователям роли (Manager users).

Установить права на каталоги:

 

 

Настройка файла Web.config :

Web.config

<connectionStrings/>

<system.web>

 

<roleManager enabled="true" />

<compilation debug="true">

</compilation>

<authentication mode="Forms">

<forms defaultUrl="default.aspx" loginUrl="~/register/login.aspx"></forms>

</authentication>

 

Использование Cookie и Session:

Default.aspx

using System.Web.SessionState;

protected void Button1_Click(object sender, EventArgs e)

{

TextBox1.Text = Session.SessionID;

 

if ((Response.Cookies["myCookie"] == null) ||

(Response.Cookies["myCookie"].Value == null))

{

HttpCookie objCookie = new HttpCookie("myCookie", TextBox2.Text);

//objCookie.Values.Add("value_cookie", "11");

objCookie.Expires = DateTime.Today;

Response.Cookies.Add(objCookie);

}

Label1.Text = Response.Cookies["myCookie"].Value;

 

}

protected void LinkButton1_Click(object sender, EventArgs e)

{Session["myvariable"] = "value1";

Response.Redirect("~/user/user.aspx");

}

 

В др. модуле считать сессию:

 

if (Session["myvariable"] != null)

// { Label1.Text = (string)((ArrayList)Session["myvariable"])[0]; }

{ Label1.Text = (string)(Session["myvariable"]); }

else { Label1.Text = " null"; }

 

Задание на работу

 

1 Рассмотреть возможности технологии ASP.NET для разработки защищенного приложения

2 Выполнить учебный проект (см. пример использования)

3 На основе лабораторной работы 3 разработать структуру приложения для разных групп пользователей (например, admin и user), выделив отдельные папки для каждой роли пользователей.

4 Реализовать работу с БД пользователей для выполнения основных операций добавления, удаления и редактирование в режиме администратора. Использовать все элементы управления из ToolBox раздела “Login”

 


Лабораторная работа №13

 

Работа с БД в ASP.NET

 

Цель работы: изучение среды разработки Visual Studio 2005 и элементов управления для работы с БД. Изучение классов и объектов ADO .NET

 

Теоретические сведения

 

Для хранения данных чаще всего используются СУБД (системы управления базами данных). В ASP .NET 2.0 работа с данными происходит через ADO .NET 2.0 – часть .NET, разработанная специально для доступа к базам данных или XML-файлам.

Веб-проект в Visual Studio 2005 содержит предопределенную папку App_Data. В ней могут храниться файлы с данными, которые используются в приложении. Это могут быть файлы .mdf (MS SQL), .mdb (Microsoft Access), .xml и другие.

Классы ADO .NET объединены в несколько пространств имен.

System.Data — это ядро ADO .NET. Оно содержит классы, необходимые для связи посредством любых провайдеров данных. Эти классы представляют таблицы, строки, столбцы, DataSet (множество взаимосвязанных таблиц). Там определены интерфейсы (в смысле языка C#) соединений с базами данных, команд, адаптеров данных.

System.Data.Common — базовые классы для всех провайдеров данных — DbConnection, DbCommand, DbDataAdapter.

В System.Data.OleDb находятся классы, позволяющие работать с источниками данных OleDb, в том числе с MS SQL версии 6.0 и ниже. Там находятся такие классы, как OleDbConnection, OleDbDataAdapter и OleDbCommand.

System.Data.Odbc содержит классы, которые работают с источниками данных ODBC посредством провайдера .NET ODBC. Классы имеют аналогичные имена с префиксом Odbc.

System.Data.SqlClient. Здесь определен провайдер данных для СУБД SQL Server версии 7.0 и выше. Содержатся классы SqlConnection, SqlTransaction, SqlCommand и другие.

В System.Data.SqlTypes находятся классы, представляющие типы данных СУБД SQL Server.

Схема типичной программы в ADO .NET следующая:

1 Вначале создается соединение с базой данных — класс Connection, который обеспечивается необходимой информацией — строкой соединения.

2 Создается объект Command и задается команда, которую необходимо выполнить в данной СУБД. Эта команда может быть запросом SQL или исполняемой процедурой. Нужно задать параметры этой команды, если они имеются.

3 Если команда не возвращает данных, она просто выполняется с помощью одного из методов Execute. Например, это может быть удаление или обновление данных таблицы.

4 Если команда возвращает выборку данных, их необходимо куда-то поместить. Решите, нужно ли вам получить данные для последующего использования без связи с базой данных или же нужно просто быстро выполнить команду. В первом случае нужно создать класс DataAdapter и с его помощью сохранить данные в DataSet или в DataTable. Во втором случае создается класс DataReader, который требует сохранять соединение на все время работы, хранит выборку только для чтения и позволяет двигаться только вперед. Зато чтение с помощью DataReader выполняется в несколько раз быстрее, чем в DataAdapter.

5 Задать полученный DataSet или DataReader как источник данных элемента управления или вывести их на страницу другим способом.

Задание на работу

 

1 Рассмотреть возможности элементов управления для работы с БД.

2 Выполнить учебный проект (см. файл «пример работы с БД.doc»)

3 Согласно вариантам реализовать работу с объектами предметной области с помощью БД (Документация – см. в файле «asp-net.pdf»). Представить ER-диаграмму (степень связи между сущностями 1:n).

4 Выполнить основные CRUD-операции: добавление, удаление, редактирование, поиск элементов.

 

Перечень объектов для реализации в БД

Вариант Название сущностей
Группы – Студенты
Проект- Списки дел
Вопросы – Ответы
Папки – Файлы
Страна – Туры
Каталог – Продукты
Роли – Пользователи
Пользователи – сообщения
Прайс-лист – Продукты
Команда – Игрок

 


Лабораторная работа №14

 

Оформление дизайна страниц в ASP.NET

 

Цель работы: изучение возможностей технологии ASP.NET при оформлении страниц.

 

Теоретические сведения

 

Шаблоны дизайна — это визуальное наследование страниц, впервые появившееся в ASP .NET 2.0. Вы можете создавать основу для любого количества страниц приложения. Шаблоны позволяют легче создавать и поддерживать приложения. Visual Studio 2005 включает поддержку создания и редактирования шаблонов страниц.

Для простого пользователя отличие одного сайта от другого — в разнообразном дизайне страниц. Большинство web-сайтов сегодня имеют узнаваемый дизайн, который достигается использованием одних и тех же элементов в тех же самых местах в разных страницах сайта. Поэтому дизайн страниц является едва ли менее важным, чем общая функциональность.

Основы Master Pages

С помощью шаблонов страниц вы определяете некоторое общее содержание и помещаете его в страницу с расширением .master. Естественно, таких страниц в приложении может быть несколько. Этот шаблон могут использовать любое количество дочерних страниц, которые, как и обычные страницы, имеют расширение aspx.

В страницу шаблона также включают общие заголовки и нижние колонтитулы.

Это единственный тип страниц, где возможно разместить специальные элементы управления ContentPlaceHolder. Они определяют место, в которое дочерние страницы данного мастера могут помещать свое собственное содержание. Когда ASP .NET получает запрос отобразить дочернюю страницу, она сливает ее код с кодом главной страницы, в результате генерируется HTML, в котором не видно никаких "швов".

Когда дочерняя страница редактируется в среде разработки, на вкладке Design видна полная страница вместе с элементами из шаблона, но они показаны серым цветом. Их редактировать нельзя. Можно редактировать то, что находится в элементах Content.

В диалоге Add New Item выберите тип страницы Master Page. Как и обычные страницы, их можно создавать с отделенным кодом или кодом, встроенным в страницу. Это никак не влияет на модель разделения кода дочерних страниц. Кроме того, главная и дочерняя страницы могут разрабатываться на разных языках.

Первое отличие этой страницы от обычной в том, что она начинается с директивы Master, а не Page. Класс мастер-страницы определен в файле MasterPage.master.cs:

public partial class MasterPage : System.Web.UI.MasterPage

{

protected void Page_Load(object sender, EventArgs e)

{

 

}

}

Класс шаблона — наследник System.Web.UI.MasterPage, который в свою очередь наследует от System.Web.UI.UserControl.

В ней могут находиться любые элементы управления и HTML-код. В ней могут обрабатываться и события страницы. Два элемента ContentPlaceHolder обозначают места, куда вставляется содержание страницы-наследницы.

<%@ Page Language="C#" MasterPageFile="~/MasterPage.master"

AutoEventWireup="true" CodeFile="MainSchool.aspx.cs"

Inherits="MainSchool" Title="Untitled Page" %>

Атрибут MasterPage директивы Page определяет шаблон дизайна, или эталонную страницу данной страницы.

Возможно настроить приложение так, чтобы все страницы наследовали одну страницу шаблона дизайна. В конфигурационном файле в секцию System.web нужно вставить элемент:

<pages masterPageFile="~/ MasterPage.master " />

Но и в этом случае назначение главной страницы в директиве Page имеет приоритет над назначением на уровне приложения. Установка web.config действует на тех страницах, в которых masterPageFile не указан, но определены элементы управления Content. Эта установка не действует на обычные aspx-страницы.

В странице содержания можно переназначить ее главную страницу программно. Для этого нужно присвоить нужное значение свойству Page.MasterPageFile. Шаблон поменяется независимо от того, какой шаблон был назначен в директиве @Page. Но если попробуете проделать это в функциях Page_Load или Page_Init, получите ошибку времени выполнения.

Это свойство можно изменить только во время обработки события Page_PreInit. Событие Page_PreInit — самая ранняя фаза жизненного цикла страницы, к которой можно получить доступ. Во время события Init главная и дочерняя страница уже сливаются в одну, поэтому поздно менять шаблон. По этой причине событие Page_PreInit — единственное, в обработчике которого можно работать с главной страницей отдельно от страницы содержания:

 

protected void Page_PreInit(object sender, EventArgs e)

{

Page.MasterPageFile = "~/MyMasterPage.master";

}

Для того чтобы из страницы содержания обратиться к элементам управления главной страницы, можно воспользоваться функцией FindControl. Непосредственно обратиться к ним нельзя, так как это защищенные члены.

Label mpLabel = (Label) Master.FindControl("masterPageLabel");

if(mpLabel != null)

{

//Set content page title to master page control

Title.Text = mpLabel.Text

}

Страницы шаблона могут иметь методы и свойства. Чтобы можно было обращаться к ним, нужно использовать директиву @MasterType. При этом становится доступен класс страницы шаблона дизайна через строго типизированную ссылку. Атрибут TypeName задает имя типа, а VirtualPath — путь относительно корневого каталога web-приложения к файлу шаблона:

<%@ page language="C#" masterpagefile="~/Site3.master" %>

<%@ mastertype virtualpath="~/Site3.master" %>

Свойства могут быть определены в классе главной страницы:

public String FooterText {

get {

return Footer.Text;

}

set {

Footer.Text = value;

}

}

Таким образом, страница разрешает доступ извне к свойствам своих элементов.

Страница содержания меняет это свойство, а элемент управления AdRotator находит с помощью FindControl:

void Page_Load()

{

Master.FooterText = "This is a custom footer";

AdRotator ad = (AdRotator)Master.FindControl("MyAdRotator");

if (ad != null)

{

ad.BorderColor = System.Drawing.Color.Purple;

ad.BorderWidth = 10;

}

}

Темы и skin (шкурки)

В интерфейсе почтовой службы Rambler дизайн страниц меняется в зависимости от времени года. Пользователь может сам выбрать себе вариант дизайна. Подобной функциональности в ASP .NET можно добиться с помощью тем.

Темы похожи на CSS тем, что тоже позволяют определять внешний вид страниц. Но темы могут сделать гораздо больше них. Таблицы стилей определяются для тегов HTML, а скины, которые входят в тему, — для элементов управления. Скины применяются на стороне сервера, поэтому могут использоваться для установки специфичных свойств серверных контролов. Например, для элемента управления Calendar таким свойством является DayNameFormat. CSS никак не позволяет оперировать такими свойствами.

Темы можно применять к страницам, к сайту или отдельным элементам управления.

Файлы тем находятся в папке с зарезервированным названием App_Themes. Эту папку можно создать, если в контекстном меню проекта выбрать "Add ASP .NET Folder". В папке App_Themes можно создавать темы, например, для разных времен года. У каждой темы будет свой каталог, в котором будут находиться относящиеся к ней файлы. На многих сайтах пользователь может выбрать тему. Вложение тем друг в друга не допускается.

Каждая тема обычно состоит из одного или нескольких файлов скинов с расширением ".skin", а также других, необходимых для задания внешнего вида сайта файлов, таких как файлы каскадных таблиц стилей, картинок, XSL-преобразований и так далее, которые также могут быть упорядочены в поддиректориях корневой директории темы. Файлы скинов и таблиц стилей обычно расположены в корне темы, а картинки — в поддиректории Images.

Темы можно применить к странице с помощью атрибута Theme директивы Page. Тему можно поменять программно. Поэтому можно дать возможность пользователю выбрать тему. Тему можно установить до или во время события PreInit:

protected void Page_PreInit(object sender, EventArgs e) { Page.Theme = "Black"; }

Тему можно применить ко всем страницам приложения, если в файле web.config вставить эту директиву:

<configuration><system.web><pages theme=" Black " /></system.web></configuration>

Если тема установлена в странице, она имеет преимущество перед глобальной темой. Темы страницы переопределяют свойства элементов управления. Если нужно, чтобы темы не применялись к элементу, нужно установить его свойство EnableTheming в False.

Если нужно отменить применение темы к группе элементов, можно поместить их в Panel и установить его свойство EnableTheming в False.

Свойство EnableTheming можно менять и на уровне страницы:

<%@ Page Language="C#" AutoEventWireup="true" EnableTheming="False"%>

Атрибут StylesheetTheme работает так же, как и Theme. Но если тема установлена с помощью этого атрибута, то свойства управления элемента имеют преимущество перед темой страницы.

В файлах тем с расширением .skin хранятся варианты внешнего вида элементов управления. Перевод термина skin на русский язык не устоялся. Можно называть его "шкурка" или "оболочка".

Скин — это шаблон элемента управления с определением набора визуальных свойств, которые будут использоваться для генерации элементов управления данной темы. Скины могут работать вместе с картинками и таблицами стилей. Один ".skin"-файл может хранить множество разных элементов управления. Например, в проекте "Starter Kit" определены две темы — Black и White. В файле Default.skin обеих тем хранятся скины элементов ImageButton, Image, GridView.

Можно создать столько файлов шкурок, сколько необходимо. Для удобства и ясности можно создать файлы скинов для каждого элемента, например, Label.skin, GridView.skin.

Создайте в папке App_Themes тему Summer. Добавьте в тему скин Calendar.skin.

Описание стиля элемента управления похоже на описание на странице, с тем отличием, что атрибут ControlId не указывается. Однако необходимо указать атрибут runat="server":

<asp:Calendar runat="server" BackColor="Honeydew" BorderColor="Teal" BorderWidth="1px" CellPadding="1" DayNameFormat="Shortest" Font-Names="Verdana" Font-Size="8pt" ForeColor="DarkSlateGray" Height="200px" Width="220px"> <SelectedDayStyle BackColor="#009999" Font-Bold="True" ForeColor="#CCFF99" /> <SelectorStyle BackColor="#99CCCC" ForeColor="#336666" /> <WeekendDayStyle BackColor="#C0FFC0" /> <OtherMonthDayStyle ForeColor="#999999" /> <TodayDayStyle BackColor="#99CCCC" ForeColor="White" /> <NextPrevStyle Font-Size="8pt" ForeColor="#CCCCFF" /> <DayHeaderStyle BackColor="#80FF80" ForeColor="#336666" Height="1px" /> <TitleStyle BackColor="Green" BorderColor="#3366CC" BorderWidth="1px" Font-Bold="True" Font-Size="10pt" ForeColor="White" Height="25px" /> </asp:Calendar>

Теперь на всех страницах, где установлена тема Summer, календарь будет выглядеть так:

У описания шкурки может быть описан атрибут SkinId. Скин с установленным атрибутом SkinID называется именованным скином. Этот атрибут при описании каждого типа элемента управления должен быть уникальным. Скин применяется к тем элементам, у которых значение свойства SkinId совпадает со SkinId описания:

<asp:Label Runat="server" SkinId="June" ForeColor="#Teal" Font-Names="Verdana"

Font-Size="X-Small" />

При этом, если у элемента не определен SkinId, применяется скин, в котором SkinId тоже отсутствует (скин по умолчанию). Этот скин для каждого класса может быть описан только один раз.

Задание на работу

 

1 Рассмотреть возможности технологии ASP.NET для оформления приложения

2 Выполнить учебный проект (см. файл «к заданию 5.ppt»)

3 На основе предыдущего задания разработать дизайн оформления сайта приложения. Использовать возможности MasterPage, Theme и skin.

 


СПИСОК РЕКОМЕНДОВАННОЙ ЛИТЕРАТУРЫ

1 Kennard, James. Mastering Joomla! 1.5 Extension and Framework Development. – BIRMINGHAM: Published by Packt Publishing Ltd., 2007 – ISBN:1847192823

2 LeBlanc, Joseph. Learning Joomla! 1.5 Extension Development. – BIRMINGHAM: Published by Packt Publishing Ltd., 2007 – ISBN-10: 1847196209

3 Колисниченко, Д.Н. Joomla 1.5. Руководство пользователя / Д.Н. Колисниченко. – М. : Диалект, 2009. – 210 с. – ISBN 978-5-8459-1509-2

4 Граф, Хаген. Создание web-сайтов с помощью Joomla 1.5!. – Хаген Граф . – М. : Изд. Дом Вильямс, 2008. 294 с. – ISBN 978-5-8459-1506-1

5 Томсон, Лаура. Разработка Web-приложений на PHP и MySQL : пер. с англ. / Лаура Томсон, Люк Веллинг. М. : Диасофт, 2002. – 672 с. - ISBN 978-5-8459-0862-9

6 Ратшиллер, Т. PHP4: Разработка web-приложений. Библиотека программиста. – Т. Ратшиллер, Т. Геркен. – СПб.: Питер, 2001. – 384с.:ил. - ISBN 5-318-00007-Х


Навчальне видання

 

 

WEB-ПРОГРАМУВАННЯ

МЕТОДИЧНІ ВКАЗІВКИ

до лабораторних робіт та самостійної роботи

для студентів очної форми навчання

Спеціальності 6.050101

«Інформаційні технології проектування»

(Російською мовою)

Укладачі Алтухов Олександр Валерійович

Таран Светлана Викторівна

 

 

Редактор

Комп’ютерна верстка О. П. Ордіна

 

168/2007. Підп. до друку . Формат 60 х 84/16.

Папір офсетний. Ум. друк. арк. . Обл.-вид. арк. .

Тираж 50 прим. Зам. №

 

Видавець і виготівник

«Донбаська державна машинобудівна академія»

84313, м. Краматорськ, вул. Шкадінова, 72.

Свідоцтво про внесення суб’єкта видавничої справи до Державного реєстру

серія ДК №1633 від 24.12.03.

 

 

Последнее изменение этой страницы: 2016-07-23

lectmania.ru. Все права принадлежат авторам данных материалов. В случае нарушения авторского права напишите нам сюда...