using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Text; using System.Windows.Forms; using System.Xml; using ICSharpCode.Core; using Mesnac.Action.Base; using Mesnac.Basic; using Mesnac.Codd.Session; using Mesnac.Controls.Base; namespace Mesnac.Action.Default.Purview { /// /// 窗体、控件权限信息加载类 /// 创建人:郑立兵 /// 创建时间:2013-7-25 /// 说明:从工程文件中加载窗体、控件权限信息至数据表中 /// public class LoadPurview : DatabaseAction , IAction { private string caption = StringParser.Parse(ResourceService.GetString("Mesnac_Dialog_Caption")); //提示 private string _projectPath = Path.Combine( Application.StartupPath , "Data" , "MCProject" , "nodeForm" ); //组态工程路径 List listPurview = null; public void Run(RuntimeParameter runtime) { base.RunIni(runtime);//必须调用 string msg1 = StringParser.Parse(ResourceService.GetString("Mesnac_Action_Default_Purview_LoadPurview_msg1")); //您确定重新加载所有权限? string msg2 = StringParser.Parse(ResourceService.GetString("Mesnac_Action_Default_Purview_LoadPurview_msg2")); //重要警告 if (MessageBox.Show(msg1, msg2, MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No) { return; } ICSharpCode.Core.LoggingService.Debug("通用方法——将权限窗体加载至数据库"); DbHelper dbHelper = NewDbHelper(Mesnac.Basic.DataSourceFactory.MCDbType.Local); if (dbHelper == null) { return; } dbHelper.ClearParameter(); dbHelper.CommandType = CommandType.Text; dbHelper.CommandText = "UPDATE BasForm SET DeleteFlag='1';UPDATE BasFormFunction SET DeleteFlag='1';"; dbHelper.ExecuteNonQuery(); listPurview = new List(); #region 命令 Dictionary> dic = XmlHandler.GetProjectCommands(Path.Combine(Application.StartupPath, "Data", "MCProject")); foreach (string actionname in dic.Keys) { listPurview.Add(new FormPurview(string.Empty, actionname, actionname, "Command")); } #endregion #region 画面 if (Directory.Exists(_projectPath)) { DirectoryInfo dicInfo = new DirectoryInfo(_projectPath); FileInfo[] files = dicInfo.GetFiles("*.xml", SearchOption.AllDirectories); if (files.Length > 0) { string cleandown; StreamReader sr; XmlDocument doc; foreach (FileInfo file in files) { try { sr = new StreamReader(file.FullName); cleandown = sr.ReadToEnd(); sr.Close(); cleandown = "" + cleandown + ""; doc = new XmlDocument(); doc.LoadXml(cleandown); loadPurview(doc); } catch (Exception ex) { Console.Write(ex.Message); } } } } #endregion freshPurview(dbHelper); string msg3 = StringParser.Parse(ResourceService.GetString("Mesnac_Action_Default_Purview_LoadPurview_msg3")); //信息加载完成! ShowMsg(msg3); } private void loadPurview( XmlDocument doc ) { if ( doc == null ) return; XmlNode nForm = doc.DocumentElement.FirstChild;//窗体组态保存xml时,规定第一个元素是Form if ( nForm != null ) { FormPurview formPurview = new FormPurview( nForm ); if ( !string.IsNullOrEmpty( formPurview.PurviewName ) && !string.IsNullOrEmpty( formPurview.PurviewText ) && !string.IsNullOrEmpty( formPurview.PurviewType ) ) listPurview.Add( formPurview ); } } private void freshPurview( DbHelper helper ) { if ( listPurview == null ) return; StringBuilder sb; helper.CommandType = CommandType.Text; foreach ( FormPurview pur in listPurview ) { sb = new StringBuilder(); sb.AppendLine( "IF EXISTS(SELECT * FROM BasForm WHERE FormName=@FormName)" ); sb.AppendLine( "UPDATE BasForm SET FormText=@FormText, FormType=@FormType, DeleteFlag='0' OUTPUT inserted.GUID WHERE FormName=@FormName;" ); sb.AppendLine( "ELSE" ); sb.AppendLine( "INSERT INTO BasForm(GUID,FormName,FormText,FormType,DeleteFlag) OUTPUT inserted.GUID" ); sb.Append( "VALUES(NEWID(),@FormName,@FormText,@FormType,'0');" ); helper.ClearParameter(); helper.AddParameter( "@FormName" , pur.PurviewName ); helper.AddParameter( "@FormText" , pur.PurviewText ); helper.AddParameter( "@FormType" , pur.PurviewType ); helper.CommandText = sb.ToString(); string formGUID = helper.ToScalar() as string; if ( String.IsNullOrEmpty(formGUID) || pur.FunctionList == null || pur.FunctionList.Count < 1 ) continue; foreach ( FunctionPurview func in pur.FunctionList ) { freshFunction( func , helper , formGUID ); } } } private void freshFunction( FunctionPurview func , DbHelper helper , string formGUID ) { StringBuilder sb = new StringBuilder(); sb.AppendLine( "IF EXISTS(SELECT * FROM BasFormFunction WHERE FormGUID=@FormGUID AND FunctionName=@FunctionName)" ); sb.AppendLine( "UPDATE BasFormFunction SET FunctionText=@FunctionText, FunctionType=@FunctionType, DeleteFlag='0' WHERE FormGUID=@FormGUID AND FunctionName=@FunctionName;" ); sb.AppendLine( "ELSE" ); sb.AppendLine( "INSERT INTO BasFormFunction(GUID,FormGUID,FunctionName,FunctionText,FunctionType,DeleteFlag)" ); sb.Append( "VALUES(NEWID(),@FormGUID,@FunctionName,@FunctionText,@FunctionType,'0');" ); helper.ClearParameter(); helper.AddParameter( "@FormGUID" , formGUID ); helper.AddParameter( "@FunctionName" , func.PurviewName ); helper.AddParameter( "@FunctionText" , func.PurviewText ); helper.AddParameter( "@FunctionType" , func.PurviewType ); helper.CommandText = sb.ToString(); helper.ExecuteNonQuery(); } } /// /// 窗体权限类 /// class FormPurview : APurview { private List listFunction = null; public FormPurview( XmlNode node ) { if ( node != null ) { XmlAttribute att = node.OwnerDocument.DocumentElement.Attributes[ "FILE_NAME" ];//;node.Attributes[ "name" ]; if ( att != null ) PurviewName = att.Value; XmlNode n = node.SelectSingleNode( "Property[@name=\"Text\"]" ); if ( n != null ) PurviewText = n.InnerText; att = node.Attributes[ "type" ]; if ( att != null ) PurviewType = att.Value.Split( ',' )[ 0 ]; FunctionPurview func; listFunction = new List(); XmlNodeList cnList = node.SelectNodes( "//Property[@name=\"MCPurview\"]" ); foreach ( XmlNode cn in cnList ) { if ( cn.ParentNode.Attributes[ "name" ].Value == PurviewName ) continue; if ( cn.InnerText.ToLower() != "true" ) continue; func = new FunctionPurview( cn.ParentNode ); if ( !string.IsNullOrEmpty( func.PurviewName ) && !string.IsNullOrEmpty( func.PurviewText ) && !string.IsNullOrEmpty( func.PurviewType ) ) listFunction.Add( func ); } } } public FormPurview( string objId , string formName , string formText , string formType ) : base( objId , formName , formText , formType ) { listFunction = new List(); } public List FunctionList { get { return listFunction; } } public override DataTable GetPurviews( DbHelper dbhelper ) { if ( dbhelper == null ) return null; dbhelper.ClearParameter(); dbhelper.CommandType = CommandType.Text; dbhelper.CommandText = "SELECT GUID,FormName,FormText,FormType FROM BasForm WHERE DeleteFlag='0'"; return dbhelper.ToDataTable(); } } /// /// 控件权限类 /// class FunctionPurview : APurview { public FunctionPurview( XmlNode node ) { if ( node != null ) { string tabValuePrefix = String.Empty; string tabTextPrefix = String.Empty; if (this.IsOwnerTabControl(node)) { XmlNode tabControlNode = this.GetTabControlOwner(node); int tagPages = this.GetTabControlPages(tabControlNode); if (tagPages > 1) { XmlNode tabPageNode = this.GetTabPageOwner(node); if (tabPageNode != null) { XmlAttribute attPage = tabPageNode.Attributes["name"]; if (attPage != null) { tabValuePrefix = attPage.Value; } XmlNode nPage = tabPageNode.SelectSingleNode("Property[@name=\"Text\"]"); if (nPage != null) { tabTextPrefix = nPage.InnerText; } } } } XmlAttribute att = node.Attributes[ "name" ]; if ( att != null ) { if (String.IsNullOrEmpty(tabValuePrefix)) { PurviewName = att.Value; } else { PurviewName = String.Format("[{0}]{1}", tabValuePrefix, att.Value); } } XmlNode n = node.SelectSingleNode( "Property[@name=\"Text\"]" ); if ( n != null ) { if (String.IsNullOrEmpty(tabTextPrefix)) { PurviewText = n.InnerText; } else { PurviewText = String.Format("[{0}]{1}", tabTextPrefix, n.InnerText); } } att = node.Attributes[ "type" ]; if ( att != null ) PurviewType = att.Value.Split( ',' )[ 0 ]; } } public FunctionPurview( string objId , string functionName , string functionText , string functionType )//string formId , : base( objId , functionName , functionText , functionType ) { } public override DataTable GetPurviews( DbHelper dbhelper ) { if ( dbhelper == null ) return null; dbhelper.ClearParameter(); dbhelper.CommandType = CommandType.Text; dbhelper.CommandText = "SELECT GUID,FormGUID,FunctionName,FunctionText,FunctionType FROM BasFormFunction WHERE DeleteFlag='0'"; return dbhelper.ToDataTable(); } /// /// 判断节点是否属于选项卡控件 /// /// /// private bool IsOwnerTabControl(XmlNode node) { if (node != null && node.Attributes != null) { XmlAttribute att = node.Attributes["type"]; if (att != null && att.Value != null && att.Value.StartsWith("System.Windows.Forms.TabControl")) { return true; } else { return IsOwnerTabControl(node.ParentNode); } } else { return false; } } /// /// 获取父级选项卡节点 /// /// /// private XmlNode GetTabControlOwner(XmlNode node) { if (node != null && node.Attributes != null) { XmlAttribute att = node.Attributes["type"]; if (att != null && att.Value != null && att.Value.StartsWith("System.Windows.Forms.TabControl")) { return node; } else { return GetTabControlOwner(node.ParentNode); } } else { return null; } } /// /// 获取选项卡的数量 /// /// /// private int GetTabControlPages(XmlNode node) { if (node != null) { int count = 0; XmlNodeList nodeList = node.SelectNodes("Object"); foreach(XmlNode xn in nodeList) { if (xn.Attributes != null) { XmlAttribute att = xn.Attributes["type"]; if (att != null && att.Value.StartsWith("System.Windows.Forms.TabPage")) { count++; } } } return count; } else { return 0; } } /// /// 获取所属选项卡页 /// /// /// private XmlNode GetTabPageOwner(XmlNode node) { if (node != null) { if (node.Attributes != null) { XmlAttribute att = node.Attributes["type"]; if (att != null && att.Value.StartsWith("System.Windows.Forms.TabPage")) { return node; } else { return GetTabPageOwner(node.ParentNode); } } else { return null; } } else { return null; } } } interface IPurview { DataTable GetPurviews( DbHelper dbhelper ); } abstract class APurview : IPurview { protected APurview() { } public APurview( string GUID , string purviewName , string purviewText , string purviewType ) { this.GUID = GUID; this.PurviewName = purviewName; this.PurviewText = purviewText; this.PurviewType = purviewType; } public string GUID { get; set; } public string PurviewName { get; set; } public string PurviewText { get; set; } public string PurviewType { get; set; } #region IPurview 成员 public abstract DataTable GetPurviews( DbHelper dbhelper ); #endregion } }