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

  • Вид работы:
    Дипломная (ВКР)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    1,43 Мб
  • Опубликовано:
    2012-10-23
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

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

Введение

социальный сеть автоматизированный администрирование

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

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

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

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

Однако, так как объемы информации по интересующим тематикам достаточно велики, можно давать ссылки на ресурсы в Интернете, на которых находится необходимая информация. Обычно человек, часто пользующийся Интернетом, имеет набор любимых ресурсов, которые сохранены средствами браузера в «Избранном», «Закладках» и т.п. Но при работе на другом компьютере возникает проблема синхронизации любимых ссылок. В этом деле может помочь web-ресурс, на котором человек может сохранить свои ссылки, а затем, зайдя в свой профиль, найти нужную. Связав это с возможностью просмотра ссылок прочих пользователей, их разделением по категориям, возможностью отправки личных сообщений (для консультаций или простого общения), мы получим социальную сеть - обменник ссылками. В современном мире эта возможность будет весьма актуальна -поиск информации в поисковых сервисах не дает хороших результатов по причине отсутствия качественного искусственного интеллекта в системах релевантности и большого количества т.н. «поискового спама». В социальной же сети пользователи сами отбирают только лучшие ресурсы с необходимыми материалами, что позволяет легко рекомендовать эти же ресурсы другим людям, интересующимся данной тематикой.

Дипломный проект проводится с целью:

         систематизации и закрепления полученных теоретических знаний и практических умений по общепрофессиональным и специальным дисциплинам («Операционные системы и среды», «Основы алгоритмизации и программирования», «Архитектура ЭВМ и вычислительных систем», «Базы данных», «Автоматизированные информационные системы») а также практики по эксплуатации программных средств информационных систем;

         углубления теоретических знаний в соответствии с заданной темой;

         формирования умений применять теоретические знания при решении поставленных вопросов;

         формирования умений использовать справочную, нормативную и правовую документацию;

         подтверждения квалификации выпускника.

Назначение и цели создания системы

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

Создание подобного ресурса в сети Интернет имеет следующие преимущества:

уменьшение затрат времени на поиск необходимой информации в Интернете;

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

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

решение проблемы синхронизации «Избранного»;

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

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

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

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

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

На современных карманных компьютерах средства просмотра web-страниц (Safari на iPhone, Opera на Windows Mobile-коммуникаторах) позволяют работать с ними почти так же, как и на настольной системе. Различие лишь в том, что пользователь видит «макет» страницы и может приближать для детального просмотра некоторые ее части. Благодаря простой и логичной структуре пользовательского интерфейса сделать необходимое будет очень просто.

Описание предметной области

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

Таким образом, структуру социальной сети и взаимодействие процессов в ней можно представить в виде, изображенном на рисунке 1.

Рис. 1

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

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

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

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

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

перемещаясь по кабинетам прочих пользователей, он может просматривать их закладки, добавлять их в свой список, читать данные в их профилях.

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

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

Описание постановки задачи. Функциональная структура АИС

В результате анализа предметной области была составлена функциональная структура АИС, приведенная на рисунке 2.

Рис. 2

В АИС выделены три основные функции:

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

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

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

Характеристика комплекса задач

Описание выявленных задач данной АИС:

)        функция «Авторизация и аутентификация» должна решать следующие задачи:

регистрация нового пользователя;

сохранение его учетных данных в БД, причем пароль должен храниться в надежно зашифрованном виде;

доступ к функциям системы посредством авторизации;

смена пароля пользователя;

защита от атак типа SQL-Injection.

) функция «Личный кабинет» должна решать следующие задачи:

доступ к возможностям системы в своем кабинете;

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

управления личными сообщениями;

управления закладками;

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

) функция «Администрирование» должна выполнять задачи:

редактирование шаблонов оформления сайта;

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

работы с их анкетными данными;

работы с данными их закладок.

Выходная информация

В виду специфики системы вся выходная информация представлена в виде экранных форм, технически реализованных как web-страницы.

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

ID

Наименование

Задача

Периодичность

Э1

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

Приглашение входа в систему, ссылка для регистрации

При каждом входе пользователей в систему

Э2

Страница регистрации

Форма для ввода придуманных пользователем логина и пароля

При первом запуске системы

Э3

Страница профиля

Отображение ссылок для входа в возможности системы, на ней выводятся также анкетные данные

При успешных авторизациях и по требованию пользователя

Э4

Страница закладок

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

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

Э5

Страница личных сообщений

Содержит списки входящих и исходящих сообщения, а также их текст

По требованию пользователя

Э6

Страница поиска

Содержит элементы управления для выбора категории закладок либо поля ввода ключевых слов (для названия ссылки, части адреса, описания)

По требованию пользователя для поиска своих ссылок или нахождения новых

Э7

Страница рекомендаций

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

По требованию пользователя

Э8

Страница анкетных данных

Содержит поля ввода для анкетных данных. Ни одно из полей не является обязательным

По требованию пользователя

Э9

Страница смены пароля

Содержит поля ввода для ввода старого пароля (в целях безопасности) и нового

По требованию пользователя

Э10

Страница загрузки аватара

Содержит элемент управления выбором файла и текущий аватар

По требованию пользователя

Э11

Страница управления пользователями

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

По требованию администратора

Э12

Страница работы с закладками

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

По требованию администратора

Э13

Работа с шаблонами сайта

Позволяет редактировать содержимое верхней и нижней частей ресурса, а также таблицу стилей

По требованию администратора


В состав выходных сообщения входят структурные единицы, перечисленные в таблице 2.

Таблица 2

Наименование

Формат

ID выходного сообщения

Псевдоним

Строка символов, до 20 символов

Э8, Э3, Э11

Интересы

Текст, до 2 Кб

Э8, Э3, Э11

Логин и пароль

Строки текста, до 20 символов

Э2, Э9

Заголовок и адрес закладки

Строки текста, до 1 Кб

Э4, Э7, Э11, Э6, Э12

Дата рождения, дата сообщения

Временной с поддержкой дат

Э8, Э3, Э11, Э5

Текст сообщения

Строки текста, до 1 Кб

Э5

Аватар

Изображение, до 1 Мб

Э10, Э3, Э11

Исходный код

Текст, до 20 Кб

Э13


Входная информация

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

Таблица 3

ID

Наименование

Форма получения

Источник

Срок получения

Q1

Анкета пользователя

Электронная

Пользователь

После заполнения

Q2

Личное сообщение

Электронная

Пользователь

После заполнения

Q3

Данные закладки

Электронная

Пользователь

После заполнения

Q4

Код шаблонов

Электронная

Администратор

После заполнения


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

Концептуальная модель системы

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

Технические средства серверной части должны соответствовать минимальным системным требованиям:

- процессор Pentium 4 3,2 ГГц;

ОЗУ -2 Гб ;

