欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
《ASP.NET辦公自動(dòng)化系統開(kāi)發(fā)實(shí)例導航》筆記二 系統管理模塊設計
《ASP.NET辦公自動(dòng)化系統開(kāi)發(fā)實(shí)例導航》筆記二 系統管理模塊設計 Posted on 2005-11-03 17:19 wddavid 閱讀(823) 評論(3)  編輯 收藏 收藏至365Key 所屬分類(lèi): .NET
首先設計的是[系統管理]模塊,這也是一般系統的步驟.
簡(jiǎn)略的UML活動(dòng)圖如下:


數據庫有:
登錄日志信息表LogInfo
操作日志信息表sysOptLog
機構基本信息表mrBranch
部門(mén)基本信息表mrDepartment    [機構比部門(mén)大一級,機構可以包括多個(gè)部門(mén)]
人員基本信息表mrBaseInf    [也就是用戶(hù)表]
模塊基本信息表sysFuncDic
角色基本信息表sysRolesDic
用戶(hù)角色關(guān)系表sysEmpRoles
模塊角色關(guān)系表sysFuncRights
目錄基本信息表sysTab

一個(gè)用戶(hù)可以對應多個(gè)角色,而一個(gè)角色可以包含多個(gè)用戶(hù):一個(gè)角色可以包含多個(gè)模塊,一個(gè)模塊也可以對應多個(gè)角色.所以,他們全部都是多對多的關(guān)系,可以處理復雜的權限問(wèn)題.

一.管理登錄日志

對SQL操作全部使用存儲過(guò)程.;對所有的頁(yè)面全部繼承基類(lèi)PageBase.cs
1.通用類(lèi)中用到一個(gè)比較常用的函數:(刪除不可見(jiàn)字符函數)
public static string DeleteUnVisibleChar(string sourceString)
        {
            System.Text.StringBuilder sBuilder 
= new System.Text.StringBuilder(131);
            
for(int i = 0;i < sourceString.Length; i++)
            {
                
int Unicode = sourceString[i];
                
if(Unicode >= 16)
                {
                    sBuilder.Append(sourceString[i].ToString());
                }                
            }
            
return sBuilder.ToString();
        }

2.自由操縱DataGrid.
可以使用一些技巧來(lái)自由操縱DataGrid:
(1)比如要在每行頭部加入CheckBox,可以加入一個(gè)模板列,模板中放入一個(gè)CheckBox控件:
<asp:TemplateColumn>
    
<ItemTemplate>
        
<asp:CheckBox id="CheckBox1" runat="server"></asp:CheckBox>
    
</ItemTemplate>
</asp:TemplateColumn>
其他的綁定列不要變,這樣就會(huì )出現一個(gè)CheckBox,比如用于選中的多項刪除操作.但是如何在程序中實(shí)現刪除操作呢?首先將datagrid的DataKeyField關(guān)鍵字段設置為要刪除所需的關(guān)鍵字段(比如用戶(hù)ID),然后在刪除處理時(shí),通過(guò)對每行的第一列的第一個(gè)控件(即CheckBox,但沒(méi)有ID,所以必須這樣做)來(lái)判斷:
                foreach(DataGridItem thisItem in DataGridLogininfo.Items)
                {
                    
if(((CheckBox)thisItem.Cells[0].Controls[1]).Checked)    //表示此一行的第一列中的第一個(gè)控件
                    {
                        
string strLoginID = DataGridLogininfo.DataKeys[thisItem.ItemIndex].ToString();    //設定DataGridLogininfo的DataKeyField為L(cháng)oginID
                    
                        DelLoginLog(strLoginID);
                    }
                }
這樣,"全部選中"的CheckBox2的代碼也簡(jiǎn)單了:
            foreach(DataGridItem thisItem in DataGridLogininfo.Items)
            {
                ((CheckBox)thisItem.Cells[
0].Controls[1]).Checked = CheckBox2.Checked;
            }

同樣,我們可以擴展,比如為每條記錄前面加個(gè)序號,如何加?
有兩種方法:
第一種,和前面一樣,加一個(gè)模板列,用一個(gè)頁(yè)面全局變量的number++;
第二種,對綁定前得到的DataTable進(jìn)行處理,加入一列:
            DataTable    mytable=myclass.Getalllogininfo ();
            DataColumn  mycolumn
