System zarządzania treścią.

Transkrypt

System zarządzania treścią.
Żewłakow Tomasz
Woś Krzysztof
Bazy Danych 2
Semestr 2011L
System zarządzania treścią.
0. Etap 0: Słowny opis projektu.
System zarządzania treścią.
Aplikacja umożliwiająca łatwą aktualizację i edycję stron tekstowych serwisu za pomocą
wizualnego edytora treści (umożliwia to wygodne tworzenie i formatowanie
dokumentów bez znajomości HTMLa) oraz publikację tych treści w internecie.
Zarządzanie treścią serwisu odbywa się poprzez wygodny panel dostępny z poziomu
strony www, który jest dostępny wyłącznie dla użytkowników posiadających
odpowiednie uprawnienia. Użytkownicy w systemie są podzieleni na role z uwagi na
zakres prac. Administrator po zalogowaniu się do systemu, może każdemu
zarejestrowanych użytkowników nadad odpowiedni stopieo uprawnieo.
Aplikacja zostanie wykonana w technologii PHP z użyciem bazy danych PostgreSQL.
Szkielet aplikacji będzie oparty o framework ZendFramework.
1. Etap 1: Projekt bazy danych.
1.1. Diagram ER.
1.2. Opis związków na diagramie ER.
1.3. Opis encji.
1.4. Analiza wymagań funkcjonalnych i niefunkcjonalnych.
Wymagania funkcjonalne
ID
1.
Nazwa
Autoryzacja użytkowników
2.
Zarządzanie użytkownikami
3.
Możliwośd publikowania,
edycji i usuwania własnych
treści
4.
Wizualny edytor treści
5.
Filtracja komentarzy
6.
Logowanie akcji
7.
Konfiguracja ustawieo
Opis
użytkownik może się zalogowad za pomocą
indywidualnego loginu oraz hasła. Po
zalogowaniu użytkownik w zależności od
typu konta zyskuje odpowiednie
uprawnienia do zarządzania treścią.
możliwośd tworzenia użytkowników
uprawionych do edycji zasobów serwisu –
3 poziomy uprawnieo
użytkownik może dodawad własne
komentarze, redaktor ponadto może
dodawad własne posty, natomiast
administrator ma możliwośd dodawania
stron.
możliwośd wizualnej edycji treści za pomocą
edytora typu WYSIWYG.
komentarze niezalogowanych
użytkowników muszą zostad zatwierdzone
przez administratora/redaktora przed
opublikowaniem.
wszystkie akcje wykonywane na stronie są
logowane w bazie danych.
system umożliwia zmianę konfiguracji w
zależności od platformy na jakiej jest
uruchomiony
Priorytet
1
2
1
3
2
3
1
Wymagania niefunkcjonalne





Bezpieczeostwo – system musi zapewnid bezpieczeostwo użytkowników – nikt nie może
mied bezpośredniego dostępu do ich danych w bazie po za kierownikiem instytutu oraz
administratorem.
Niezawodnośd – system powinien byd dostępny ciągle oraz zapewniad spójnośd
wprowadzanych danych. Wysoce niepożądane są pomyłki we wprowadzaniu tematu
pracy.
Przyjazny interfejs – aplikacja powinna byd łatwa w użytku, przejrzysta oraz estetycznie
wyglądająca. Intuicyjnośd obsługi jest bardzo pożądana.
System pomocy – system powinien byd wyposażony w komentarze przy każdym z pól
wyboru.
Możliwośd rozwoju systemu – powinna byd możliwośd dopisywania nowych modułów,
oraz zmiany wyglądu.
1.5. Diagram logiczny.
1.6. Skrypt DDL.
W osobnym pliku: baza.sql
2. Etap 2: Projekt aplikacji.
2.1. Hierarchia menu.
 Administracja
o Kategorie
 Przeglądaj
 Edytuj
 Usuo
 Dodaj
o Strony
 Przeglądaj
 Edytuj
 Usuo
 Dodaj
o Posty
 Przeglądaj
 Edytuj
 Usuo
 Dodaj
 Przeglądaj komentarze
 Usuo Komentarz
o Użytkownicy
 Przeglądaj
 Edytuj
 Usuo
 Dodaj
 Strona
o Posty
 Przeglądaj
 Komentuj
o Strony
 Przeglądaj
2.2. Szkielet aplikacji.
 Posty – moduł umożliwiający wyświetlanie, dodawanie, edycję oraz usuwanie postów
wyświetlanych później na stronie głównej.
 Strony – moduł umożliwiający wyświetlanie, dodawanie, edycję oraz usuwanie stron
informacyjnych.
 Użytkownicy – moduł obsługujący rejestrację, logowanie oraz zarządzanie kontem
użytkowników oraz nadawanie im odpowiednich uprawnieo dostępu do panelu zarządzania
treścią.
 Komentarze – moduł umożliwiający dodawanie komentarzy, wstępną moderację oraz
umożliwiający usuwanie komentarzy.
 Logi – moduł umożliwiający przeglądanie w czytelnej formie logów z działao podczas
użytkowania aplikacji.
 Opcje – moduł umożliwiający dostosowywanie opcji działania aplikacji do własnych