80 Гб свободного пространства на жестком диске;

видеокарта - 32 Мб с поддержкой разрешения 800х600 и 32-битного цвета или выше;

клавиатура;

- операционная система - в случае Windows-систем: Windows 2000 Server/Windows XP Professional/Windows 2003 Server/Windows 2008 Server; в случае UNIX-систем: FreeBSD 6.5+, OpenBSD 4+, Linux (любой дистрибутив) с ядром версии 2.6+.

К клиентским машинам предъявляются обычные для работы в Интернете требования:

процессор Pentium 1000 Гц;

128 Мб ОЗУ;

от 500 до 1000 Мб на жестком диске;

видеокарта 32 Мб с поддержкой разрешения 800х600 и 32-битного цвета или выше;

клавиатура;

мышь;

операционная система - Microsoft Windows 98/ME/NT/2000/XP/2003/Vista, Linux 2.4+, MacOS 9+, FreeBSD 5+, OpenBSD 3+, NetBSD.

Концептуальная модель данных

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

Рис. 3

Логическое проектирование. Логическая модель данных

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

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

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

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

Таблица 5

Сущность

Первичный ключ

Атрибуты

Пользователь

Уникальный ключ пользователя Номер пользователя

Номер пользователя Логин Пароль Статус в системе

Анкета пользователя

Уникальный ключ пользователя Номер пользователя

Номер пользователя Псевдоним Дата рождения Номер ICQ Интересы Хобби Род занятий Аватар

Сообщения

Уникальный ключ сообщения Номер сообщения

Номер сообщения Номер отправителя Номер адресата Тема Текст сообщения Дата и время Статус удаления

Закладки

Уникальный ключ закладки Номер закладки

Номер закладки Номер пользователя Название Описание URL-адрес Тип категории


Для каждой сущности мы задаем первичный и (по условию, предъявляемому к работе системы с данной сущностью) альтернативный ключи, которыми связываем сущности в реляционные отношения. С помощью связей можно организовать видимую связь между данными, которая отражена в описании предметной области. В таблице не отражена сущность «Администратор», т.к. она полностью аналогична и, более того, технически реализована неотделимо от сущности «Пользователь». Логическая модель данных автоматизированной системы отражена на рисунке 4.

Рис. 4

Алгоритм работы автоматизированной системы

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

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

1)  добавление данных, происходит посредством оператора языка SQL INSERT;

2)      удаление данных - с помощью оператора языка SQL DELETE;

)        изменение данных - посредством оператора языка SQL UPDATE;

)        вывод данных - в поля редактирования, с помощью оператора языка SQL SELECT и средств клиента;

Рассмотрим алгоритм работы автоматизированной системы в укрупненном виде. Он приведен на рисунке 5.

Рис.

Информационная безопасность системы

Специфика системы такова, что она может быть атакована следующими видами атак, характерными для сети Интернет:

)        Отказ в обслуживании. Бывает двух типов: обычный (DoS) и распределенный (DDoS), который гораздо опаснее. Если при обычном типе атаки участие в ней принимают 1 или несколько компьютеров, то подобная атака обычно не может нанести ущерба при наличии достаточно мощного сервера и достаточно широкой пропускной способности его канала. Кроме того, достаточно средствами сервера узнать IP-адрес атакующего (это можно сделать при помощи как специальных пакетов - систем обнаружения атак (IDS), так и при помощи простых программ - анализаторов логов и сетевой активности). Затем можно средствами ОС, МСЭ или специализированными программами запретить подключения с этих адресов. Однако при распределенной атаке злоумышленник имеет большую сеть компьютеров (обычно зараженных вирусами типа «троянский конь», и владельцы их даже не догадываются о сетевой активности этих компьютеров), которым он может отдавать команды для отправки пакетов на ресурс. Такие сети называются «ботнетами» и защититься от их атаки весьма сложно. По достижению суммарной пропускной способности их каналов равенства каналу сервера он начинает заметно сбоить, а в его работе начинаются заметные задержки. По превышению пропускной способности сервер перестает успевать обрабатывать запросы и либо зависает, либо самопроизвольно завершает свою работу с ошибкой. Блокировать приходится целые подсети, что не всегда представляется возможным.

)        Подбор паролей. Данный тип атак производится путем перебора всех возможных комбинаций логина и пароля на какой-либо сервис или для доступа в закрытую часть сайта. Взломщик может воспользоваться как готовыми программами, такими как MyBrute для Windows или консольный переборщик hydra для UNIX-систем, так и программами собственного написания, сделанными специально для подбора пароля для входа на конкретный ресурс. Атака производится либо одним из трех типов (по словарю, посимвольный перебор, перебор с учетом известной части пароля), так и комбинированным методом. Защититься от атак можно, блокируя подключения с IP-адресов proxy-серверов, которыми пользуется взломщик, а также используя сложные пароли типа kF1pwZ86NG3t!

)        Атаки на уязвимые сервисы. Посредством специальных программ (например, nmap) взломщик может сделать сканирование сервисов системы («fingerprinting»), узнать их версии. Имея на руках описание свежей ошибки в одном из сервисов, взломщик может дождаться появления программы взлома под эту версию (т.н. эксплоит) либо написать подобную программу сам, что предполагает его высокую квалификацию. Наиболее профессиональные хакеры самостоятельно ищут ошибки в программном обеспечении и создают «0-day»-эксплоиты, находящиеся в распоряжении узкого круга знакомых хакера. Подобные программы являются наиболее опасными, т.к. об ошибках в ПО неизвестно более никому, а уязвимые сервисы имеют тысячи ресурсов по всему миру. Защиты от них, что естественно, найти невозможно. От обычных же эксплоитов можно защититься, постоянно следя за новостями мира информационной безопасности и устанавливая новые, безопасные версии сервисов.

)        Атаки на сценарии. В PHP-сценариях существует угроза локального или удаленного внедрения файлов, а также SQL-инъекции как причина двух типичных недочетов программистов. В первом случае, если программист использует в сценарии файлы, то возможно указать в качестве параметра скрипта такой путь к файлу, который будет прочтен и отображен на экране, к примеру, /etc/passwd. В случае SQL-инъекции взломщик меняет параметры скрипта таким образом, что запрос к БД становится уязвимым.

Если передается числовой параметр, то его можно заменить на -1 OR 1=1, в результате чего выполнится условие 1=1, всегда равное true, и из БД будут выбраны все данные. Также может быть использован оператор UNION, позволяющий задать еще несколько запросов вкупе к тому, который уже выполняется. Защититься от подобного можно, тщательно фильтруя содержимое переменной и приводя ее к числовому типу, после чего проверяя ее на корректность. Также можно обрезать лишние символы, к примеру, если точно известно, что параметр id не может быть более 99999, следует обрезать строку-параметр до 5 символов, после чего уже приводить ее к числу и проверять.

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

