📄 sys_accessctrl.pas
字号:
//增加模块复制,权限更改跟踪功能
unit Sys_AccessCtrl;
Interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, DBTables, StdCtrls, Menus, Grids, DBGrids, Buttons, ExtCtrls,
ImgList, ComCtrls, ToolWin, BaseIme, AdODB;
Type
TFrm_Sys_AccessCtrl = Class(TFrm_BaseIme)
Grid1: TStringGrid;
Label1: TLabel;
ControlBar1: TControlBar;
ToolBar1: TToolBar;
tlbtn_Copy: TToolButton;
tlbtn_exit: TToolButton;
GroupBox1: TGroupBox;
Label3: TLabel;
cmbbx_user: TComboBox;
Label2: TLabel;
cmbbx_Module: TComboBox;
Label4: TLabel;
lbl_Duty: TLabel;
btn_ok: TButton;
ckbx_usermodule: TCheckBox;
Label5: TLabel;
edt_quickid: TEdit;
Label6: TLabel;
cmbbx_Dept: TComboBox;
Label7: TLabel;
lbl_Post: TLabel;
AdoQry_Tmp1: TAdoQuery;
AdoQry_Tmp2: TAdoQuery;
AdoQry_Tmp3: TAdoQuery;
tb_givemodule: TToolButton;
procedure FormCreate(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure tlbtn_exitClick(Sender: TObject);
procedure cmbbx_Change(Sender: TObject);
procedure Grid1DblClick(Sender: TObject);
procedure tlbtn_CopyClick(Sender: TObject);
procedure Grid1KeyPress(Sender: TObject; var Key: ChAr);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormKeyPress(Sender: TObject; var Key: ChAr);
procedure ckbx_usermoduleClick(Sender: TObject);
procedure btn_okClick(Sender: TObject);
procedure Grid1Enter(Sender: TObject);
procedure Grid1DrawCell(Sender: TObject; ACol, Arow: Integer;
Rect: TRect; State: TGridDrawState);
procedure Grid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure tb_givemoduleClick(Sender: TObject);
private
bint:integer;
p_menuType,p_title,p_table,p_menuidfieldName,p_Moduletable:string;
userCode,userName:string;
fReadOnly,gridempty:boolean; //grid是否empty
procedure emptygrid; //清空grid
procedure fillgrid; //填充grid
function displayyn(aint:integer):string; // 显示"是""否"
procedure updatedb(YesNo:integer); //更新数据库
procedure openqr_menu; //打开qr_menu
procedure insertrec; //添加一条记录
function GetSysMenuId(SysMenuCode:string):integer;
function FoundAccess(SysMenuId:integer):integer;
public
Dept,user,module,Book:string; //保存当前所维护的操作员、模块、帐套、操作员职务
Sourceoid:string; //从该操作员id复制权限
SourceBook:string; //从帐套复制权限
procedure InitForm(AdoConnection:TAdoConnection;ReadOnly:boolean);
procedure setSysParam(Param1:string;Param2:string;Param3:string;Param4:string);
end;
var
Frm_Sys_AccessCtrl: TFrm_Sys_AccessCtrl;
implementation
uses Sys_AccessCtrl_Copy,Sys_Global,Sys_GiveAccess;
{$R *.DFM}
procedure TFrm_Sys_AccessCtrl.FormCreate(Sender: TObject);
begin
inherited;
// Application.Createform(TFrm_Sys_AccessCtrl_Copy,Frm_Sys_AccessCtrl_Copy);
Frm_Sys_AccessCtrl_Copy:= TFrm_Sys_AccessCtrl_Copy.Create(self);
Dept:='';
user:='';
module:='';
p_menuType:='';
p_title:='';
p_table:='SysMenuAccessCtrl';
p_menuidfieldName:='SysMenuId';
p_Moduletable:='SysModuleAccessCtrl';
Frm_Sys_AccessCtrl.Caption:=p_title+Frm_Sys_AccessCtrl.Caption;
end;
procedure TFrm_Sys_AccessCtrl.FormActivate(Sender: TObject);
begin
inherited;
emptygrid;
btn_ok.enabled:=False;
ckbx_usermodule.enabled:=False; //没选择条件之前不能改变是否可用该模块
cmbbx_Dept.text:='';
cmbbx_user.text:='';
cmbbx_Module.text:='';
cmbbx_Dept.SetFocus;
tlbtn_Copy.enabled:=False;//没选择条件之前不能 copy
tb_givemodule.Enabled :=tlbtn_Copy.Enabled ;
with AdoQry_tmp1 do
begin
Close;
sql.Text:='select * from Employee where EmployeeCode='''+userCode+'''';
open;
userName:=fieldbyname('EmployeeName').asstring;
end;
with AdoQry_Tmp1 do
begin
Close;
sql.clear;
sql.Add('select DeptCode as depArtmentid,'+
' DeptName as depArtmentName '+
'from Dept Order by DeptCode');
open;
cmbbx_Dept.Items.clear;
while not eof do
begin
cmbbx_Dept.Items.Add(fieldbyname('depArtmentid').asstring+' '+fieldbyname('depArtmentName').asstring);
next;
end;
end;
with AdoQry_Tmp1 do
begin
Close;
sql.clear;
sql.Add('select SysModuleCode as moduleid,'+
' SysModuleName as moduleName '+
'from SysModule Order by Sysmoduleid ');
open;
First;
cmbbx_Module.Items.clear;
while not eof do
begin
cmbbx_Module.Items.Add(fieldbyname('moduleid').asstring+' '+fieldbyname('moduleName').asstring);
next;
end;
end;
end;
procedure TFrm_Sys_AccessCtrl.emptygrid;
begin
gridempty:=True;
grid1.RowCount:=2;
grid1.FixedRows:=1;
grid1.Cells[0,0]:='菜单代码';
grid1.Cells[1,0]:='菜 单 名 称';
grid1.Cells[2,0]:='访问权限';
grid1.Cells[0,1]:='';
grid1.Cells[1,1]:='';
grid1.Cells[2,1]:='';
end;
//填充grid,先根据menu填充grid,菜单名为'-'的项目填充"--",
// 然后根据menuCtrl填充每个菜单项的权限,可用的显示'是',
// 否则显示''
procedure TFrm_Sys_AccessCtrl.fillgrid;
var
i,j,recCount:integer;
str:string;//use to Add ' '
begin
gridempty:=False;
with AdoQry_Tmp2 do //找出模块MID上的所有菜单
begin
Close;
sql.clear;
sql.Add('select '+
' SysMenuCode as datamenuid,'+
' PSysMenuCode as pdatamenuid,'+
' SysMenuName as menuName '+
'from SysMenu '+
'where SysModuleCode=:modid '+
'Order by SysMenuCode');
Parameters.ParambyName('modid').Value:=getCode(cmbbx_Module.text);
open;
recCount:=recordCount;
First;
grid1.RowCount:=recCount+1;
if recCount=0 then
begin
emptygrid;
exit;
end; //若记录数为零,则不填grid
for i:=1 to recCount do
begin
str:=stringofchAr(' ',(length(fieldbyname('datamenuid').asstring)-4));
grid1.Cells[0,i]:=fieldbyname('datamenuid').asstring;
grid1.Cells[1,i]:=str+fieldbyname('menuName').asstring;
if (fieldbyname('menuName').asstring='-') then
grid1.Cells[2,i]:='--'
else
grid1.Cells[2,i]:='';
Next;
end;
openqr_menu; //实质是open qr_SysAccessCtrl
First;
for i:=1 to recCount do
begin
if fieldbyname('SysMenuCode').asstring=grid1.Cells[0,i] then
begin
if (grid1.Cells[2,i]<>'--') then
grid1.Cells[2,i]:=displayyn(fieldbyname('canAccess').asinteger);
next;
end;
end;
end;
end;
procedure TFrm_Sys_AccessCtrl.tlbtn_exitClick(Sender: TObject);
begin
//退出时将copy用的form释放
Frm_Sys_AccessCtrl_Copy.release;
modalResult:=mrok;
Close;
end;
//每有条件变化时,button_ok才有效,checkbox无效
procedure TFrm_Sys_AccessCtrl.cmbbx_Change(Sender: TObject);
begin
inherited;
if (sender as tcombobox).Name='cmbbx_Dept' then
with AdoQry_Tmp1 do
begin
Close;
sql.clear;
sql.Add('select a.EmployeeCode as userid,'+
' b.EmployeeName as userName '+
'from Operator a,Employee b '+
'where a.EmployeeCode=b.EmployeeCode '+
' and b.DeptCode='''+getCode(cmbbx_Dept.text)+''' '+
' and a.OperatorUsable=1 '+
'Order by a.EmployeeCode');
open;
cmbbx_user.Items.clear;
while not eof do
begin
cmbbx_user.Items.Add(fieldbyname('userid').asstring+' '+fieldbyname('userName').asstring);
next;
end;
end;
btn_ok.enabled:=True;
ckbx_usermodule.enabled:=False;
tlbtn_Copy.enabled:=False;
tb_givemodule.Enabled :=tlbtn_Copy.Enabled ;
end;
//显示内容为'是'、''时才可以改变
//模块可用时才可以改变
procedure TFrm_Sys_AccessCtrl.Grid1DblClick(Sender: TObject);
var aint:integer;
begin
if (not gridempty) and (ckbx_usermodule.checked) and (not fReadOnly) then
with grid1 do
if (col=2) and (row<>0) then
begin
if Cells[Col, Row]='是' then
begin
Cells[Col, Row] :='';
aint:=0;
bint:=aint;
end
else if Cells[Col, Row]='' then
begin
Cells[Col, Row] :='是';
aint:=1;
bint:=aint;
end
else
exit;
updatedb(aint);
end;
inherited;
end;
function TFrm_Sys_AccessCtrl.displayyn(aint: integer): string;
begin
if aint=1 then Result:='是'
else Result:='';
end;
//改变SysAccessCtrl
procedure TFrm_Sys_AccessCtrl.updatedb(YesNo: integer);
begin
if not AdoQry_Tmp2.locate('SysMenuId',GetSysMenuId(grid1.cells[0,grid1.row]),[])then
begin
insertrec;
openqr_menu; //使openqr_menu恢复原状
exit;
end;
with AdoQry_tmp1 do
begin
Close;
sql.clear;
sql.Add('update SysMenuAccessCtrl');
sql.Add( ' set canAccess=:newValue ');
sql.Add( ' where EmployeeCode=:uid ');
sql.Add( ' and SysMenuId=:menid');
Parameters.ParambyName('newValue').Value:=YesNo;
Parameters.ParambyName('menid').Value:=GetSysMenuId(grid1.Cells[0,grid1.row]);
Parameters.ParambyName('uid').Value:=getCode(cmbbx_user.text);
ExecSQL;
end;
with AdoQry_tmp1 do
begin
Close;
sql.clear;
sql.Add('insert SysMenuAccesslog (EmployeeCode,SysMenuid,action,Ctrl_EmployeeCode'+
',acttime) Values (:EmployeeCode,:SysMenuid,:action,:Ctrl_EmployeeCode'+
',getdate())');
Parameters.ParambyName('EmployeeCode').Value:=getCode(cmbbx_user.text);
Parameters.ParambyName('SysMenuid').Value:=GetSysMenuId(grid1.Cells[0,grid1.row]);
if bint=1 then
Parameters.ParambyName('action').Value:='授予'
else
Parameters.ParambyName('action').Value:='取消';
Parameters.ParambyName('Ctrl_EmployeeCode').Value:=userCode+' '+userName;
execsql;
end;
end;
procedure TFrm_Sys_AccessCtrl.tlbtn_CopyClick(Sender: TObject);
begin
inherited;
grid1.setfocus;
if Frm_Sys_AccessCtrl_Copy.Showmodal=mrok then
begin
if DispInfo('用户"'+getCode(cmbbx_user.text)+'"的权限将全部被用户"'+Sourceoid+'"的权限替代,确定吗?',2)='n' then
exit;
with AdoQry_tmp1 do
begin
//----在复制前先删除该用户的所有权限
Close;
sql.clear;
sql.Add('delete SysMenuAccessCtrl '+
' from (select SysMenuid '+
' from SysMenu '+
' where SysModuleCode='''+getCode(cmbbx_Module.Text)+''') as SysMenu '+
' where SysMenuAccessCtrl.EmployeeCode='''+getCode(cmbbx_user.Text)+''' and '+
' SysMenuAccessCtrl.SysMenuid=SysMenu.SysMenuid');
execsql;
//---给SysAccessCtrl添加记录
Close;
sql.clear;
sql.Add('insert into SysMenuAccessCtrl '+
' (EmployeeCode,'+
' CanAccess,'+
' SysMenuid) '+
'select '''+getCode(cmbbx_user.Text)+''','+
' Ctrl.CanAccess,'+
' Ctrl.SysMenuId '+
'from SysMenuAccessCtrl as Ctrl, '+
'(select SysMenuid '+
' from SysMenu '+
' where SysModuleCode='''+getCode(cmbbx_Module.Text)+''') as SysMenu '+
'where Ctrl.EmployeeCode='''+SourceOid+''' and '+
' Ctrl.SysMenuid=SysMenu.SysMenuid ');
execsql;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -