Онлайн-дневник студента
Хранение успеваемости студентов в цифровом виде. Разработка серверной части дневника студента в сети Интернет, его преимущества по сравнению с обычным дневником. Обзор технологий создания веб-приложений. Руководство по установке и сопровождению.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 16.06.2017 |
Размер файла | 2,2 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
90
Размещено на http://www.allbest.ru/
Оглавление
- Введение
- 1. Обзор технологий
- 1.1 Обзор технологий создания веб-приложений
- PHP
- Ruby On Rails
- Python
- Вывод
- 2.2 Обзор СУБД
- MySQL
- PostgreSQL
- Microsoft SQL Server
- MongoDB
- 3. Используемые технологии серверной части веб-приложения
- 3.1 3-х уровневая серверная архитектура
- 3.2 ASP.net MVC 5
- 3.3 С#
- 3.4 LINQ
- 3.5 ASP.net Identity
- 3.6 Entity Framework
- 3.7 Visual Studio 2015
- 3.8 MS SQL Server
- 3.9 IIS
- 4. Описание работы приложения
- 4.1 Инфологическая модель базы данных
- Пояснение к ER-диаграмме
- 4.3 Физическая модель данных
- 4.4 Скрипты создания таблиц
- 4.5 Используемые SQL запросы
- 4.6 Описание сценария приложения
- Общее описание
- Реализация сценария преподавателя
- Основная страница для преподавателя где выводятся оценки для выбранной группы по выбранной дисциплине
- Выбор преподавателем тех групп и предметов по которым он выставляет оценки
- Архив где выводятся проставленные оценки за прошлые семестры
- Создание таблицы - журнал
- Студент
- Основнная страница для студента с просмотром своих оценок
- Подача заявки на регистрацию студентом
- Администратор
- Основная типовая страница для Группы
- Создание Группы
- Редактирование Группы
- Удаление Группы
- Принятие заявки на регистрацию студента
- 5. Тестирование
- 6. Руководство пользователя
- 6.2 Преподаватель
- Общее руководство для преподавателя
- 6.3 Администратор
- Поиск
- Создание
- Редактирование
- Удаление
- Приём заявок на регистрацию студента
- Журнал
- Общее руководство для администратора
- 7. Руководство по установке и сопровождению ПО
- Программные требования
- Хранение данных
- Публикация на веб-сервере IIS
- 8. Заключение
- Список используемых источников
Введение
В этой дипломной работе разрабатывается онлайн дневник студента, в частности его серверная часть. Это веб-приложение, потенциально, будет использоваться в СПбГМТУ.
Интернет и цифровые технологии все увереннее становятся неотъемлемой частью всех сфер жизнедеятельности современного человека. Не стала исключением и система образования, в которой электронные учебники постепенно вытесняют обычные книги, а ноутбуки и планшеты - традиционные тетради. По современным требованиям успеваемость студентов также должна хранится в цифровом виде.
Онлайн дневник несёт в себе некоторые преимущества по сравнению с обычным дневником. Первое это доступ к нему в любое время и в любом месте, если есть доступ в интернет с того или иного устройства. Второе, это автоматическая аналитика успеваемости студентов.
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) - активно развивающиеся технология.
2.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, только участвующий в установке кворума, но не хранящий никаких данных), количество запущенных реплик должно быть нечётным.
цифровой дневник студент онлайн
3. Используемые технологии серверной части веб-приложения
3.1 3-х уровневая серверная архитектура
· Слой клиент-интерфейс HTML5+CSS3+JS
· Слой логики - ASP.net MVC 5
· Слой данных - MS SQL Server
Нас интересует слой логики и слой данных.
3.2 ASP.net MVC 5
ASP.net MVC представляет собой платформу для создания сайтов и веб-приложений с использованием паттерна (или шаблона) MVC (model - view - controller).
Работа над новой платформой была начата в 2007 году, а в 2009 году появилась первая версия. В итоге к текущему моменту фреймворк обрел большую популярность по всему миру благодаря своей гибкости и адаптивности.
Шаблон MVC, лежащий в основе новой платформы, подразумевает взаимодействие трех компонентов: контроллера (controller), модели (model) и представления (view). Что же представляют эти компоненты?
Контроллер (controller) представляет класс, с которого собственно и начинается работа приложения. Этот класс обеспечивает связь между моделью и представлением. Получая вводимые пользователем данные, контроллер исходя из внутренней логики при необходимости обращается к модели и генерирует соответствующее представление.
Представление (view) - это собственно визуальная часть или пользовательский интерфейс приложения - например, html-страница, через которую пользователь, зашедший на сайт, взаимодействует с веб-приложением.
Модель (model) представляет набор классов, описывающих логику используемых данных.
3.3 С#
Упоминаю 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# продолжает активно развиваться, и с каждой новой версией появляется все больше интересных функциональностей, как, например, лямбды, динамическое связывание, асинхронные методы и т.д.
3.4 LINQ
Важной частью платформы.net и языка C# в частности является LINQ. Он занимает важную часть в этом веб-приложении т.к. все запросы к БД написаны с помощью него. Теперь о самом LINQ.
LINQ (Language-Integrated Query) представляет простой и удобный язык запросов к источнику данных. В качестве источника данных может выступать объект, реализующий интерфейс IEnumerable (например, стандартные коллекции, массивы), набор данных DataSet, документ XML. Но вне зависимости от типа источника LINQ позволяет применить ко всем один и тот же подход для выборки данных.
3.5 ASP.net Identity
Это система аутентификации и авторизации на платформе.net. Можно обратить внимания в описании бд что у сущностей Студента и Преподавателя отсутствуют поля для логина и пароля, это потому что в данном веб-приложении для функционала аутентификации и авторизации используется Identity.
3.6 Entity Framework
Для доступа к бд в данном веб-приложении используется Entity Framework который представляет специальную объектно-ориентированную технологию на базе фреймворка.net для работы с данными. Если традиционные средства ADO.net позволяют создавать подключения, команды и прочие объекты для взаимодействия с базами данных, то Entity Framework представляет собой более высокий уровень абстракции, который позволяет абстрагироваться от самой базы данных и работать с данными независимо от типа хранилища. Если на физическом уровне мы оперируем таблицами, индексами, первичными и внешними ключами, но на концептуальном уровне, который нам предлагает Entity Framework, мы уже работает с объектами.
3.7 Visual Studio 2015
Это набор инструментов для создания программного обеспечения: от планирования до разработки пользовательского интерфейса, написания кода, тестирования, отладки, анализа качества кода и производительности, развертывания в средах клиентов и сбора данных телеметрии по использованию. Эти инструменты предназначены для максимально эффективной совместной работы; все они доступны в интегрированной среде разработки (IDE) Visual Studio. Visual Studio можно использовать для создания различных типов приложений, от простых приложений для магазина и игр для мобильных клиентов до больших и сложных систем, обслуживающих предприятия и центры обработки данных.
3.8 MS SQL Server
Microsoft SQL Server - система управления реляционными базами данных (СУБД), разработанная корпорацией Microsoft. Основной используемый язык запросов - Transact-SQL, создан совместно Microsoft и Sybase. Transact-SQL является реализацией стандарта ANSI/ISO по структурированному языку запросов (SQL) с расширениями. Используется для работы с небольшими и средними по размеру базами данных до крупных баз данных масштаба предприятия; конкурирует с другими СУБД в этом сегменте рынка.
3.9 IIS
Это проприетарный набор серверов для нескольких служб Интернета от компании Майкрософт. IIS распространяется с операционными системами семейства Windows NT.
Основным компонентом IIS является веб-сервер, который позволяет размещать в Интернете сайты. IIS поддерживает протоколы HTTP, HTTPS, FTP, POP3, SMTP, NNTP. По данным компании Netcraft на июнь 2015 года, почти 22 млн сайтов обслуживаются веб-сервером IIS, что составляет 12,32 % от общего числа веб-сайтов.
4. Описание работы приложения
4.1 Инфологическая модель базы данных
Модель представленна в виде ER-диграммы - это диграмма которая визуально описывает сущности предметной области их свойства и взаимосвязи.
ER-диаграмма модели базы данных:
Рис.1 Инфологическая модель базы данных
Пояснение к ER-диаграмме
Группа:
Номер группы храниться в своём первоначальном виде за первый курс т.е. вида“1120”, но не “1220”. Номер группы за тот или иной учебный вычисляется через поле “Год поступления”.
Академическая степень - имеется ввиду степени: бакалавриат, магистратура.
Форма обучения - имеется ввиду: очная и заочная форма обучения.
Таблица с оценками
Тип контроля знаний - имеются ввиду тот тип оценки знаний который будет проставляться в этой таблице. Пример: экзамен, зачёт, журнал, практика, курсовая работа.
Журнал - это оценки которые проставляет преподаватель в течении семестра (за тесты, работы и тп).
Семестр
Атрибуты “Начало семестра” и “Конец семестра” нужны для таблиц с оценками с типом контроля знаний - журнал. Что-бы по составить таблицу с оценками за весь семестр.
4.2 Даталогическая модель
Даталогическая модель отражает логические связи между элементами данных вне зависимости от их содержания и среды хранения.
Рис.2 Даталогическая модель базы данных
4.3 Физическая модель данных
Это модель данных которая описанна с помощью средств конкретной СУБД. В нашем случае это MS SQL Server 2016.
Рис.3 Физическая модель данных
Пояснение:
Добавлена таблица ApplicationsForRegistration. Она служит для того что бы студент подавал заявку на регистрацию.
4.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-х таблиц от Таблицы с оценками.
При удалении одной из связанных таблиц Преподаватель Группа Дисциплина тоже удаляется.
4.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')
4.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 ();
}
Пояснение:
Создавая выбирая группу и предмет, преподаватель волен выбрать: взять ему существующий предмет или создать новый. Снизу страницы отображены уже созданные связи.
Архив где выводятся проставленные оценки за прошлые семестры
Исходный код:
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 и Архив было сделано осознано, чтобы отделить таблицы с оценками текущего семестра от всех остальных.
Создание таблицы - журнал
Рис. 6 Создание таблицы - журнал
Исходный код:
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);
}
Пояснение:
Преподаватель с помощью галочек указывает расписание по которому формируется таблица журнал. Для таблицы типа экзамен нужно указать дату проведения экзамена. Остальные таблицы формируются подобным кодом, только не требуют ввода дополнительной информации.
Студент
Основная страница для студента с просмотром своих оценок
Рис. 7 Основная страница студента
Исходный код:
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);
}
Пояснение:
Студент может только просматривать свои оценки, выбирая разный семестр. Студент не видит таблицу с типом журнал.
Подача заявки на регистрацию студентом
Рис. 8 Форма подачи заявки на регистрацию, студентом
Исходный код:
[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 ())
Подобные документы
Теоретические основы Интернет-технологий и основных служб сети Интернет. Ознакомление с возможностями подключения к сети Интернет. Основные службы сети. Принципы поиска информации в WWW. Обзор современных Интернет браузеров. Программы для общения в сети.
курсовая работа [385,2 K], добавлен 18.06.2010Возможность использования новых информационных технологий в обучении студентов экономического профиля. Внедрение экономической деловой компьютерной игры "Никсдорф Дельта" для исследования экономических процессов в рамках Интернет-фестиваля "Поколение.RU".
реферат [12,0 K], добавлен 03.12.2008Предпосылки возникновения Глобальной информационной сети. Структура сети Интернет. Подключение к сети и адресация в Интернет. Семейство протоколов TCP/IP. Наиболее популярные Интернет-технологии. Технологии создания серверных частей Web-приложений.
реферат [575,8 K], добавлен 01.12.2007Средства разработки серверной части системы создания и управления сайтами в сети Интернет. Contester и STAGer - системы для проведения турниров и индивидуального решения задач по олимпиадному (спортивному) программированию. Архитектура "файл-сервер".
курсовая работа [1007,3 K], добавлен 21.05.2014Разработка тематических "онлайн-магазинов". Обоснование выбора информационных технологий. Архитектурное решение проекта. Разработка модели базы данных магазина. Схема базы данных на языке SQL. Интернет-магазины "ebay.com", "onliner.by", "eda.by".
курсовая работа [1,1 M], добавлен 24.06.2013Internet как мировой банк электронных данных. Развитие географии как научной дисциплины. Анализ моделей жизненного цикла программного продукта. Характеристика спиральной модели Боэма. Рассмотрение карты сайта "География для студента", создания web-сайта.
курсовая работа [2,7 M], добавлен 19.09.2012Обзор веб-приложений для реализации онлайн фитнес-системы поддержания физической формы человека. Диаграммы вариантов использования. Построение логической модели данных. Способы идентификации классов анализа. Разработка сценариев и макетов экранных форм.
дипломная работа [1,2 M], добавлен 02.08.2016Страницы сайтов как набор текстовых файлов, размеченных на языке HTML. Виды сайтов, их классификация. Характеристика сайта: статический или динамический. Проблема безопасности web-сайта. Исследование программного обеспечения и языков программирования.
дипломная работа [850,3 K], добавлен 11.01.2015Мультимедийное представление информации, аналоги платформ. Разработка структуры сайта, макетов страниц. Верстка шаблонов страниц. Написание серверной логики и кода презентаций. Публикация сайта в сети Интернет. Требования к интерфейсу пользователя.
дипломная работа [983,2 K], добавлен 17.12.2015История развития, принцип действия новых технологий в глобальной компьютерной сети Интернет: ADSL, IP-телефонии; их основные преимущества. Характеристика Российского интернета, перспективы его развития. Анализ динамики активности интернет-пользователей.
реферат [876,9 K], добавлен 04.01.2012