Социальная сеть

Анализ структуры социальной сети. Рассмотрение основных функций автоматизированной информационной системы: регистрация и аутентификация пользователей, администрирование. Этапы разработки программно-информационного компонента. Назначение web-сервисов.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 27.10.2012
Размер файла 2,3 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

$tid = (int)$_POST['tid'];

$title = trim($_POST['title']);

$message = trim($_POST['message']);

//echo 'Message: '.$message.'<br />';

//echo 'AFTER mysql_real_escape_string: '.$message.'<br />';

$message = strip_tags($message, '&');

//echo 'NOW: '.$message.'<br />';

$title = strip_tags($title, '&');

$id = $_SESSION['user_id'];

$same_user = true;

$no_user = false;

include '../head.php';

include '../menu.php';

$error = false;

$ert = '';

if ($id == $tid)

{

$error = true;

$ert .= 'Вы не можете послать сообщение самому себе';

}

if (empty($message))

{

$error = true;

$ert .= 'Не введен текст сообщения';

}

if (empty($tid))

{

$error = true;

$ert .= 'Не заполнено поле получателя';

}

else

{

$q = "select login from users where id={$tid}";

$r = mysql_query($q);

if (mysql_num_rows($r) == 0)

{

$error = true;

$ert .= 'Пользователя с введенным Вами id не существует';

}

}

?>

<div id="rightCol">

<?

if (!$error)

{

// отсылка сообщения

$query = "INSERT INTO pm

VALUES

(

NULL,

{$id},

{$tid},

'".mysql_real_escape_string( $title )."',

'".mysql_real_escape_string( $message )."',

NOW(),

0

)";

echo $query;

$r = mysql_query($query);

echo '<div class="OKMessage">Сообщение успешно отослано</div>';

}

else {

echo '<div class="errMessage">Во время отправки произошли следующие ошибки:<br />'.nl2br($ert).'</div>';

}

?>

</div>

<div id="bottom"></div>

</div>

<?

include '../foot.php';

?>

Пользователь имеет возможность просмотра отправленных и полученных сообщений. Для примера приведен фрагмент формы просмотра входящих сообщений на рисунке 12. С помощью AJAX данные подгружаются без перезагрузки страницы.

Рис. 12

Код просмотра входящих сообщений практически полностью идентичен просмотру входящих. Просмотр списка в целом выглядит так:

<?

session_start();

if (!isset($_SESSION['user_id']))

{

header('Location: /soc/index.php?page='.$_SERVER["PHP_SELF"]);

//die('Доступ закрыт, даём ссылку на авторизацию. -- <a href="login.php">Авторизоваться</a>');

}

include '../mysql.php';

$id = $_SESSION['user_id'];

$same_user = true;

$no_user = false;

include '../head.php';

include '../menu.php';

?>

<div id="rightCol">

<h3>Входящие</h3>

<script language="JavaScript" type="text/javascript">

<!--

function see_mail(id)

{

$("#showMail").load("message.php", {'mess_id':id});

}

//-->

</script>

<table class="messTable">

<tr class="he"><td>Получатель</td><td>Сообщение</td><td>Отправлено</td><td>Действия</td></tr>

<?

function my_str_word($text, $counttext = 10, $sep = ' ') {

$words = split($sep, $text);

if ( count($words) > $counttext )

$text = join($sep, array_slice($words, 0, $counttext)).'...';

return $text;

}

$query = "SELECT a.id_mess, a.title, a.message, DATE_FORMAT(a.dt,'%d.%m.%Y %H:%i:%s'), b.nick, a.fid

FROM pm a INNER JOIN user_details b

ON a.fid=b.id

WHERE a.tid={$id}

AND rid<>{$id}

ORDER BY dt DESC";

//echo $query;

$res = mysql_query($query);

if (mysql_num_rows($res) == 0)

{

print "<tr>

<td colspan=\"4\">В этой папке нет сообщений</td>

</tr>";

}

else {

while ($mess = mysql_fetch_row($res))

{

$cuttext = my_str_word($mess[2]);

print "<tr><td class=\"messSender\">

<a href=\"/soc/profile.php?id=$mess[5]\">$mess[4]</a>

</td>

<td>

<div class=\"messTheme\">$mess[1]</div>

<div class=\"messBody\"><a href=\"#\" onClick=\"see_mail($mess[0])\">".nl2br($cuttext)."</a></div>

</td>

<td class=\"messDate\">

$mess[3]

</td>

<td class=\"messActs\">

<div><a href=\"write.php?tid=$mess[5]&message=$mess[2]&title=$mess[1]\">Ответить</a></div>

<div><a href=\"del.php?id=$mess[0]\">Удалить</a></div>";

echo "</tr>";

}

}

?>

</table>

<div id="showMail"></div>

</div>

<div id="bottom"></div>

</div>

<?

include '../foot.php';

?>

Просмотр текущего сообщения делается так:

<?

session_start();

if (!isset($_SESSION['user_id']))

{

header('Location: /soc/index.php?page='.$_SERVER["PHP_SELF"]);

//die('Доступ закрыт, даём ссылку на авторизацию. -- <a href="login.php">Авторизоваться</a>');

}

include '../mysql.php';

$id = $_SESSION['user_id'];

$mess_id = (int)$_POST['mess_id'];

$query = "SELECT a.tid, a.fid, a.title, a.message, DATE_FORMAT(a.dt,'%d.%m.%Y %H:%i:%s') as dt,

b.fio AS to_user_name, c.fio AS from_user_name

FROM pm a INNER JOIN user_details b

ON a.tid=b.id

INNER JOIN user_details c

ON a.fid=c.id

WHERE id_mess=".$mess_id."

AND (a.tid=".$id." OR a.fid=".$id.")

AND a.rid<>".$id;

//echo $query;

$res = mysql_query($query);

$m = mysql_fetch_array($res);

echo '<table border="0" cellspacing="0" cellpadding="3">';

echo '<tr>';

echo'<td><b>Отправитель:</b></td><td><a href="/soc/profile.php?id='.$m['fid'].'">'.$m['from_user_name'].'</a></td>';

echo '</tr>';

echo '<tr>';

echo'<td><b>Получатель:</b></td><td><a href="/soc/profile.php?id='.$m['tid'].'">'.$m['to_user_name'].'</a></td>';

echo '</tr>';

echo '<tr>';

echo '<td>Дата:</td><td>'.$m['dt'].'</a></td>';

echo '</tr>';

echo '<tr>';

echo '<td>Тема:</td><td>'.$m['title'].'</a></td>';

echo '</tr>';

echo '<tr>';

echo '<td valign="top"><b>Сообщение:</b></td><td>'.nl2br(wordwrap($m['message'], 75, "\n", 1)).'</td>';

echo '</tr>';

?>

Теперь рассмотрим возможность работы с закладками. Пользователь может просматривать список своих закладок. Удаление реализовано при помощи AJAX, при изменении он попадает в ту же форму, что и при добавлении. На рисунке 13 приведена форма списка закладок, а на рисунке 14 - форма добавления новой закладки.