SELECT id_news, news_date, news_caption, news_text, news_id_author FROM news news_caption = LIKE('%Test%'), где Test - строка, передеваемая в качестве параметра скрипту, то взломщик может передать следующий параметр:

text = ')+and+(news_id_author='1')/*

В результате этого внутри сценария появится запрос

SELECT id_news, news_date, news_caption, news_text, news_id_author FROM newsnews_caption = LIKE('%') AND (news_id_author=’1’)/*%)

В этом запросе комментарий отсечет ненужные символы и будут выведены только статьи под авторством автора № 1 с любыми заголовками.

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

Разработка программно-информационного компонента. Обоснование выбора среды разработки

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

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

) система должна быть надежной;

) не должна нарушаться целостность данных при внесении изменений;

) система должна обеспечивать дружественный интуитивный интерфейс, удобное перемещение и быстрый вызов любой функции;

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

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

HTML - является главной частью клиентской части приложения, обеспечивает возможность создания гипертекстовой разметки веб-страниц. Он позволяет создавать формы (с типичными элементами управления - кнопками, списками, полями ввода), таблицы, внедрять различные объекты (аудио- и видеофайлы, Java-апплеты, Flash-анимацию), вставлять рисунки, работать с шрифтовым оформлением страниц. И, конечно же, одной из важнейших его возможностей является поддержка гиперссылок.

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

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

AJAX - технология (вернее, их совокупность), возникшая на основе JavaScript и XML. Она позволяет добиться полной интерактивности диалога с пользователем, благодаря ей можно обновлять не всю страницу целиком, а лишь необходимые данные, что позволяет веб-приложениям по удобству и надежности вплотную приблизиться к настольным. В проекте эта технология реализуется при помощи JavaScript-фреймворка jQuery. Он имеет поддержку цепочек вызовов, отличную работу с DOM, встроенные эффекты, возможность тонкой надстройки над объект xmlHttpRequest, огромное количество различных плагинов и мощную поддержку, включающую как огромное сообщество программистов, собравшихся над этим проектом, так и удобную и доступную документацию.

Visual Basic Script - имеет возможности, превосходящие в клиентском плане возможности JavaScript (например, запись и чтение из файлов, навигация по файловой системе), а также является языком серверных сценариев в технологии ASP (позволяя, например, работать с БД), однако его работоспособность на клиентской части ограничена только браузером Internet Explorer, а о недостатках ASP будет изложено ниже.

Adobe Flash и ActionScript - технологии, позволяющие создать красочное интерактивное клиентское приложение. Однако данным решениям присуща излишняя медлительность (производительность скриптового языка ActionScript слишком мала), большой объем, занимаемый flash-роликом, сильная нагрузка на процессор клиента, а также невозможность отображения при использовании клиентом устаревшей версии flash-плеера, ОС или браузера, не поддерживающего Flash или программ, блокирующих такое содержимое (файрволлы, компрессоры трафика). Кроме того, для создания Flash-приложений требуется коммерческое приложение Flash MX.

Для серверной стороны необходимо рассмотреть выбор языка программирования серверных сценариев, который непосредственно связан с выбором web-сервера и сервера баз данных.

В настоящее время на рынке программного обеспечения лидируют разработки open source - Apache и Internet Information Server от компании Microsoft. IIS обладает меньшей степенью защищенности, чем Apache, что обусловлено большим числом найденных в нем ошибок безопасности. Хотя его и можно загрузить бесплатно или установить сразу вместе с Windows, хостинг с IIS (а, следовательно, и Windows Server) обойдется значительно дороже (в 2-3 раза) хостинга под управлением UNIX. Кроме того, следует отметить, что IIS работает только под Windows, в то время как Apache - практически под любой современной ОС. В то же время Apache имеет весьма сложный конфигурационный файл, который необходимо редактировать вручную, а IIS - удобный графический конфигуратор.

В целом, можно сказать, что оба этих продукта равны по возможностям и отличаются лишь деталями реализации. Однако то, что связка Apache+MySQL+PHP уже давно стала классической, а также практически полное отсутствие затрат на разработку позволяет выбрать Apache как наиболее приемлемый вариант.

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

PostgreSQL - СУБД, которая имеет достаточно вложный собственный формат данных, из-за чего работа с данными оказывается весьма непроизводительной. Данный формат данных оправдывает себя только при огромных запросах, в которых соединяются десятки таблиц с сотнями тысяч записей в каждой.

SQLite - нереляционная СУБД, все данные таблиц хранятся в одном файле, а работа с ними поддерживается при помощи удобного интерфейса, поддерживающего ANSI SQL. Также необходимо отметить, что она неявляется демоном (сервисом) в обычном смысле этого слова - это встраиваемая библиотека, и в ее основе не лежит технология «клиент-сервер» - все реализуется как составная часть программного модуля. Благодаря такому устройству потребляет намного меньше памяти, чем прочие СУБД, и дает существенный выигрыш в производительности. Однако на больших объемах данных этот выигрыш исчезает. Применяется главным образом в небольших проектах, хостингах, где нет поддержки СУБД, а также в некоторых настольных приложениях.

MySQL - СУБД, обеспечивающая высокую надежность, производительность, поддержку расширенного относительно ANSI SQL формата этого языка. Имеет хорошо продуманную внутреннюю организацию, что позволяет удобно и быстро получать данные из таблиц. Используется в средних проектах, так как на очень больших объемах данных начинает проигрывать по производительности PostgreSQL. Однако ее скорости хватает практически во всех случаях. Поддерживает все необходимые функции: разграничение полномочий, тонкое конфигурирование, служебные таблицы.

Microsoft SQL Server - коммерческая СУБД, работающая только под Windows. Имеет удобный графический конфигуратор, поддержку большого числа форматов данных, отличную призводительность. Однако ее бесплатная версия Express Edition имеет слишком много ограничений и лишена нормального конфигуратора.

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

Perl - язык, в системах UNIX использующийся для создания автоматизации в системе. Имеет гибкий синтаксис, встроенную поддержку регулярных выражений, являющуюся одним из его главных достоинств, большое количество модулей и целое сообщество, располагающееся на ресурсе cpan.org. Однако его производительность весьма мала, кроме того, для выполнения практически любой обыденной вещи необходимо пользоваться (и искать) новым модулем, множество из которых идут в поставке.

ASP - скорее не ЯП, а серверная технология. Ее ЯП является VBScript, а выполняться такие сценарии могут лишь под управлением IIS. Ввиду использования Apache данная технология, несмотря на свою мощь и большое количество порталов, построенных на ней, нам не подходит.

Java - малопроизводительный ЯП, однако также весьма мощен и прост. Но для его работы необходимо установить веб-сервер от Sun Microsystems, что также не подходит.

PHP - простой и очень мощный ЯП, поддерживающий работу со множеством СУБД, файловой системой, регулярными выражениями. Отлично подходит для работы с MySQL и Apache. Весьма производителен за счет того, что является транслирующим интерпретатором. Также удобен тот факт, что PHP позволяет внедрять HTML-содержимое внутрь сценариев, в том числе разделяя его вывод по условиям, в цикле и т.д.

Физическая модель данных

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

Таблица 6 - аватары (avatars)

Поле

Тип

Длина

Описание

Avatar_id

INT

11

Уникальный номер аватара

Filename

VARCHAR

100

Путь к аватару


Таблица 7 - закладки (bookmark)

Поле

Тип

Длина

Описание

Link_id

INT

11

Уникальный номер ссылки

User_id

INT

11

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

Title

VARCHAR

255

Название закладки

Url

MEDIUMTEXT

65535

Адрес закладки

Descr

MEDIUMTEXT

65535

Описание закладки

Catid

INT

11

Идентификатор категории


Таблица 8 - категории (categories)

Поле

Тип

Длина

Описание

Catid

INT

11

Уникальный идентификатор категории

Name

VARCHAR

100

Название категории





Таблица 9 - личные сообщения (pm)

Поле

Тип

Длина

Описание

Id_mess

INT

11

Номер сообщения

Fid

INT

11

Идентификатор отправителя

INT

11

Идентификатор получателя

Title

VARCHAR

30

Тема сообщения

Message

TEXT

65535

Текст сообщения

Dt

DateTime

18

Дата и время отправки

Rid

INT

11

Статус удаления, равен ID того, кто удалил сообщение или 0, если оно не удалялось


Таблица 10 - данные пользователей (user_details)

Поле

Тип

Длина

Описание

Id

INT

11

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

Nick

VARCHAR

20

Псевдоним (никнейм)

FIO

VARCHAR

80

ФИО

Birth

INT

11

Дата рождения в формате метки времени UNIX

Hobbie

TEXT

65535

Любимые занятия

Job

VARCHAR

50

Работа, должность

ICQ

VARCHAR

9

Номер ICQ

Avatar_id

INT

11

Уникальный идентификатор аватара



Таблица 11 - учетные записи пользователей (users)

Поле

Тип

Длина

Описание

Id

INT

11

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

Login

INT

11

Имя пользователя в системе

Password

INT

11

Пароль в зашифрованном виде

Salt

VARCHAR

30

Случайная строка, используется для шифрования пароля

Status

TEXT

65535

Статус пользователя (обычный, администратор, заблокирован)


Описание пользовательского интерфейса и программных модулей

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

1)      интерфейс должен быть максимально удобен и интуитивно прост;

2)      пользователь должен иметь «под рукой» все необходимые средства для типовой работы с данными;

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

)        информации не должно быть слишком много, чтобы в ней было легко ориентироваться;

)        для визуального оформления и эстетически приятного восприятия информации следует вводить графические элементы - фоновые картинки и прочую графику, использовать различные шрифты;

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

Исходя из этих требований, необходимо создавать интерфейс программы. Когда проектирование интерфейса и компоновки элементов закончено, идет собственно верстка, когда при помощи средств JavaScript, CSS и HTML создается законченный интерфейс. После отладки макета верстки в различных браузерах идет собственно написание программного кода продукта, его отладка и выдача окончательного варианта в виде совокупности сверстанных страниц и результатов выполнения серверных скриптов.

При входе в систему пользователь видит перед собой форму, показанную на рисунке 6. Пользователь может ввести данные в поля ввода и войти в систему под своим аккаунтом. Если у него еще нет учетной записи, то он может зарегистрироваться в системе или воспользоваться гостевым входом, просматривая профили пользователей, их закладки и имея возможность поиска. Если пользователь при входе поставит галочку «запомнить», то сценарий запишет на его ПК cookies (cookie-набор), в котором в зашифрованном виде будет сохранен пароль и логин. При следующем входе в систему пользователю не нужно будет их вводить заново. Запоминание пользователя длится две недели.

Рис. 6

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

<?php_start();('mysql.php');(isset($_GET['logout']))

{(isset($_SESSION['user_id']))

{($_SESSION['user_id']);($_SESSION['adm']);

}('login', '', 0, "/");('password', '', 0, "/");

// и переносим его на главную('Location: index.php');

exit;

}(isset($_SESSION['user_id']))

{

// юзер уже залогинен, перекидываем его отсюда на закрытую страницу

header('Location: profile.php');;

}

$error = false;

$ert = '';(!empty($_POST))

{

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

$query = "SELECT `salt``users``login`='{$login}'1";

$sql = mysql_query($query) or die(mysql_error());(mysql_num_rows($sql) == 1)

{

$row = mysql_fetch_assoc($sql);

// итак, вот она соль, соответствующая этому логину:

$salt = $row['salt'];

// теперь хешируем введенный пароль как надо и повторям шаги, которые были описаны выше:

$password = md5(md5($_POST['password']) . $salt);

// и пошло поехало...

// делаем запрос к БД

// и ищем юзера с таким логином и паролем

$query = "SELECT `id`, `status``users``login`='{$login}' AND `password`='{$password}'1";

$sql = mysql_query($query) or die(mysql_error());

// если такой пользователь нашелся(mysql_num_rows($sql) == 1)

{

// то мы ставим об этом метку в сессии (допустим мы будем ставить ID пользователя)

$row = mysql_fetch_assoc($sql);

$_SESSION['user_id'] = $row['id'];($row['status'] == 1)

$_SESSION['adm'] = 1;if ($row['status'] >= 20)

{

$error = true;

$ert .= 'Вы заблокированы';($_SESSION['user_id']);($_SESSION['adm']);

}

// если пользователь решил "запомнить себя"

// то ставим ему в куку логин с хешем пароля(!$error)

{

$time = 86400*7*2; // ставим куку на 2 недели

if (isset($_POST['remember']))

{('login', $login, time()+$time, "/");('password', $password, time()+$time, "/");

}

// и перекидываем его на закрытую страницу

header('Location: profile.php?id='.$_SESSION['user_id']);

exit;

}

// не забываем, что для работы с сессионными данными, у нас в каждом скрипте должно присутствовать session_start();

}

{

$ert .= 'Пользователь не найден';

$error = true;

}

}

{

$error = true;

$ert .= 'Пользователь не найден';

}

}

include 'header.php';

?>

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

<!--roll(obj, n)

{(n).style.backgroundImage = 'url("html-bg-hover.gif")';.style.backgroundImage = 'url("html-bg-normal.gif")';

}

//-->

</script>

<?'

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

<b style="position:relative;top:15px;left:5px;">Вход в систему</b>

<div style="position:relative;top:30px;left:10px;">

<div style="position:relative;top:10px;">Логин:&nbsp;<input type="text" name="login" style="position:absolute;left:60px;width:130px;" /></div>

<div style="position:relative;top:20px;">Пароль:&nbsp;<input type="password" name="password" style="position:absolute;left:60px;width:130px;"/></div>

<div style="position:relative;top:30px;">Запомнить:&nbsp;<input type="checkbox" name="remember" /></div>

<div style="position:relative;top:40px;left:40px;">

<div style="cursor:pointer;cursor:hand;background:url(\'html-bg-normal.gif\') no-repeat;color:#fff;width:70px;height:24px;text-align:left;line-height:24px;padding-left:15px;" onClick="f.submit()"onMouseOver="roll(this, 1)" onMouseOut="roll(this, 0)">

Вход

</div>

<div style="position:relative;left:100px;top:-20px;"><a href="register.php">регистрация</a></div>

</div>

</div>

</form>';($error)

{'<div style="position:relative; top: 20px;">';nl2br($ert);'</div>';

}'footer.php';

?>

Форма регистрации нового пользователя показана на рисунке 7. Из-за простоты системы и ограничений пакета Denwer, на котором представляется система, подтверждение по e-mail не реализовано.

Рис. 7

Код регистрации приведен далее.

<?php_start();('mysql.php');

/*

** Функция для генерации соли, используемоей в хешировании пароля

** возращает 3 случайных символа

*/GenerateSalt($n=3)

