Создание обучающей системы с использованием интернет-технологий

Автор: Пользователь скрыл имя, 05 Марта 2013 в 10:01, дипломная работа

Описание работы

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

Содержание

Введение 6
1 Постановка задачи и обзор существующих решений 8
1.1 Требования к системам дистанционного обучения 8
1.2 Обзор некоторых существующих решений 9
1.3 Выбор и обоснование решения поставленной задачи 18
1.4 Основные преимущества и возможности системы 19
2 Разработка системы 20
2.1 Проектирование структуры системы 20
2.2 Создание базового приложения Rails 20
3 Реализация дополнительной функциональности и работа с системой 32
3.1 Идентификация пользователей 32
3.2 Контроль уровня доступа 33
3.3 Загрузка файлов на сервер и работа с ними 34
3.4 Работа с комментариями 36
3.5 Начальная настройка 36
3.6 Создание пользователя 37
3.7 Обслуживание системы 38
4 Технико-экономическое обоснование разработки клиент-серверного приложения «обучающая система с использованием интернет-технологий» 39
4.1 Краткая характеристика программного продукта 39
4.2 Расчет сметы затрат, себестоимости и отпускной цены ПО 39
4.3 Расчет экономического эффекта от применения ПО пользователем 48
4.4 Вывод 52
5 Реализация эргономических требований к конструкции и организации рабочего места в системе “человек - тех.средство” 53
5.1 Характеристика трудового процесса технического средства. Функции работника 53
5.2 Выбор и обоснование рабочего положения работника, рабочей поверхности, сидения (рабочего кресла) 54
5.3 Проектирование сенсомоторного поля рабочего места, т.е. пространства с размещенными в нем средствами отображения информации, органами управления и другими техническими средствами с учетом зон досягаемости 56
Заключение 61
Список использованных источников 62

Работа содержит 1 файл

Пояснительная записка 1.docx

— 339.89 Кб (Скачать)

В разрабатываемой системе  случае заголовок представления  следующий

<!DOCTYPE html>

<html>

<head>

  <meta charset="UTF-8" />

  <title><%= @page_title %></title>

  <%= stylesheet_link_tag :all %>

  <%= javascript_include_tag :defaults %>

  <%= csrf_meta_tag %>

</head>

Здесь описан стандартный HTML-элемент <HEAD>, в котором название страницы <TITLE> устанавливается переменной @page_title, которая передаётся контроллером. Далее идёт непосредственно тело HTML-документа в тэге <BODY>.

Для того, чтобы принять  решение, отображать ссылку на вход в  систему или вывести имя уже  вошедшего пользователя используется следующий код

<% if @user %>

<%= content_tag(:b, @user.first_name+' '+@user.second_name) %>

<%= link_to('Выйти из системы', {:controller => 'access', :action => 'logout'})%>

<% else %>

<%= link_to('Войти в систему', {:controller => 'access', :action => 'login'})%>

<% end %>

Здесь используется комманда content_tag, которая создаёт из полученной строки HTML-элемент в заданном тэге. Например

content_tag(:b, @user.first_name+' '+@user.second_name)

отобразит в тэге <B> результат  суммирования имени и фамилии  пользователя с пробелом между ними.

Операция link_to которая генерирует HTML-гиперссылку. В качестве параметров в неё передаётся отображаемый пользователю текст ссылки и хэш, в котором указывается, контроллер и метод, которому передаётся управление, а так же, при необходимости, дополнительные параметры. Например, следующий фрагмент кода

link_to('Войти в  систему', {:controller => 'access', :action => 'login'})

отобразит ссылку «Войти в  систему» которая передаст управление методу login контролера access.

Для отображения пользователю результатов его действий, например, сообщения об успешном создании какого-либо материала или об ошибке используется так называемый Flash. Для проверки его наличия и, при наличии, отображения используется следующий код

<% if !flash[:notice].blank? %>

  <div class="notice">

    <%= flash[:notice] %>

  </div>