Рис. 13

Рис. 14

Код просмотра списка закладок представлен ниже:

<?

session_start();

$guest = false;

if (!isset($_SESSION['user_id']))

{

$guest = true;

}

include 'mysql.php';

include 'bm_fns.php';

$id = (int)$_POST['id'];

//echo $id;

$page = (int)$_POST['page'];

get_bms_links($id, $page, 3);

?>

<div id="cont">

<script language="JavaScript" type="text/javascript">

<!--

$("document").ready(function()

{

$(".acts>a").click(function()

{

if ($(this).attr('t') == '1') return;

if (!confirm("Удалить ссылку?")) return;

var i = $(this).parent().parent().attr('id');

$.get("del.php", {'linkid': i }, function(data)

{

//alert(data);

var s = "#"+i;

//$("#bm").children().find(s).remove();

$.post("list.php",{id:<? echo $id; ?>, page: <? echo $page; ?>}, function(data){

$("#tt").html(data);

//alert(data);

});

});

//alert($(this).parent().parent().attr('id'));

});

});

//-->

</script>

<table class="bmTable" id="bm">

<?php

if ($page<=0) $page=1;

$r = get_user_bms($id, $page);

if ($r) {

$n = mysql_num_rows($r);

if ($n<1) echo 'Нет закладок';

else {

$same_user = false;

if ($id == $_SESSION['user_id']) $same_user = true;

while ($m = mysql_fetch_array($r, MYSQL_NUM)) {

echo "<tr id=\"$m[4]\">";

echo "<td><a href=\"$m[1]\">$m[0]</a><br />";

if (!empty($m[2])) echo nl2br(wordwrap($m[2], 40, "\n", 1))."<br />";

echo "<b>Категория:</b> $m[3]<br />Адрес: <a href=\"$m[1]\">".htmlspecialchars($m[1])."</a></td>";

if ($same_user) {

echo "<td class=\"acts\"><a href=\"upd.php?linkid=$m[4]\" t=\"1\">Изменить</a><br /><a href=\"#\" t=\"0\">Удалить</a></td>";

}

else {

if (!$guest) echo "<td class=\"acts\"><a href=\"add_from.php?linkid=$m[4]\" t=\"1\">Добавить к себе</a></td>";

}

echo '</tr>';

}

}

}

?>

</table>

</div>

Основные функции из подключаемого файла приведены далее:

<?php

unset($bm_count);

$bm_count = 5;

function get_bms_links($userid, &$page, $links)

{

global $bm_count;

$q = "SELECT COUNT(*) FROM bookmark WHERE bookmark.user_id = $userid";

//echo $q;

$r = mysql_query($q);

$res = mysql_fetch_row($r);

unset($pages);

//echo $res[0];

$pages = ceil($res[0]/$bm_count);

if ($page < 1) $page = 1;

if ($page > $pages) $page = $pages;

//echo $page;

// links - число ссылок рядом

if ($page > $links)

$starttext = "<a href=\"$PHP_SELF?page=1&id=$userid\">&laquo;</a>";

else

$starttext = '';

if ($page < ($pages-$links+1))

$endtext = "<a href=\"$PHP_SELF?page=$pages&id=$userid\">&raquo;</a>";

else

$endtext = '';

$nearpages = '';

for ($i = $page-($links-1); $i <= $page+($links-1); $i++)

{

if ( ($i>0) && ($i<=$pages) )

{

$nearpages.="<a href=\"$PHP_SELF?page=$i&id=$userid\"";

if ($i == $page) $nearpages.='style="font-weight:bold;"';

$nearpages.=">$i</a>&nbsp;";

}

}

echo '<div style="text-align:right;">'.$starttext.' '.$nearpages.' '.$endtext.'</div>';

}

function get_user_bms($userid, $page)

{

global $bm_count;

$l1 = ($page-1)*$bm_count;

$q = "SELECT bm.title, bm.url, bm.descr, cat.name, bm.link_id from bookmark bm, categories cat WHERE

bm.user_id = $userid AND cat.catid = bm.catid ORDER BY bm.url LIMIT $l1, $bm_count";

$r = mysql_query($q);

//echo $q;

if (!$r) return false;

return $r;

}

function delete_bm($userid, $linkid)

{

//echo $userid;

//echo "delete from bookmark where user_id={$userid} and url='$url'";

$linkid = (int)$linkid;

$q = "select url from bookmark where user_id=$userid and link_id=$linkid";

$res = mysql_query($q);

$u = mysql_fetch_row($res);

if (!mysql_query("delete from bookmark where user_id=$userid and link_id=$linkid"))

return false;

return $u[0];

}

function upd_bm($userid, $url, $title, $description, $cat_id, $linkid)

{

$title = mysql_real_escape_string($title);

$title = htmlspecialchars($title);

$description = mysql_real_escape_string($description);

$description = htmlspecialchars($description);

if ($url{(strlen($url)-1)} == '/') $url = substr($url,0,(strlen($url)-1));

$url = mysql_escape_string($url);

$cat_id = (int)$cat_id;

$linkid = (int)$linkid;

$q = "UPDATE bookmark SET title='$title', url='$url', descr='$description', catid=$cat_id WHERE ";

$q = $q."user_id=$userid AND link_id=$linkid";

//echo $q;

if (!mysql_query($q))

return false;

return true;

}

function add_bm($userid, $newurl, $title, $description, $cat_id)

{

//есть ли такая закладка

$title = mysql_real_escape_string($title);

$description = mysql_real_escape_string($description);

$description = htmlspecialchars($description);

$title = htmlspecialchars($title);

//echo $newurl; // - тут все корректно

if ($newurl{strlen($newurl)} == '/') $newurl = substr($newurl,0,strlen($url)-2);

$newurl = mysql_real_escape_string($newurl);

$cat_id = (int)$cat_id;

$q = "select * from bookmark where user_id=$userid and url='$newurl'";

//echo $q;

$r = mysql_query($q);

if (mysql_num_rows($r) > 0) throw new Exception('Такая закладка уже есть!');

$q = "insert into bookmark values(NULL, $userid, '$title', '$newurl', '$description', $cat_id)";

if (!mysql_query($q)) throw new Exception('Не удается добавить закладку!');

return true;

}

function recommend_urls($userid, $popularity = 1)

{

$query="SELECT SUBSTRING_INDEX( a.url, '/', 3 ) , count( a.url )

FROM bookmark a

WHERE a.user_id

IN (

SELECT DISTINCT (

b2.user_id

)

FROM bookmark b1, bookmark b2

WHERE b1.user_id = $userid

AND b1.user_id != b2.user_id

AND SUBSTRING_INDEX( b1.url, '/', 3 ) = SUBSTRING_INDEX( b2.url, '/', 3 )

)

AND SUBSTRING_INDEX( a.url, '/', 10 ) NOT

IN (

SELECT SUBSTRING_INDEX( url, '/', 10 )

FROM bookmark

WHERE user_id = $userid

)

GROUP BY SUBSTRING_INDEX( url, '/', 3 ) LIMIT 5";// having count(SUBSTRING_INDEX(url, '/', 3 ))>1";

//echo nl2br($query).'<br /><hr>';

$r = mysql_query($query);

if (!$r)

throw new Exception('Не удается найти закладки для рекомендации.');

if (mysql_num_rows($r)==0)

throw new Exception('Не удается найти закладки для рекомендации.');

return $r;

}

?>

Пользователь может воспользоваться сервисом рекомендации ссылок, его вид приведен на рисунке 15.

Рис. 15

Подгрузка рекомендаций выполнена при помощи AJAX. Список рекомендаций реализован следующим образом:

<?

session_start();

if (!isset($_SESSION['user_id']))

{

header('Location: /soc/index.php?page='.$_SERVER["PHP_SELF"]);

}

include 'mysql.php';

$id = $_SESSION['user_id'];

$same_user = true;

$no_user = false;

include '../head.php';

include '../menu.php';

?>

<div id="rightCol">

<script type="text/javascript" src="jquery.js"></script>

<script>

<!--

var oldurl = '';

function see_details(url)

{

//alert(url)

if (oldurl == url)

{

$("#d").slideUp("fast");

oldurl = '';

return;

}

else $("#d").hide();

$.get("details.php", {'url' : url}, function(data) {

//alert(data)

$("#d").html(data);

oldurl = url;

})

$("#d").animate({

left: 50, opacity: 'show'

}, 500);

}

//-->

</script>

<?

require_once('bm_fns.php');

try

{

$r = recommend_urls($id,1);

echo '<i>Рекомендовано:</i> '

?>

<table border="1" bordercolor="#abcabc" cellspacing="0" cellpadding="5">

<tr><th>URL</th><th>Количество рекомендаций</th></tr>

<?

$i = 0;

while ($m=mysql_fetch_array($r, MYSQL_NUM))

{

echo '<tr>';

echo "<td><a href=\"javascript:void(0)\" onClick=\"see_details('$m[0]')\">$m[0]</a></td><td>$m[1]</td>";

echo '</tr>';

}

}

catch (Exception $e)

{

echo $e->getMessage();

}

?>

</table>

<div id="d" style="border:1px #ccc dashed;display:none;"></div>

</div>

<div id="bottom"></div>

</div>

<?

include '../foot.php';

?>

Вывод данных по рекомендациям сделан так:

<?

session_start();

if (!isset($_SESSION['user_id']))

{

header('Location: /soc/index.php?page='.$_SERVER["PHP_SELF"]);

}

include_once('mysql.php');

header('Content-type: text/html; charset=utf-8');

$id = $_SESSION['user_id'];

$url = $_GET['url'];

$q = "SELECT substring_index( url, '/', 10 ), count(user_id), b.fio, b.id

FROM bookmark INNER JOIN user_details b ON b.id=bookmark.user_id

WHERE user_id !=$id

AND substring_index( url, '/', 3 ) = substring_index( '$url', '/', 3 )

AND url NOT IN (select url from bookmark where user_id=$id) group by substring_index( url, '/', 10 )";

//echo $q;

$res = mysql_query($q);

echo '<table>';

while ($m = mysql_fetch_array($res))

{

echo '<tr>';

$s = 'рекомендаци';

if ($m[1] == 1) $s.='я';

else if ($m[1] > 1 && $m[1] < 10) $s.='и'; else $s.='й';

echo "<td><a href=\"$m[0]\">$m[0]</a></td><td>$m[1] $s</td><td>";

if (empty($m[2])) $m[2] = 'Пользователь '.$m[3];

if ($m[1] > 1) $s = '&nbsp;'; else $s = '<a href="/soc/profile.php?id='.$m[3].'">'.$m[2].'</a>';

echo $s.'</td>';

echo '</tr>';

}

echo '</table>';

?>

Пользователь может сменить данные своего профиля. Для этого ему нужно зайти в «Мои настройки-Анкета». Вид формы заполнения анкеты представлен на рисунке 16. В момент заполнения открыт календарь, который можно скрыть и ввести данные в текстовое поле обычным способом.

Рис. 16

Вспомогательные функции для выбора информации профиля пользователя из БД и записи туда приведены ниже:

function upd_user($id, $nick, $fio, $birth, $hobbie, $job, $icq)

{

$id = (int)$id;

$nick = mysql_escape_string(substr(trim($nick),0,19));

$fio = mysql_escape_string(substr(trim($fio),0,79));

$hobbie = mysql_escape_string($hobbie);

$job=mysql_escape_string(substr(trim($job),0,49));

$icq = str_replace('-','',$icq);

$icq=mysql_escape_string(substr(trim($icq),0,8));

$birth = explode('.',$birth);

$birth = mktime(0,0,0,(int)$birth[1], (int)$birth[0], (int)$birth[2]);

$q = "UPDATE user_details SET nick='$nick', fio='$fio',

birth=$birth, hobbie='$hobbie', job='$job', icq='$icq'

WHERE id={$id}";

//echo $q;

if (mysql_query($q)) return true; else return false;

}

function get_user_details($id)

{

$ud = array();

$q = "select nick, fio, birth, hobbie, job, icq from user_details where id={$id}";

$r = mysql_query($q);

if (mysql_num_rows($r) > 0)

{

$ud = mysql_fetch_array($r);

$ud['birth'] = date('d.m.Y', $ud['birth']);

return $ud;

}

else

{

return 0;

}

}

Пользователь может также сменить пароль. Новый пароль будет зашифрован и при необходимости записан в cookie-набор пользователя. Вид формы смены пароля приведен на рисунке 17.

Рис. 17

Исходный код сценария выглядит следующим образом:

<?

session_start();

if (!isset($_SESSION['user_id']))

{

header('Location: index.php?page='.$_SERVER['PHP_SELF']);

}

include '../mysql.php';

$id = $_SESSION['user_id'];

$query = "SELECT `password`, `salt`

FROM `users`

WHERE `id`='{$id}'

LIMIT 1";

$sql = mysql_query($query) or die('Невозможно найти этот ID');

if (!empty($_POST))

{

if (mysql_num_rows($sql) > 0)

{

$row = mysql_fetch_assoc($sql);

// берем соль

$salt = $row['salt'];

$p = $row['password'];

$error = false;

$errort = '';

$oldpassword = (isset($_POST['oldpassword'])) ? mysql_real_escape_string($_POST['oldpassword']) : '';

$newpass = (isset($_POST['password'])) ? mysql_real_escape_string($_POST['password']) : '';

if ( !empty( $newpass) and !preg_match( "#^[-_!0-9A-Za-z]+$#i", $newpass ) )

{

$errort = $errort.'Поле "Пароль" содержит недопустимые символы<br />';

$error = true;

}

if (strlen($newpass) < 6)

{

$error = true;

$errort .= 'Длина нового пароля менее шести символов';

}

$oldpassword = md5(md5($oldpassword) . $salt);

if ($p !== $oldpassword)

{

$error = true;

$errort .= 'Введенный вами старый пароль неверен';

}

if (!$error)

{

$newpass = md5(md5($newpass) . $salt);

$q = "update users set `password`='{$newpass}' where `id`={$id}";

$r = mysql_query($q);

$time = 86400*7*2;

setcookie('password', $newpass, time()+$time, "/");

//echo $q;

echo '<div class="OKMessage">Пароль успешно изменен на</div>';

}

else

{

print '<div class="errMessage">Возникли следующие ошибки<br />' . nl2br($errort).'</div>';

}

}

}

$no_user = false;

$same_user=true;

$id = $_SESSION['user_id'];

include '../head.php';

include '../menu.php';

?>

<div id="rightCol">

<form action="reset.php" method="post">

<table>

<tr>

<td>Старый пароль:</td>

<td><input type="password" name="oldpassword" /></td>

</tr>

<tr>

<td>Новый пароль:</td>

<td><input type="password" name="password" /></td>

</tr>

<tr>

<td></td>

<td><input type="submit" value="Сменить пароль" /></td>

</tr>

</table>

</form>

</div>

<div id="bottom"></div>

</div>

<?

include '../foot.php';

?>

При желании пользователь может сменить свой аватар. При этом он будет уменьшен до максимально возможных размеров пропорционально. Форма загрузки аватара приведена на рисунке 18.

Рис. 18

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

<?php

session_start();

if (!isset($_SESSION['user_id']))

{

header('Location: /soc/index.php?page='.$_SERVER["PHP_SELF"]);

//die('Доступ закрыт, даём ссылку на авторизацию. -- <a href="login.php">Авторизоваться</a>');

}

$id = $_SESSION['user_id'];

function GenerateName($n=10)

{

$key = '';

$pattern = '1234567890abcdefghijklmnopqrstuvwxyz';

$counter = strlen($pattern)-1;

for($i=0; $i<$n; $i++)

{

$key .= $pattern{rand(0,$counter)};

}

return $key;

}

function resize_image($max_w, $max_h, $img, $fname)

{

$size = GetImageSize($img);

$w = $size[0];

$h = $size[1];

$x_ratio = $max_w / $w;

$y_ratio = $max_h / $h;

if ( ($w <= $max_w) && ($h <= $max_h) )

{

$dstw = $w;

$dsth = $h;

}

else if ( ($x_ratio * $h) < $max_h)

{

$dstw = $max_w;

$dsth = ceil($x_ratio * $h);

}

else

{

$dsth = $max_h;

$dstw = ceil($y_ratio * $w);

}

$src = ImageCreateFromJpeg($img);

$dst = imagecreatetruecolor($dstw, $dsth);

ImageCopyResampled($dst, $src, 0, 0, 0, 0, $dstw, $dsth, $w, $h);

//$fname = substr($img, 0, strpos($img, '.')).'-thumb.jpg';

/*print nl2br("$img:

Width: $w,

Height: $h,

Сжатие по x: $x_ratio,

Сжатие по у: $y_ratio

Новое имя: $fname,

Новая ширина: $dstw,

Новая высота: $dsth

"); */

ImageJpeg($dst, $fname, 100);

}

include '../mysql.php';

$error = false;

$ert = '';

if ($_FILES['userfile']['error'] > 0)

{

$error = true;

switch ($_FILES['userfile']['error'])

{

case 1: $ert.='размер файла больше upload_max_filesize\n'; break;

case 2: $ert.='размер файла больше max_file_size\n'; break;

case 3: $ert.='загружена только часть файла\n'; break;

case 4: $ert.='файл не загружен\n'; break;

}

}

// Проверка, имеет ли файл правильный MIME-тип

$blacklist = array(".php", ".phtml", ".php3", ".php4", "pl");

foreach ($blacklist as $item) {

if(preg_match("/$item\$/i", $_FILES['userfile']['name'])) {

$ert.="Вы попытались загрузить вредоносный файл.\n";

$error = true;

}

}

$imageinfo = getimagesize($_FILES['userfile']['tmp_name']);

if($imageinfo['mime'] != 'image/jpeg') {

$ert.="Можно загружать только изображения формата JPEG\n";

$error = true;

}

// помещаем файл туда, куда нужно

$upfile = 'uploads/'.$_FILES['userfile']['name'];

if ($_FILES['userfile']['tmp_name'])

{

$z = $_FILES['userfile']['tmp_name'];

if (!move_uploaded_file("$z", $upfile))

{

$ert.='Проблема: невозможно переместить файл в каталог назначения\n';

$error = true;

}

if (!$error)

{

$fn = '../avatars/'.GenerateName().'.jpg';

resize_image(240, 320, $upfile, $fn);

$fn = substr($fn,3);

$q = "insert into avatars values(NULL, '$fn')";

mysql_query($q);

$avid = mysql_insert_id();

$q = "update user_details set avatar_id=$avid where id={$id}";

mysql_query($q);

unlink($upfile);

}

}

else

{

$ert.='Проблема: возможна атака через загрузку файла.\n';

$error = true;

}

include '../head.php';

$no_user = false;

$same_user = true;

include '../menu.php';

echo '<div id="rightCol">';

if ($error)

{

echo nl2br('<div class="errMessage">Возникли следующие проблемы:<br>'.$ert.'</div>');

}

else

{

echo '<div class="OKMessage">Файл успешно загружен</div>';

}

echo '</div>';

echo '<div id="bottom"></div></div>';

include '../foot.php';

?>

Если пользователь желает найти какую-либо информацию, он может воспользоваться поиском. Форма поиска приведена на рисунке 19.

Рис. 19

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

<?

include_once('mysql.php');

session_start();

$guest = false;

if (!isset($_SESSION['user_id']))

{

// header('Location: /soc/index.php?page='.$_SERVER["PHP_SELF"]);

$guest = true;

//die('Доступ закрыт, даём ссылку на авторизацию. -- <a href="login.php">Авторизоваться</a>');

}

if (!$guest) $id = $_SESSION['user_id']; else $id = 0;

//echo $_GET['type'];

if (isset($_GET['type']))

