快递管理系统平台 快递管理系统设计方案
本文来源:广州软件开发 发布日期:2019-12-05
三层系统架构方案
说明:
在软件开发方法日益成熟的今天,很多公司都推出了平台化开发方案。然而,虽然平台化考虑了整个系统架构的方方面面,但它却有实现非常复杂、维护非常麻烦、继承使用不灵活等缺陷。于是,我就有了一个想法,能否开发一个轻型的系统架构,它能实现重要的技术方案,然而实现不是很复杂、维护不是很麻烦,继承使用也很灵活。在几个月的研发中,我朝着这个方向发展,最终实现了这种需求的系统架构。内容概要:
概述:本系统架构是采用RemObject SDK技术研发的三层系统架构,由应用服务器、客户端框架和数据库三部分组成。服务器:
采用面向对象方法设计而成,具有稳定性强、安全性高、负载量大、可扩展性强等特性。采用数据库连接池技术、服务对像池技术和多端口监听等技术,使服务器的功能即强大又稳定。已实现数据库操纵接口(对数据库进行各种操作)、广播消息接口、自动更新服务接口,另外用户可轻松地扩展自己需要的服务功能。
客户端:
采用面向对象方法设计而成,具有扩展性强、易于维护、学习简单等特点。
设计为插件模块,即插即用,即可自动生成菜单,又可手动调整;
已开发用户权限管理,拿来即可用,可严格控制客户端界面的权限,如(添加、删除等);
包括自动更新下载,随时都可以发布新的版本,客户端登录就可更新;
包括换皮肤功能,客户端界面非常美观;
客户端使用分页数据处理,让服务器沉受力更强;
客户端的网格具有自动排序功能,列头信息可调整保存
客户端有接收消息和发送消息功能,可与其它登录客户端进行消息通信。
开发了三个基类,分别用于不同用途的扩展继承(权限管理基类:用于注册Form所包含的权限,如增加、删除;单表操纵基类:用于对单表进行增删改查等相关数据表操作,严格控制操作状态;主从表操纵基类:用于对单表进行增删改查等相关数据表操作,严格控制操作状态),从此三个类继承,稍做初始化赋值,就能完成相应的功能,也可以对方法进行重载,照自己的思路去开发。
客户端基类图:

主要界面演示:
应用服务器:

客户端主界面:


系统功能调整界面:

主从操纵表

客户端目录及配置文件:

客户端自动更新界面:

用色权限分配:

用户角色分配:

