ВКР-Автоматизация почтовых конверсий для веб-аналитики(Филипченко) (1218776), страница 5
Текст из файла (страница 5)
UML-диаграммы позволяет разработчикам программного обеспечение достигнуть соглашения для представления общих понятий (таких как класс, компонент и поведение) и больше сконцентрироваться на проектировании и архитектуре.
Преимущества UML диаграмм:
– UML объектно-ориентирован, в результате чего методы описания результатов анализа и проектирования семантически близки к методам программирования на современных объектно-ориентированных языках;
– UML позволяет описать систему практически со всех возможных точек зрения и разные аспекты поведения системы;
– UML-диаграммы просты для чтения после ознакомления с его синтаксисом;
– UML позволяет вводить собственные текстовые и графические стереотипы, что способствует его расширению охватываемых сфер представления;
– UML получил широкое распространение и динамично развивается [24].
Для подробного отражения работы системы функционала, необходимо разбить существующее представление о задаче на сущности, знаниями об представляемых объектов и соответственно составить UML – диаграмму классов.
Диаграммой классов называется статическая структурная диаграмма, описывающая структуру системы, демонстрирующая классы, их атрибуты, методы, наследование между классами [10].
Существуют различные точки зрения на построения диаграмм классов в зависимости от их применения.
В данной работе на этапе проектирования функционала необходимым шагом будет построение диаграммы классов с точки зрения реализации. Представим диаграмму содержащую используемые непосредственно в программном коде классы, при использовании объектно-ориентированного языка программирования PHP.
Из требований, накладываемых на разрабатываемый функционал, можно выделить следующие сущности:
– почтовые ящики (класс User);
– клиенты сайта (класс Email);
Также для взаимодействия представленных сущностей с базой данных необходимо проработать класс database.
Основываясь на работу функционала представленный на блок-схеме изображенном на рисунке 6 представим UML-диаграмму классов на рисунке 10.
Рисунок 10 – UML-диаграмма классов
Необходимо чтобы работа выполнялась в следующих этапах:
– клиенту, вошедшему на веб-сайт, выделяется индивидуальный почтовый ящик, который он может видеть, как контактный почтовый адрес предприятия. Идентификатор данного почтового адреса заносится в таблицу User;
– из небольшого фрагмента данных извлекается уникальный номер (ClientID) и заносится в таблицу User базы данных;
– осуществить создание ящика или выделение свободного ящик.
– необходимо с определенной периодичностью проводить актуализацию данных, а именно проверку на лимит по времени привязки почтового ящика и поступления сигнала о совершении отправки письма – конверсии;
– в случае совершения целевого действия происходил отправка уникального идентификатора клиента в Google Analytics;
– в случае превышения лимитного времени, происходила отвязка почтового адреса и удаления информации о клиенте;
– происходила переадресация письма на почтовый адрес менеджера предприятия.
3 Автоматизация процесса работы функционала отслеживания почтовых конверсий
После анализа средств реализации был сделан вывод, что будет создаваться программный функционал для отслеживания почтовых конверсий. В качестве средств реализации проекта будут использоваться возможности объектно-ориентированного языка программирования PHP в связке с СУБД MySQL, в качестве панели управления веб-хостингом будет использоваться ISPmanager и его инструментарий.
3.1 Реализация классов на PHP
При создании класса необходимо четко понять задачу, которую мы хотим представить. Часто построение класса является моделированием той сущности, которую необходимо перенести в код. Объект является отражением сущности, которая описана в виде класса. При моделировании класса стоит выявить те необходимые части сущности, над которыми будут производиться необходимые действия, с помощью методов. То есть необходимые части сущности являются полями класса, они как раз отражают данные, которые составляют общий тип данных. Этим тип объекта напоминает данные типа массив.
Методы выполняют разнообразные действия над данными. Методы следует проектировать так, чтобы они работали только с теми данными, которые определены в классе. Не рекомендуется определять методы, которые как-либо влияют на внешние данные. Так называемая стратегия слабого связывания - чем меньше связей между классами и внешними данными - тем проще извлечь класс из системы и повторно использовать его вновь [32].
Для работы данного программного функционала необходимо реализовать работу четырех классов: user, email, database, cron. Разберем данные классы по отдельности.
Класс (database) предназначен для работы с базой данных: соединения с базой данных, добавления записей в таблицы, произведения выборок из таблицы, подсчета строк результатов, производить изменения в таблице, удаления записей.
Реализация методов класса database:
Метод соединяет с сервером MySQL отправляя название сервера, имя пользователя базы данных, пароль.
public function connect() {
$connection = mysql_connect($this->db_host,
$this->db_user, $this->db_pass);
mysql_select_db($this->db_name);
return true;
}
Метод осуществляет выборку данных из таблицы. Метод принимает название таблицы и условия выборки.
protected function select($table, $where) {
$sql = "SELECT * FROM $table WHERE $where";
$result = mysql_query($sql);
return $this->processRowSet($result);
}
Результирующая информация выводится через метод результатом, которого будет ассоциативный массив данных.
protected function processRowSet($rowSet) {
$resultArray = array();
while($row = mysql_fetch_assoc($rowSet)) {
array_push($resultArray, $row);
}
return $resultArray;
}
Метод осуществляет обновления данных в таблице. Метод принимает название таблицы, данные которые необходимо занести в таблицу, и условие, при котором данное действие выполняется.
protected function update($data, $table, $where) {
$set = "";
foreach ($data as $column => $value) {
$set .= ($set == "") ? "" : ", ";
$set .= "$column = $value";
}
$sql = "UPDATE $table SET $set WHERE $where";
mysql_query($sql) or die(mysql_error());
return true;
}
Метод осуществляет добавление новой записи в таблицы. Метод принимает название таблицы и массив данных, которые необходимо занести в таблицу.
protected function insert($data, $table) {
$columns = "";
$values = "";
foreach ($data as $column => $value) {
$columns .= ($columns == "") ? "" : ", ";
$columns .= $column;
$values .= ($values == "") ? "" : ", ";
$values .= $value;
}
$sql = "insert into $table ($columns) value ($values)";
mysql_query($sql) or die(mysql_error());
return mysql_insert_id();
}
Метод осуществляющий удаление данных из таблицы и принимает название таблицы и условие удаления.
protected function remove($table, $where) {
$sql = "DELETE FROM $table WHERE $where";
mysql_query($sql) or die(mysql_error());
return true;
}
Данный класс является родительским классом для всех остальных классов. Методы имеют инкапсуляцию: protected. Взаимодействие с методами осуществляется только в классах наследниках.
Реализация методов класса user:
Метод осуществляет проверку на уникальность пользователя в таблице, в случае положительного результата, заносит в таблицу уникальный идентификатор пользователя, извлеченного из временных файлов на компьютере клиента.
function uniqueness($userId) {
$data = "userId = '$userId'";
$row = $this->num_rows('user', $data);
if ($row == 0) {
$data = array ("userId" => "'$userId'");
return $this->insert($data, 'user');}
else {
$result = $this->select('user', $data);
$result = $result[0];
$row = $result['id_user'];
return $row;
}
}
Присваивание уникального идентификатора производит отслеживающий код – набор программных команд на языке JavaScript.
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];
a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})
(window,document,'script','//www.google-analytics.com/analytics.js','ga');
Метод осуществляет проверку привязки почтового ящика к пользователю.
function check($id_user) {
$data = "id_user = '$id_user'";
$result = $this->select('user', $data);
$result = $result[0];
$row = $result['mail_id'];
if ($row == 0) {
return false;
}
else {
return $row;
}
}
Метод осуществляет привязку почтового ящика к пользователю.
public function assignment($id_user, $num_mail) {
$data = array ("mail_id" => "$num_mail");
$where = "id_user = $id_user";
$this->update($data, 'user', $where);
return true;
}
Метод осуществляет извлечение уникального идентификатора из временных файлов.
public function gaParseCookie() {
if (isset($_COOKIE['_ga'])) {
list($version,$domainDepth, $cid1, $cid2) = split("[\.]", $_COOKIE["_ga"],4);
$contents = array("version" => $version,
"domainDepth" => $domainDepth,
"cid" => $cid1.".".$cid2);
$cid = $contents['cid'];
}
return $cid;
return $this->gaGenUUID();
}
В случае если пользователь отключил функцию хранения временных файлов, во избежание ошибки генерируем случайное число для пользователя.
private function gaGenUUID() {
$cid = sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),
mt_rand( 0, 0xffff ),
mt_rand( 0, 0x0fff ) | 0x4000,
mt_rand( 0, 0x3fff ) | 0x8000,
mt_rand( 0, 0xffff ),mt_rand( 0, 0xffff ),mt_rand( 0, 0xffff ));
return $cid;
}
Реализация методов класса email:
Метод осуществляющий проверку наличия свободных ящиков в базе данных:
public function availability_free() {
$where = "status = 0";
if ($this->num_rows('email', $where) != 0) {
$result = $this->select('email', $where);
$result = $result[0];
$row = $result['id_mail'];
$where = "id_mail = $row";
$data = array ("status" => "1");
$this->update($data, 'email', $where);
return $row;
}
else {
return $this->create_mail();
}
}
В случае отсутствия свободных ящиков создает новый и сохраняет в базу данных. Через функцию file_get_contents отправка запроса на веб-хостинг на создание почтового ящика.
private function create_mail() {
$name = 'user';
$sql = "SELECT * FROM email";
$result = mysql_query($sql);
$num_rows = mysql_num_rows($result) + 1;
$name .= $num_rows;
file_get_contents("https://109.120.169.172:1500/manager?authinfo=".$this->db_user.":".$this->db_pass."&out=xml
&func=email.edit&elid=" "&sok=yes&name=".$name."&domain=".$this->domain."&passwd=".$this->passwd."&confirm=".$this->passwd."&forward=".$this->forward.""a=" 0);
$data = array ("name_mail" => "'$name@$this->domain'",
"status" => "1");
$this->insert($data, 'email');
return mysql_insert_id();
}
Метод возвращающий название привязанного к пользователю почтового ящика.
public function return_name_mail($num_mail) {
$where = "id_mail = $num_mail";
$result = $this->select('email', $where);
$result = $result[0];
$email = $result['name_mail'];
return $email;
}
Разберем подробно инструмент автоматического выполнения заданий на сервере cron.