preferencji.
2.3. Podział realizacji funkcjonalności między stronę serwera i klienta.
 Klient
o
o
o
o
o
Wyświetlanie postów, możliwośd ich edycji oraz usunięcia,
Możliwośd komentowania postów oraz ich moderacji,
Obsługa edycji, modyfikacji oraz dodawania postów, stron i użytkowników.
Wstępna walidacja wprowadzanych danych,
Wyświetlanie przyjaznego interfejsu.
 Serwer
o Pobieranie, edycja oraz usuwanie rekordów w bazie danych – zarządzanie bazą
danych,
o Obsługa sesji użytkownika,
o Pełna walidacja danych,
o Obsługa żądao danych.
o Logowanie zdarzeo i akcji.
2.4. Sposób realizacji wymuszania integralności danych.
W tabelach zostały podefiniowane powiązania na bazie kluczy obcych. Dodając wartości do tabeli, w
przypadku tabeli z kluczami obcymi, schemat bazy wymusza na nas dodawanie wartości jedynie
zgodnych. Dodatkowo tabele połączone danym kluczem obcym są w tych samych momentach
usuwane. Przykładowo, dodając post do kategorii musimy wybrad jedną z aktualnie zdefiniowanych.
Natomiast jeśli usuwamy kategorię, również wszystkie wpisy z kategorii są usuwane.
2.5. Indeksy w bazie danych.
Indeksy zostały nałożone w celu szybszego wyszukiwania informacji w tabelach. Znajdują się one na
następujących polach:
 categories.id
 comment_status.id
 comments.id
 logs.id
 options.name
 pages.id
 posts.id
 priviliges.id
 publish_statuses.id
 users.id
2.6. GUI.
3. Etap 3: Implementacja.
3.1. Aplikacja.
Dostępna pod adresem http://projekty.wos.in/bd/
3.2. Procedury wbudowane i triggery.
FUNKCJE
 Funkcja usuwająca komentarze zawierające dane słowo
CREATE OR REPLACE FUNCTION delcommentwithword(slowo character)
RETURNS boolean AS
$BODY$
BEGIN
--INSERT INTO user_connection_data (ip, user_id) VALUES (_ip, _user_id);
DELETE FROM comments WHERE content LIKE '%'||slowo||'%';
IF FOUND THEN
RETURN true;
ELSE RETURN false;
END IF;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
 Funkcja zliczająca ilość postów i stron stworzonych przez użytkownika.
CREATE OR REPLACE FUNCTION getcount()
RETURNS numeric AS
$BODY$
DECLARE
counter NUMERIC(5,0);
tmp NUMERIC(5,0);
BEGIN
SELECT COUNT(*) INTO counter FROM posts;
SELECT COUNT(*) INTO tmp FROM pages;
counter := counter + tmp;
RETURN (counter) ;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
 Funkcja zliczająca punkty użytkownika
CREATE OR REPLACE FUNCTION getpoints(userid numeric)
RETURNS numeric AS
$BODY$
DECLARE
points NUMERIC(5,0);
tmp_points NUMERIC(5,0);
BEGIN
SELECT COUNT(*) INTO points FROM posts WHERE "author" = USERID;
points := points * 3;
SELECT COUNT(*) INTO tmp_points FROM pages WHERE "author" = USERID;
tmp_points := tmp_points * 4;
points := points + tmp_points;
RETURN (points) ;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
Triggery
 Trigger ustawiający domyślną kategorię dla postów z usuwanej kategorii
CREATE TRIGGER delete
BEFORE DELETE
ON categories
FOR EACH ROW
EXECUTE PROCEDURE bdelete();
REATE OR REPLACE FUNCTION bdelete()
RETURNS trigger AS
$BODY$
DECLARE idk NUMERIC(5,0);
BEGIN
SELECT id INTO idk FROM categories WHERE name = 'brak kategorii';
UPDATE posts SET category = idk WHERE category = OLD.id;
RETURN NULL;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
 Trigger pełniący rolę loggera.
CREATE TRIGGER log
AFTER INSERT OR UPDATE OR DELETE
ON posts
FOR EACH ROW
EXECUTE PROCEDURE log_add();
CREATE OR REPLACE FUNCTION log_add()
RETURNS trigger AS
$BODY$ BEGIN
IF (TG_OP = 'DELETE') THEN
insert into log(ip, date, action, descr) values (new.author, now(), 'delete', old.title);
RETURN OLD;
ELSIF (TG_OP = 'UPDATE') THEN
insert into log(ip, date, action, descr) values (new.author, now(), 'update', new.content);
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
insert into log(ip, date, action, descr) values (new.author, now(), 'insert', new.title);
RETURN NEW;
END IF;
RETURN NULL;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
 Trigger sprawdzający poprawność adresu mail użytkownika.
CREATE TRIGGER vadilate_mailt
BEFORE INSERT
ON users
FOR EACH ROW
EXECUTE PROCEDURE vadilate_mail();
CREATE OR REPLACE FUNCTION vadilate_mail()
RETURNS trigger AS
$BODY$
BEGIN
IF NEW.email NOT LIKE '%@%' THEN
RAISE EXCEPTION '% bledny mail', NEW.email;
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;