{

$key = '';

$pattern = '1234567890abcdefghijklmnopqrstuvwxyz.,*_-=+';

$counter = strlen($pattern)-1;($i=0; $i<$n; $i++)

{

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

}$key;

}'header.php';(empty($_POST))

{

?>

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

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

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

<!--

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

{

$("#reg").corner("round");

});

//-->

</script>

<div style="margin:100px auto;width:300px;background:#ccc;padding-left:15px;padding-bottom:10px;" id="reg">

<h3>Регистрация</h3>

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

<table>

<tr>

<td>Логин:</td>

<td><input type="text" name="login" /></td>

</tr>

<tr>

<td>Пароль:</td>

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

</tr>

<tr>

<td>Повторите пароль:</td>

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

</tr>

<tr>

<td colspan="2" align="center"><input type="submit" value="Зарегистрироваться" /></td>

</tr>

</table>

</form>

</div>

<?php

}

{

// обрабатывае пришедшие данные функцией mysql_real_escape_string перед вставкой в таблицу БД

$error = false;

$errort = '';

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

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

$repassword = (isset($_POST['repassword'])) ? mysql_real_escape_string($_POST['repassword']) : '';( !empty( $login ) and !preg_match( "#^[A-Za-z][- _0-9A-Za-z]+$#i", $login ) )

{

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

$error = true;

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

{

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

$error = true;

}($password !== $repassword)

{

$error = true;

$errort.='Введенные пароли не совпадают<br />';

}

// проверяем на наличие ошибок (например, длина логина и пароля)

if (strlen($login) < 2)

{

$error = true;

$errort .= 'Длина логина должна быть не менее 2х символов.<br />';

}(strlen($password) < 6)

{

$error = true;

$errort .= 'Длина пароля должна быть не менее 6 символов.<br />';

}

// проверяем, если юзер в таблице с таким же логином

$query = "SELECT `id``users``login`='{$login}'1";

$sql = mysql_query($query) or die(mysql_error());(mysql_num_rows($sql)==1)

{

$error = true;

$errort .= 'Пользователь с таким логином уже существует в базе данных, введите другой.<br />';

}

// если ошибок нет, то добавляем юзаре в таблицу(!$error)

{

// генерируем соль и пароль

$salt = GenerateSalt();

$hashed_password = md5(md5($password) . $salt);

$query = "INSERT`users`

`login`='{$login}',

`password`='{$hashed_password}',

`salt`='{$salt}'";

$sql = mysql_query($query) or die(mysql_error());

$i = mysql_insert_id();

$query = "insert into user_details values($i, '','',0,'','','',0)";

//echo $query;

$sql = mysql_query($query);'<div>Поздравляем, Вы успешно зарегистрированы!<br /><a href="login.php">Авторизоваться</a></div>';

}

{'<div>Возникли следующие ошибки<br />' . nl2br($errort).'<br /><a href="register.php">попробуйте еще раз</a></div>';

}

}'footer.php';

?>

После успешной авторизации пользователь попадает в свой личный кабинет. На рисунке 8 показан личный кабинет администратора, а на рисунке 9 - обычного пользователя системы.

Рис. 9

Рис. 10

Код личного кабинета выглядит так:

<?_start();

$guest = false;(!isset($_SESSION['user_id']))

{

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

$guest = true;

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

}'mysql.php';

$id = (int)$_GET['id'];(empty($id))

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

}

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