{

if ($_GET['type'] == 'cat')

{

$cid = (int)$_GET['cid'];

$q = "SELECT u.id, b.title, b.url, b.descr, c.name

FROM bookmark b, users u, categories c

WHERE c.catid =$cid

AND b.user_id != $id

AND b.user_id=u.id

AND c.catid = b.catid";

//echo $q;

}

else if ($_GET['type'] == 'kw')

{

$descr = $_GET['descr'];

$descr = trim($descr);

$descr = mysql_escape_string($descr);

$descr_a = explode(';', $descr);

$title = $_GET['title'];

$title = trim($title);

$title = mysql_escape_string($title);

$title_a = explode(';', $title);

//echo 'Title is empty? '.empty($title).' '.$title.' ';

$q = "SELECT u.id, b.title, b.url, b.descr, c.name

FROM bookmark b, users u, categories c

WHERE (";

$b = false;

if (!empty($descr))

{

for ($i=0;$i<count($descr_a);$i++)

{

$q = $q." b.descr LIKE '%$descr_a[$i]%' OR";

}

$b = true;

$q = substr($q, 0, strlen($q)-3).")";

}

if (!empty($title))

{

if ($b) $q = $q.' AND (';

for ($i=0;$i<count($title_a);$i++)

{

$q = $q." b.title LIKE '%$title_a[$i]%' OR";

}

$b = true;

$q = substr($q, 0, strlen($q)-3).")";

}

if (!$b) {

$p = strpos($q, '(');

echo $p;

$q = substr($q, 0, $p);

}

if ($b) $q.=' AND ';

$q.="b.user_id !=$id

AND b.user_id=u.id

AND c.catid = b.catid";

//echo $q;

}

$r =mysql_query($q);

}

echo '<table border=1>';

echo '<tr><th>Пользователь</th><th>Название</th><th>URL-адрес</th><th>Описание</th><th>Категория</th></tr>';

while ($m=mysql_fetch_array($r, MYSQL_NUM))

{

echo '<tr>';

$q = "select nick from user_details where id={$m[0]}";

$rr = mysql_query($q);

$u=mysql_result($rr,0,0);

if (empty($u)) $u = 'Пользователь '.$m[0];

//echo $u;

echo "<td><a href=\"/soc/profile.php?id=$m[0]\">$u</a></td><td>$m[1]</td><td><a href=\"$m[2]\">$m[2]</a></td><td>$m[3]</td><td>$m[4]</td>";

echo '</tr>';

}

echo '</table>';

?>

Если пользователь является администратором, то ему доступны дополнительные функции. Так, администратор может редактировать шаблоны сайта. Нужно обратить внимание, что пользователь без прав на доступ к администрированию не сможет туда зайти. Редактирование шаблонов показано на рисунке 20.

Рис. 20

Код редактирования шаблонов предельно прост и использует возможности визуального JavaScript-редактора кода Edit Area.

Администратор может также работать с пользователями: удалять их, блокировать, разблокировать, редактировать их анкетные данные. Работа с пользователями реализована посредством AJAX.Содержимое всех небольших вспомогательных файлов приведено ниже.

Блокировка:

<?

session_start();

if (!isset($_SESSION['user_id']))

{

header('Location: /soc/index.php?page='.$_SERVER["PHP_SELF"]);

//die('Доступ закрыт, даём ссылку на авторизацию. -- <a href="login.php">Авторизоваться</a>');

}

$id = (int)$_POST['id'];

if ($id == $_SESSION['user_id']) {

echo 'Себя нельзя банить';

exit;

}

include '../mysql.php';

$q = "update users set status=status+20 where id={$id}";

if (mysql_query($q)) echo 'Успешно забанен'; else echo 'Невозможно забанить';

?>

Разблокировка:

<?

session_start();

if (!isset($_SESSION['user_id']))

{

header('Location: /soc/index.php?page='.$_SERVER["PHP_SELF"]);

//die('Доступ закрыт, даём ссылку на авторизацию. -- <a href="login.php">Авторизоваться</a>');

}

$id = (int)$_POST['id'];

if ($id == $_SESSION['user_id']) {

echo 'Себя нельзя банить';

exit;

}

include '../mysql.php';

$q = "update users set status=status-20 where id={$id}";

if (mysql_query($q)) echo 'Успешно разбанен'; else echo 'Невозможно разбанить';

?>

Редактирование анкеты:

<?

session_start();

if (!isset($_SESSION['user_id']))

{

header('Location: /soc/index.php?page='.$_SERVER["PHP_SELF"]);

//die('Доступ закрыт, даём ссылку на авторизацию. -- <a href="login.php">Авторизоваться</a>');

}

$id = (int)$_POST['id'];

include '../mysql.php';

include '../options/user_fns.php';

$ud = get_user_details($id);

if ($ud != 0)

{

?>

<script language="JavaScript" type="text/javascript">

<!--

function get_mess()

{

data = $('form').serialize();

$("#mu").load('ch_p.php', data);

}

//-->

</script>

<h3>Редактирование анкеты</h3>

<form name="an_f">

<input type="hidden" name="id" value="<? echo $id; ?>">

<table class="profileTable" cellpadding="0" cellspacing="0">

<tbody>

<tr>

<td colspan="2" class="title">

Общая информация

</td>

</tr>

<tr>

<td class="label">Никнейм</td>

<td><input type="text" name="nick" value="<? echo $ud['nick']; ?>"></td>

</tr>

<tr>

<td class="label">ФИО</td>

<td><input type="text" name="fio" size="40" value="<? echo $ud['fio']; ?>"></td>

</tr>

<tr>

<td class="label">Дата рождения</td>

<td><input type="text" name="birth" value="<? echo $ud['birth']; ?>"></td>

</tr>

<tr>

<td colspan="2" class="title">

Контактная информация

</td>

</tr>

<tr>

<td class="label">ICQ</td>

<td><input type="text" name="icq" value="<? echo $ud['icq']; ?>"></td>

</tr>

<tr>

<td colspan="2" class="title">

Персональная информация

</td>

</tr>

<tr>

<td class="label">Деятельность</td>

<td width="300"><textarea rows="5" cols="30" name="job"><? echo $ud['job']; ?></textarea></td>

</tr>

<tr>

<td class="label">Интересы</td>

<td width="300"><textarea rows="5" cols="30" name="hobbie"><? echo $ud['hobbie']; ?></textarea></td>

</tr>

</tbody>

</table>

<input type="button" value="Обновить" onClick="get_mess();>

</form>

<?

}

?>

Удаление пользователя:

<?

session_start();

if (!isset($_SESSION['user_id']))

{

header('Location: /soc/index.php?page='.$_SERVER["PHP_SELF"]);

//die('Доступ закрыт, даём ссылку на авторизацию. -- <a href="login.php">Авторизоваться</a>');

}

$id = (int)$_POST['id'];

if ($id == $_SESSION['user_id']) {

echo 'Себя нельзя удалить';

exit;

}

include '../mysql.php';

$q = "delete from users where id={$id}";

$q1 = "delete from bookmark where user_id={$id}";

$q2 = "delete from user_details where id={$id}";

if ( mysql_query($q) && mysql_query($q2))

{

mysql_query($q1);

echo 'Удалено успешно';

}

else

{

echo 'Невозможно удалить';

}

?>

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

Рис. 21

Код сценария представлен ниже:

<?

session_start();

if (!isset($_SESSION['user_id']))

{

header('Location: /soc/index.php?page='.$_SERVER["PHP_SELF"]);

//die('Доступ закрыт, даём ссылку на авторизацию. -- <a href="login.php">Авторизоваться</a>');

}

include '../mysql.php';

include '../head.php';

if ($_SESSION['adm'] != 1)

{

echo '<div class="errMessage">Вы не являетесь администратором</div>';

echo '</div>';

include '../foot.php';

exit;

}

$id = $_SESSION['user_id'];

$same_user = true;

$no_user = false;

include '../menu.php';

$pages = $_POST['pages'];

if (empty($pages)) $pages = 20;

//echo $pages;

function replace_month($path){

if(eregi('jan',$path)){$path='1';}

elseif(eregi('feb',$path)){$path='2';}

elseif(eregi('mar',$path)){$path='3';}

elseif(eregi('apr',$path)){$path='4';}

elseif(eregi('may',$path)){$path='5';}

elseif(eregi('jun',$path)){$path='6';}

elseif(eregi('jul',$path)){$path='7';}

elseif(eregi('aug',$path)){$path='8';}

elseif(eregi('sep',$path)){$path='9';}

elseif(eregi('oct',$path)){$path='10';}

elseif(eregi('nov',$path)){$path='11';}

else{$path='12';}

return $path;

}

$filename = 'z:/usr/local/apache/logs/access.log';

$fd = $pages; // 1 строка 100 bytes - 20 строк

$fp = filesize($filename)-$fd*100;

if ($pages == 'all') $fp = 0;

$fh = fopen($filename, 'r');

fseek($fh, $fp);

$arr = array();

$i = 0;

$a = 0;

while (!feof($fh))

{

$line = trim(fgets($fh, 1024));

if(!eregi('.jpg',$line) and !eregi('.gif',$line) and !eregi('.js',$line) and !eregi('.css',$line))

{

//echo 'b';

if (strstr($line, '/soc'))

{

$arr[$i] = $line;

//echo 'a';

$i++;

}

}

}

fclose($fh);

?>

<div id="rightCol">

<form action='access.php' method='post'>

<select name="pages">

<?

$pp = array(20,50,100,200,500);

foreach ($pp as $p)

{

echo "<option value=$p";

if ($p == $pages) echo " selected";

echo ">Последние $p</option>";

}

?>

<option value="all" <? if ($pages == 'all') echo 'selected'; ?>>Все</option>&nbsp;<input type="submit" value="Просмотреть">

</form>

<br />

<table border="1">

<?

foreach ($arr as $v)

{

preg_match("/^(\S+)\s+(\S+)\s+(\S+)\s+\[(.*)\]\s+\"(.*)\"\s+(\S+)\s+(\S+)$/x",$v,$matches);

array_shift($matches); // так как 0 элемент содержит всю строку

$ip = $matches[0];

$time = $matches[3];

$url = $matches[4];

$succes = $matches[5];

$bytes = $matches[6];

preg_match("@(..)/(...)/(....):(..):(..):(..)@",$time,$matches);

array_shift($matches);

$matches[1] = replace_month($matches[1]);

$time = mktime($matches[3],$matches[4],$matches[5],$matches[1],$matches[0],$matches[2]);

if (eregi("(\%27)|( or )|( and )|( union )",$url)) { $hack[$h++] = array($ip, $time, $url, $bytes); }

preg_match("/\S+\s+(\S+)/",$url,$matches);

$url = $matches[1];

$url = urlencode($url);

if($succes=='200') {

$success[$i++] = array ( $ip,$time,$url,$bytes );

}

else {

$failure[$x++] = array ( $ip,$time,$url,$bytes );

}

}

?>

<tr>

<td align="center" colspan="4">Корректные запросы</td>

</tr>

<?

if (!empty($success))

{

$success = array_reverse($success);

foreach ($success as $k=>$v)

{

echo '<tr>';

foreach ($v as $key=>$val)

{

if ($key == 1) { $val = date('d.m.Y H:i:s',(int)$val); }

if ($key == 2) {

$val = urldecode($val);

$val = nl2br(wordwrap($val, 40, "\n", 1));

}

echo "<td>$val</td>";

}

echo '</tr>';

}

}

else

{

echo '<tr><td colspan="4">Не обнаружены</td>';

}

?>

<tr>

<td align="center" colspan="4">Некорректные запросы</td>

</tr>

<?

if (!empty($failure))

{

$failure = array_reverse($failure);

foreach ($failure as $k=>$v)

{

echo '<tr>';

foreach ($v as $key=>$val)

{

if ($key == 1) { $val = date('d.m.Y H:i:s',(int)$val); }

if ($key == 2) { $val = urldecode($val); $val = nl2br(wordwrap($val, 40, "\n", 1)); }

echo "<td>$val</td>";

}

echo '</tr>';

}

}

else

{

echo '<tr><td colspan="4">Не обнаружены</td>';

}

?>

<tr>

<td align="center" colspan="4">Подозрительные запросы</td>

</tr>

<?

if (!empty($hack))

{

$hack = array_reverse($hack);

foreach ($hack as $k=>$v)

{

echo '<tr>';

foreach ($v as $key=>$val)

{

if ($key == 1) { $val = date('d.m.Y H:i:s',(int)$val); }

if ($key == 2) { $val = urldecode($val); $val = nl2br(wordwrap($val, 40, "\n", 1));}

echo "<td>$val</td>";

}

echo '</tr>';

}

}

else

{

echo '<tr><td colspan="4">Не обнаружены</td>';

}

?>

</table>

</div>

<div id="bottom"></div>

</div>

<?

include '../foot.php';

?>

Нажав «Справка», пользователь может прочесть справку по использованию системы, а по нажатию «О сайте» можно увидеть следующую страницу, изображенную на рисунке 22.

Рис. 22

Инструкции по эксплуатации системы. Инструкции пользователя

Перед началом работы пользователь обязан:

1) осмотреть и привести в порядок рабочее место;

