Klasa Użytkownik

0

Mam taką małą klasę do obsługi użytkowników programu.

unit classUzytkownik;

interface

uses ADODB, SysUtils;

type
  TUzytkownik = class

    DB: TADOConnection;

    Id: Integer;
    Login: String;
    Haslo: String;
    Nazwisko: String;

    constructor Create(var ADOCOnnection: TADOConnection);
    procedure Dodaj;
    procedure WybierzUzytkownika(Id: Integer); overload;
    procedure WybierzUzytkownika(Login: String; Haslo: String); overload;
    function CzyIstnieje(Login: String; Haslo: String): Boolean;
    function CzyLoginWolny(Login: String): Boolean;
    procedure Aktualizuj;
    procedure Usun;
  end;

const TABELA_UZYTKOWNICY: String = 'umo_uzytkownicy';

implementation

constructor TUzytkownik.Create(var ADOCOnnection: TADOConnection);
begin
  DB := ADOCOnnection;
end;

procedure TUzytkownik.Dodaj;
var Insert: TADOCommand;
begin
  Insert := TADOCommand.Create(Self.DB);
  Insert.Connection := Self.DB;

  Insert.CommandText :=

    'INSERT INTO ' + TABELA_UZYTKOWNICY + ' (' +
    'Login, ' +
    'Haslo, ' +
    'Nazwisko ' +
    ') ' +
    'VALUES('+
    '"' + Self.Login + '", ' +
    '"' + Self.Haslo + '", ' +
    '"' + Self.Nazwisko + '" ' +
    ' );';

  Insert.Execute;
end;

procedure TUzytkownik.Aktualizuj;
var Update: TADOCommand;
begin
  Update := TADOCommand.Create(Self.DB);
  Update.Connection := Self.DB;

  Update.CommandText :=

    'UPDATE ' + TABELA_UZYTKOWNICY + ' SET ' +

    'Login     = "' + Self.Login + '", ' +
    'Haslo     = "' + Self.Haslo + '", ' +
    'Nazwisko  = "' + Self.Nazwisko + '" ' +

    'WHERE Id   = "' + IntToStr(Self.Id) + '" LIMIT 1;';

  Update.Execute;
end;

procedure TUzytkownik.WybierzUzytkownika(Id: Integer);
var DataSet: TADODataSet;
begin
  DataSet := TADODataSet.Create(DB);
  DataSet.Connection := DB;
  DataSet.CursorType := ctStatic;

  DataSet.CommandText :=

    'SELECT * FROM ' + TABELA_UZYTKOWNICY + ' ' +
    'WHERE id = ' + IntToStr(Id) + ' LIMIT 1;';

  DataSet.Open;

  Self.Id        := DataSet.FieldByName('Id').AsInteger;
  Self.Login     := DataSet.FieldByName('Login').AsString;
  Self.Haslo     := DataSet.FieldByName('Haslo').AsString;;
  Self.Nazwisko  := DataSet.FieldByName('Nazwisko').AsString;
end;

procedure TUzytkownik.WybierzUzytkownika(Login: String; Haslo: String);
var DataSet: TADODataSet;
begin
  DataSet := TADODataSet.Create(DB);
  DataSet.Connection := DB;
  DataSet.CursorType := ctStatic;

  DataSet.CommandText :=

    'SELECT * FROM ' + TABELA_UZYTKOWNICY + ' ' +
    'WHERE Login = "' + Login + '" AND haslo = "' + Haslo + '" LIMIT 1;';

  DataSet.Open;

  Self.Id        := DataSet.FieldByName('Id').AsInteger;
  Self.Login     := DataSet.FieldByName('Login').AsString;
  Self.Haslo     := DataSet.FieldByName('Haslo').AsString;;
  Self.Nazwisko  := DataSet.FieldByName('Nazwisko').AsString;
end;

function TUzytkownik.CzyIstnieje(Login: String; Haslo: String): Boolean;
var DataSet: TADODataSet;
begin
  DataSet := TADODataSet.Create(DB);
  DataSet.Connection := DB;
  DataSet.CursorType := ctStatic;

  DataSet.CommandText :=

    'SELECT COUNT(*) FROM ' + TABELA_UZYTKOWNICY + ' ' +
    'WHERE Login = "' + Login + '" AND haslo = "' + Haslo + '" ;';

  DataSet.Open;

  if DataSet.Fields.Fields[0].Value > 0 then
    Result := True
  else
    Result := False
end;

function TUzytkownik.CzyLoginWolny(Login: String): Boolean;
var DataSet: TADODataSet;
begin
  DataSet := TADODataSet.Create(DB);
  DataSet.Connection := DB;
  DataSet.CursorType := ctStatic;

  DataSet.CommandText :=

    'SELECT COUNT(*) FROM ' + TABELA_UZYTKOWNICY + ' ' +
    'WHERE Login = "' + Login + '" ;';

  DataSet.Open;

  if DataSet.Fields.Fields[0].Value > 0 then
    Result := False
  else
    Result := True
end;

procedure TUzytkownik.Usun;
var Delete: TADOCommand;
begin
  Delete := TADOCommand.Create(Self.DB);
  Delete.Connection := Self.DB;

  Delete.CommandText :=

  'DELETE FROM ' + TABELA_UZYTKOWNICY + ' ' +
  'WHERE id = "' + IntToStr(Self.Id) + '" ' +
  'LIMIT 1;';

  Delete.Execute;
end;

end.

1. Jak już wiele razy wspominałem, jestem początkującym amatorem, wiec jeśli widzicie jakieś błędy w tej klasie to napiszcie.

2. Chciałem zapytać o to jak zaimplementować listę użytkowników. Czy do tego pisze się osobną klasę czy można w tej? Dokładnie to chodzi mi o pobranie wszystkich użytkowników by później wyświetlić ich dane w ListView.

3. Będę musiał także zaimplementować jakiś mini-system uprawnień. Program jest podzielony na moduły, nie każdy użytkownik ma dostęp do każdego modułu. W każdym module są operacje typu: przeglądanie, dodawanie, modyfikacja, usuwanie. Usuwanie np. chcę zarezerwować wyłącznie dla admina. Proszę o wskazówki jak taki system uprawnień napisać.

0
  1. DB powinno być private lub protected. Jeśli chcesz się "bawić" klasami to zmiennych się nie upublicznia. Zamiast zmiennych powinny być właściwości. Daje Ci to taką przewagę, że jak user zmieni coś (np. imię) to możesz to wychwycić. Powinno to być tak
type
  TUzytkownik = class
  private
    DB: TADOConnection;
    FNazwisko: String; //przyjęło się zmienne przechowujące dane właściwości zaczynać od F

    procedure SetNazwisko(const Value: string);
  public
    property Nazwisko: string read FNazwisko write SetNazwisko;
  end;

procedure TUzytkownik.SetNazwisko(const Value: string);
begin
  if Value <> FNazwisko then
  begin
    Fnazwisko := Value;
    //tu jakaś operacja która musi być wykonana przy zmianie wartości właściwości
  end;
end;
  1. Lista konkretnych obiektów (np. userów) zazwyczaj u mnie jest to obiekt dziedziczący po TObjectList (modół Contnrs), gdzie nadpisuję metody takie jak Add, Extract, Remove itp aby zwracały/oczekiwały konkretnego typu a nie TObject

  2. najprościej to po prostu przy tworzeniu formy sprawdzasz do czego user ma prawa i odpowiednio chowasz/blokujesz klawisze odpowiedzialne za daną akcję.

1 użytkowników online, w tym zalogowanych: 0, gości: 1