//echo 'user: '.$same_user.' id'.$id.' sessid '.$_SESSION['user_id'];

$no_user = false;

//echo "select nick, fio, birth, hobbie, job, icq, filename from `user_details`, `avatars` where id={$id} and avatars.avatar_id=user_details.avatar_id";

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

$r = mysql_query($q);(mysql_num_rows($r) == 0) $no_user = true;

$r = mysql_query("select nick, fio, birth, hobbie, job, icq, avatar_id from `user_details` where id={$id}");(mysql_num_rows($r) > 0) $ud = mysql_fetch_array($r, MYSQL_ASSOC); else

{

$ud = array('nick'=>'',

'fio'=>'',

'birth'=>0,

'hobbie'=>0,

'job'=>'',

'icq'=>'',

'avatar_id'=>0);

}(!$no_user)

{($ud as $k => $v)

{

//echo $ud[$k-1].'+'.empty($ud[$k-1]);(empty($v)) $ud[$k] = 'Нет данных';

}

$ud['avatar_id'] = (int)$ud['avatar_id']; // хитрый план(isset($ud['avatar_id']))

{

$q = "select filename from avatars where avatar_id = {$ud['avatar_id']}";

//echo $q;

$r = mysql_query($q);(mysql_num_rows($r) > 0)

$ava = mysql_fetch_row($r);$ava[0] = 'avatars/anon.jpg'; }

}'head.php';'menu.php';

?>

<div id="rightCol">

<? if (!$no_user) { ?>

<h3><?if ($ud['fio']!='Нет данных') echo $ud['fio']; else echo 'Пользователь '.$id ?></h3>

<table>

<tbody>

<tr>

<td colspan="2">

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

</td>

</tr>

<tr>

<td>Никнейм</td>

<td><?echo $ud['nick'];?></td>

</tr>

<tr>

<td>Дата рождения</td>

<td><?if ($ud['birth']!='Нет данных') echo date('d.m.Y', $ud['birth']);else echo 'не указана';?></td>

<tr>

<td colspan="2">

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

</td>

</tr>

<tr>

<td>

<td><?echo $ud['icq'];?></td>

</tr>

<tr>

<td colspan="2">

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

</td>

</tr>

<tr>

<td>

<td width="300"><? echo $ud['job']; ?></td>

</tr>

<tr>

<td>Интересы</td>

<td width="300"><? echo $ud['hobbie']; ?></td>

</tr>

</tbody>

</table>

</div>

<? } else {

echo '<div>

}?>

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