2) отрегулировать освещенность на рабочем месте, убедиться в достаточности освещенности, отсутствии отражений на экране, отсутствии встречного светового потока;

3) проверить правильность подключения оборудования в электросеть;

4) убедиться в наличии защитного заземления и подключения экранного проводника к корпусу процессора;

5) протереть специальной салфеткой поверхность экрана ;

6) убедиться в отсутствии дискет в дисководах персонального компьютера;

При включении компьютера пользователь обязан соблюдать следующую последовательность включения оборудования:

1) включить блок питания;

2) включить периферийные устройства (принтер, монитор, сканер и др.);

3) включить системный блок.

Пользователь во время работы обязан:

1) в течение всего рабочего дня содержать в порядке и чистоте рабочее место;

2) держать открытыми все вентиляционные отверстия устройств;

3) внешнее устройство "мышь" применять только при наличии специального коврика;

4) при необходимости прекращения работы на некоторое время корректно завершать все активные задачи;

5) выполнять санитарные нормы и соблюдать режимы работы и отдыха;

6) соблюдать правила эксплуатации вычислительной техники в соответствии с инструкциями по эксплуатации;

7) соблюдать расстояние от глаз до экрана в пределах 60-80 см.

Пользователю во время работы запрещается:

1) прикасаться к задней панели системного блока при включенном питании;

2) переключать разъемов интерфейсных кабелей периферийных устройств при включенном питании;

