Допустить к защите
« » ____________________
ДИПЛОМНЫЙ ПРОЕКТ
Консультанты:
2008г.
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ДОПОЛНИТЕЛЬНОГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
МОСКОВСКИЙ ЭЛЕКТРОННО-ТЕХНОЛОГИЧЕСКИЙ ТЕХНИКУМ
ГОСУДАРСТВЕННОЙ АКАДЕМИИ ИННОВАЦИЙ
«УТВЕРЖДАЮ»
Зам. директора по учебной работе.
______________________________
«______» _______________ 2008 г.
ЗАДАНИЕ
НА ДИПЛОМНЫЙ ПРОЕКТ
— реквизиты совещания.
СОДЕРЖАНИЕ
Введение.......................................................................................................................5
1 Общая часть..............................................................................................................6
1.1 Постановка задачи.............................................................................................6
1.1.1 Назначение задачи......................................................................................6
1.1.2 Технико-математическое описание задачи...............................................6
1.1.3 Требования к программе..........................................................................12
1.1.4 Требования к составу и параметрам технических средств...................12
1.2 Описание языка программирования..............................................................14
1.2.1 Выбор языка программирования............................................................14
1.2.2 Элементы языка программирования.......................................................15
2 Специальная часть..................................................................................................32
2.1 Описание алгоритма........................................................................................32
2.1.1 Схемы алгоритма......................................................................................32
2.1.2 Описание работы программы..................................................................38
2.2 Текст программы.............................................................................................44
2.2.1 Схема базы данных (файл db/schema.rb)................................................44
2.2.2 Контроллеры системы..............................................................................44
2.2.3 Модели системы.......................................................................................49
2.3 Инструкция на выполнение программы........................................................50
2.3.1 Общие сведения........................................................................................50
2.3.2 Вызов и загрузка.......................................................................................50
2.3.3 Входные данные........................................................................................51
2.3.4 Выходные данные.....................................................................................51
2.3.5 Сообщения программы............................................................................51
2.3.6 Техника безопасности при работе на компьютере................................52
2.4 Описание процесса отладки программы.......................................................53
2.4.1 Методы отладки........................................................................................53
2.4.2 Тестирование.............................................................................................55
4
RU.МЭТТ.18108-01 84 01
ВВЕДЕНИЕ
Разработка системы ведения и учета протоколов совещаний ведется на
основании приказа ФГОУ ДПО МЭТТ ГАИ № 43-С от 04.04.08 «Об утверждении
тем дипломных проектов, о назначении руководителей дипломных проектов».
1 ОБЩАЯ ЧАСТЬ
— технология ORM[4];
— формат RSS[6].
1.1.2.2.1 Принципы
1.1.2.2.2 Архитектура
1.1.2.2.3 Интеграция
Ruby on Rails может работать с Apache, Lighttpd или любым другим веб-
сервером, поддерживающим FastCGI. Для разработки и отладки часто используется
встроенный в Ruby веб-сервер WEBrick или Mongrel.
Windows;
– сетевая карта;
– видеокарта;
– клавиатура;
– монитор;
– сетевая карта;
Такие языки программирования, как C, C++, C#, Pascal, Delphi, BASIC, Java и
другие C-подобные даже не рассматривались в виду низкой продуктивности при
разработке веб-приложений.
1.2.2.4 Числа
Существуют следующие формы задания чисел: 123, 1_234, 123.45, 1.2e-3,
0xffff (шестнадцатеричное), 0b01011 (двоичное), 0377 (восьмеричное).
1.2.2.5 Строки
Существуют следующие формы задания строк:
1.2.2.7 Диапазоны
Используются следующие формы задания диапазонов:
— 1..10;
— 'a'..'z';
— | альтернатива;
— \A начало строки;
— \b граница слова;
— \B не граница слова;
— \z конец текста;
— (?# ) комментарий;
1.2.2.9 Массивы
Массивы могут быть заданы одним из следующих способов:
— [1, 2, 3];
1.2.2.10 Словари
Словари (они же ассоциативные массива, они же хеши) могут быть заданы
одним из следующих способов:
1.2.2.11 Файлы
Работа с файлами осуществляется при помощи следующих методов:
— File.new(path,modenum[,permnum])> file/li>;
1.2.2.13 Переменные
— $global_variable глобальные переменные;
— [OtherCLass::]CONSTANT константа
1.2.2.14 Псевдопеременные
— self возвращает указатель на текущий объект;
— $$ id процесса интерпретатора;
1.2.2.17 Выражения
Элементом выражения могут быть базовые типы (см. выше), команда shell,
переменная, константа или вызов метода.
— [];
— **;
— - (унарный), + (унарный), !, ~;
— *, /, %;
— +, -;
— <<, >>;
— &;
— |, ^;
— &&;
— ||;
— .., ...;
— = (+=, -= ...);
— not;
— and, or.
25
RU.МЭТТ.18108-01 84 01
if логическое_выражение [then]
программный_код
elsif логическое_выражение [then]
программный_код
else
программный_код
end
программный_код if логическое_выражение
case выражение_для_проверки
when шаблон [, шаблон]... [then]
программный_код
when шаблон [, шаблон]... [then]
программный_код
[else
программный_код]
end
begin
программный_код
end while логическое_выражение
begin
программный_код
end until логическое_выражение
— method;
27
RU.МЭТТ.18108-01 84 01
— obj.method;
— Class::method;
— method(arg1, arg2);
— method(arg1, key1 => val1, key2 => val2, aval1, aval2) #{ блок };
— методы могут переопределять операторы: .., |, ^, &, <=>, ==, ===, =~, >,
>=, <, <=, +, -, *, /, %, **, <<, >>, ~, +@, -@, [], []= (2 аргумента).
Могут использоваться как для явного указания имен методов так и для
разделения класса на "области доступа".
class A
protected
def protected_method
# ничего
end
end
class B < A
public
def test_protected
myA = A.new
myA.protected_method
29
RU.МЭТТ.18108-01 84 01
end
end
b = B.new.test_protected
1.2.2.26 Псевдонимы
alias старое_название, новое_название
1.2.2.27 Блоки/замыкания
Блоками являются следующие конструкции:
— do ... end;
— { ... }.
1.2.2.28 Лямбда-методы
Создаются одним из следующих способов:
— Kernel#proc;
— Proc#new;
2 СПЕЦИАЛЬНАЯ ЧАСТЬ
2.1 Описание алгоритма
View View
Control Control
33
RU.МЭТТ.18108-01 84 01
Авторизация и
аутентификация
Ожидание
события
управлять Управление
совещаниями совещаниями
управлять Управление
списком списком
сотрудников сотрудников
управлять Управление
списком списком
должностей должностей
выйти из режима
администрирования
ОСТАНОВ
34
RU.МЭТТ.18108-01 84 01
Вывод
информации о
совещаниях
Ожидание
события
добавить Добавление
совещание нового совещания
отменить
Отмена совещания
совещание
перенести Перенос
совещание совещания
выход
ОСТАНОВ
35
RU.МЭТТ.18108-01 84 01
Ввод реквизитов
нового
совещания
Выбор
участников
совещания
Добавление нового
совещания
ОСТАНОВ
Изменение
реквизитов
совещания
Перенос совещания
ОСТАНОВ
36
RU.МЭТТ.18108-01 84 01
Вывод списка
сотрудников
Ожидание
события
удалить Удаление
сотрудника сотрудника
Ввод реквизитов
добавить
нового
сотрудника
сотрудника
Добавление нового
сотрудника
выход
ОСТАНОВ
37
RU.МЭТТ.18108-01 84 01
Вывод списка
должностей
Ожидание
события
удалить Удаление
должность должности
Добавление новой
должности
выход
ОСТАНОВ
38
RU.МЭТТ.18108-01 84 01
reports
PK id
users
posts
PK id date
PK id theme
surname question
post name FK1 user
created_at otchestvo report
updated _at FK1 post cancel
e_mail transfer
created_at transfer_date
updated_at finish
created_at
updated_at
t.datetime "created_at"
t.datetime "updated_at"
end
end
def index
@reports=Report.find(:all)
for z in @reports
z.update_attribute(:finish, true) if (z.date<Time.now)
if (!z.transfer_date.nil?)
z.update_attribute(:finish, true) if (z.transfer_date<Time.now)
z.update_attribute(:finish, false) if (z.transfer_date>Time.now)
end
end
45
RU.МЭТТ.18108-01 84 01
@list1=Report.find(:all,:conditions => {:report => nil, :finish => false ,:cancel =>
false},:order => "date",:limit =>15)
@list2=Report.find(:all,:conditions => {:report => nil, :transfer => true, :finish =>
false,:cancel => false},:order => "date")
@list3=Report.find(:all,:conditions => {:report => nil, :cancel => true, :finish =>
false},:order => "date",:limit =>15)
end
def list
@reports=Report.find(:all)
for z in @reports
z.update_attribute(:finish, true) if (z.date<Time.now)
if (!z.transfer_date.nil?)
z.update_attribute(:finish, true) if (z.transfer_date<Time.now)
z.update_attribute(:finish, false) if (z.transfer_date>Time.now)
end
end
@lists=Report.find(:all,:order => "date DESC")
end
def show
@lists=Report.find(:all,:conditions => {:id => params[:id]})
end
end
def create
@users = User.find(:all, :order => "post")
flash[:err1]=""
flash[:err2]=""
flash[:err3]=""
if request.post?
@reports = Report.new
@reports.date=DateTime.parse(params[:date][:year]+"-"+params[:date][:month]
+"-"+params[:date][:day]+" "+params[:date][:hour]+":"+params[:date][:minute])
@reports.theme=params[:theme]
@reports.question=(1..flash[:i]).to_a.map{|x|params[:"arg#{x}"]}.map{|x| (x=="")?(nil):
(x)}.compact.join("/*/")
@reports.user=(0..flash[:jim]).to_a.map{|x|params[:"box#{x}"]}.map{|x| (x=="")?(nil):
46
RU.МЭТТ.18108-01 84 01
def edit
@report1=Report.find(:all)
for z in @report1
z.update_attribute(:finish, true) if (z.date<Time.now)
if (!z.transfer_date.nil?)
z.update_attribute(:finish, true) if (z.transfer_date<Time.now)
z.update_attribute(:finish, false) if (z.transfer_date>Time.now)
end
end
if request.post?
@report1=Report.find(flash[:transf])
@report1.update_attribute(:transfer_date, DateTime.parse(params[:date][:year]
+"-"+params[:date][:month]+"-"+params[:date][:day]+" "+params[:date][:hour]
+":"+params[:date][:minute]))
@report1.update_attribute(:transfer, true)
redirect_to :action => 'edit'
end
@report1=Report.find(:all,:conditions => {:report => nil},:order => "date DESC")
end
def report
@report2=Report.find(params[:id]).question.split("/*/")
if request.post?
47
RU.МЭТТ.18108-01 84 01
if (!params[:rep1].blank?)
@report2=Report.find(params[:id])
@report2.update_attribute(:report, params[:rep1])
redirect_to :action => 'edit'
else
flash[:err]="Отчет не может быть пустым!!!"
end
end
end
def field
end
def destroy
@destroy = Report.find(params[:id].to_i).destroy
redirect_to :action => 'edit'
end
def cancel
@report2=Report.find(params[:id].to_i)
@report2.update_attribute(:cancel, true)
redirect_to :action => 'edit'
end
def datetime
end
end
def list
@report1=Report.find(:all)
for z in @report1
z.update_attribute(:finish, true) if (z.date<Time.now)
if (!z.transfer_date.nil?)
z.update_attribute(:finish, true) if (z.transfer_date<Time.now)
z.update_attribute(:finish, false) if (z.transfer_date>Time.now)
end
end
@time_table=Report.find(:all,:conditions => {:report => nil, :finish => false},:order =>
48
RU.МЭТТ.18108-01 84 01
"date",:limit =>30)
end
end
def index
end
def post
@post2 = Post.new(params[:post2])
flash[:err]=""
if request.post?
if (@post2.post.blank?)
@post2.post=""
flash[:err]="Это поле не может быть пустым!"
end
redirect_to :action =>:post if (@post2.save)
end
@post1 = Post.find(:all)
end
def user
@user1 = User.find(:all)
end
def new_user
flash[:err1]=""
flash[:err2]=""
flash[:err3]=""
flash[:err4]=""
@post = Post.find(:all).map{|x| [x.post,x.post]}
@user2 = User.new(params[:user2])
if request.post?
if (@user2.surname.blank?)
@user2.surname=""
flash[:err1]="Поле не может быть пустым"
end
49
RU.МЭТТ.18108-01 84 01
if (@user2.name.blank?)
@user2.surname=""
flash[:err2]="Поле не может быть пустым"
end
if (@user2.otchestvo.blank?)
@user2.otchestvo=""
flash[:err3]="Поле не может быть пустым"
end
if (!@user2.e_mail[/\S+@\S+[.]\S+/])
flash[:err4]="Введен не верный Е-mail"
end
redirect_to :action =>:user if (@user2.save)
end
end
def destroy
@destroy = Post.find(params[:id].to_i).destroy if params[:break]=='post'
@destroy = User.find(params[:id].to_i).destroy if params[:break]=='user'
redirect_to :action => params[:break]
end
end
def index
if request.post?
cookies[:pass]=params[:pass]
redirect_to :controller => 'conference',:action => 'edit'
end
end
end
2) Список сотрудников.
Для базы данных системы может быть использована любая СУБД из списка
поддерживаемых программным каркасом Ruby on Rails.
1) Вопросы системы.
2.4.2 Тестирование
Процесс выполнения программы с целью обнаружения ошибок называется
тестированием.
— тестирование эргономичности;
Рисунок 1
После запуска веб-обозревателя необходимо набрать адрес по которому
запущена серверная часть. В нашем случае адрес будет выглядеть как http://localhost:
3000/ . Если при обращении к этому адресу происходит ошибка, то проверьте
правильность набранного адреса и удостоверьтесь в том, что серверная часть
системы работает. В крайнем случае попытайтесь запустить серверную часть
системы еще раз.
Рисунок 2
На этой странице располагается вся необходимая информация о предстоящих
совещаниях. Для каждого из предстоящих совещаний выводиться следующая
информация:
— тематика совещания;
Рисунок 3
62
RU.МЭТТ.18108-01 84 01
Рисунок 4
Рисунок 5
Рисунок 6
Наш веб-обозреватель назвал интерфейс нашей системы в формате RSS не
иначе, как «веб-канал» и предложил на него подписаться.
рис. 7).
Рисунок 7
Как только мы ввели адрес нашего «веб-канала», следует нажать на кнопку
«Next» (следующий). Появится следующий слайд (см. рис. 8) на котором нам
предложат ввести название нашего «веб-канала».
Рисунок 8
Обратите внимание, что загруженная информация оформлена совсем не так,
как на рисунке 6, что свидетельствует о том, что интерфейс определяет RSS-
агрегатор FeedDemon, а не «веб-канал».
Рисунок 9
68
RU.МЭТТ.18108-01 84 01
3 ЭКОНОМИЧЕСКАЯ ЧАСТЬ
Руководитель проекта:
— Тэ = 5 * 8 = 40 час/месяц;
Программист:
— Тэ = 22 * 8 = 176 час/месяц;
Персональный компьютер:
70
RU.МЭТТ.18108-01 84 01
Офисная мебель:
Потолочная лампа:
Настольная лампа:
Модем:
Принтер/сканер/копир:
Отчисления в ЕСН:
Аренда помещения:
— по курсу 1$ = 27 руб.;
Налог на имущество:
Освещение:
72
RU.МЭТТ.18108-01 84 01
Отопление:
— праздники = 11 дней;
— Vвып_одного_дубликатора = 87 дисков/час;
Окончание таблицы 7
Статья затрат Единица Оптовая цена, Количество Сумма, руб.
измерения руб.
Коробка под DVD шт. 2,10 696000 1461600
диск
Полипропиленовая м2 10 12429 124290
пленка для дисков
Вкладыш для шт. 3,40 696000 2366400
диска бумажный
Черная лента для шт. 1499 230 344770
термопринтера
трехцветная лента шт. 2999 424 1271576
для термопринтера
Картриджи для шт. 114,40 220 25168
фотопринтера
«Epson» (8 цветов)
Стандартный шт. 2678 50 133900
картридж для
«Xerox»
Картонная коробка шт. 1,40 3867 5413,80
Упаковочная лента шт. 6 194 1164
Канцелярские - - - 30000
расходы
Итого: 9895575,80
Окончание таблицы 8
Должность Количество Оклад в Премия 40%, Годовая сумма,
человек месяц, руб. руб. руб.
Менеджер по 2 30000 - 720000
управлению
персоналом
Графический 1 26000 - 312000
дизайнер
Системный 2 23000 - 552000
администратор
Работник цеха 8 16000 - 1536000
Упаковщик- 2 16000 - 384000
грузчик
Водитель 1 22000 - 264000
грузовика
Охранник 2 22000 - 528000
Уборщица 2 12000 - 288000
Итого: 6264000
Аренда помещения:
76
RU.МЭТТ.18108-01 84 01
— по курсу 1$ = 27 руб.;
Электроэнергия:
Отопление:
Горюче-смазочные материалы:
250 / 4 = 63 дня/год;
Налог на имущество:
Окончание таблицы 10
Статья расходов Единица Сумма, руб. Удельный вес, %
измерения
Цеховые расходы руб. 15348895,76 45,54
Амортизация руб. 429059,50 1,27
оборудования
Расходы на руб. 131173,23 0,39
разработку системы
Итого условно постоянные расходы: 15909128,49 -
Всего полная себестоимость: 33706524,29 100
Прибыль руб. 49813475,71 147,79
предприятия
Товарная продукция руб. 83520000 -
НДС – 18% руб. 15033600 -
Свободная руб. 98553600 -
отпускная цена за
весь выпуск
Расчеты к таблице 10:
4,83
Материалы
18,58 Электроэнергия
45,54
Фонд оплаты труда
ЕСН
0,03
Цеховые расходы
Амортизация оборудования
Рисунок 10
Определение точки безубыточности аналитическим методом:
— ТП = 83520000 руб.;
— V = 696000 шт.;
— П = 49813475,71 руб.;
— Дм = а + П = 65722604,20 руб.;
90
ТП
83,5
80
70
60
П
50
40
33,7
30
Тбу ∑b
20,2
20
c/cп
15,9
10
a
0 696
0 100
168,5
200 300 400 500 600 700 V (тыс.шт)
Рисунок 11
90
ТП
83,5
80
70
60
П
50 Дм
40
33,7
30
a
20,2
Тбу
20
17,8
10 ∑b
0 696
0 100
168,5
200 300 400 500 600 700 V (тыс.шт)
Рисунок 12
80
RU.МЭТТ.18108-01 84 01
Прибыль (млн.руб)
60
50
49,8
40
30
20
10
Тбуv
0
696 V (тыс.шт)
0 100 168,5 200 300 400 500 600 700
-10
-16
-20
-30
-40
-50
-60
Убытки
Рисунок 13
3.2.11 Определение критической суммы товарной продукции графическим
методом
Прибыль (млн.руб)
60
50
49,8
40
30
20
10
Тбутп
0
0 20
20,2
40 60 80
83,5
100
ТП (млн.руб)
-10
-16
-20
-30
-40
-50
-60
Убытки
Рисунок 14
81
RU.МЭТТ.18108-01 84 01
Т а б л и ц а 11 — технико-экономические показатели
Наименование показателя Единица Величина
измерения показателя
Объем производства шт. 696000
Товарная продукция без НДС руб. 83520000
НДС 18% руб. 15033600
Товарная продукция с НДС руб. 98553600
Годовой фонд оплаты труда руб. 6264000
Численность персонала чел. 23
Производительность труда (штук) шт/чел. 30261
Производительность труда (рублей) руб/чел. 4284939,13
Среднемесячная заработная плата одного руб. 272347,83
сотрудника
Полная себестоимость ТП руб. 33706524,29
Затраты на 1 рубль товарной продукции коп. 40
Прибыль производства руб. 49813475,71
Рентабельность производства % 147,79
Критический объем производства шт. 168477
Критический объем товарной продукции руб. 20217251,40
Отпускная цена предприятия руб/ед. 120
Свободная отпускная цена с НДС руб/ед. 141,60
Расчеты к таблице 11:
3.3 Вывод
Производство системы при незначительных затратах на разработку способно
приносить неплохие прибыли. Рентабельность производства при максимальных
затратах равна 147,79%, но у этого бизнеса есть огромный недостаток –
непостоянство производимой продукции. В условиях бесперебойного выпуска
продукции возникает проблема сбыта и тут может помочь только смена
производимого программного продукта.
83
RU.МЭТТ.18108-01 84 01
ЗАКЛЮЧЕНИЕ
В результате дипломного проектирования были выполнены все требования
задания на дипломное проектирование. В дальнейшем, в системе планируется
осуществить возможность рассылки уведомлений о создании совещания (в котором
должен принять участие адресат) и начале совещания (или за 10-15 минут до
времени начала) по электронной почте. Также планируется добавить более удобный
редактор протоколов совещаний, переработать интерфейс пользователя и провести
глубокую переработку исходного кода (чтобы повысить его читабельность и
увеличить способность к дальнейшему масштабированию системы).
84
RU.МЭТТ.18108-01 84 01