</div>

<?'foot.php';

?>

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

Рис. 11

Код отправки личного сообщения приведен ниже:

<?_start();(!isset($_SESSION['user_id']))

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

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

}'../mysql.php';

$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;'../head.php';'../menu.php';

$error = false;

$ert = '';($id == $tid)

{

$error = true;

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

}(empty($message))

{

$error = true;

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

}(empty($tid))

{

$error = true;

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

}

{

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

$r = mysql_query($q);(mysql_num_rows($r) == 0)

{

$error = true;

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

}

}

?>

<div id="rightCol">

<?(!$error)

{

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

$query = "INSERT INTO pm

(,

{$id},

{$tid},

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

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

)";$query;

$r = mysql_query($query);

echo '<div>

}{'<div>

}

?>

</div>

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

</div>

<?'../foot.php';

?>

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

Рис. 12

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

<?_start();(!isset($_SESSION['user_id']))

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

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

}'../mysql.php';

$id = $_SESSION['user_id'];

$same_user = true;

$no_user = false;'../head.php';'../menu.php';

?>

<div id="rightCol">

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

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

<!--see_mail(id)

{

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

}

//-->

</script>

<table>

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

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

$words = split($sep, $text);( count($words) > $counttext )

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

}

$query = "SELECT a.id_mess, a.title, a.message, DATE_FORMAT(a.dt,'%d.%m.%Y %H:%i:%s'), b.nick, a.fidpm a INNER JOIN user_details ba.fid=b.ida.tid={$id}rid<>{$id}BY dt DESC";

//echo $query;

$res = mysql_query($query);(mysql_num_rows($res) == 0)

{"<tr>

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

</tr>";

}{($mess = mysql_fetch_row($res))

{

$cuttext = my_str_word($mess[2]);"<tr><td>

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

</td>

<td>

<div>

<div>

</td>

<td>

$mess[3]

</td>

<td>

<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>";"</tr>";

}

}

?>

</table>

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

</div>

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

</div>

<?'../foot.php';

?>

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

<?_start();(!isset($_SESSION['user_id']))

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

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

}'../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,.fio AS to_user_name, c.fio AS from_user_namepm a INNER JOIN user_details ba.tid=b.idJOIN user_details ca.fid=c.idid_mess=".$mess_id."(a.tid=".$id." OR a.fid=".$id.")a.rid<>".$id;

//echo $query;

$res = mysql_query($query);

$m = mysql_fetch_array($res);'<table border="0" cellspacing="0" cellpadding="3">';'<tr>';'<td><b>Отправитель:</b></td><td><a href="/soc/profile.php?id='.$m['fid'].'">'.$m['from_user_name'].'</a></td>';'</tr>';'<tr>';'<td><b>Получатель:</b></td><td><a href="/soc/profile.php?id='.$m['tid'].'">'.$m['to_user_name'].'</a></td>';'</tr>';'<tr>';'<td>Дата:</td><td>'.$m['dt'].'</a></td>';'</tr>';'<tr>';'<td>Тема:</td><td>'.$m['title'].'</a></td>';'</tr>';'<tr>';'<td valign="top"><b>Сообщение:</b></td><td>'.nl2br(wordwrap($m['message'], 75, "\n", 1)).'</td>';

echo '</tr>';

?>

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

Рис. 13

Рис. 14

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

<?_start();

$guest = false;(!isset($_SESSION['user_id']))

{

$guest = true;

}'mysql.php';'bm_fns.php';

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

//echo $id;

$page = (int)$_POST['page'];_bms_links($id, $page, 3);

?>

<div id="cont">

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

<!--

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

{

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

{($(this).attr('t') == '1') return;(!confirm("Удалить ссылку?")) return;i = $(this).parent().parent().attr('id');

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

{

//alert(data);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>

<?php($page<=0) $page=1;

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

$n = mysql_num_rows($r);

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

else {

$same_user = false;($id == $_SESSION['user_id']) $same_user = true;($m = mysql_fetch_array($r, MYSQL_NUM)) {"<tr id=\"$m[4]\">";"<td><a href=\"$m[1]\">$m[0]</a><br />";(!empty($m[2])) echo nl2br(wordwrap($m[2], 40, "\n", 1))."<br />";"<b>Категория:</b> $m[3]<br />Адрес: <a href=\"$m[1]\">".htmlspecialchars($m[1])."</a></td>";($same_user) {"<td>Изменить</a><br /><a href=\"#\" t=\"0\">Удалить</a></td>";

}{(!$guest) echo "<td>Добавить к себе</a></td>";

}'</tr>';

}

}

}

?>

</table>

</div>

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

<?php($bm_count);

$bm_count = 5;get_bms_links($userid, &$page, $links)

{$bm_count;

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

//echo $q;

$r = mysql_query($q);

$res = mysql_fetch_row($r);($pages);

//echo $res[0];

$pages = ceil($res[0]/$bm_count);($page < 1) $page = 1;($page > $pages) $page = $pages;

//echo $page;

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

if ($page > $links)

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

$starttext = '';($page < ($pages-$links+1))

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

$endtext = '';

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

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

{

$nearpages.="<a href=\"$PHP_SELF?page=$i&id=$userid\"";($i == $page) $nearpages.='style="font-weight:bold;"';

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

}

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

}get_user_bms($userid, $page)

{$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.user_id = $userid AND cat.catid = bm.catid ORDER BY bm.url LIMIT $l1, $bm_count";

$r = mysql_query($q);

//echo $q;(!$r) return false;$r;

}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);(!mysql_query("delete from bookmark where user_id=$userid and link_id=$linkid"))false;$u[0];

}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);($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;(!mysql_query($q))false;true;

}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; // - тут все корректно($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);(mysql_num_rows($r) > 0) throw new Exception('Такая закладка уже есть!');

$q = "insert into bookmark values(NULL, $userid, '$title', '$newurl', '$description', $cat_id)";(!mysql_query($q)) throw new Exception('Не удается добавить закладку!');true;

}recommend_urls($userid, $popularity = 1)

{

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

)bookmark b1, bookmark b2b1.user_id = $useridb1.user_id != b2.user_idSUBSTRING_INDEX( b1.url, '/', 3 ) = SUBSTRING_INDEX( b2.url, '/', 3 )

)SUBSTRING_INDEX( a.url, '/', 10 ) NOT(SUBSTRING_INDEX( url, '/', 10 )bookmarkuser_id = $userid

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

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

$r = mysql_query($query);(!$r)

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

if (mysql_num_rows($r)==0)

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

}