3) загромождать верхние панели устройств бумагами и посторонними предметами;

4) допускать захламленность рабочего места бумагой в целях недопущения накапливания пыли;

5) производить отключение питания во время выполнения активной задачи;

6) допускать попадание влаги на поверхность системного блока, монитора, рабочую поверхность клавиатуры, дисководов, принтеров и др.устройств;

7) производить самостоятельно вскрытие и ремонт оборудования;

По окончании работ оператор обязан соблюдать следующую последовательность выключения вычислительной техники:

1) произвести закрытие всех активных задач;

2) убедиться, что в дисководах нет дискет;

3) выключить питание системного блока;

4) выключить питание всех периферийных устройств;

5) отключить блок питания.

Для начала работы в системе необходимо зайти по адресу http://localhost/soc/. При наличии запущенного и корректно настроенного веб-сервера вы либо попадете на страницу авторизации, либо, если вы уже были запомнены в системе, автоматически переместитесь в свой личный кабинет. В случае попадания на страницу авторизации введите свой логин и пароль либо нажмите ссылку «регистрация» для регистрации нового аккаунта в системе. Поставив галочку «запомнить», вы две недели сможете не вводить свой логин и пароль при заходе с текущего компьютера в систему.

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

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

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

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

Для обмена сообщениями выберите пункт меню «Мои сообщения». Вы можете написать сообщение, зная ID адресата. Введите данные в форму, тему заполнять не обязательно. Для просмотра списка входящих и исходящих сообщения и просмотра сообщений в них выберите в меню нужную папку и пользуйтесь элементами управления в списке. Среди них есть «Ответить», позволяющий быстро написать ответное сообщение и «Удалить». Для просмотра сообщения просто щелкните по нему в списке.

Для смены личных настроек откройте меню «Мои настройки». Вы можете загрузить личный аватар вместо стандартного - просто выберите JPEG или GIF-файл и нажмите «Загрузить». Для смены пароля введите старый пароль и новый. Для заполнения анкеты выберите «Моя анкета» и заполните поля в ней, ни одно из них не является обязательным.

Инструкции по сопровождению

К установке и настройке системы допускаются лица, прошедшие курс основ сетевого и системного администрирования, имеющие навыки работы с веб-сервером и сервером БД, владеющие базовыми навыками программирования в Интернет.

Установка системы производится следующим образом:

- устанавливается и настраивается веб-сервер с поддержкой PHP 4.5+ . На прилагаемом компакт-диске имеется пакет Denwer, который решает первые две задачи;

- устанавливается и настраивается сервер БД с СУБД MySQL 5+. Она устанавливается в составе пакета;

- в конфигурационных файлах системы администратор вводит и сохраняет настройки доступа к серверу БД;

- посредством прилагаемого файла создается структура таблиц БД soc, создается «главный администратор». Для этого в папку /usr/local/mysql5/data переносится папка с БД;

- распаковываются в папку веб-документов веб-сервера файлы системы;

- запускается веб-браузер и тестируется корректная работа установленной системы.

Файлы, входящие в состав системы, перечислены в таблице 12.

Таблица 12

Имя файла

Тип

Размер, Кб

Header.php

Шапка страницы

1

Head.php

Шапка для внутренних страниц

2

Footer.php

Низ страницы

1

Foot.php

Низ внутренних страниц

1

Mysql.php

Конфигурационный файл для соединения с БД

1

About.php

«О сайте»

1

Search.php

Форма поиска

2

Search_processing.php

Логика поиска

3

Index.php

Вспомогательная страница

3

Menu.php

Меню в личном кабинете

3

Profile.php

Личный кабинет

4

Register.php

Скрипт регистрации

4

Login.php

Скрипт авторизации

4

Formbg.gif

Фон формы

2

Jquery.corner.js

Библиотека для создания закругленных углов

7

Jquery.js

Библиотека jquery

54

I.png

Фотография автора

84

/admin/banned.php, /admin/unban.php

Бан и разбан

1

Users.php

Управление пользователями

2

Access.php

Просмотр логов

5

Del_user.php

Удаление пользователя

1

/bm/add.php, /bm/add_from.php

Добавление закладок

3 кб и 1 кб

/bm/bm_fns.php

Функции для закладок

5

/bm/index.php

Главная страница

3

/bm/recs.php

Рекомендации

2

/bm/list.php

Список ссылок

2

/options/avatar.php

Загрузка аватара

6

/options/anketa.php

Заполнение анкеты

4

/options/reset.php

Смена пароля

3

/pm/inbox.php,

/pm/outbox.php

Входящие и исходящие

3

/pm/send_message.php

Отправка сообщения

3

/pm/write.php

Форма отправки

2

/pm/message.php

Просмотр сообщения

2

Администрирование системы

В число функций управления системой входят:

- функции управления и создания предоставляемых пользователю ресурсов из файлов данных и базы данных;

- функции административного управления системой: управление работой сервера БД, веб-сервера, интерпретатора PHP, установку МСЭ, IDS;

- функции поддержки работы серверов, интерпретатора, вспомогательных библиотек: обновление версий ПО, достижение оптимальных настроек конфигурации, защита от атак;

- функции авторизации пользователей, управления пользователями.

Администратор должен выполнять следующие процедуры:

- анализировать журналы работы веб-сервера и сервера БД;

- очищать журналы, контролировать их рост. Это можно сделать средствами phpMyAdmin для MySQL и программами, выполняющими архивацию и очистку журнала по расписанию для веб-сервера, например, cron.

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

В своей работе администратор должен использовать следующие методы:

- управления учетными записями пользователей - блокировка, разблокировка, смена данных;

- настраивать и контролировать профили пользователей, удаляя или изменяя нежелательные элементы;

- настраивать и видоизменять вид рабочей среды пользователя в системе;

- производить аудит системы программами, тестирующими безопасность и мониторинг системы программами-анализаторами логов.

Для основной работы в системе есть меню Администрирование и его подпункты. Для работы с пользователями необходимо перейти в соответствующий подпункт, ввести id пользователя и нажать необходимую ссылку. Для просмотра журнала можно перейти в пункт «просмотр логов», выбрать число записей и проанализировать их. В случае долгой загрузки страницы можно сделать вывод о слишком большой величине журнала и очистить его в директории /user/local/apache/logs, предварительно сделав архивную копию.

При наличии знаний в HTML и CSS можно удобно редактировать шаблоны сайта. Также в шаблоны можно включать код на PHP и JavaScript.

Для просмотра журналов работы СУБД необходимо зайти в phpMyAdmin и выбрать пункт «Показать состояние MySQL».

Для обновления ПО нужно посещать сайты http://apache.org и http://mysql.org

Заключение

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

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

После выбора СУБД и среды разработки и обоснования такого выбора собственно было начато проектирование и программирование. Программный модуль полностью выполняет те функции, которые описаны в постановке задачи, и эти функции соответствуют предъявляемым к ним требованиям. После разработки программного модуля была создана документация для пользователей и администраторов системы.

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

