当前位置:主页>销售管理软件> 列表

如何设计一个user类?请关注! 找财务软件哪个好

仓库管理软件版1楼: 此类设计的如何?请指教
unit uUser;
interface
uses adodb,windows,Forms,Dialogs,StdCtrls,Classes,SysUtils;
type
TUser = class(TObject)
private
{ Private declarations }
public
Adocon:TADOConnection;
CheckQuery: TAdoQuery;
UserName:string;
Pwd:string;
userid:string;
constructor Create(AdoCon:TADOConnection);
destructor destroy();
function CheckUser(const UserName,Pwd:string):Boolean; //验证登录用户
function GetPermission(const userid:string):string; //取得权限
end;

implementation

constructor Tuser.Create(AdoCon:TADOConnection);
begin
inherited Create;
CheckQuery:=TAdoQuery.Create(nil);
CheckQuery.connection:=AdoCon;
end;

destructor Tuser.destroy;
begin
CheckQuery.Free;
end;

function Tuser.GetPermission(const userid:string):string;
var sqlstr:string;
begin
sqlstr:=''select LOGINID from USERS where USERID=''''''+userID+'''''' '';
with checkquery do
begin
close;
sql.clear;
sql.add(sqlstr);
open;
if not eof then Result:=fieldbyname(''LOGINID'').AsString;
end;
end;

function Tuser.CheckUser(const UserName,Pwd:string):Boolean;
var sqlstr:string;
begin
sqlstr:=''select loginid,password,userid,username from users where loginid=''''''+UserName+'''''' and password=''''''+Pwd+'''''''';
with checkquery do
begin
close;
sql.clear;
sql.add(sqlstr);
open;
if eof then
begin
Result:=False;
Application.Messagebox(''无效用户!请重新输入。'',''警告'',MB_OK);
Exit;
end;
userid:=fieldbyname(''userid'').AsString;
Result:=True;
end;
end;

end.

2楼: Adocon:TADOConnection;
CheckQuery: TAdoQuery;
UserName:string;
Pwd:string;
userid:string;
放到私有 利用属性去访问它 如管家婆进销存

3楼: public 内的东西太多
像adoconnection、adoquery、username之类的东西都放到private去

4楼: 1.根据数据连接,用户表名,用户编码,生成一个类,包含用户编码,用户名,密码,权限列表;
2.做一个容器类,包含N个上述的用户类,该类完成添加删除修改的工作,以及用户登录的操作。

5楼: 是不是不要把变量暴露在public。都要把他们放在private吗?

6楼: 字段最好不要设为私有

仓库管理软件版7楼: 字段放到私有域中,用属性来读写它们!

8楼: 我想要把这个用户类封装完整,在类的实现中包含了基本的业务规则,以后每次使用的时候,直接拿来就可以了。但是对于类的设计认识不够。怎样才能做到业务和界面的分离呢?

9楼: 不好,问题很多。
1.有些变量不要让外部访问。让外部访问的部分最好改为属性。
如ADOCon和CheckQuery等等
private
FUserName:String;
procedure SetUserName(Value:String);
public
property UserName read FUserName Write SetUserName;
2.创建的方法有局限
constructor Create(AdoCon:TADOConnection);overload;
constructor Create(strConn:String);overload;
3.析构方法一定要Override;
destructor destroy;override;
很多.......

10楼: 分离有好几种分离的方式 简单的说 你的类中最多封装数据集 不要去封装ADOConnection一类的东西 然后通过某个方法对数据集赋值 这样 不管你的数据查询方式如何改变
你类里面的数据访问方式不会有任何变化

你可以参考刘艺老师的一本 面向对象编程的书 书不深 但讲得还算清楚

11楼: 欢迎大家不吝赐教。请大家各抒己见。
CheckQuery和ADOCon有关联啊!

12楼: 用户表user中包含字段:
loginid,password,userid,username
要对此表增加新的记录,应该怎样实现啊? 如财务软件哪个好

13楼: 怎么了?
没人理吗?

仓库管理软件版14楼: 大概就是像下面这个样子
unit Unit2;
interface
uses DB, ADODB, windows, Forms, Dialogs, StdCtrls, Classes, SysUtils;