<% end %>

Метод blank? проверяет, пуст ли элемент [:notice] в хэше flash, и если нет, то в тэге <%= flash[:notice] %> происходит его вывод в HTML-страницу.

2.3.6 Создание  представлений для отображения одной лекции

Рассмотрим создание представления  для отображения лекции. Сначала  с помощью метода content_tag(:div, content_tag(:p, @lecture.about), :class => 'about') выводятся текст-описание лекции. При этом текст будет заключён в тэг <P>, который, в свою очередь в тэг <DIV> со стилем about.

Затем идёт метод sanitize(@lecture.content, :tags => %w(b u ol ul il table tr td)) в котором происходит вывод лекции таким образом, что все HTML-тэги в тексте будут безопасно отображены в браузере с помощью escape-последовательностей. Список возможных для оформления тэгов, которые не будут заменены на escape-последовательности задаётся в списке :tags => %w(b u ol ul il table tr td).

Если в модели лекции имеется  приложенный файл, то отображается кнопка для скачки данного файла с указанием его размера.

<% if @lecture.filepath %>

  <% size = File.size(@lecture.filepath) / 1024%>

  <% if size < 1024 then m = "KB" else m = "MB" end %>

  <% size = (size / 1024) if size > 1023 %>

  <%= button_to "Скачать файл (#{size.to_s+m})", :action=>'download', :filepath => @lecture.filepath%>

  <%= file_view(@lecture.filepath)%>

<% end %>

Для проверки типа файла  и выбора соответствующего метода вывода используется метод file_view, который представляет собой так называемый Helper, и представляет собой какой-либо логически завершённый элемент программного кода, вынесенный в отдельный файл, которым можно воспользоваться в различных отображениях. Код file_view показан ниже

module LectureHelper

def file_view(string)

if string[0..13] == 'public/images/'

image_tag(string[14..-1])

elsif string[0..13] == 'public/videos/'

video_tag(string[14..-1], :controls => true, :autobuffer => true)

elsif string[0..13] == 'public/audios/'

audio_tag(string[14..-1], :controls => true)

else end  end end

2.3.7 Отображение  комментариев к лекции

После того, как все данные по лекции выведены, отображаются комментарии. Код

<% if @comments.count == 0 %>

К этой лекции нет  комментариев<br>

проверяет наличие комментариев к текущей лекции и если их нет, то выводит строку «К этой лекции нет комментариев», иначе выполняется следующий код

<% else %>

  <% @comments.each do |c| %>

Конструкция @comments.each do |c| выполняет следующий далее код для каждого элемента списка @comments как для переменной с. Сначала определяется автор комментария и выводится его имя в виде ссылки на пользователя и дата добавления комментария

    <% u = User.find_by_id(c.user_id) %>

    <%= link_to(u.first_name + ' ' + u.second_name, :controller => 'user', :action => 'show', :id => u.id) + ' ' + c.created_at.to_formatted_s(:db) %><br>

Затем отображается непосредственно  текст комментария

    <%= c.text %><br>

далее идёт проверка наличия  прав у текущего пользователя на удаление комментариев

    <% if @user.editor %>

и если пользователь имеет  права отображается кнопка для удаления комментария

      <%= button_to "Удалить комментарий", {:action=>'erase_comment', :comment_id => c.id}, :confirm => "Действительно удалить?"%>

    <% end %>

    <hr>

  <% end %>

<%end%>

После отображения всех комментариев показывается форма для создания нового комментария. Для её создания используется метод form_for, которому указывается модель, для которой создаётся комментарий и действие, которое надо выполнить при отправке данных формы. В данном случае это модель Comment, а действие: метод create_comment. В качестве дополнительных параметров передаётся :lecture_id => @lecture.id для создания связи комментария с лекцией и :user_id => session[:user_id] для хранения id пользователя, создавшего комментарий.

<%= form_for(:comment, :url => {:action => 'create_comment', :lecture_id => @lecture.id, :user_id => session[:user_id]}) do |f| %>