?>

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

Рис. 15

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

<?_start();(!isset($_SESSION['user_id']))

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

}'mysql.php';

$id = $_SESSION['user_id'];

$same_user = true;

$no_user = false;'../head.php';'../menu.php';

?>

<div id="rightCol">

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

<script>

<!--oldurl = '';see_details(url)

{

//alert(url)(oldurl == url)

{

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

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

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

//alert(data)

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

})

$("#d").animate({: 50, opacity: 'show'

}, 500);

}

//-->

</script>

<?_once('bm_fns.php');

{

$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;($m=mysql_fetch_array($r, MYSQL_NUM))

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

}

}(Exception $e)

{$e->getMessage();

}

?>

</table>

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

</div>

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

</div>

<?'../foot.php';

?>

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

<?_start();(!isset($_SESSION['user_id']))

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

}_once('mysql.php');('Content-type: text/html; charset=utf-8');

$id = $_SESSION['user_id'];

$q = "SELECT substring_index( url, '/', 10 ), count(user_id), b.fio, b.idbookmark INNER JOIN user_details b ON b.id=bookmark.user_iduser_id !=$idsubstring_index( url, '/', 3 ) = substring_index( '$url', '/', 3 )url NOT IN (select url from bookmark where user_id=$id) group by substring_index( url, '/', 10 )";

//echo $q;

$res = mysql_query($q);'<table>';($m = mysql_fetch_array($res))

{'<tr>';

$s = 'рекомендаци';($m[1] == 1) $s.='я';if ($m[1] > 1 && $m[1] < 10) $s.='и'; else $s.='й';"<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>';$s.'</td>';'</tr>';

}'</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, hobbie='$hobbie', job='$job', icq='$icq'id={$id}";

//echo $q;(mysql_query($q)) return true; else return false;

}get_user_details($id)

{

$ud = array();

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

$r = mysql_query($q);(mysql_num_rows($r) > 0)

{

$ud = mysql_fetch_array($r);

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

return $ud;

}

{0;

}

}

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

Рис. 17

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

<?_start();(!isset($_SESSION['user_id']))

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

}'../mysql.php';

$id = $_SESSION['user_id'];

$query = "SELECT `password`, `salt``users``id`='{$id}'1";

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

{(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']) : '';( !empty( $newpass) and !preg_match( "#^[-_!0-9A-Za-z]+$#i", $newpass ) )

{

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

$error = true;

}(strlen($newpass) < 6)

{

$error = true;

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

}

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

{

$error = true;

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

}(!$error)

{

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

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

$r = mysql_query($q);

$time = 86400*7*2;('password', $newpass, time()+$time, "/");

//echo $q;'<div>Пароль успешно изменен на</div>';

}

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

}

}

}

$no_user = false;

$same_user=true;

$id = $_SESSION['user_id'];'../head.php';'../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>

<?'../foot.php';

?>

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

Рис. 18

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

<?php_start();(!isset($_SESSION['user_id']))

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

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

}

$id = $_SESSION['user_id'];GenerateName($n=10)

{

$key = '';

$pattern = '1234567890abcdefghijklmnopqrstuvwxyz';

$counter = strlen($pattern)-1;($i=0; $i<$n; $i++)

{

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

}$key;

}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;( ($w <= $max_w) && ($h <= $max_h) )

{

$dstw = $w;

$dsth = $h;

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

{

$dstw = $max_w;

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

}

{

$dsth = $max_h;

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

}

$src = ImageCreateFromJpeg($img);

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

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

/*print nl2br("$img:: $w,: $h,

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

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

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

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

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

"); */($dst, $fname, 100);

}'../mysql.php';

$error = false;

$ert = '';($_FILES['userfile']['error'] > 0)

{

$error = true;($_FILES['userfile']['error'])

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

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

}

}

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

$blacklist = array(".php", ".phtml", ".php3", ".php4", "pl");($blacklist as $item) {(preg_match("/$item\$/i", $_FILES['userfile']['name'])) {

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

$error = true;

}

}

$imageinfo = getimagesize($_FILES['userfile']['tmp_name']);($imageinfo['mime'] != 'image/jpeg') {

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

$error = true;

}

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

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

{

$z = $_FILES['userfile']['tmp_name'];(!move_uploaded_file("$z", $upfile))

{

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

$error = true;

}(!$error)

{

$fn = '../avatars/'.GenerateName().'.jpg';_image(240, 320, $upfile, $fn);

$fn = substr($fn,3);

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

$avid = mysql_insert_id();

$q = "update user_details set avatar_id=$avid where id={$id}";_query($q);($upfile);

}

}

{

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

$error = true;

}'../head.php';

$no_user = false;

$same_user = true;'../menu.php';'<div id="rightCol">';($error)

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

}

{'<div>Файл успешно загружен</div>';

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

include '../foot.php';

?>

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

Рис. 19

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

<?

include_once('mysql.php');

session_start();

$guest = false;(!isset($_SESSION['user_id']))

{

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

$guest = true;

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

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

//echo $_GET['type'];(isset($_GET['type']))

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

{

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

$q = "SELECT u.id, b.title, b.url, b.descr, c.namebookmark b, users u, categories cc.catid =$cidb.user_id != $idb.user_id=u.idc.catid = b.catid";

//echo $q;

}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.namebookmark b, users u, categories c(";

$b = false;(!empty($descr))

{($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).")";

}(!empty($title))

{($b) $q = $q.' AND (';($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).")";

}(!$b) {

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

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

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

$q.="b.user_id !=$idb.user_id=u.idc.catid = b.catid";

//echo $q;

}

$r =mysql_query($q);

}'<table border=1>';'<tr><th>Пользователь</th><th>Название</th><th>URL-адрес</th><th>Описание</th><th>Категория</th></tr>';($m=mysql_fetch_array($r, MYSQL_NUM))

{'<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;"<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>";'</tr>';

}'</table>';

?>

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

Рис. 20

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

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

Блокировка:

<?_start();(!isset($_SESSION['user_id']))

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

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

}

$id = (int)$_POST['id'];($id == $_SESSION['user_id']) {

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

}'../mysql.php';

$q = "update users set status=status+20 where id={$id}";(mysql_query($q)) echo 'Успешно забанен'; else echo 'Невозможно забанить';

?>

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

<?_start();(!isset($_SESSION['user_id']))

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

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

}

$id = (int)$_POST['id'];($id == $_SESSION['user_id']) {

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

}'../mysql.php';

$q = "update users set status=status-20 where id={$id}";(mysql_query($q)) echo 'Успешно разбанен'; else echo 'Невозможно разбанить';

?>

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

<?_start();(!isset($_SESSION['user_id']))

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

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

}

$id = (int)$_POST['id'];'../mysql.php';'../options/user_fns.php';