· например, как исправлять ошибки в программном коде;

· были решены такие проблемы, как работа с DOM при его динамической подгрузке;

· «вечная» проблема при работе с кодировками русского языка в AJAX;

· в составлении достаточно сложных SQL-запросов.

Относительно же степени реализации системы можно сказать, что все ее функции выполнены в полном объеме, поэтому проблемы поиска информации и ее синхронизации решать стало намного проще.

Однако в силу ограниченности времени реализации проекта, не были реализованы некоторые желательные дополнительные функции:

- защита от нежелательной корреспонденции;

- возможность жалобы на пользователя;

- увеличение схожести интерфейса с интерфейсом ОС, повсеместное использование AJAX.

- дополнительные возможности для пользователей: загрузка своих файлов в хранилище, обмен ими, репутация пользователей;

- форум для техподдержки.

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

Список использованной литературы

1.Хольцнер С. Ajax. Библия программиста. - М.:Диалектика, 2009. - 560 с.

2.Крейн Д., Паскарелло Э., Даррен Д. Ajax в действии. - М.: Вильямс, 2008. - 640 с.

3.Мак-Федрис П. Использование JavaScript. - М.: Вильямс, 2002. - 895 с.

4.Веллинг Л., Томсон Л. Разработка web-приложений с помощью PHP и MySQL. - М.: Вильямс, 2006. - 880 с.

5.http://habrahabr.ru

6.http://phpclub.ru

7.http://php.su

8.http://htmlbook.ru

9.http://www.javascriptkit.com/

Приложение

Техническое задание

1. Требования к системе в целом

1.1. Разрабатываемая система - единое целое, выполняет решение поставленных перед ней задачи в соответствии с ними разделяется на следующие функции:

- работа с закладками пользователей;

- поиск и рекомендация;

- работа с личной перепиской;

- работа с профилями пользователей;

- администрирование и защита информации.

Функция «Работа с закладками» позволяет вводить и редактировать данные закладок, копировать их к себе от других пользователей. Функция «Поиск и рекомендация» позволяет находить необходимые закладки либо непосредственно, либо методом выработки рекомендаций для пользователя. Функция «Работа с личной перепиской» должна позволять просматривать списки сообщений, отвечать на них и создавать новые сообщения. Функция «Работа с профилями пользователей» позволяет ввести пользователю свои данные, а также просмотреть данных других пользователей. Функция «Администрирование и защита информации» позволяет защититься от несанкционированного доступа и управлять различными объектами системы.

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

1.3. Система функционирует в режиме реального времени и работает с поддержкой технологии WYSIWYG настолько, насколько позволяет ее отобразить конечное ПО пользователя.

1.4. В случае некорректной работы системы производится ее проверка и, при необходимости, остановка работы сервера на 1-2 дня, в течение которых восстанавливается ее работоспособность. При незначительных неполадках работоспособность системы может быть восстановлена без остановки серверного ПО.

1.5. Число пользователей системы теоретически неограниченно, практически же - вычислительными ресурсами сервера и особенностями работы его ПО. В системе обязательно должен присутствовать по крайней мере один администратор.

1.6. Система приспосабливается к изменению процессов и методов управления при несущественной доработке. Систему можно модернизировать до тех пор, пока сложность модернизации не станет равной либо превысит сложность написания новой АИС. Целевое назначение системы сохраняется до тех пор, пока не отменен либо изменен стандарт в области образования.

1.7. Надежность АИС непосредственно связана с надежностью технических средств и считается полностью устойчивой при условии стабильного электропитания и исправного оборудования. Программная часть системы достаточно выверена, чтобы считаться надежной при любом применении.

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

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

1.10. Технически эксплуатация АИС должна осуществляться по правилам использования ПК.

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

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

1.13 Технические средства для обеспечения защиты от внешних воздействий должны располагаться на достаточном удалении (5-10 метров) от источников электромагнитных полей, нагревательного оборудования, источников электрического загрязнения (проводка), вдали от воды и пыльных мест (также необходимо защищать внутренности монитора и системного блока от попадания воды или инородных тел).


Подобные документы

  • Свойства социальных сетей. Функционирование информационной сети объекта управления как среды информационного влияния, управления и противоборства. Обеспечение социальной безопасности сетей. Создание теоретико-игровой модели информационного противоборства.

    курсовая работа [837,1 K], добавлен 17.07.2012

  • Идентификация и аутентификация пользователей в системах защиты информации. Порядок установки программно-аппаратного комплекса аккорд. Регистрация администратора безопасности информации. Установка платы контроллера. Подсоединение контактного устройства.

    курсовая работа [31,9 K], добавлен 15.03.2016

  • Детализация функций системы и требования к информационной системе. Анализ категорий пользователей. Этапы внедрения автоматизированной информационной системы на предприятии. Описание таблиц базы данных. Защита данных от несанкционированного доступа.

    дипломная работа [1,0 M], добавлен 22.07.2015

  • Характеристика особенностей инфраструктурных серверов, построенных на основе Linux. Создание и конфигурация рабочей станции сети предприятия. Установка операционной системы и ее первоначальная настройка. Администрирование сервисов, пользователей и групп.

    курсовая работа [1,4 M], добавлен 07.01.2014

  • Функциональная модель процесса проектирования сети. Технико-экономическое обоснование разработки сети. Проектирование структурной схемы и перечень функций пользователей сети. Планирование информационной безопасности. Расчет капитальных вложений.

    практическая работа [345,0 K], добавлен 09.06.2010

  • Особенности построения сети доступа. Мониторинг и удаленное администрирование. Разработка структурной схемы сети NGN. Анализ условий труда операторов ПЭВМ. Топология и архитектура сети. Аппаратура сетей NGN и измерение основных параметров сети.

    дипломная работа [5,7 M], добавлен 19.06.2011

  • Рассмотрение социальной сети как автоматизированной среды, позволяющей общаться в группе пользователей, объединенных общим интересом. Две группы программных инструментов внутри социального программного обеспечения: коммуникационные и интерактивные.

    презентация [2,1 M], добавлен 03.05.2015

  • Анализ систем организационного управления, их функции и компоненты. Функциональность, администрирование, регистрация пользователей, настройка и управление информационной системой SAP R/3. Преимущества и экономическая эффективность от ее внедрения.

    курсовая работа [4,0 M], добавлен 11.12.2013

  • Характерные особенности работы современных социальных сетей. Набор предлагаемых ими стандартных сервисов. История их развития. Проблемы информационной безопасности для пользователей сети. Вредоносные программы для кражи паролей и персональных данных.

    презентация [732,7 K], добавлен 03.11.2014

  • Сетевое подключение к компьютеру, настройка общей папки. Создание рабочей группы для всех ПК в сети. Использование окна "Управление сетями и общим доступом". Подключение сетевого диска. Аутентификация пользователей. Поиск объекта в системной базе.

    реферат [2,2 M], добавлен 27.11.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.