<br><%= f.text_area(:text) %><br><br>

  <div class='form_buttons'>

   <%= submit_tag("Добавить комментарий") %>

  </div>

<% end %>

2.3.8 Представление  для создания и редактирования  лекций

Как при создании, так  и при редактировании лекций (курсов, кафедр) используются одинаковые формы. Поэтому разумно вынести код  отображения форм в отдельный файл, а затем его использовать при операциях создании и редактирования данных.

Код форм для определенного  контроллера выносится в файл _form.html.erb.

Сначала идёт строка, в которой  выполняется команда render, выводящая  из папки :partial => 'shared/error_messages' специальное представление для вывода ошибок, если они есть. Выбор конкретного объекта, ошибки которого требуется отобразить, выполняется с помощью :locals => {:object => @lecture}

<%= render(:partial => 'shared/error_messages', :locals => {:object => @lecture}) %>

Затем следует перечисление элементов формы и их меток. Например f.select(:course_id, @courses.collect {|c| [c.name, c.id]}) отображает выпадающий список со всеми курсами, присутствующими в системе.

Курс:<br><%= f.select(:course_id, @courses.collect {|c| [c.name, c.id]}) %><br><br>

Название:<br><%= f.text_field(:name) %><br><br>

Описание:<br><%= f.text_area(:about, :rows => 10) %><br><br>

Текст:<br><%= f.text_area(:content, :cols => 60, :rows => 25) %><br><br>

Для оформления можно использовать html-тэги: <%='<p>, <i>, <u>'%><br><br>

<%= "Текущий  файл: #{@lecture.filepath}" if @lecture.filepath %><br>

Загрузить файл<%= " взамен текущего" if @lecture.filepath %>:<br><%= f.file_field :file %>

Вызов формы, вынесенной в  отдельный файл, из представления  осуществляется с помощью

<%= form_for(:lecture, :url => {:action => 'create', :course_id => @course.id}, :html => {:multipart => true}) do |f| %>

  <%= render(:partial => 'form', :locals => {:f => f}) %>

В этом коде, так же как  и в пункте 2.3.7 для комментариев, указывается параметры отправки формы. Кроме того render(:partial => 'form', :locals => {:f => f})определяет, из какого файла будет считана форма :partial => 'form', а так же какие локальные переменные будут ей переданы :locals => {:f => f}.

2.3.9 Создание  связей между объектами

Для создания и удобного иерархической структуры объектов, Rails предоставляет все необходимые  средства.

После того, как создан контроллер кафедры, можно приступать к созданию контроллера курсов, проводимых на конкретной кафедре. Здесь присутствует связь «один ко многим» (множество курсов принадлежат одной кафедре). Методом, описанным выше, создается модель Course (файл /app/models/course.rb).

Для реализации данной связи  необходимо в модель department.rb добавить строчку «has_many :courses». Стоит обратить внимание, что название файла модели пишется в одиночном числе, а при указании дочерней модели в связи «один ко многим» используется множественная форма (по правилам английского языка). Для создания второй части связи в файл модели course.rb добавляется строка «belongs_to :department».

Также необходимо произвести модификацию таблицы lectures в базе данных. Для этого создаётся миграция, которая добавляет поле «department_id» и делает его ключом. Связь «один ко многим» установлена также между курсами и лекциями, лекциями и комментариями.

Для того, чтобы при удалении родительского элемента в базе данных не оставались дочерние элементы без  родительских, перед удаление родительского элемента

Курс может быть создана  только внутри некоторой кафедры, поэтому  ссылка на создание курса расположена  в представлениях кафедры, где к  форме создания добавляется параметр «department_id».

