СОДЕРЖАНИЕ
Разработка систем управления проектами по средствам Web интерфейса
алгоритм интерфейс обработка информация
1.1 Описание и анализ существующих технологий управления проектами
1.2 Разработка модели систем управления проектами по средствам Web-интерфейса
1.3 Постановка задачи систем управления проектами посредством Web-интерфейса
2.1 Разработка систем управления
Объектом автоматизации является как информация по товарам и товарным
группам, так и сами сведения о товарах для обработки, учета, обмена и хранения.
Алгоритмическое обеспечение всех компонентов программы имеет значительные отличия, поскольку они несут различный функционал.
При первом входе пользователя в систему создаётся новый идентификатор
сессии. Сессия или session, позволяет серверу определить пользователя с помощью
специального номера, который уникален и назначается при работе пользователя с
сервером. Кроме того, сессии позволяют связывать переменные с этим
пользователем и хранить эти переменные на сервере. Другими словами сессии
позволяют делать переменные глобальными для всех компонентов программы. Таким
образом, система может однозначно определить, от кого из пользователей,
работающих с программой, пришли те или иные данные. Далее пользователь
добавляет описания литературы, или производит изменения уже имеющихся данных, и
только по окончании опроса все данные сохраняются в базе данных. Алгоритм
начала работы с системой (алгоритм авторизации) показан на рисунке 2.1.
![]()
Рис.
2.1 Алгоритм авторизации пользователя
Как видно из данного алгоритма, после ввода данных, по которым мы желаем авторизоваться в системе нас возникает 2 варианта, есть ли уже учетная запись в системе, или такой записи нет. Если записи нет - пользователю предлагается ее создать. Если пользователь отказывается регистрироваться в системе - пользователю выдается сообщение, что работа с программой не может быть продолжена и происходит выход из системы. В противном случае идет переход в подпрограмму регистрации пользователей и повторный ввод данных.
Общий же алгоритм работы программы представлен на рисунке 2.2:
Программное обеспечение состоит из набора PHP-скриптов.
Рис. 2.2 Общая схема работы системы
Пользователь отсылает запрос серверу на показ определенной страницы.
Сервер посредством правил транслирует адресную строку, переданную на сервер
пользователем в PHP-скрипт, и посылает в него набор переменных, выделенных из
строки запроса.исполняет скрипт. Скрипт взаимодействует с БД
(помещает/извлекает информацию, запускает хранимые процедуры и т. д.) и в
результате работы выдает HTML документ. Полученный HTML-документ передается в
качестве ответа клиенту, приславшему запрос.
MySQL версии 3.22 имеет предел по размеру таблиц 4 Гб. В MySQL версии 3.23, где используется новый тип таблиц, максимальный размер таблицы доведен до 8 миллионов терабайтов (2 63 bytes).
Однако следует заметить, что операционные системы имеют свои собственные
ограничения по размерам файлов. Ниже приведено несколько примеров (табл. 2.1).
Таблица 2.1 Примеры ограничений
|
Операционная система |
Ограничения на размеры файла |
|
32-разрядная Linux-Intel |
2Гб, 4Гб и более, в зависимости от версии Linux |
|
Linux-Alpha |
8T (?) |
|
Solaris 2.5.1 |
2 Гб (с патчем возможно 4Гб) |
|
Solaris 2.6 |
4Гб (может быть изменено при помощи указания флага) |
|
Solaris 2.7 Intel |
4 Гб |
|
Solaris 2.7 UltraSPARC |
512 Гб |
В Linux 2.2 существует возможность создавать таблицы с размерами более 2 Гб, используя патч LFS для файловой системы ext2. Существуют также патчи, обеспечивающие поддержку больших файлов для ReiserFS в Linux 2.4.
Как можно видеть, размер таблицы в базе данных MySQL обычно лимитируется операционной системой.
По умолчанию MySQL-таблицы имеют максимальный размер около 4 Гб. Для любой таблицы можно проверить/определить ее максимальный размер с помощью команд SHOW TABLE STATUS или myisamchk -dv table_name. See section 4.5.6 Синтаксис команды SHOW.
Если необходимы таблицы большего размера, чем 4 Гб (и используемая операционная система ``не возражает''), следует при создании такой таблицы задать параметры AVG_ROW_LENGTH и MAX_ROWS (see section 6.5.3 Синтаксис оператора CREATE TABLE). Эти параметры можно задать и позже - с помощью ALTER TABLE (see section 6.5.4 Синтаксис оператора ALTER TABLE).
Поскольку таблицы, обрабатываемые данной системой управления имеют
простую структуру, то превышение макисмальных возможностей обработки не
планируется.
Клиентская часть системы должна работать на IBM-совместимых персональных компьютерах.
Минимальная конфигурация клиентского оборудования:
- тип процессора - Pentium I 166 Mgz и выше;
- объем оперативного запоминающего устройства - 64 Мб и более;
- объем свободного места на жестком диске - 20 Мб.
Рекомендуемая конфигурация:
- тип процессора - Pentium IV 1.5 ГГЦ;
- объем оперативного запоминающего устройства - 512 Мб;
- объем свободного места на жестком диске - 500 Мб.
Минимальная конфигурация серверной части:
- тип процессора - Pentium III 1000 Mgz и выше
- объем оперативного запоминающего устройства - 256 Мб и более;
- объем свободного места на жестком диске - 50 Мб (без учета БД).
Рекомендуемая конфигурация:
- тип процессора - Pentium D 2.8 ГГЦ;
- объем оперативного запоминающего устройства - 2048 Мб;
- объем свободного места на жестком диске - 50 Мб (без учета БД).
Клиентская часть программы должна работать под Интернет браузерами IE 5 и выше, или аналогичных Opera, Mozilla Firefox. Используемая ОС при этом не должна иметь значения.
Серверная часть должна быть полностью совместима с СУБД MySQL v 5.0,
web-сервером Apache v. 2.2. под управлением ОС Hardened Gentoo Linux.
База данных состоит из 3 взаимосвязанных таблиц.
База данных магазина представлена в виде таблицы товаров. Организованной
по следующей схеме (табл. 2.2).
Таблица 2.2 Таблица товаров
|
Название |
Производитель |
Товарная группа |
Цена |
Количество |
|
333 |
Armani |
www |
1 |
1 |
|
Кардиган |
Bikkembergs |
Верхняя одежда |
2600 |
1 |
|
Туфли классические |
Calvin Klein |
Туфли |
3250 |
4 |
С помощью web- интерфейса пользователи могут добавлять и удалять товары, товарные группы и производителей. Данные возможности реализованы с помощью следующих функций.
Добавление производителя (addNewBrand.php):
<?php(isset($_POST['name']))
{
$newBrandName = strip_tags($_POST['name']);
_once($_SERVER['DOCUMENT_ROOT'].'/db/dbclass.php');
$db = new dbclass();
$db->prepare('INSERT INTO `brands`(`name`) VALUES
(:newName)');
{
$db->bind(':newName', $newBrandName);
$db->execute();
$response=array('status'=>'ok');
}(Exception $e)
{
$response=array('status'=>'error','msg'=>'Ошибка БД!');
}
}
{
$response=array('status'=>'error','msg'=>'Неизвестная ошибка!');
}(json_encode($response));
?>
Добавление новой товарной группы (addNewGroup.php):
<?php(isset($_POST['name']))
{
$newGroupName = strip_tags($_POST['name']);
_once($_SERVER['DOCUMENT_ROOT'].'/db/dbclass.php');
$db = new dbclass();
$db->prepare('INSERT INTO `groups`(`name`) VALUES
(:newName)');
{
$db->bind(':newName', $newGroupName);
$db->execute();
$response=array('status'=>'ok');
}(Exception $e)
{
$response=array('status'=>'error','msg'=>'Ошибка БД!');
}
}
{
$response=array('status'=>'error','msg'=>'Неизвестная ошибка!');
}(json_encode($response));
?>
Добавление нового товара
(addNewProduct.php):
<?php(isset($_POST['name']) && isset($_POST['brand']) && isset($_POST['group']) && isset($_POST['price']) && isset($_POST['count']))
{
$name = strip_tags($_POST['name']);
$brand = strip_tags($_POST['brand']);
$group = strip_tags($_POST['group']);
$price = strip_tags($_POST['price']);
$count = strip_tags($_POST['count']);
_once($_SERVER['DOCUMENT_ROOT'].'/db/dbclass.php');
$db = new dbclass();
$db->prepare('SELECT * FROM `brands` ORDER BY `id` ASC');
$db->execute();
$allBrands=array();($r=$db->fetch())
{
$allBrands[$r['id']]=$r['name'];
$db->prepare('SELECT * FROM `groups` ORDER BY `id` ASC');
$db->execute();
$allGroups=array();($r=$db->fetch())
{
$allGroups[$r['id']]=$r['name'];
}
$db->prepare('INSERT INTO
`products`(`name`,`price`,`group_id`,`group_name`,`brand_id`,`brand_name`,`count`)
VALUES (:name,:price,:groupId,:groupName,:brandId,:brandName,:count)');
{
$db->bind(':name', $name);
$db->bind(':price', $price);
$db->bind(':groupId', $group);
$db->bind(':groupName', $allGroups[$group]);
$db->bind(':brandId', $brand);
$db->bind(':brandName', $allBrands[$brand]);
$db->bind(':count', $count);
$db->execute();
$response=array('status'=>'ok');
}(Exception $e)
{
$response=array('status'=>'error','msg'=>'Ошибка БД!');
}
}
{
$response=array('status'=>'error','msg'=>'Неизвестная ошибка!');
}(json_encode($response));
?>
Удаление производителя (deleteBrand.php):
<?php(isset($_POST['id']))
{
$id = strip_tags($_POST['id']);
_once($_SERVER['DOCUMENT_ROOT'].'/db/dbclass.php');
$db = new dbclass();
$db->prepare('DELETE FROM `brands` WHERE `id`=:id');
{
$db->bind(':id', $id);
$db->execute();
$response=array('status'=>'ok');
}(Exception $e)
{
$response=array('status'=>'error','msg'=>'Ошибка БД!');
}
}
{
$response=array('status'=>'error','msg'=>'Неизвестная ошибка!');
}(json_encode($response));
?>
Удаление товарной группы (deleteGroup.php):
?php(isset($_POST['id']))
{
$id = strip_tags($_POST['id']);
_once($_SERVER['DOCUMENT_ROOT'].'/db/dbclass.php');
$db = new dbclass();
$db->prepare('DELETE FROM `groups` WHERE `id`=:id');
{
$db->bind(':id', $id);
$db->execute();
$response=array('status'=>'ok');
}(Exception $e)
{
$response=array('status'=>'error','msg'=>'Ошибка БД!');
}
}
{
$response=array('status'=>'error','msg'=>'Неизвестная ошибка!');
}(json_encode($response));
?>
Удаление товара (deleteProduct.php):
<?php(isset($_POST['id']))
{
$id = strip_tags($_POST['id']);
_once($_SERVER['DOCUMENT_ROOT'].'/db/dbclass.php');
$db = new dbclass();
$db->prepare('DELETE FROM `products` WHERE `id`=:id');
{
$db->bind(':id', $id);
$db->execute();
$response=array('status'=>'ok');
}(Exception $e)
{
$response=array('status'=>'error','msg'=>'Ошибка БД!');
}
}
{
$response=array('status'=>'error','msg'=>'Неизвестная ошибка!');
}(json_encode($response));
?>
Кроме того, реализована функция просмотра статистики продаж (saleItem.php):
<?php(isset($_POST['id']) && isset($_POST['count']))
{
$id = strip_tags($_POST['id']);
$count = strip_tags($_POST['count']);
_once($_SERVER['DOCUMENT_ROOT'].'/db/dbclass.php');
$db = new dbclass();
$db->prepare('SELECT * FROM `products` WHERE `id`=:id');
$db->bind(':id',$id);
$db->execute();($r = $db->fetch())
{
$name = $r['name'];
$brandId = $r['brand_id'];
$groupId = $r['group_id'];
$price = $r['price'];
}
$db->prepare('INSERT INTO `sales`(`id`,`name`,`brand_id`,`group_id`,`count`,`price`) VALUES(:id,:name,:brand,:group,:count,:price)');
{
$db->bind(':id', $id);
$db->bind(':name', $name);
$db->bind(':brand', $brandId);
$db->bind(':group', $groupId);
$db->bind(':count', $count);
$db->bind(':price', $price * $count);
$db->execute();
$db->prepare('UPDATE `products` SET `count`=`count`-:count WHERE `id`=:id');
$db->bind(':count',$count);
$db->bind(':id',$id);
$db->execute();
$response=array('status'=>'ok');
}(Exception $e)
{
$response=array('status'=>'error','msg'=>'Ошибка БД!');
}
}
{
Управление и обработка данными реализуется с помощью ролей. В данной системе управления представлены три роли: директор, товаровед и менеджер.
Роли обуславливают функциональные возможности обработки данных. Так, роли директора и товароведа доступно добавление, удаление товарных групп, товаров, производителей (приложение 1, 2).
Менеджеру доступно лишь удаление товаров путем реализации интерфейса
продажи (tpl_manager_main.php):
<div id="statusPanel">
<?php('<span>Добрый день, %s %s!</span>', $_SESSION['position'], $_SESSION['name']);
?>
<a style="float:right" href="/logout/">Выход</a>
</div>
<div style="margin: 20px 0 0 40px;">
<a href="/stat/">Посмотреть статистику</a>
</div>
<div id="workspace">
<?php($this->products as $k=>$v)
{('<div style="margin: 0 0 20px;float:left">
<p style="font-size:16px;color:#565656">%s > %s</p>
<p>%s</p>
<div style="width:150px;float:left;line-height:26px">%d руб.</div><div style="width:200px;float:left;line-height:26px">Доступно <span id="itemCountAllow_%d">%d</span> шт.</div>
<div style="float:left;line-height:26px">Кол-во <input type="text" style="width:30px" id="itemCountForSale_%d"><input type="button" value="Продать!" onclick="saleItem(%d)" id="saleItemBut_%d"></div>