type
TUser = class(TObject)
private
{ Private declarations }
FADOConn:TADOConnection;
FCheckQuery:TADOQuery;
FUserName:String;
FPassword:String;
FUserID:String;
FLoginID:String;
procedure SetUserName(Value:String);
procedure SetUserID(Value:String);
procedure SetPassword(Value:String);
procedure SetLoginID(Value:String);
procedure CreateQuery(aADOConn:TADOConnection);
public
Property UserName:String read FUserName Write SetUserName;
property UserID:String read FUserID write SetUserName;
property Password:String read FPassword write SetPassword;
property LoginID:string read FLoginID write SetLoginID;

constructor Create(aADOConn: TADOConnection);overload;
constructor Create(strConn:String);overload;
destructor destroy;override; //一定要Override
function CheckUser(const UserName, Pwd: string): Boolean;
//既然GetPermission返回的是LoginID,还有必要用此函数吗,
//CheckUser若成功,访问LoginID属性就可以了
function GetPermission(const userid: string): string;
procedure SaveUser; //最后别忘了保存


procedure NewUser(sLoginID,sUserID,sUserName,sPassword:String);
end;

const
sql_SelectUser:string=''Select * from users'';
cs_LoginID:String=''LoginID'';
cs_Password:string=''Password'';
cs_UserID:string=''UserID'';
cs_UserName:string=''UserName'';

implementation
{ TUser }
procedure TUser.CreateQuery(aADOConn: TADOConnection);
begin
FCheckQuery:=TADOQuery.Create(self);
with FCheckQuery do
begin
Connection:=aADOConn;
SQL.Text:=''Select * from Users'';
Open; //一次性打开算了,不用老是打开,关闭吧?
end;
end;

constructor TUser.Create(aADOConn: TADOConnection);
begin
inherited Create;
FADOConn:=aADOConn;
if not FADOConn.Connected then
FADOConn.Connected;
CreateQuery(FADOConn);
end;

constructor TUser.Create(strConn: String);
begin
inherited Create;
FADOConn:=TADOConnection.Create(self);
with FADOConn do
begin
LoginPrompt:=False;
ConnectionString:=strConn;
Connected:=True;
end;
CreateQuery(FADOConn);
end;

destructor TUser.destroy; //释放资源
begin
if Assigned(FADOConn) then
FADOConn.free;
if Assigned(FCheckQuery) then
FCheckQuery.Free;
inherited;
end;

function TUser.CheckUser(const UserName, Pwd: string): Boolean;
begin
Result:=False
if FCheckQuery.Locate(''username;password'', VarArrayOf([UserName,pwd]), [loPartialKey]) then
begin
FUserName:=FieldByName(cs_UserName).AsString;
FPassword:=FieldByName(cs_Password).AsString;
FLoginID:=FieldByName(cs_LoginID).AsString;
FUserID:=FieldByName(cs_UserID).AsString;
Result:=True;
end;
end;

function TUser.GetPermission(const userid: string): string;
begin
if FCheckQuery.Locate(''userid'', VarArrayOf([Userid]), [loPartialKey]) then
Result:=FieldByName(cs_LoginID).AsString;
end;

procedure TUser.SaveUser;
begin
with FCheckQuery do

try
FieldByName(cs_LoginID).AsString:=FLoginID;
FieldByName(cs_UserID).AsString:=FUserID
FieldByName(cs_UserName).AsString:=FUserName;
FieldByName(cs_Password).AsString:=FPassword;
except
Cancel;
end;
end;

procedure TUser.NewUser(sLoginID, sUserID, sUserName, sPassword: String);
begin
FCheckQuery.Append; //追加一条
FLoginID:=sLoginID;
FUserID:=sUserID;
FUserName:=sUserName;
FPassword:=sPassword;
end;

procedure TUser.SetLoginID(Value: String);
begin
if Value='''' then exit;
if FLoginID<>Value then
FLoginID:=Value;
end;

procedure TUser.SetUserID(Value: String);
begin
if Value='''' then exit;
if FUserID<>Value then
FUserID:=Value;
end;

procedure TUser.SetUserName(Value: String);
begin
if Value='''' then exit;
if FUserName<>Value then
FUserName:=Value;
end;

procedure TUser.SetPassword(Value: String);
begin


if Value='''' then exit;
if FPassword<>Value then
FPassword:=Value;
end;

end.

15楼: 谢谢楼上的高手朋友!
大家怎么看呢?还有什么要说的吗?

16楼: 哪位能给介绍一些封装的不错的数据库操作方面的代码吗?
那就太感激了!呵呵

17楼: 没有吗?我觉得烂代码太多了!呵呵

18楼: 多人接受答案了。