=  mytable.Columns.Add ("number",System.Type .GetType ("System.String"));    //在數據源DataTable中加入一列,注意技巧
            for (int i=0;i<mytable.Rows.Count ;i++)
            {
                mytable.Rows [i][
"number"]=(i+1).ToString ();
            }
這是一個(gè)很重要的方法,如果要對綁定數據實(shí)現復雜的操作,常常要用到這個(gè)原理.

還有,如何加入比較復雜的功能,比如,鼠標到每一條記錄上都變色呢?
這個(gè)可以通過(guò)DataGrid的ItemDataBound事件來(lái)處理,可以給每一項加上屬性,方法如下:
        //綁定Javascript腳本到每行,是鼠標指向時(shí)顏色變化
        private void DataGridLogininfo_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
        {
            ListItemType itemType 
= e.Item.ItemType;
            
if (itemType == ListItemType.Item )
            {
                
                e.Item.Attributes[
"onmouseout"= "javascript:this.style.backgroundColor=‘#dedfde‘;";
                e.Item.Attributes[
"onmouseover"= "javascript:this.style.backgroundColor=‘#fff7ce‘;cursor=‘hand‘;" ;

            }
            
else if( itemType == ListItemType.AlternatingItem)
            {
                e.Item.Attributes[
"onmouseout"= "javascript:this.style.backgroundColor=‘#ffffff‘;";
                e.Item.Attributes[
"onmouseover"= "javascript:this.style.backgroundColor=‘#fff7ce‘;cursor=‘hand‘;" ;
            }
        }


二.管理操作日志
與上面一個(gè)沒(méi)什么區別,同樣要利用PageBase的PageBegin方法,這樣可以確定所在的模塊并檢查權限,頁(yè)面基類(lèi)的好處已經(jīng)體現出來(lái)了.

視圖狀態(tài)ViewState在A(yíng)SP.NET里是默認存在的,在表單的發(fā)送之間幾乎所有的ASP.NET控件都會(huì )保留屬性值.它實(shí)際上就是一個(gè)隱藏的表單域,即HIDDEN的INPUT.

為服務(wù)器控件添加javascript腳本:
Button1.Attributes.Add("onclick""javascript:alert(‘cool!‘");


三.模塊管理
模塊管理再次證明了一點(diǎn):只有想不到,沒(méi)有做不到的.
里面對于權限的DataList綁定CheckBoxList的復雜處理可謂精彩絕倫.

如果對于綁定到DataList等里面的控件操作,一般都要使用
(ControlType)DataList.Items[Index].FindControl("ControlName")來(lái)取得控件,然后進(jìn)行處理.

對于命令按鈕,都要設置CommandName,然后在DataList_ItemCommand里面通過(guò)判斷來(lái)進(jìn)行處理,所以CommandName不僅僅是可以用edit或delete,還可以多種多樣,處理十分靈活.

由于類(lèi)中的連接常常是局部變量,外部調用時(shí)不可能關(guān)閉,所以用
DataReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
這樣自動(dòng)關(guān)閉連接比較實(shí)用.

四.目錄管理
這里主要有一個(gè)知識點(diǎn):如果編輯比較簡(jiǎn)單,可以直接用DataGrid的自有編輯方法:

這里,主要有dgCatalog_EditCommand,dgCatalog_DeleteCommand,dgCatalog_CancelCommand,dgCatalog_UpdateCommand這幾個(gè)事件.同樣,都是先取得DataKey關(guān)鍵字,然后進(jìn)行處理;Update的時(shí)候,同樣是取得(TextBox)Cells[0].Controls[1].Text這樣的值,然后再運行存儲過(guò)程等等更新.

Feedback

# 邏輯層和數據層劃分  回復   

2005-11-04 08:03 by wddavid
這里,只有目錄模塊用了邏輯層,而且邏輯層的處理也非常簡(jiǎn)單,就是把數據層處理返回值.
比如:
public bool UpdateCatalog(CatalogData catalogData)
{
CatalogDB CatalogAccess = new CatalogsDB();
return CatalogAccess.UpdateLog(catalogData);
}
直接調用數據層的就完事了.
我們前面把處理都放在數據層主要是數據比較簡(jiǎn)單,不需要增加邏輯層來(lái)復雜操作.但是這里為什么又增加呢?
主要因為一點(diǎn):擴展性.雖然這里對數據沒(méi)有任何處理,只是將表示層的數據直接傳給下一層數據層,這里加入這一層是為了以后業(yè)務(wù)層擴展使用,根據業(yè)務(wù)層的需要,表示層傳來(lái)的數據可以經(jīng)過(guò)業(yè)務(wù)邏輯層的加工再傳給數據層.
(比如,如果將來(lái)目錄的一些路徑改變了,這里就必須進(jìn)行處理,而不需要去修改數據層,數據層一般只處理對處理好的數據的數據庫操作)

# 基類(lèi)PageBase再探  回復   

2005-11-08 08:26 by wddavid
本系統中的PageBase類(lèi)主要也只有幾點(diǎn)作用:

1.提供初始化方法PageBegin,那么我們在每個(gè)頁(yè)面Page_Load里面都調用它,形式:
Public void PageBegin(moduleName, isCheck)
moduleName我們根據每個(gè)頁(yè)面的不同寫(xiě)模塊名稱(chēng),isCheck為了靈活處理,如果不需要檢驗權限的頁(yè)面則isCheck參數為false.這樣,根據取得Session["EmpID"]來(lái)判斷對于現在模塊moduleName的權限,如果不夠就RedirectTo Login.aspx.

2.寫(xiě)入操作日志.由于操作日志要確定操作員和模塊名稱(chēng),所以每個(gè)頁(yè)面不一樣,所以把其放入PageBase里.

3.錯誤處理.
唯一的PageBase中處理的Page事件:
protected void PageBase_Error(object sender, System.EventArgs e)
里面用EventLog.WriteEntry寫(xiě)入系統日志.

# 繼承DataSet的信息類(lèi)和手動(dòng)建立DataAdapter的Command  回復   

2005-11-08 08:37 by wddavid

下面這個(gè)是目錄模塊信息類(lèi)CatalogData:

 public class CatalogData : DataSet //繼承DataSet,這樣可以擁有成員Tables來(lái)返回DataTable
 {
  //表格名稱(chēng),其實(shí)這些最好用public static readonly string ...來(lái)代替
  public const string CATALOG_TABLE_NAME = "CatalogData";

  public const string PK_FIELD = "pkid";
  public const string TABID_FIELD = "tabid";
  public const string INDEXID_FIELD = "indexid";
  public const string NAME_FIELD = "name";
  public const string DESCRIPTION_FIELD = "description";
  public const string URL_FIELD = "url";

  //構造函數
  public CatalogData()
  {
   BuildTable();
  }
  //創(chuàng )建數據結構表格
  private void BuildTable()
  {
   DataTable table = new DataTable(CATALOG_TABLE_NAME);
   DataColumnCollection cols = table.Columns; //同指向table的Columns,對列和行的集合就是DataColumnCollection和DataRowCollection
   cols.Add(PK_FIELD,typeof(System.Int16)); //列的表示:(名稱(chēng), 類(lèi)型)
   cols.Add(TABID_FIELD,typeof(System.String));
   cols.Add(INDEXID_FIELD,typeof(System.String));
   cols.Add(NAME_FIELD,typeof(System.String));
   cols.Add(DESCRIPTION_FIELD,typeof(System.String));
   cols.Add(URL_FIELD,typeof(System.String));
   Tables.Add(table); //這樣,新建的CatalogData類(lèi)就有了一個(gè)CatalogData.Tables[CatalogData.CATALOG_TABLE_NAME]的DataTable
  }
 }

注釋中已經(jīng)說(shuō)明了這種定義的一些特點(diǎn):
同理,我們在數據層的應用中,對于Update,Insert等各種方法,使用了下面的方法:
  public bool UpdateCatalog(CatalogData catalogData)
  {
   commandAdp.UpdateCommand = GetCommand();

   //因為插入的GetCommand()取得命令不需要pkid,所以pkid參數單獨加入
   commandAdp.UpdateCommand.Parameters.Add(new SqlParameter(paramChg(CatalogData.PK_FIELD),SqlDbType.Int));
   commandAdp.UpdateCommand.Parameters[paramChg(CatalogData.PK_FIELD)].SourceColumn = CatalogData.PK_FIELD;

   commandAdp.UpdateCommand.CommandText = "UpdateCatalogs";
   commandAdp.Update(catalogData,CatalogData.CATALOG_TABLE_NAME); //同更新DataSet (catalogData)

   if(catalogData.HasErrors) //繼承DataSet的是否含有錯誤
   {
    catalogData.Tables[CatalogData.CATALOG_TABLE_NAME].GetErrors()[0].ClearErrors();
    return false;
   }
   else
   {
    //catalogData.AcceptChanges(); //Update(DataSet)后其實(shí)不用DataSet.AcceptChanges
    return true;
   }
  }

    public bool CreateCatalog(CatalogData catalogData)
    {
     commandAdp.InsertCommand = GetCommand();
     commandAdp.InsertCommand.CommandText = "InsertCatalog";
 
     commandAdp.Update(catalogData,CatalogData.CATALOG_TABLE_NAME);

     if(catalogData.HasErrors)
     {
      catalogData.Tables[CatalogData.CATALOG_TABLE_NAME].GetErrors()[0].ClearErrors();
      return false;
     }
     else
     {
      catalogData.AcceptChanges();
      return true;
     }
    }

  private SqlCommand GetCommand()
  {
   SqlCommand command = new SqlCommand();

   command.Connection = con;
   command.CommandType = CommandType.StoredProcedure;

   SqlParameterCollection param = command.Parameters;

   param.Add(new SqlParameter(paramChg(CatalogData.TABID_FIELD),SqlDbType.VarChar));
   param.Add(new SqlParameter(paramChg(CatalogData.INDEXID_FIELD),SqlDbType.VarChar));
   param.Add(new SqlParameter(paramChg(CatalogData.NAME_FIELD),SqlDbType.VarChar));
   param.Add(new SqlParameter(paramChg(CatalogData.DESCRIPTION_FIELD),SqlDbType.VarChar));
   param.Add(new SqlParameter(paramChg(CatalogData.URL_FIELD),SqlDbType.VarChar));

   //設置源列的名稱(chēng)并設置參數值
   param[paramChg(CatalogData.TABID_FIELD)].SourceColumn = CatalogData.TABID_FIELD;
   param[paramChg(CatalogData.INDEXID_FIELD)].SourceColumn = CatalogData.INDEXID_FIELD;
   param[paramChg(CatalogData.NAME_FIELD)].SourceColumn = CatalogData.NAME_FIELD;
   param[paramChg(CatalogData.DESCRIPTION_FIELD)].SourceColumn = CatalogData.DESCRIPTION_FIELD;
   param[paramChg(CatalogData.URL_FIELD)].SourceColumn = CatalogData.URL_FIELD;

   return command;
  }
  /* 注意,上面生成的是DataAdapter.UpdateCommand.
   * 一般來(lái)說(shuō),我們都使用自動(dòng)生成法:
   * 如果用于檢索填充 DataSet 的數據的 SELECT 語(yǔ)句基于單個(gè)數據庫表,則可利用 CommandBuilder 對象自動(dòng)生成
   *  DataAdapter 的 DeleteCommand、InsertCommand 和 UpdateCommand 屬性。 這將簡(jiǎn)化并減少執行插入、更新和刪除操作所必需的代碼。
   * 也就是說(shuō),比如:
   * ada.SelectCommand.CommandText = "select * from table";
   * SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(ada);
   * 這樣,就可以使用Update命令:ada.Update(dataSet, tableName);
   * 如果要手動(dòng)生成,則要象上面一樣,設置param,并要設置每個(gè)param對應表中的列名,即SourceColumn.(還有一個(gè)SourceVersion,來(lái)決定是用新值還是舊值,一般較少用)
   */

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
SQL的Where語(yǔ)句 | 酷殼 - CoolShell.cn
如何在asp.net中如何在線(xiàn)播放視頻文件
微信公眾賬號開(kāi)發(fā)教程第3篇-開(kāi)發(fā)模式啟用及接口配置
處理 Oracle SQL in 超過(guò)1000 的解決方案
json和table互相轉換
datatable 操作
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久