基类及公共类简要说明:
1、 权限基类:TbaseSecurityfrm
权限基类主要有二大功能,一:初始化窗体的权限点(如:添加、删除等);二:初始化窗体的菜单相关属性(如:双亲、功能名、位置)。有以下属性:
property RightList:TFuncRigth read FRightList; //权限管理列表
property FunctionID:string read FFunctionID write FFunctionID; //功能ID
property ParentID:string read FParentID write FParentID; //菜单的双亲ID
property FunctionName:string read GetFunctionName; //功能名称
property PosIndex:Integer read FPosIndex; //菜单中同一级的顺序号
property ImageIndex:Integer read FImageIndex; //菜单中的图标序号
以上属性,除RightList、FunctionName外,其它属性都需要在继承窗体的OnCreate中初始化值,其中FunctionID必须在项目中唯一。
有以下方法:
procedure InitFunctionRight;virtual; //初始化Form的权限参数
procedure GetUserFunctionRight;virtual; //取得用户功能权限
窗体可以自定义权限点,需在InitFunctionRight中添加,
如:FRightList.AddRight('Access','访问');
如何保存登录用户对窗体的使用权限,需要覆盖GetUserFunctionRight来实现,
如:FRightList.AddHasRight(psName);
2、单表操纵基类:TbaseDatafrm
单表操纵基类,主要实现对数据表的操纵和严格控制操纵时各控制的状态。有以下属性:
property EditClass:TBaseDataEditClass read FEditClass write SetEditClass; //编辑Form类property TableName:string read FTableName write FTableName; //表名
property PKFields:string read FPKFields write FPKFields; //主键名
property QuerySQL: String read FQuerySQL write FQuerySQL; //表名、视图名、查询语句
property PageSize: integer read FPageSize write FPageSize; //每页的大小(行数)
property CurrPage: integer read FCurrPage write FCurrPage; //要显示的当前页
property PageCount: integer read FPageCount; //总页数
property TotleRecord:Integer read FTotleRecord; //总记录数
property GridCanEdit:Boolean read FGridCanEdit write FGridCanEdit;//Grid能够编辑
property CanEditGridCol:Boolean; //Grid列是否可编辑保存
如果要对数据表进行编辑操作,必须对TableName、PKFields赋值,如果只是查询操作,则只需对QuerySQL赋值即可。如果想在Grid中进行数据编辑,需对GridCanEdit赋值true,否则,需对EditClass赋值,EditClass必须是继承于TbaseDataEditfrm的子类。如果想重新设置页大小,需设置PageSize的值,所有属性如要赋值都需在窗体的OnCreate中赋值。
有以下方法:
procedure ChangeMasterStates(pbCanModify:Boolean);virtual; //改变编辑表的控件状态
procedure GetPageData; //取得分页数据
procedure GetUserAction(psName:string); //取得登录用户拥有的权限
如果用户想调整操纵数据时各控件的使用状态,需要覆盖ChangeMasterStates方法,对相关状态进行控制。
3、主从表操纵基类:TbaseMasterDetailfrm
主从表操纵基类主要实现了对主从数据表的操纵控制处理。有以下属性:
property GridDetEdit:Boolean; //从表GRID可以编辑
property DetTableName:string; //从表名
property DetEditClass:TbaseDataEditClass; //编辑从表的窗体类
property DetPKFields:string read FDetPKFields write FDetPKFields; //从表主键
继承于TbaseMasterDetailfrm的子类,除了要对它的父类相关属性赋值外。
有以下方法:
procedure ChangeDetStates(pbCanModify:Boolean);virtual; //改变编辑从表的控件状态
procedure OpenDetDataSet; virtual;abstract; //打开从表数据集
注意点:主表数据集滚动时,会执行OpenDetDataSet方法,所以取主表的从表数据,需在这个方法中实现。
4、数据编辑基类:TBaseDataEditfrm
数据编辑基类用于编辑单条数据记录。有以下属性:
property ModifyState:TModifyState read FModifyState write SetModifyState; //状态
property DataSet:TDataSet read FDataSet write SetDataSet; //修改数据集
property SoonSave:Boolean read FSoonSave write FSoonSave; //立刻保存
有以下方法:
procedure VerifySaveData;virtual; //校验保存数据合法性
procedure SetDataValue;virtual; //初始化其它信息
注意点:如果要在保存之前对数据进行校验,需覆盖VerifySaveData方法。
5、扩展菜单基类:TBaseMenufrm
扩展菜单基类用于扩展每个模块功能的父级菜单和分隔符。有以下方法:
procedure AddDirAndSpile;virtual; //添加目录和分隔符
procedure Add(psFuncID,psParentID,psFuncName:string; piPos,piImgIndex:Integer;
piFuncType:TFuncType); //添加一个菜单功能
注意:每一个子系统都必须实现一个TbaseMenufrm的子类,用于扩展该子系统的菜单功能树,每个继承子类都需覆盖AddDirAndSpile方法,添加相关菜单项。
6、本地数据操纵对象:TLocalSQL
本地数据操纵对象是一个访问服务器对应服务方法的本地对象,在系统初始化时,就初始化了一个可以直接调用的实例。它有以下调用方法://根据SQL语句取数据集
function SelectData(const SQL: String; out Data: Variant; out ErrMsg: String): Integer;
//根据两条SQL语取两个数据集
function SelectDupleData(const SQLA: String; const SQLB: String; out DataA: Variant; out DataB: Variant; out ErrMsg: String): Integer;
//执行需要事务的SQL语句
function ExecuteSQL(const SQL: String; out ErrMsg: String): Integer;
//执行存储过程
function ExecuteProc(const ProcName: String; const ParamArr: ParamArray;
const RetRecord: Boolean; out RetParamArr: ParamArray; out Data: Variant;
out ErrMsg: String): Integer;
//更新单表数据集
function UpdateData(const Delta: Variant; const TableName: String; const KeyFields: String; out ErrMsg: String): Integer;
//更新两个表的数据集
function UpdateDupleData(const DeltaA: Variant; const TableNameA: String;
const KeyFieldsA: String; const DeltaB: Variant; const TableNameB: String;
const KeyFieldsB: String; out ErrMsg: String): Integer;
//执行SQL命令及更新另一个表的数据
function UpdateSQLAndData(const SQL: String; const Delta: Variant; const TableName: String; const KeyFields: String; out ErrMsg: String): Integer;
//根据SQL查询语句取得分页查询数据
function GetQueryPageData(const SelectSQL: String; var CurPage: Integer;
var PageSize: Integer; out totalRecords: Integer; out totalPages: Integer;
out Data: Variant; out ErrMsg: String): Integer;
//取得唯一编号列表
function GetUniqueID(const tableName: String; const FieldName: String;
const Count: Integer; var IDList: String; out ErrMsg: String): Integer;
//取得系统时间
function GetDatetime(out AValue: DateTime; out ErrMsg: String): Integer;
//根据SQL查询条件,取得查询到的记录数
function GetRecordCount(const SQL: String; out RecCount: Integer;
out ErrMsg: String): Integer;
7、窗体注册管理类:TManagerForm
窗体注册管理类主要负责注册并管理需要用菜单打开的Form,在它所在单元,提供两个全局承数,用来注册Form和反注册Form,方法如下:procedure RegisterClassE(AClass:TPersistentClass); //注册窗体
procedure UnRegisterClassE(AClass:TPersistentClass); //反注册窗体
因此,每个子系统下的子窗体,都需在pas文件的initialization段用方法RegisterClassE进行注册,在finalization段用方法UnRegisterClassE进行返注册,注意需要Uses FormManagerListUnt单元。
8、查询对话框类:TdanngQryDlg
查询对话框是一个通用的生成SQL查询条件的对话框组件。它有以下属性:
published
property QuerySQL:string; //生成的SQL查询条件,不带where
property DataSet:TdataSet; //要查询的数据集
property Fields:TStrings ; //字段列表,格式为:列标=字段名
property Title:string read FTitle write SetTitle; //对话框标题
property IsFilter:Boolean read FIsFilter write FIsFilter; //是否过滤查询SQL条件
property DatabaseType:TdDataType read FDatabaseType write FDatabaseType; //数据库类型
property BoolList:TStrings read FBoolList write SetBoolList; //字符串型逻辑字段列表,在属性的值格式为:列标=标识假,标识真,如:是否学生=’No’,’Yes’
property AssingedSink:TAssingedSink read FAssingedSink write FAssingedSink;//指定皮肤事件,为了使新创建的窗体有皮肤,需写此事件。
它有一个方法:
function Excute:Boolean; //返回值为真,则代表生成查询SQL条件正确,生成的查询条件为:QuerySQL。
9.DBGrid列信息操纵类:TxhGridCol
它用于初始化和保存DBGrid的列标信息,如一列改变长度,一列移到另一列前,改变后可以跟据登录用户保存起来。它有以下属性:property UserName:string ; //当前登录用户,
property Grid:TDBGridEh ;//操纵的DBGrid;
它有以下方法:
procedure SaveGridRowInfo; //保存Grid列信息
procedure LoadGridRowInfo; //装载Grid列信息
procedure ClearGridRowInfo; //消除保存的列信息















更多内容可进入www.sunseam.com查看
上一篇:材料物资管理系统怎么操作(三)
下一篇:没有了
下一篇:没有了