Связь «многие ко многим»  реализуется с некоторыми изменениями. В моделях прописываются строки «has_and_belongs_to_many :secondmodels» для Firstmodel и «has_and_belongs_to_many :firstmodels» для Secondmodel. Кроме того, создаётся отдельная таблица с именем «firstmodels_secondmodels» с двумя полями «firstmodel_id» и «secondmodel_id» с помощью которых и осуществляется связь «многие ко многим». Подобным образом реализована связь между пользователями и их учебными курсами.

 

3 Реализация дополнительной  функциональности и работа с  системой

3.1 Идентификация пользователей

Для обеспечения доступа  к административным и редакторским функциям необходимо идентифицировать пользователей и в зависимости  от привилегий пользователя принимать  решение о предоставлении ему  тех или иных функций.

Наиболее широко распространённым средством идентификации является идентификация по имени пользователя и пароля. При входе в систему не идентифицированный пользователь вводит своё имя и пароль, которые сравниваются с хранящимися в базе данных. Если есть полное совпадение, то идентификация подтверждается, из базы данных загружаются пользовательские данные и устанавливается сессия связи с браузером, которая хранит подтверждение идентификации пользователя в течении сеанса работы.

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

Очевидным решением является шифрование паролей, превращая их в  хэши, которые и хранятся в базе данных. Некоторое время назад наиболее распространённым методом шифрования являлся алгоритм MD5, однако в нём была найдена уязвимость, позволяющая довольно быстро подобрать строку, MD5-хэш которой будет идентичен имеющемуся в базе. Поэтому на данный момент используются гораздо более стойкие к взлому алгоритмы SHA1 и SHA2.

Однако простое шифрование пароля не может гарантировать его  высокую сохранность. Так как  многие пользователи составляют довольно предсказуемые пароли, злоумышленники создают так называемые «радужные таблицы» в которых хранятся списки всевозможных паролей и их хэши, и если паролю пользователя есть соответствие в «радужных таблицах», то он может быть легко взломан.

Поэтому применяют так  называемое «соление» паролей. В  этом случае пароль, устанавливаемый пользователем, модифицируется случайными данными («солью») по определённому алгоритму. «Соль» хранится в базе данных и при каждой попытке авторизации введённый пароль модифицируется тем же образом и той же «солью», поэтому для пользователя этот процесс полностью прозрачен.

Процесс авторизации реализован в файле класса User – /app/models/user.rb.

Метод «make_salt» создаёт  соль на основе текущего времени и  имени пользователя. «hash_with_salt» с  помощью подключаемой функции шифрует  модифицированный пароль по алгоритму SHA1. Метод «authentificate» проверяет  соответствие введённых имени пользователя и пароля оригинальным, и в случае успеха возвращает экземпляр класса User. Ниже приведены исходные коды методов «make_salt», «hash_with_salt», и «create_hashed_password»:

  def self.make_salt(login="")

Digest::SHA1.hexdigest("Use #{login} with #{Time.now} to make salt")

  end

    def self.hash_with_salt(password="", salt="")

    Digest::SHA1.hexdigest("Put #{salt} on the #{password}")

  end

    private

    def create_hashed_password

    unless password.blank?

      self.salt = User.make_salt(login) if salt.blank?

      self.hashed_password = User.hash_with_salt(password, salt)

    end

  end

3.2 Контроль уровня доступа

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

Первый метод работает в представлениях с помощью оператора  «if» решая, отображать данную ссылку или нет. Например строка «<%= link_to 'Редактировать курс', {:controller => 'course', :action => 'edit', :id => c.id} if @user.editor %>» отобразит ссылку «Редактировать курс» только в том случае, если пользователь @user имеет поле «editor» равное истине.

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

Например, метод «before_filter :confirm_logged_in» в контроллере lecture_controller.rb означает, что доступ ко всем методам контроллера будет дан только в случае прохождения метода «confirm_logged_in». Этот метод проверяет, зарегистрирован ли текущий пользователь, и используется практически во всех контроллерах, поэтому для повторного использования вынесен в контроллер application_controller.rb, потомком которого являются все остальные контроллеры.

Информация о работе Создание обучающей системы с использованием интернет-технологий