Интернет-технологии
Обзор технологий создания веб-приложений. Инфологическая модель базы данных. Скрипты создания таблиц. Используемые SQL запросы. Описание сценария приложения. Фреймворк Django в контексте веб-разработки. Система управления реляционными базами данных.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 20.06.2017 |
Размер файла | 3,8 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Оглавление
- ВВЕДЕНИЕ
- 1. ОБЗОР ТЕХНОЛОГИЙ
- 1.1 Обзор технологий создания веб-приложений
- 1.2 Обзор СУБД
- 2. ИСПОЛЬЗУЕМЫЕ ТЕХНОЛОГИИ СЕРВЕРНОЙ ЧАСТИ ВЕБ-ПРИЛОЖЕНИЯ
- 2.1 ASP.Net MVC 5
- 2.2 С#
- 2.3 LINQ
- 2.4 ASP.NET Identity
- 2.5 Entity Framework
- 2.6 Visual Studio 2015
- 2.7 MS SQL Server
- 2.8 IIS
- 3. ОПИСАНИЕ РАБОТЫ ПРИЛОЖЕНИЯ
- 3.1 Инфологическая модель базы данных
- 3.2 Даталогическая модель
- 3.3 Физическая модель данных
- 3.4 Скрипты создания таблиц
- 3.5 Используемые SQL запросы
- 3.6 Описание сценария приложения
- 4. ТЕСТИРОВАНИЕ
- 5. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ
- 5.1 Студент
- 5.2 Преподаватель
- 5.3 Администратор
- 6. РУКОВОДСТВО ПО УСТАНОВКЕ И СОПРОВОЖДЕНИЮ ПО
- ЗАКЛЮЧЕНИЕ
- СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ
ВВЕДЕНИЕ
В этой дипломной работе разрабатывается онлайн дневник студента, в частности его серверная часть. Это веб-приложение, потенциально, будет использоваться в СПбГМТУ.
Интернет и цифровые технологии все увереннее становятся неотъемлемой частью всех сфер жизнедеятельности современного человека. Не стала исключением и система образования, в которой электронные учебники постепенно вытесняют обычные книги, а ноутбуки и планшеты - традиционные тетради. По современным требованиям успеваемость студентов также должна хранится в цифровом виде.
Онлайн дневник несёт в себе некоторые преимущества по сравнению с обычным дневником. Первое это доступ к нему в любое время и в любом месте, если есть доступ в интернет с того или иного устройства. Второе, это автоматическая аналитика успеваемости студентов.
1. ОБЗОР ТЕХНОЛОГИЙ
1.1 Обзор технологий создания веб-приложений
PHP
PHP был создан в 1994 году датским программистом РасмусомЛердорфом и изначально представлял собой набор скриптов на другом языке Perl. Позже этот набор скриптов был переписан в интерпретатор на языке Си. И с самого возникновения PHP (сокращение от PHP: Hypertext Preprocessor - PHP: Препроцессор гипертекста) представлял удобный набор инструментов для упрощенного создания веб-сайтов и веб-приложений.
На сегодняшний день PHP является наиболее распространенным языком веб-программирования. Подавляющие большинство сайтов и веб-сервисов в интернете написано с помощью PHP. По некоторым оценкам PHP применяется более чем на 80% сайтов, среди которых такие сервисы, как facebook.com, vk.com, baidu.com и другие. И такая популярность неудивительна. Простота языка позволяет быстро и легко создавать сайты и порталы различной сложности.
Ruby On Rails
Это полноценный, многоуровневый фреймворк на Ruby для построения веб-приложений, использующих базы данных, который основан на архитектуре Модель-Представление-Контроллер (Model-View-Controller, MVC). Динамичный AJAX-интерфейс, обработка запросов и выдача данных в контроллерах, предметная область, отраженная в базе данных, -- для всего этого Rails предоставляет однородную среду разработки на Ruby. Все, что необходимо для начала -- база данных и веб-сервер.
Python
Универсальный язык программирования, применимый в том числе и в вебе. С технической точки зрения web-приложение на Python -- полноценное приложение, загруженное в память, обладающее своим внутренним состоянием, сохраняемым от запроса к запросу.
В контексте веб-разработки в первую очередь стоит упомянуть фреймворк Django.
Django - это высокоуровневый питоновский Web-фреймворк, который реализован на основе архитектуры MVC. Django имеет прозрачный дизайн, дает возможность для оперативной разработки Web-приложений, позволяет разрабатывать динамические Web-сайты.
Отличительные особенности Django:
- любой запрос обрабатывается программно и перенаправляется на свой адрес(url);
- разделение контента и представления с помощью шаблонов;
- абстрагирование от низкого уровня баз данных.
Вывод
Лидирующей технологией в веб-программирование серверной части является - PHP. Для него существует множество конкурирующих фреймворков и он обладает самым большим комьюнити.
Объединяющей деталью большинства современных фреймворков является использование паттерна MVC.
Выбор пал на ASP.NET потому что:
- есть опыт использования С#.
- Visual Studio - удобное IDE для Windows.
- ASP.NET MVC (теперь ASP.Net Core) - активно развивающиеся технология.
1.2 Обзор СУБД
СУБД - Система управления базами данных представляет собой совокупность языковых и программных средств, которые обеспечивают управление созданием и использованием баз данных.
MySQL
Свободная реляционная система управления базами данных. Разработку и поддержку MySQL осуществляет корпорация Oracle, получившая права на торговую марку вместе с поглощённой Sun Microsystems, которая ранее приобрела шведскую компанию MySQL AB. Продукт распространяется как под GNU General Public License, так и под собственной коммерческой лицензией. Помимо этого, разработчики создают функциональность по заказу лицензионных пользователей. Именно благодаря такому заказу почти в самых ранних версиях появился механизм репликации.
MySQL является решением для малых и средних приложений. Входит в состав серверов WAMP, AppServ, LAMP и в портативные сборки серверов Денвер, XAMPP, VertrigoServ. Обычно MySQL используется в качестве сервера, к которому обращаются локальные или удалённые клиенты, однако в дистрибутив входит библиотека внутреннего сервера, позволяющая включать MySQL в автономные программы.
Гибкость СУБД MySQL обеспечивается поддержкой большого количества типов таблиц: пользователи могут выбрать как таблицы типа MyISAM, поддерживающие полнотекстовый поиск, так и таблицы InnoDB, поддерживающие транзакции на уровне отдельных записей. Более того, СУБД MySQL поставляется со специальным типом таблиц EXAMPLE, демонстрирующим принципы создания новых типов таблиц. Благодаря открытой архитектуре и GPL-лицензированию, в СУБД MySQL постоянно появляются новые типы таблиц.
MySQL возникла как попытка применить mSQL к собственным разработкам компании: таблицам, для которых использовались ISAM -- подпрограммы низкого уровня. В результате был выработан новый SQL-интерфейс, но API-интерфейс остался в наследство от mSQL. Откуда происходит название «MySQL» -- доподлинно неизвестно. Разработчики дают два варианта: либо потому, что практически все наработки компании начинались с префикса My, либо в честь девочки по имени My, дочери Майкла Монти Видениуса, одного из разработчиков системы.
Логотип MySQL в виде дельфина носит имя «Sakila». Он был выбран из большого списка предложенных пользователями «имён дельфина». Имя «Sakila» было отправлено Open Source-разработчиком Ambrose Twebaze.
PostgreSQL
Это объектно-реляционная система управления базами данных с открытым исходным кодом.
PostgreSQL создана на основе некоммерческой СУБД Postgres, разработанной как open-source проект в Калифорнийском университете в Беркли. К разработке Postgres, начавшейся в 1986 году, имел непосредственное отношение Майкл Стоунбрейкер, руководитель более раннего проекта Ingres, на тот момент уже приобретённого компанией Computer Associates. Название расшифровывалось как «Post Ingres», и при создании Postgres были применены многие уже ранее сделанные наработки.
Стоунбрейкер и его студенты разрабатывали новую СУБД в течение восьми лет с 1986 по 1994 год. За этот период в синтаксис были введены процедуры, правила, пользовательские типы и другие компоненты. В 1995 году разработка снова разделилась: Стоунбрейкер использовал полученный опыт в создании коммерческой СУБД Illustra, продвигаемой его собственной одноимённой компанией (приобретённой впоследствии компанией Informix), а его студенты разработали новую версию Postgres -- Postgres95, в которой язык запросов POSTQUEL -- наследие Ingres -- был заменен на SQL.
Разработка Postgres95 была выведена за пределы университета и передана команде энтузиастов. Новая СУБД получила имя, под которым она известна и развивается в текущий момент -- PostgreSQL.
Microsoft SQL Server
Система управления реляционными базами данных, разработанная корпорацией Microsoft. Основной используемый язык запросов -- Transact-SQL, создан совместно Microsoft и Sybase. Transact-SQL является реализацией стандарта ANSI/ISO по структурированному языку запросов (SQL) с расширениями. Используется для работы с базами данных размером от персональных до крупных баз данных масштаба предприятия; конкурирует с другими СУБД в этом сегменте рынка.
СУБД является частью длинной цепочки специализированного программного обеспечения, которое корпорация Microsoft создала для разработчиков. А это значит, что все звенья этой цепи (приложения) глубоко интегрированы между собой.
То есть их инструментарий легко взаимодействует между собой, что во многом упрощает процесс разработки и написания программного кода. Примером такой взаимосвязи является среда программирования MS Visual Studio. В ее инсталляционный пакет уже входит SQL Server Express Edition.
Конечно, это не единственная популярная СУБД на мировом рынке. Но именно она является более приемлемой для компьютеров, работающих под управлением Windows, за счет своей направленности именно на эту операционную систему. И не только из-за этого.
Преимущества MS SQL Server:
* Обладает высокой степенью производительности и отказоустойчивости;
* Является многопользовательской СУБД и работает по принципу «клиент-сервер»;
* Тесная интеграция с операционной системой Windows;
* Поддержка удаленных подключений;
* Поддержка популярных типов данных, а также возможность создания триггеров и хранимых процедур;
* Встроенная поддержка ролей пользователей;
* Расширенная функция резервного копирования баз данных;
* Высокая степень защищенности;
* Каждый выпуск включает в себя несколько специализированных редакций.
MongoDB
Документоориентированная система управления базами данных (СУБД) с открытым исходным кодом, не требующая описания схемы таблиц. Классифицирована как NoSQL, использует JSON-подобные документы и схему базы данных. Написана на языке C++.
СУБД управляет наборами JSON-подобных документов, хранимых в двоичном виде в формате BSON. Хранение и поиск файлов в MongoDB происходит благодаря вызовам протокола GridFS. Подобно другим документоориентированным СУБД (CouchDB и др.), MongoDB не является реляционной СУБД. В СУБД:
Нет такого понятия, как «транзакция». Атомарность гарантируется только на уровне целого документа, то есть частичного обновления документа произойти не может.
Отсутствует понятие «изоляции». Любые данные, которые считываются одним клиентом, могут параллельно изменяться другим клиентом.
В MongoDB реализована асинхронная репликация в конфигурации «ведущий -- ведомый» (англ. master -- slave), основанная на передаче журнала изменений с ведущего узла на ведомые. Поддерживается автоматическое восстановление в случае выхода из строя ведущего узла. Серверы с запущенным процессом mongod должны образовать кворум, чтобы произошло автоматическое определение нового ведущего узла. Таким образом, если не используется специальный процесс-арбитр (процесс mongod, только участвующий в установке кворума, но не хранящий никаких данных), количество запущенных реплик должно быть нечётным.
2. ИСПОЛЬЗУЕМЫЕ ТЕХНОЛОГИИ СЕРВЕРНОЙ ЧАСТИ ВЕБ-ПРИЛОЖЕНИЯ
В приложение используется 3-х уровневая серверная архитектура.
· Слой клиент-интерфейс HTML5+CSS3+JS
· Слой логики - ASP.Net MVC 5
· Слой данных - MS SQL Server
Нас интересует слой логики и слой данных.
1.1 ASP.Net MVC 5
ASP.NET MVC представляет собой платформу для создания сайтов и веб-приложений с использованием паттерна (или шаблона) MVC (model - view - controller).
Работа над новой платформой была начата в 2007 году, а в 2009 году появилась первая версия. В итоге к текущему моменту фреймворк обрел большую популярность по всему миру благодаря своей гибкости и адаптивности.
Шаблон MVC, лежащий в основе новой платформы, подразумевает взаимодействие трех компонентов: контроллера (controller), модели (model) и представления (view). Что же представляют эти компоненты?
Контроллер (controller) представляет класс, с которого собственно и начинается работа приложения. Этот класс обеспечивает связь между моделью и представлением. Получая вводимые пользователем данные, контроллер исходя из внутренней логики при необходимости обращается к модели и генерирует соответствующее представление.
Представление (view) - это собственно визуальная часть или пользовательский интерфейс приложения - например, html-страница, через которую пользователь, зашедший на сайт, взаимодействует с веб-приложением.
Модель (model) представляет набор классов, описывающих логику используемых данных.
1.2 С#
Упоминаю ASP.NET MVC стоит рассказать о том языке программирования, для которого он написан.
На сегодняшний момент язык программирования C# один из самых мощных, быстро развивающихся и востребованных языков в ИТ-отрасли. В настоящий момент на нем пишутся самые различные приложения: от небольших десктопных программок до крупных веб-порталов и веб-сервисов, обслуживающих ежедневно миллионы пользователей.
По сравнению с другими языками C# достаточно молодой, но в то же время он уже прошел большой путь. Первая версия языка вышла вместе с релизом Microsoft Visual Studio .NET в феврале 2002 года. Текущей версией языка является версия C# 7.0, которая вышла в 7 марта 2017 года вместе с Visual Studio 2017.
C# является языком с Си-подобным синтаксисом и близок в этом отношении к C++ и Java. Поэтому, если вы знакомы с одним из этих языков, то овладеть C# будет легче.
C# является объектно-ориентированным и в этом плане много перенял у Java и С++. Например, C# поддерживает полиморфизм, наследование, перегрузку операторов, статическую типизацию. Объектно-ориентированный подход позволяет решить задачи по построению крупных, но в тоже время гибких, масштабируемых и расширяемых приложений. И C# продолжает активно развиваться, и с каждой новой версией появляется все больше интересных функциональностей, как, например, лямбды, динамическое связывание, асинхронные методы и т.д.
1.3 LINQ
Важной частью платформы .NET и языка C# в частности является LINQ. Он занимает важную часть в этом веб-приложении т.к. все запросы к БД написаны с помощью него. Теперь о самом LINQ.
LINQ (Language-Integrated Query) представляет простой и удобный язык запросов к источнику данных. В качестве источника данных может выступать объект, реализующий интерфейс IEnumerable (например, стандартные коллекции, массивы), набор данных DataSet, документ XML. Но вне зависимости от типа источника LINQ позволяет применить ко всем один и тот же подход для выборки данных.
1.4 ASP.NET Identity
Это система аутентификации и авторизации на платформе .NET. Можно обратить внимания в описании бд что у сущностей Студента и Преподавателя отсутствуют поля для логина и пароля, это потому что в данном веб-приложении для функционала аутентификации и авторизации используется Identity.
1.5 Entity Framework
Для доступа к бд в данном веб-приложении используется Entity Framework который представляет специальную объектно-ориентированную технологию на базе фреймворка .NET для работы с данными. Если традиционные средства ADO.NET позволяют создавать подключения, команды и прочие объекты для взаимодействия с базами данных, то Entity Framework представляет собой более высокий уровень абстракции, который позволяет абстрагироваться от самой базы данных и работать с данными независимо от типа хранилища. Если на физическом уровне мы оперируем таблицами, индексами, первичными и внешними ключами, но на концептуальном уровне, который нам предлагает Entity Framework, мы уже работает с объектами.
1.6 Visual Studio 2015
Это набор инструментов для создания программного обеспечения: от планирования до разработки пользовательского интерфейса, написания кода, тестирования, отладки, анализа качества кода и производительности, развертывания в средах клиентов и сбора данных телеметрии по использованию. Эти инструменты предназначены для максимально эффективной совместной работы; все они доступны в интегрированной среде разработки (IDE) Visual Studio. Visual Studio можно использовать для создания различных типов приложений, от простых приложений для магазина и игр для мобильных клиентов до больших и сложных систем, обслуживающих предприятия и центры обработки данных.
1.7 MS SQL Server
Microsoft SQL Server -- система управления реляционными базами данных (СУБД), разработанная корпорацией Microsoft. Основной используемый язык запросов -- Transact-SQL, создан совместно Microsoft и Sybase. Transact-SQL является реализацией стандарта ANSI/ISO по структурированному языку запросов (SQL) с расширениями. Используется для работы с небольшими и средними по размеру базами данных до крупных баз данных масштаба предприятия; конкурирует с другими СУБД в этом сегменте рынка.
1.8 IIS
Это проприетарный набор серверов для нескольких служб Интернета от компании Майкрософт. IIS распространяется с операционными системами семейства Windows NT.
Основным компонентом IIS является веб-сервер, который позволяет размещать в Интернете сайты. IIS поддерживает протоколы HTTP, HTTPS, FTP, POP3, SMTP, NNTP. По данным компании Netcraft на июнь 2015 года, почти 22 млн сайтов обслуживаются веб-сервером IIS, что составляет 12,32 % от общего числа веб-сайтов.
3. ОПИСАНИЕ РАБОТЫ ПРИЛОЖЕНИЯ
3.1 Инфологическая модель базы данных
Модель представленна в виде ER-диграммы - это диграмма которая визуально описывает сущности предметной области их свойства и взаимосвязи.
ER-диаграмма модели базы данных
Рис.1 Инфологическая модель базы данных
Пояснение к ER-диаграмме
Группа:
Номер группы храниться в своём первоначальном виде за первый курс т.е. вида“1120”, но не “1220”. Номер группы за тот или иной учебный вычисляется через поле “Год поступления”.
-Академическая степень - имеется ввиду степени: бакалавриат, магистратура.
-Форма обучения - имеется ввиду: очная и заочная форма обучения.
Таблица с оценками
-Тип контроля знаний - имеются ввиду тот тип оценки знаний который будет проставляться в этой таблице. Пример: экзамен, зачёт, журнал, практика, курсовая работа.
Журнал - это оценки которые проставляет преподаватель в течении семестра(за тесты, работы и тп).
Семестр
-Атрибуты “Начало семестра” и “Конец семестра” нужны для таблиц с оценками с типом контроля знаний - журнал. Что-бы по составить таблицу с оценками за весь семестр.
3.2 Даталогическая модель
Даталогическая модель отражает логические связи между элементами данных вне зависимости от их содержания и среды хранения.
Рис. 2 Даталогическая модель базы данных
3.3 Физическая модель данных
Это модель данных которая описанна с помощью средств конкретной СУБД. В нашем случае это MS SQL Server 2016.
Рис. 3 Физическая модель данных
Пояснение:
Добавлена таблица ApplicationsForRegistration. Она служит для того что бы студент подавал заявку на регистрацию.
3.4 Скрипты создания таблиц
Группа.
CREATE TABLE [dbo].[Groups] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Number] INT NOT NULL,
[YearOfAdmission] INT NOT NULL,
[Faculty] NVARCHAR (128) NOT NULL,
[Degree] NVARCHAR (128) NOT NULL,
[FormOfStudy] NVARCHAR (128) NOT NULL,
[MonitorId] INT NULL,
CONSTRAINT [PK_Groups] PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_dbo_Groups_dbo_Students_MonitorId] FOREIGN KEY ([MonitorId]) REFERENCES [dbo].[Students] ([Id]) ON DELETE SET NULL
);
GO
CREATE NONCLUSTERED INDEX [IX_FK_dbo_Groups_dbo_Students_MonitorId]
ON [dbo].[Groups]([MonitorId] ASC);
MonitorId - Id старосты группы.
Внешний ключ на таблицу Student для старосты группы. При удалении этой таблицы Student то вместо неё ставиться null. Так как MonitorId не обязательное поле таблицы.
Используется некластеризованный индекс у внешнего ключа для увеличения скорости запросов.
Студент.
CREATE TABLE [dbo].[Students] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Number] NVARCHAR (128) NOT NULL,
[FullName] NVARCHAR (128) NOT NULL,
[YearOfBirth] INT NOT NULL,
[GroupId] INT NULL,
[Photo] VARBINARY (MAX) NULL,
[UserName] NVARCHAR (256) NULL,
[Email] NVARCHAR (128) NULL,
CONSTRAINT [PK_Students] PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_dbo_Students_dbo_Groups_GroupId] FOREIGN KEY ([GroupId]) REFERENCES [dbo].[Groups] ([Id]) ON DELETE SET NULL
);
GO
CREATE NONCLUSTERED INDEX [IX_FK_dbo_Students_dbo_Groups_GroupId]
ON [dbo].[Students]([GroupId] ASC);
Таблица Student ссылается на таблицу Group через поле GroupId, для того что бы студент был привязан ко одной из групп.
Поле UserName используется для того что связываться с аккаунтом(если он есть).
Используется некластеризованный индекс у внешнего ключа для увеличения скорости запросов.
Преподаватель.
CREATE TABLE [dbo].[Teachers] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[FullName] NVARCHAR (128) NOT NULL,
[Departament] NVARCHAR (128) NOT NULL,
[UserName] NVARCHAR (128) NULL,
CONSTRAINT [PK_Teachers] PRIMARY KEY CLUSTERED ([Id] ASC)
);
Поле UserName используется для того что связываться с аккаунтом(если он есть).
Дисциплина.
CREATE TABLE [dbo].[Subjects] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (128) NOT NULL,
[Departament] NVARCHAR (128) NOT NULL,
CONSTRAINT [PK_Subjects] PRIMARY KEY CLUSTERED ([Id] ASC)
);
Семестр.
CREATE TABLE [dbo].[Semester] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[BeginningDate] DATE NOT NULL,
[EndDate] DATE NOT NULL,
[Number] NVARCHAR (128) NOT NULL,
[Year] NVARCHAR (128) NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
Таблица с оценками.
CREATE TABLE [dbo].[TableOfGrades] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[TeachersGroupsSubjectId] INT NOT NULL,
[TypeOfKnowledgeControl] NVARCHAR (128) NOT NULL,
[SemesterId] INT NOT NULL,
CONSTRAINT [PK_TableOfGrades] PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_dbo_TableOfGrades_dbo_TeachersGroupsSubjects_TeachersGroupsSubjectId] FOREIGN KEY ([TeachersGroupsSubjectId]) REFERENCES [dbo].[TeachersGroupsSubjects] ([Id]) ON DELETE CASCADE,
CONSTRAINT [FK_dbo_TableOfGrades_dbo_Semester_SemesterId] FOREIGN KEY ([SemesterId]) REFERENCES [dbo].[Semester] ([Id])
);
Таблица с оценками имеет внешний на таблицу ПреподавательГруппаДисциплина, для того что бы однозначно связать оценки с преподавателем, группой и дисциплиной.
Так же имеется внешний ключ на таблицу Семестр для того что бы связать оценки с определённым семестром.
При удалении связанной таблицы ПреподавательГруппаДисциплина, то Таблица оценок удаляется вслед за ней.
Таблицу Семестр нельзя удалить пока она связанна хотя бы с одной Таблица оценок.
Оценка.
CREATE TABLE [dbo].[TableEntry] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[StudentId] INT NOT NULL,
[Date] DATE NULL,
[TableOfGradeId] INT NOT NULL,
[Value] NVARCHAR (128) NULL,
CONSTRAINT [PK_TableEntry] PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_dbo_TableEntry_dbo_Students_StudentId] FOREIGN KEY ([StudentId]) REFERENCES [dbo].[Students] ([Id]) ON DELETE CASCADE,
CONSTRAINT [FK_dbo_TableEntry_dbo_TableOfGrades_TableOfGradeId] FOREIGN KEY ([TableOfGradeId]) REFERENCES [dbo].[TableOfGrades] ([Id]) ON DELETE CASCADE
);
GO
CREATE NONCLUSTERED INDEX [IX_FK_dbo_TableEntry_dbo_Students_StudentId]
ON [dbo].[TableEntry]([StudentId] ASC);
GO
CREATE NONCLUSTERED INDEX [IX_FK_dbo_TableEntry_dbo_TableOfGrades_TableOfGradeId]
ON [dbo].[TableEntry]([TableOfGradeId] ASC);
Оценка имеет внешний ключ на Студента, чтобы связать оценку с определённым студентом. Так же имеется внешний ключ на Таблица оценок, для того что бы связать оценки с абстрактными данными хранящимися в Таблица оценок, такими данными как: преподаватель, дисциплина, группа, семестр.
При удалении связанного Студента или Таблицы оценок сама Оценка удаляется вслед за ними.
Используется некластеризованный индекс у внешних ключей для увеличения скорости запросов.
ПреподавательГруппаДисциплина
CREATE TABLE [dbo].[TeachersGroupsSubjects] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[GroupId] INT NOT NULL,
[SubjectId] INT NOT NULL,
[TeacherId] INT NOT NULL,
CONSTRAINT [PK_TeachersGroupsSubjects] PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_dbo_TeachersGroupsSubjects_dbo_Subjects_SubjectId] FOREIGN KEY ([SubjectId]) REFERENCES [dbo].[Subjects] ([Id]),
CONSTRAINT [FK_dbo_TeachersGroupsSubjects_dbo_Teachers_TeacherId] FOREIGN KEY ([TeacherId]) REFERENCES [dbo].[Teachers] ([Id]),
CONSTRAINT [FK_dbo_TeachersGroupsSubjects_dbo_Groups_GroupId] FOREIGN KEY ([GroupId]) REFERENCES [dbo].[Groups] ([Id])
);
GO
CREATE NONCLUSTERED INDEX [IX_FK_dbo_TeachersGroupsSubjects_dbo_Groups_GroupId]
ON [dbo].[TeachersGroupsSubjects]([GroupId] ASC);
GO
CREATE NONCLUSTERED INDEX [IX_FK_dbo_TeachersGroupsSubjects_dbo_Subjects_SubjectId]
ON [dbo].[TeachersGroupsSubjects]([SubjectId] ASC);
GO
CREATE NONCLUSTERED INDEX [IX_FK_dbo_TeachersGroupsSubjects_dbo_Teachers_TeacherId]
ON [dbo].[TeachersGroupsSubjects]([TeacherId] ASC);
ПреподавательГруппаДисциплина имеет внешние ключи на Группу, Дисциплину и Преподавателя так-как смысл самой таблицы ПреподавательГруппаДисциплина для того что абстрагировать эту связь 3-х таблиц от Таблицы с оценками.
При удалении одной из связанных таблиц ПреподавательГруппаДисциплина тоже удаляется.
3.5 Используемые SQL запросы
Для запросов к субд в данном приложении используется расширения языка Linq, который сам формирует необходимый SQL запрос, поэтому в коде нету привычного SQL кода, но тем не менее можно посмотреть созданный SQL запрос. Только внутри них указываются параметры вида “@p__linq__1”.
Select запросы:
1) Запрос для выборки Оценок для Таблицы оценок у преподавателя
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[TableOfGradeId] AS [TableOfGradeId],
[Extent1].[Date] AS [Date],
[Extent1].[Value] AS [Value],
[Extent1].[StudentId] AS [StudentId]
FROM [dbo].[TableEntry] AS [Extent1]
INNER JOIN [dbo].[TableOfGrades] AS [Extent2] ON [Extent1].[TableOfGradeId] = [Extent2].[Id]
INNER JOIN [dbo].[Semester] AS [Extent3] ON [Extent2].[SemesterId] = [Extent3].[Id]
INNER JOIN [dbo].[TeachersGroupsSubjects] AS [Extent4] ON [Extent2].[TeachersGroupsSubjectId] = [Extent4].[Id]
WHERE ([Extent4].[GroupId] = '1') AND ([Extent4].[TeacherId] = '1') AND ([Extent4].[SubjectId] = '1') AND ([Extent3].[Number] = '2') AND ([Extent3].[Year] = '2016|2017') AND ([Extent2].[TypeOfKnowledgeControl] = 'Exam')
2) Пример запроса для выборки Студентов для преподавателя что бы составлять таблицы с оценками.
SELECT
[Filter1].[Id1] AS [Id]
FROM (SELECT [Extent1].[Id] AS [Id1], [Extent2].[GroupId] AS [GroupId1], [Extent2].[SubjectId] AS [SubjectId], [Extent2].[TeacherId] AS [TeacherId], [Extent3].[SemesterId] AS [SemesterId]
FROM [dbo].[Students] AS [Extent1]
INNER JOIN [dbo].[TeachersGroupsSubjects] AS [Extent2] ON [Extent1].[GroupId] = [Extent2].[GroupId]
INNER JOIN [dbo].[TableOfGrades] AS [Extent3] ON [Extent2].[Id] = [Extent3].[TeachersGroupsSubjectId]
WHERE N'Journal' = [Extent3].[TypeOfKnowledgeControl] ) AS [Filter1]
INNER JOIN [dbo].[Semester] AS [Extent4] ON [Filter1].[SemesterId] = [Extent4].[Id]
WHERE ([Filter1].[TeacherId] = '1') AND ([Filter1].[GroupId1] = '1') AND ([Filter1].[SubjectId] = '1006') AND ([Extent4].[Number] = '2') AND ([Extent4].[Year] = '2016|2017')
3) Пример запроса для выборки Семестров у студента.
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[BeginningDate] AS [BeginningDate],
[Extent1].[EndDate] AS [EndDate],
[Extent1].[Number] AS [Number],
[Extent1].[Year] AS [Year]
FROM [dbo].[Semester] AS [Extent1]
INNER JOIN [dbo].[TableOfGrades] AS [Extent2] ON [Extent1].[Id] = [Extent2].[SemesterId]
INNER JOIN [dbo].[TeachersGroupsSubjects] AS [Extent3] ON [Extent2].[TeachersGroupsSubjectId] = [Extent3].[Id]
INNER JOIN [dbo].[Students] AS [Extent4] ON [Extent3].[GroupId] = [Extent4].[GroupId]
WHERE [Extent4].[Id] = '1'
4) Пример запроса для выборки названия Дисциплин у студента.
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[BeginningDate] AS [BeginningDate],
[Extent1].[EndDate] AS [EndDate],
[Extent1].[Number] AS [Number],
[Extent1].[Year] AS [Year]
FROM [dbo].[Semester] AS [Extent1]
INNER JOIN [dbo].[TableOfGrades] AS [Extent2] ON [Extent1].[Id] = [Extent2].[SemesterId]
INNER JOIN [dbo].[TeachersGroupsSubjects] AS [Extent3] ON [Extent2].[TeachersGroupsSubjectId] = [Extent3].[Id]
INNER JOIN [dbo].[Students] AS [Extent4] ON [Extent3].[GroupId] = [Extent4].[GroupId]
WHERE [Extent4].[Id] = '1'
5) Пример запроса для выборки Оценок у студента.
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[Value] AS [Value],
[Extent1].[Date] AS [Date],
[Extent1].[TableOfGradeId] AS [TableOfGradeId],
[Extent1].[StudentId] AS [StudentId]
FROM [dbo].[TableEntry] AS [Extent1]
INNER JOIN [dbo].[TableOfGrades] AS [Extent2] ON [Extent1].[TableOfGradeId] = [Extent2].[Id]
INNER JOIN [dbo].[Semester] AS [Extent3] ON [Extent2].[SemesterId] = [Extent3].[Id]
INNER JOIN [dbo].[TeachersGroupsSubjects] AS [Extent4] ON [Extent2].[TeachersGroupsSubjectId] = [Extent4].[Id]
WHERE ([Extent1].[StudentId] = @p__linq__0) AND ([Extent4].[SubjectId] = @p__linq__1) AND ([Extent3].[Number] = @p__linq__2) AND ([Extent3].[Year] = @p__linq__3)
Запрос Insert
1) Создание Студента.
INSERT [dbo].[Students]([Number], [FullName], [YearOfBirth], [GroupId], [Photo], [UserName], [Email])
VALUES ('12415641', 'Кириллов Анатолий Павлович', '1995', '12', NULL, NULL, 'maliva1995@yandex.ru')
SELECT [Id]
FROM [dbo].[Students]
WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity()
2) Создание Группы
INSERT [dbo].[Groups]([Number], [YearOfAdmission], [Faculty], [Degree], [FormOfStudy], [MonitorId])
VALUES ('1190', '2014', '2', 'Бакалавриат', 'Очная', NULL)
SELECT [Id]
FROM [dbo].[Groups]
WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity()
Запрос Delete
1) Удаление Группы
DELETE [dbo].[Groups]
WHERE ([Id] = '13')
2) Удаление Студента
DELETE [dbo].[Students]
WHERE ([Id] = @0)
Запрос Update
1) Обновление Группы
UPDATE [dbo].[Groups]
SET [Number] = '1110', [YearOfAdmission] = '2012', [Faculty] = 'ФКиО', [Degree] = 'Бакалавриат', [FormOfStudy] = 'Очная', [MonitorId] = NULL
WHERE ([Id] = '11')
2) Обновление Студента
UPDATE [dbo].[Groups]
SET [Number] = '1110', [YearOfAdmission] = '2012', [Faculty] = 'ФКиО', [Degree] = 'Бакалавриат', [FormOfStudy] = 'Очная', [MonitorId] = NULL
WHERE ([Id] = '11')
3) Обновление Оценки у преподавателя в таблице.
UPDATE [dbo].[TableEntry]
SET [Value] = '5'
WHERE ([Id] = '116')
3.6 Описание сценария приложения
Общее описание
У нас в приложение 3 вида пользователя: Студент, Администратор, Преподаватель. Для каждого из них функционал разительно отличается.
Преподаватель:
· Просматривать и редактировать оценки.
· Может выбирать у какой группы и какой предмет введёт, создавая соответствующую связь в бд.
· Создавать необходимые ему таблицы с различным видом контроля знаний(журнал, экзамен, зачёт, курсовая работа, практика.
Студент:
· Подавать заявку на регистрацию
· Просматривать свои оценки.
Администратор:
· Удалять/редактировать/создавать основные сущности: Студент, Группа, Преподаватель, Дисциплина, ПреподавательГруппаДисциплина, Семестр.
· Принимать заявки на регистрацию студента.
· Изменять оценки в таблицах с оценками.
· Просматривать аналитическую информацию по успеваемости.
Реализация сценария преподавателя.
Основная страница для преподавателя где выводятся оценки для выбранной группы по выбранной дисциплине.
Рис. 4 Заглавная страница преподавателя
Исходный код:
[HttpGet]
public ActionResult Index(int? group, int? subject)
{
string userName = HttpContext.User.Identity.Name;
var lecturerId = db.Teachers.Where(p => p.UserName == userName).First().Id;
var toDaySemester = Semester.Today();
//Формирует список групп у которых преподаватель ввёл в данном семестре
var findGroups = (from p in db.Groups
join b in db.TeachersGroupsSubjects on p.Id equals b.GroupId
join c in db.TableOfGrades on b.Id equals c.TeachersGroupsSubjectId
join d in db.Semester on c.SemesterId equals d.Id
where b.TeacherId == lecturerId && d.Number == toDaySemester.Number &&
d.Year == toDaySemester.Year
select new
{
Id = p.Id,
Number = p.Number,
YearOfAdmission = p.YearOfAdmission,
Faculty = p.Faculty,
Degree = p.Degree,
MonitorId = p.MonitorId
}).ToList();
List<Groups> groups = new List<Groups>();
foreach (var group1 in findGroups)
{
if (groups.Find(p => p.Id == group1.Id) == null)
groups.Add(new Groups
{
Id = group1.Id,
Number = group1.Number,
YearOfAdmission = group1.YearOfAdmission,
Faculty = group1.Faculty,
Degree = group1.Degree,
MonitorId = group1.MonitorId
});
}
foreach (var b in groups)
{
b.Number = b.GetGroupNumber(Semester.Today());
}
groups.OrderBy(p => p.Number);
int firstGroup;
if (group == null)
firstGroup = groups.FirstOrDefault().Id;
else
firstGroup = group.Value;
ViewBag.Groups = new SelectList(groups, "Id", "Number", groups.First(p => p.Id == firstGroup));
//Формируем список дисплин по одной из групп для преподавателя
var subjects = (from p in db.Subjects
join b in db.TeachersGroupsSubjects on p.Id equals b.SubjectId
join f in db.Groups on b.GroupId equals f.Id
join c in db.TableOfGrades on b.Id equals c.TeachersGroupsSubjectId
join d in db.Semester on c.SemesterId equals d.Id
where b.TeacherId == lecturerId && d.Number == toDaySemester.Number && d.Year == toDaySemester.Year && f.Id == firstGroup
select new
{
Name = p.Name,
Id = p.Id
}).ToList();
subjects = subjects.Distinct().ToList();
subjects.OrderBy(p => p.Name);
if (subject == null)
subject = subjects.First().Id;
ViewBag.Subject = new SelectList(subjects, "Id", "Name", subjects.First(p => p.Id == subject));
LecturerViewModel viewModel = new LecturerViewModel();
var toDaySemester1 = GetTodaySemester();
int lecId = db.Teachers.Where(p => p.UserName == userName).First().Id;
viewModel.GetAllFinalGrades(db, firstGroup, lecId, subject.Value, toDaySemester1);
//Заполнения модели представления
//Получение название предметов для журнала
viewModel.GetNamesOfStudents(db, firstGroup, lecId, subject.Value, toDaySemester1);
//Получение данных для заполнения области таблицы с оценками
viewModel.GetStudentsGrades(db, firstGroup, lecId, subject.Value, toDaySemester1);
//Для строки с названиями месяцев
viewModel.GetMounthNames();
//С количеством дней в месяцах для для colspan.
viewModel.GetDaysMounth();
//Для отображение строки где день месяца + день недели.
viewModel.GetDaysSemester();
//Для формирование таблиц с итоговыми оценками
viewModel.GetAllFinalGrades(db, firstGroup, lecId, subject.Value, toDaySemester1);
viewModel.Subject = db.Subjects.Find(subject);
viewModel.Group = db.Groups.Find(firstGroup);
return View(viewModel);
}
[HttpPost]
public ActionResult Index(LecturerViewModel viewModel, string action)
{
DiaryConnection db = new DiaryConnection();
db.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);
//action - параметр отправляемый из кнопки "сохранить". В зависимости от него обновляеться нужная часть модели.
if(action == "Journal")
{
for (int i = 0; i < viewModel.ListOfGrades.Count; i++)
{
for (int j = 0; j < viewModel.ListOfGrades[i].Count; j++)
{
//Обновляем отправленные данные таблицы
var foundTableEntry = viewModel.ListOfGrades[i][j];
var tableEntry = db.TableEntry.Where(p => p.Id == foundTableEntry.Id).First();
tableEntry.Value = foundTableEntry.Value;
}
}
}
if (action == "PassFailTest")
{
foreach (var b in viewModel.PassFailTestGrades)
{
//Обновляем отправленные данные таблицы
var tableEntry = db.TableEntry.Where(p => p.Id == b.Id).First();
tableEntry.Value = b.Value;
}
}
if (action == "PracticalWork")
{
foreach (var b in viewModel.PracticalWorkGrades)
{
var tableEntry = db.TableEntry.Where(p => p.Id == b.Id).First();
tableEntry.Value = b.Value;
}
}
if (action == "CoursePaper")
{
foreach (var b in viewModel.CoursePaperGrades)
{
var tableEntry = db.TableEntry.Where(p => p.Id == b.Id).First();
tableEntry.Value = b.Value;
}
}
if (action == "Exam")
{
foreach (var b in viewModel.ExamGrades)
{
var tableEntry = db.TableEntry.Where(p => p.Id == b.Id).First();
tableEntry.Value = b.Value;
}
}
db.SaveChanges();
return Redirect("/Lecturer/Index" + "/" + viewModel.Group.Id + "/" + viewModel.Subject.Id);
}
Пояснение:
C помощью HTTP запроса GET к методу Index выводится начальное представление. А с помощью запроса POST происходит обновление страницы.
Изначально преподаватель волен выбрать какие таблицы ему создать, а какие проигнорировать. Таблица журнал образуется по тому расписанию которое укажет преподаватель. По умолчанию выводятся группы, предметы за текущий семестр. Таблицы за предыдущие семестры вынесены в Архив.
Поля в таблицах свободны для редактирования, только нужно нажать кнопку сохранить под необходимой таблицей, что вызовет метод POST который сохранит изменения и обновит страницу.
Основные методы по формирование таблиц вынесены в класс LecturerViewModel.
Выбор преподавателем тех групп и предметов по которым он выставляет оценки.
Рис. 5 Создание связи ПреподавательГруппаПредмет
Исходный код:
[HttpGet]
public ActionResult SelectGroupAndSubject()
{
string userName = HttpContext.User.Identity.Name;
var groups = db.Groups.ToList();
foreach (var b in groups)
{
b.Number = b.GetGroupNumber(Semester.Today());
}
ViewBag.Lecturer = db.Teachers.Where(p => p.UserName == userName).First();
ViewBag.Groups = new SelectList(groups, "Id", "Number");
ViewBag.Subjects = new SelectList(db.Subjects.ToList(), "Id", "Name");
ViewBag.TGS = db.TeachersGroupsSubjects.Where(p => p.Teachers.UserName == userName).ToList();
return View();
}
[HttpPost]
public ActionResult SelectGroupAndSubject([Bind(Include = "Id,GroupId,TeacherId,SubjectId")]TeachersGroupsSubjects lgs, string isNewSubject, string newSubjectName, string newSubjectDepartament)
{
if (isNewSubject == "true")
{
if (db.Subjects.Where(p => p.Name == newSubjectName && p.Departament == newSubjectDepartament).ToList().Count == 0)
{
db.Subjects.Add(new Subjects { Name = newSubjectName, Departament = newSubjectDepartament });
db.SaveChanges();
}
lgs.SubjectId = db.Subjects.Where(p => p.Name == newSubjectName && p.Departament == newSubjectDepartament).First().Id;
}
if (ModelState.IsValid)
{
db.TeachersGroupsSubjects.Add(lgs);
db.SaveChanges();
return Redirect("/Lecturer/Index" + "/" + lgs.GroupId + "/" + lgs.SubjectId);
}
string userName = HttpContext.User.Identity.Name;
var lecId = db.Teachers.Where(p => p.UserName == userName).First().Id;
var groups = db.Groups.ToList();
foreach (var b in groups)
{
b.Number = b.GetGroupNumber(Semester.Today());
}
ViewBag.Lecturer = lecId;
ViewBag.Groups = new SelectList(groups, "Id", "Number");
ViewBag.Subjects = new SelectList(db.Subjects.ToList(), "Id", "Name");
return View();
}
Пояснение:
Создавая выбирая группу и предмет, преподаватель волен выбрать: взять ему существующий предмет или создать новый. Снизу страницы отображены уже созданные связи.
Архив где выводятся проставленные оценки за прошлые семестры.
Рис. 6 Архив у преподавателя
Исходный код:
public ActionResult Archive(int? group, int? subject, string year, string semesterNumber)
{
string userName = HttpContext.User.Identity.Name;
var lecturerId = db.Teachers.Where(p => p.UserName == userName).First().Id;
var findSemesters = (from p in db.Semester
join c in db.TableOfGrades on p.Id equals c.SemesterId
join g in db.TeachersGroupsSubjects on c.TeachersGroupsSubjectId equals g.Id
join f in db.Teachers on g.TeacherId equals f.Id
where f.Id == lecturerId
select new
{
Id = p.Id,
BeginningDate = p.BeginningDate,
EndDate = p.EndDate,
Number = p.Number,
Year = p.Year
}).Distinct();
List<Semester> semesters = new List<Semester>();
foreach (var item in findSemesters)
{
semesters.Add(new Semester { Id = item.Id, BeginningDate = item.BeginningDate, EndDate = item.EndDate, Number = item.Number, Year = item.Year });
}
Semester semester;
if (year == null || semesterNumber == null)
semester = semesters.FirstOrDefault();
else
semester = db.Semester.FirstOrDefault(p => p.Year == year && p.Number == semesterNumber);
var findGroups = (from p in db.Groups
join b in db.TeachersGroupsSubjects on p.Id equals b.GroupId
join c in db.TableOfGrades on b.Id equals c.TeachersGroupsSubjectId
join d in db.Semester on c.SemesterId equals d.Id
where b.TeacherId == lecturerId && d.Number == semester.Number &&
d.Year == semester.Year
select new
{
Id = p.Id,
Number = p.Number,
YearOfAdmission = p.YearOfAdmission,
Faculty = p.Faculty,
Degree = p.Degree,
MonitorId = p.MonitorId
}).ToList();
List<Groups> groups = new List<Groups>();
foreach (var group1 in findGroups)
{
if (groups.Find(p => p.Id == group1.Id) == null)
groups.Add(new Groups
{
Id = group1.Id,
Number = group1.Number,
YearOfAdmission = group1.YearOfAdmission,
Faculty = group1.Faculty,
Degree = group1.Degree,
MonitorId = group1.MonitorId
});
}
foreach (var b in groups)
{
b.Number = b.GetGroupNumber(Semester.Today());
}
groups.OrderBy(p => p.Number);
if (group == null)
group = db.Groups.First().Id;
var firstGroup = groups.First();
var subjects = (from p in db.Subjects
join b in db.TeachersGroupsSubjects on p.Id equals b.SubjectId
join f in db.Groups on b.GroupId equals f.Id
join c in db.TableOfGrades on b.Id equals c.TeachersGroupsSubjectId
join d in db.Semester on c.SemesterId equals d.Id
where b.TeacherId == lecturerId && d.Number == semester.Number && d.Year == semester.Year && f.Id == firstGroup.Id
select new
{
Name = p.Name,
Id = p.Id
}).ToList();
subjects = subjects.Distinct().ToList();
subjects.OrderBy(p => p.Name);
if (subject == null)
subject = db.Subjects.First().Id;
//SelectList для симестров надо делать вручную. У меня на представление есть пример.
ViewBag.Semesters = semesters;
ViewBag.Groups = new SelectList(groups, "Id", "Number", groups.FirstOrDefault(p => p.Id == group));
ViewBag.Subjects = new SelectList(subjects, "Id", "Name", subjects.FirstOrDefault(p => p.Id == subject));
LecturerViewModel viewModel = new LecturerViewModel();
viewModel.GetAllFinalGrades(db, group.Value, lecturerId, subject.Value, semester);
//Заполнения модели представления
//Получение название предметов для журнала
viewModel.GetNamesOfStudents(db, group.Value, lecturerId, subject.Value, semester);
//Получение данных для заполнения области таблицы с оценками
viewModel.GetStudentsGrades(db, group.Value, lecturerId, subject.Value, semester);
//Для строки с названиями месяцев
viewModel.GetMounthNames();
//С количеством дней в месяцах для для colspan.
viewModel.GetDaysMounth();
//Для отображение строки где день месяца + день недели.
viewModel.GetDaysSemester();
//Для формирование таблиц с итоговыми оценками
viewModel.GetAllFinalGrades(db, group.Value, lecturerId, subject.Value, semester);
viewModel.Subject = db.Subjects.Find(subject);
viewModel.Group = db.Groups.Find(group);
return View(viewModel);
}
Пояснение:
Фактически тот же самый функционал что и у метода Index с той разницей, что добавлен функционал выбора семестра. Разделение на Index и Архив было сделано осознано, чтобы отделить таблицы с оценками текущего семестра от всех остальных.
Создание таблицы - журнал.
Рис. 7 Создание таблицы - журнал
Исходный код:
public ActionResult CreateJournal(int groupId, int subjectId)
{
ViewBag.GroupId = groupId;
ViewBag.SubjectId = subjectId;
return View();
}
[HttpPost]
public ActionResult CreateJournal(List<bool> numerator, List<bool> denominator, int groupId, int subjectId)
{
string userName = HttpContext.User.Identity.Name;
DiaryConnection db = new DiaryConnection();
var lecId = db.Teachers.Where(p => p.UserName == userName).First().Id;
var tgs = db.TeachersGroupsSubjects.Where(p => p.TeacherId == lecId &&
p.GroupId == groupId && p.SubjectId == subjectId).First();
var semester = Semester.Today();
if (db.TableOfGrades.Any(p => p.TeachersGroupsSubjectId == tgs.Id && p.TypeOfKnowledgeControl == "Journal"))
return Redirect("/Lecturer/Index" + "/" + groupId + "/" + subjectId);
//var tgs = (from p in db.TeachersGroupsSubject where p.TeacherId == lecId /*&& p.GroupId == group1 && p.SubjectId == subject*/ select p).ToList();// db.TeachersGroupsSubject.Where(p => p.TeacherId == lecId && p.GroupId ==group &&p.SubjectId == subject).ToList().First();
//Получаем все дни по расписанию в течении семестра.
var allDays = GetAllDaysAreOnTimetable(numerator, denominator, semester);
//Получаем всех студентов у данной группы
var allStudents = (from p in db.Students where p.GroupId == groupId
select new
{ Id = p.Id }).ToList();/*db.Students.Where(p => p.GroupId == group1)*/
//Добавляем новую таблицу с оценками(TGSId должен быть параметром)
var newTable = new TableOfGrades {
TeachersGroupsSubjectId = tgs.Id,
TypeOfKnowledgeControl = "Journal",
SemesterId = semester.Id
};
db.TableOfGrades.Add(newTable);
db.SaveChanges();
foreach (var day in allDays)
{
foreach (var std in allStudents)
{
if (!db.TableEntry.Any(p => (p.StudentId == std.Id) && (p.Date == day) && (p.TableOfGradeId == newTable.Id)))
db.TableEntry.Add(new TableEntry { StudentId = std.Id, Date = day, TableOfGradeId = newTable.Id, Value = "" });
}
}
db.SaveChanges();
return Redirect("/Lecturer/Index" + "/" + groupId + "/" + subjectId);
}
Пояснение:
Преподаватель с помощью галочек указывает расписание по которому формируется таблица журнал. Для таблицы типа экзамен нужно указать дату проведения экзамена. Остальные таблицы формируются подобным кодом, только не требуют ввода дополнительной информации.
Студент
Основнная страница для студента с просмотром своих оценок.
Рис. 8 Основная страница студента
Исходный код:
public ActionResult Index(string year, string semesterNumber)
{
string userName = HttpContext.User.Identity.Name;
var student = dbContext.Students.Where(p => p.UserName == userName).First();
//var semester = dbContext.Semester.Where(p => p.Year == year && p.Number == semesterNumber).First();
var semester = dbContext.Semester.Where(p => p.Year == year && p.Number == semesterNumber).First();
if(semester==null)
HttpNotFound();
var viewModel = new StudentJournalViewModel();
//Заполнения модели представления
//Получение название предметов для журнала
viewModel.GetNamesOfSubject(dbContext, student.Id, semester);
//Получение данных для заполнения области таблицы с оценками
viewModel.GetSubjectGrades(dbContext, student.Id, semester);
//Для строки с названиями месяцев
viewModel.GetMounthNames();
//С количеством дней в месяцах для для colspan.
viewModel.GetDaysMounth();
//Для отображение строки где день месяца + день недели.
viewModel.GetDaysSemester();
//Для отображение пропусков ввида:”3 пропуска из 24”
viewModel.GetMissed();
//Для формирование таблиц с итоговыми оценками
viewModel.GetAllFinalGrades(dbContext, student.Id, semester);
//для формирования cсылок с оценками за разные семестры
viewModel.GetRefToSemesters(dbContext, student.Id);
return View(viewModel);
}
Пояснение:
Студент может только просматривать свои оценки, выбирая разный семестр. Студент не видит таблицу с типом журнал.
Подача заявки на регистрацию студентом.
Рис. 9 Форма подачи заявки на регистрацию, студентом
Исходный код:
[AllowAnonymous]
public ActionResult StudentRegister()
{
List<Groups> groups = new List<Groups>();
using (DiaryConnection db = new DiaryConnection())
{
groups = db.Groups.ToList();
foreach (var b in groups)
{
b.Number = b.GetGroupNumber(Semester.Today());
ViewBag.Groups = new SelectList(groups, "Id", "Number");
}
}
return View();
}
[HttpPost]
[AllowAnonymous]
public ActionResult StudentRegister(StudentRegisterViewModel viewModel)
{
ApplicationsForRegistration application = new ApplicationsForRegistration {FirstName = viewModel.FirstName,
SecondName = viewModel.SecondName, MiddleName = viewModel.MiddleName,
CardNumber = viewModel.CardNumber, DateOfBirth = viewModel.DateOfBirth,
GroupId = viewModel.GroupId, Email = viewModel.Email, Login = viewModel.Login, Password = viewModel.Password };
using (DiaryConnection db = new DiaryConnection())
{
db.ApplicationsForRegistration.Add(application);
db.SaveChanges();
}
return RedirectToAction("ApplicationAccepted");
}
[AllowAnonymous]
public ActionResult ApplicationAccepted()
{
return View();
}
Пояснение:
Студент заполняет данную форму, чтобы администратор мог его одназначно идентифицировать и принять его заявку.
Администратор
У администартора есть права на поиск, удаление, редактирование, создания основных сущностей: Студент, Группа, Преподаватель, Дисциплина, ПреподавательГруппаДисциплина, Семестр. Описывать этот функционал несколько раз - безсмысленно, поэтому расмотрим его подробнее на примере Группы.
Основная типовая страница для Группы.
Рис. 10 Группа у администратора
Исходный код:
public ActionResult Groups()
{
List<Groups> groups;
DiaryConnection db = new DiaryConnection();
groups = db.Groups.ToList();
return View(groups);
}
public ActionResult GroupsSearch(int? number, int? yearOfAdmission, string faculty, string degree, string formOfStudy)
{
IEnumerable<Groups> foundGroups;
List<Groups> groups;
using (DiaryConnection db = new DiaryConnection())
{
groups = db.Groups.ToList();
}
foundGroups = groups;
if (number != null)
foundGroups = foundGroups.Where(p => p.GetGroupNumber(Semester.Today()) == number);
if (yearOfAdmission != null)
foundGroups = foundGroups.Where(p => p.YearOfAdmission == yearOfAdmission);
if (faculty != "")
foundGroups = foundGroups.Where(p => p.Faculty == faculty);
if (degree != "")
foundGroups = foundGroups.Where(p => p.Degree == degree);
...Подобные документы
Django — свободный фреймворк для веб-приложений на языке Python, использующий шаблон проектирования MVC. Архитектура и основные компоненты приложения. Главные компоненты среды разработки Django. Некоторые возможности и взаимосвязь компонентов фреймворка.
реферат [23,7 K], добавлен 18.01.2015Основные виды баз данных. Система управления базами данных. Анализ деятельности и информации, обрабатываемой в поликлинике. Состав таблиц в базе данных и их взаимосвязи. Методика наполнения базы данных информацией. Алгоритм создания базы данных.
курсовая работа [3,1 M], добавлен 17.12.2014Краткая характеристика, главные преимущества и область применения MS Access. Базы данных и системы управления базами данных. Описание пошагового создания базы данных, таблиц, форм, запроса и отчета. Особенности и функциональные возможности MS Access.
курсовая работа [3,4 M], добавлен 23.09.2010Цель создания базы данных магазина. Понятие и сущность инфологического моделирования, его применение. Особенности разработки базы данных, создание таблиц, схемы данных, запросов, визуальных и печатных форм. Описание процесса работы с базами данных.
курсовая работа [1,9 M], добавлен 15.11.2013Особенности разработки инфологической модели и создание структуры реляционной базы данных. Основы проектирования базы данных. Разработка таблиц, форм, запросов для вывода информации о соответствующей модели. Работа с базами данных и их объектами.
курсовая работа [981,4 K], добавлен 05.11.2011Создание таблиц базы данных с помощью MS Access "Страны Азии". Форма базы данных и запросы к выборкам данных. Модификация структуры таблиц, создания связей между главными таблицами, редактирование данных и проектирование форм для реальной базы данных.
контрольная работа [723,9 K], добавлен 25.11.2012Основные возможности системы управления реляционными базами данных (СУБД) Microsoft Access. Пользовательский интерфейс MS Access 2003. Команды панели инструментов окна БД. Область возможных режимов создания объектов. Создание таблиц в базе данных.
реферат [5,5 M], добавлен 08.11.2010Объекты системы управления базами данных Access. Запросы, формы, отчеты. Типы данных: текстовый, поле мемо, числовой. Поле объекта OLE, гиперссылка, мастер подстановок. Ручные, автоматизированные и автоматические средства создания объектов базы данных.
презентация [872,0 K], добавлен 31.10.2016Описание системы управления реляционными базами данных MySQL. Изучение факторов влияющих на пропускную способность в беспроводных сетях. Особенности применения языка Java Script. Методы тестирования web-приложений. Разработка пользовательского интерфейса.
дипломная работа [2,1 M], добавлен 24.06.2015Выделение информационных объектов и их инфологическая модель. Логическая структура реляционной базы данных. Разработка таблиц в системе управления базами данных Access. Создание запросов, форм и отчетов в СУБД Access. Разработка приложения пользователя.
курсовая работа [2,8 M], добавлен 05.02.2018Система управления базами данных (СУБД). Программные средства, предназначенные для создания, наполнения, обновления и удаления базы данных. Структура, модели и классификация баз данных. Создание каталогов, псевдонимов, таблиц, шаблонов и форм СУБД.
презентация [1,1 M], добавлен 09.01.2014Запросы к базам данных: SQL, QBE, UDF, транзакции. Создание таблиц в системе управления базами данных MS Access, определение основных свойств полей. Проектирование базы данных "ТМЦ". Создание файла базы данных в MS Access, конструкторы и мастера.
контрольная работа [1,6 M], добавлен 15.03.2011Алгоритмы обработки массивов данных. Система управления базами данных. Реляционная модель данных. Представление информации в виде таблицы. Система управления базами данных реляционного типа. Графический многооконный интерфейс.
контрольная работа [2,8 M], добавлен 07.01.2007Запуск MS Excel. Технология создания рабочей книги. Ввод и редактирование данных. Технология создания шаблона таблицы. Форматирование содержимого ячеек. Система управления базами данных СУБД MS Access. Технология создания базы данных, форм и отчетов.
курсовая работа [681,7 K], добавлен 30.05.2013История создания, понятие, типы и функции системы управления базами данных. Изучение технологии копирования данных средствами устройства их хранения. Процесс разработки алгоритма и программы для нахождения максимального элемента массива А в массиве В.
отчет по практике [360,4 K], добавлен 08.02.2014Описание логической структуры таблиц базы данных для разработки web-приложения с помощью технологий ado.net и asp.net. Система меню, программы и модули, используемые в работе сайта. Класс, выполняющий операции и связующий информацию сайта с базой данной.
курсовая работа [104,5 K], добавлен 26.09.2012Хранение и обработка данных. Компоненты системы баз данных. Физическая структура данных. Создание таблиц в MS Access. Загрузка данных, запросы к базе данных. Разработка информационной системы с применением системы управления базами данных MS Access.
курсовая работа [694,0 K], добавлен 17.12.2016Архитектура и функции СУБД. Инфологическая модель данных "Сущность-связь". Ограничения целостности. Характеристика связей и язык моделирования. Манипулирование реляционными данными. Написание сервера на Java.3 и приложения-клиента на ActoinScript 3.0.
курсовая работа [935,3 K], добавлен 09.07.2013Технологии, используемые на стороне сервера: язык python, фреймворк Django, ORM, MVC, JSON, MySQL, веб-сервер Nginx, операционная система Linux. Разработка online хранилища данных. Программная реализация предметной области. Шаблоны вывода данных.
дипломная работа [123,3 K], добавлен 25.04.2015Виды и функции системы управления базами данных Microsoft Access. Иерархическая, сетевая, реляционная модель описания баз данных. Основные понятия таблицы базы данных. Особенности создания объектов базы данных, основные формы. Доступ к Internet в Access.
контрольная работа [19,8 K], добавлен 08.01.2011