$ud = get_user_details($id);($ud != 0)

{

?>

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

<!--get_mess()

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

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

}

//-->

</script>

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

<form name="an_f">

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

<table>

<tbody>

<tr>

<td colspan="2">

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

</td>

</tr>

<tr>

<td>Никнейм</td>

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

</tr>

<tr>

<td>ФИО</td>

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

</tr>

<tr>

<td>Дата рождения</td>

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

</tr>

<tr>

<td colspan="2">

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

</td>

</tr>

<tr>

<td>

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

</tr>

<tr>

<td colspan="2">

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

</td>

</tr>

<tr>

<td>

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

</tr>

<tr>

<td>Интересы</td>

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

</tr>

</tbody>

</table>

</form>

<?

}

?>

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

<?

session_start();

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

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

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

}

$id = (int)$_POST['id'];($id == $_SESSION['user_id']) {

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

}'../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}";( mysql_query($q) && mysql_query($q2))

{_query($q1);'Удалено успешно';

}

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

}

?>

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

Рис. 21

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

<?_start();(!isset($_SESSION['user_id']))

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

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

}'../mysql.php';'../head.php';

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

{'<div>

echo '</div>';'../foot.php';;

}

$id = $_SESSION['user_id'];

$same_user = true;

$no_user = false;'../menu.php';

$pages = $_POST['pages'];(empty($pages)) $pages = 20;

//echo $pages;replace_month($path){(eregi('jan',$path)){$path='1';}(eregi('feb',$path)){$path='2';}(eregi('mar',$path)){$path='3';}(eregi('apr',$path)){$path='4';}(eregi('may',$path)){$path='5';}(eregi('jun',$path)){$path='6';}(eregi('jul',$path)){$path='7';}(eregi('aug',$path)){$path='8';}(eregi('sep',$path)){$path='9';}(eregi('oct',$path)){$path='10';}(eregi('nov',$path)){$path='11';}{$path='12';}$path;

}

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

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

$fp = filesize($filename)-$fd*100;($pages == 'all') $fp = 0;

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

$arr = array();

$i = 0;

$a = 0;(!feof($fh))

{

$line = trim(fgets($fh, 1024));(!eregi('.jpg',$line) and !eregi('.gif',$line) and !eregi('.js',$line) and !eregi('.css',$line))

{

//echo 'b';(strstr($line, '/soc'))

{

$arr[$i] = $line;

//echo 'a';

$i++;

}

}

}($fh);

?>

<div id="rightCol">

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

<select name="pages">

<?

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

{"<option value=$p";($p == $pages) echo " selected";">Последние $p</option>";

}

?>

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

</form>

<br />

<table border="1">

<?($arr as $v)

{_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];_match("@(..)/(...)/(....):(..):(..):(..)@",$time,$matches);_shift($matches);

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

$time = mktime($matches[3],$matches[4],$matches[5],$matches[1],$matches[0],$matches[2]);(eregi("(\%27)|( or )|( and )|( union )",$url)) { $hack[$h++] = array($ip, $time, $url, $bytes); }_match("/\S+\s+(\S+)/",$url,$matches);

$url = $matches[1];

$url = urlencode($url);($succes=='200') {

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

}{

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

}

}

?>

<tr>

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

</tr>

<?(!empty($success))

{

$success = array_reverse($success);($success as $k=>$v)

{'<tr>';($v as $key=>$val)

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

$val = urldecode($val);

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

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

}'</tr>';

}

}

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

}

?>

<tr>

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

</tr>

<?(!empty($failure))

{

$failure = array_reverse($failure);($failure as $k=>$v)

{'<tr>';($v as $key=>$val)

{($key == 1) { $val = date('d.m.Y H:i:s',(int)$val); }($key == 2) { $val = urldecode($val); $val = nl2br(wordwrap($val, 40, "\n", 1)); }"<td>$val</td>";

}'</tr>';

}

}

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

}

?>

<tr>

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

</tr>

<?(!empty($hack))

{

$hack = array_reverse($hack);($hack as $k=>$v)

{'<tr>';($v as $key=>$val)

{($key == 1) { $val = date('d.m.Y H:i:s',(int)$val); }($key == 2) { $val = urldecode($val); $val = nl2br(wordwrap($val, 40, "\n", 1));}"<td>$val</td>";

}'</tr>';

}

}

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

}

?>

</table>

</div>

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

</div>

<?'../foot.php';

?>

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

Рис. 22

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Для начала работы в системе необходимо зайти по адресу 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.

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

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

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

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

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

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

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

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

.http://habrahabr.ru

.http://phpclub.ru

.http://php.su

.http://htmlbook.ru

.http://www.javascriptkit.com/

Приложение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

.14. Патентная чистота должна быть обеспечена в отношении России и стран СНГ.

.15. Вся документация по разработанной системе должна быть стандартизирована по ЕСПД, в качестве нормативных документов следует использовать стандартные и унифицированные для данной предметной области формы.

. Требования к функциям системы

Функция «Работа с закладками» должна решать следующие задачи:

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

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

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

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

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

Функция «Работа с личной перепиской» должна решать задачи:

просмотра списка сообщений с разделением на «входящие» и «исходящие»;

выбор сообщения и его просмотр;

ответ на сообщение;

создание нового сообщения.

Функция «Администрирование и защита информации» должна решать задачи:

изменения шаблонов оформления сайта;

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

аутентификацию и регистрацию новых пользователей

блокирование учетных записей пользователей и их удаление.

. Требования к видам обеспечения

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

.2. Информационное обеспечение - состав, структура и организация данных (например, личные дела учащихся и сведения об их успеваемости) - представлены в виде содержимого таблиц БД. Информационный обмен между компонентами системы происходит путем связи таблиц, форм и SQL-операторов. Сбор данных в системе производится путем их ввода в таблицы. Обработка и передача данных происходит на основе алгоритмов решения задач системы. Защита данных от разрушения решается путем восстановления данных из резервных копий, то есть восстановление должно идти из ближайшей сделанной копии. Хранение, обновление и восстановление данных происходит в таблицах БД путем записи, перезаписи, дозаписи в них данных. Документы, создаваемые в ходе работы АИС, не имеют юридической силы.

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

.4. Программное обеспечение - используется MySQL 5, PHP 5, Apache 2.6 на стороне сервера и любое ПО на стороне клиента, которое поддерживается перечисленными ниже минимальными системными требованиями.

.5. Техническое обеспечение - минимальная конфигурация для клиента 128 Mb RAM/1 GHz процессор/10 Gb HDD/32 Mb video/принтер, клавиатура, мышь.

.6. Организационное обеспечение - инструкция по сопровождению и использованию; реакция системы на ошибки пользователя, подсказки, справка в бумажном варианте и в виде функции системы.

Похожие работы на - Социальная сеть

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!