gpt4 book ai didi

c#递归应用完成js文件自动引用

转载 作者:我是一只小鸟 更新时间:2023-03-10 14:31:22 28 4
gpt4 key购买 nike

背景:

  两张表,分别是 :sys_tbl,和 sys_field,其中:sys_tbl 是系统所有表的信息,包含两个字段 :code(表名),name(表描述信息);sys_fld 是记录第张表中的字段 的名称(field)和描述信息(table) ,  。

截图如下:

sys_tbl 。

   。

  。

  。

 其中,字段 名称包含对其它名称(对象) 的引用,写法为:表名(去除下划线)_引用字段 ,如:einventory_cinvcode,就是对表 e_inventory 中字段 cinvcode的引用.

 每张表都在系统 中对应有不同功能的js文件(模块)如: 编辑窗体(dialog类型),跨域选择窗体(field)类型等 。

 需求:

在一个综合的页面中,会对其它对象进行引用(依赖),而这种引用最终体现在对js文件的包含。同时被引用的js 文件(一级引用)还有自已关联对象(二级引用).....如此下去,直到N 级引用.

所以现在需要逐层找到对象的引用,直到最后不依赖任何对象为止,并把这些js文件生成引用包含路径(不重复) 。

  。

分析:

1、返回结果类型:

得到这些js引用,不能重复,但是对象之间引用是可以存在交叉的,在整个引用链条上,同一个对象会被 多个对象引用,所以简单的字符串数组是避免不了重复的。但是在C#中的HashSet可以做到不重复,同时这个去重工作是自动完成的,所以存结果如果是简单的value类型,用 HashSet就可以,但是因为字段中表的信息已经被格式化过,所以还要把格式化之前的表名称取出与字段对应,所以需要一个key-value类型的数据 ,那就是 Dictionary<string, string> 了.

2、算法选择

因为查找引用,是层层进行的,而且下一层引用的要用到上一层的引用结果,所以这里选择递归算法 。

代码实现:

声明一个全局变量,记录所有的表与字段的对应的数据,因为需要确保数据key 唯一性所以选择Dicctionary类型 。

                
                  ///
                
                
                  <summary>
                
                
                  ///
                
                
                   define the gloable parameter to save the rel obj data
        
                
                
                  ///
                
                
                  </summary>
                
                
                  public
                
                
                  static
                
                 Dictionary<
                
                  string
                
                , 
                
                  string
                
                > 
                
                   deepRef 
                
                = 
                
                  new
                
                 Dictionary<
                
                  string
                
                , 
                
                  string
                
                >();
              

入口函数,完成准备工作,(数据库连接,参数准备) 。

                
                  ///
                
                
                  <summary>
                
                
                  ///
                
                
                   通过表的字段 获取相关的引用字段依赖的对象 直到没有依赖为止
        
                
                
                  ///
                
                
                  </summary>
                
                
                  ///
                
                
                  <param name="headField">
                
                
                  表字段列表
                
                
                  </param>
                
                
                  ///
                
                
                  <returns></returns>
                
                
                  public
                
                
                  static
                
                 Dictionary<
                
                  string
                
                ,
                
                  string
                
                >  getRelRef(List<IniItemsTableItem>
                
                   headField)
        {
            HashSet
                
                <
                
                  string
                
                > refset = 
                
                  new
                
                 HashSet<
                
                  string
                
                >
                
                  ();
           
                
                
                  //
                
                
                   HashSet<string> refset_result = new HashSet<string>();
                
                
                  foreach
                
                 (
                
                  var
                
                 item 
                
                  in
                
                
                   headField)
            {
                
                
                
                  if
                
                 (!item.controlType.StartsWith(
                
                  "
                
                
                  hz_
                
                
                  "
                
                ))
                
                  //
                
                
                   is not the field of  reference
                
                
                                  {
                    
                
                
                  continue
                
                
                  ;
                }
                
                
                
                  string
                
                [] fieldarr = item.dataIndex.Split(
                
                  '
                
                
                  _
                
                
                  '
                
                );
                
                  //
                
                
                  the constructor is :[tabble]_[field]
                
                
                  
                refset.Add(fieldarr[
                
                
                  0
                
                ]);
                
                  //
                
                
                  the first prefix
                
                
                  
            }
            dataOperate dao 
                
                = 
                
                  new
                
                
                   dataOperate();
            dao.DBServer 
                
                = 
                
                  "
                
                
                  info
                
                
                  "
                
                
                  ;
            SqlConnection conn 
                
                =
                
                   dao.createCon();
            
                
                
                  try
                
                
                  
            {
                
                
                
                  if
                
                 (refset.Count > 
                
                  0
                
                
                  )
                {
                    
                    
                
                
                  if
                
                 (conn.State !=
                
                   ConnectionState.Open)
                        conn.Open();
                
                
                  //
                
                
                  open connection
                
                
                    deepRef = 
                
                  new
                
                 Dictionary<
                
                  string
                
                , 
                
                  string
                
                >();
                
                  //
                
                
                  clear the relation obj data
                
                
                                      getRef(conn, refset);
                 

                }
                
                
                
                  return
                
                
                   deepRef;
            }
            
                
                
                  catch
                
                
                   (Exception)
            {

                
                
                
                  throw
                
                
                  ;
            }
            
                
                
                  finally
                
                
                  
            {
                
                
                
                  if
                
                 (conn.State ==
                
                   ConnectionState.Open)
                    conn.Close();
            }

        }
                
              

递归函数,最终完成在数据库中获取字段依赖的对象的获取 。

                
                  ///
                
                
                  <summary>
                
                
                  ///
                
                
                   get the relation obj 
        
                
                
                  ///
                
                
                  </summary>
                
                
                  ///
                
                
                  <param name="conn"></param>
                
                
                  ///
                
                
                  <param name="ref_field"></param>
                
                
                  ///
                
                
                  <returns></returns>
                
                
                  public
                
                
                  static
                
                 HashSet<
                
                  string
                
                > 
                
                   getRef 
                
                (SqlConnection conn, HashSet<
                
                  string
                
                >
                
                   ref_field)
        {
            HashSet
                
                <
                
                  string
                
                > refset = 
                
                  new
                
                 HashSet<
                
                  string
                
                >
                
                  ();

            
                
                
                  string
                
                 refstr = 
                
                  string
                
                .Join(
                
                  "
                
                
                  ','
                
                
                  "
                
                
                  , ref_field);
            
                
                
                  if
                
                 (refstr != 
                
                  ""
                
                
                  )
            {
                refstr 
                
                = 
                
                  "
                
                
                  '
                
                
                  "
                
                 + refstr + 
                
                  "
                
                
                  '
                
                
                  "
                
                
                  ;

                
                
                
                  string
                
                 sql = 
                
                  "
                
                
                  SELECT dbo.GetSplitOfIndex(b.[field],'_',1) as refcode,a.[code]  FROM   (  select   replace(code,'_','') as uncode,* from     [SevenWOLDev].[dbo].[sys_tbl_view] )   as a inner join [SevenWOLDev].[dbo].[sys_fld_view]  as b    on a.uncode=dbo.GetSplitOfIndex(b.[field],'_',1)    where replace([table],'_','') in (
                
                
                  "
                
                 + refstr + 
                
                  "
                
                
                  ) and uitype='ref'
                
                
                  "
                
                
                  ;
                
                
                
                  //
                
                
                  get dataset relation obj
                
                
                DataSet ds =
                
                   dataOperate.getDataset(conn, sql);
                
                
                
                  if
                
                 (ds != 
                
                  null
                
                 && ds.Tables.Count > 
                
                  0
                
                
                  )
                {
                    DataTable dt 
                
                = ds.Tables[
                
                  0
                
                
                  ];
                    
                
                
                  if
                
                 (dt.Rows.Count > 
                
                  0
                
                
                  )
                    {
                        
                
                
                  //
                
                
                  rel ref exists
                
                
                  for
                
                 (
                
                  int
                
                 k = 
                
                  0
                
                ; k < dt.Rows.Count; k++
                
                  )
                        {
                            
                
                
                  string
                
                 vt = dt.Rows[k].ItemArray[
                
                  0
                
                
                  ].ToString();
                             
                
                
                  string
                
                 vv = dt.Rows[k].ItemArray[
                
                  1
                
                
                  ].ToString();
                            refset.Add(vt);
                
                
                  //
                
                
                  save current ref
                
                
                  if
                
                (!
                
                     deepRef   
                  .ContainsKey(vt))
                                
                    deepRef  
                  .Add(vt, vv);
                
                
                  //
                
                
                   save all ref
                
                
                  
                             
                        }
                        
                
                
                  if
                
                 (refset.Count > 
                
                  0
                
                )
                
                  //
                
                
                   get the ref successfully
                
                
                                          {
                            
                
                
                  //
                
                
                  recursion get
                
                
                                              getRef(conn, refset);
                        }

                    }

                }

            }
            
                
                
                  else
                
                
                  
            { 
                
                
                
                  //
                
                
                  no ref
                
                
                              }
            
                
                
                  return
                
                
                   refset;
        }
                
              

对函数进行调用,并组织出js文件引用路径 。

                 Dictionary<
                
                  string
                
                ,
                
                  string
                
                > deepRef =
                
                   ExtjsFun.getRelRef(HeadfieldSetup);
            
                
                
                  if
                
                 (deepRef != 
                
                  null
                
                
                  )
            {
                
                
                
                  foreach
                
                 (
                
                  var
                
                 s 
                
                  in
                
                
                   deepRef)
                {
                    
                
                
                  string
                
                 tem_module = 
                
                  ""
                
                
                  ;
                    tem_module 
                
                =
                
                   s.Value;
                    
                
                
                  string
                
                [] moduleArr = tem_module.Split(
                
                  '
                
                
                  _
                
                
                  '
                
                
                  );
                    
                
                
                  if
                
                 (tem_module.IndexOf(
                
                  "
                
                
                  _
                
                
                  "
                
                ) >= 
                
                  0
                
                
                  )
                        tem_module 
                
                = moduleArr[
                
                  1
                
                ];
                
                  //
                
                
                  module name for instance: p_machine ,the module is “machine” unless not included the underscore
                
                
                  string
                
                 fieldkind = 
                
                  "
                
                
                  dialog
                
                
                  "
                
                
                  ;
                    jslist.Add(MyComm.getFirstUp(tem_module) 
                
                + 
                
                  "
                
                
                  /
                
                
                  "
                
                 + ExtjsFun.GetJsModuleName(tem_module, s.Value, fieldkind) + 
                
                  "
                
                
                  .js
                
                
                  "
                
                
                  );
                    fieldkind 
                
                = 
                
                  "
                
                
                  field
                
                
                  "
                
                
                  ;
                    jslist.Add(MyComm.getFirstUp(tem_module) 
                
                + 
                
                  "
                
                
                  /
                
                
                  "
                
                 + ExtjsFun.GetJsModuleName(tem_module, s.Value, fieldkind) + 
                
                  "
                
                
                  .js
                
                
                  "
                
                
                  );
                }
            }
                
              

  。

最终结果 如下:

                
                  <
                
                
                  script 
                
                
                  src
                
                
                  ="../../dept/demoApp/scripts/Sprice/SpriceE_spriceGridfield.js"
                
                
                   type
                
                
                  ="text/javascript"
                
                
                  ></
                
                
                  script
                
                
                  >
                
                
                  <
                
                
                  script 
                
                
                  src
                
                
                  ="../../dept/demoApp/scripts/Org/OrgE_orgDialog.js"
                
                
                   type
                
                
                  ="text/javascript"
                
                
                  ></
                
                
                  script
                
                
                  >
                
                
                  <
                
                
                  script 
                
                
                  src
                
                
                  ="../../dept/demoApp/scripts/Supplier/SupplierOa_supplierDialog.js"
                
                
                   type
                
                
                  ="text/javascript"
                
                
                  ></
                
                
                  script
                
                
                  >
                
                
                  <
                
                
                  script 
                
                
                  src
                
                
                  ="../../dept/demoApp/scripts/Supplier/SupplierOa_supplierField.js"
                
                
                   type
                
                
                  ="text/javascript"
                
                
                  ></
                
                
                  script
                
                
                  >
                
                
                  <
                
                
                  script 
                
                
                  src
                
                
                  ="../../dept/demoApp/scripts/Unit/UnitE_unitDialog.js"
                
                
                   type
                
                
                  ="text/javascript"
                
                
                  ></
                
                
                  script
                
                
                  >
                
                
                  <
                
                
                  script 
                
                
                  src
                
                
                  ="../../dept/demoApp/scripts/Unit/UnitE_unitField.js"
                
                
                   type
                
                
                  ="text/javascript"
                
                
                  ></
                
                
                  script
                
                
                  >
                
                
                  <
                
                
                  script 
                
                
                  src
                
                
                  ="../../dept/demoApp/scripts/Wh/WhWh_whDialog.js"
                
                
                   type
                
                
                  ="text/javascript"
                
                
                  ></
                
                
                  script
                
                
                  >
                
                
                  <
                
                
                  script 
                
                
                  src
                
                
                  ="../../dept/demoApp/scripts/Wh/WhWh_whField.js"
                
                
                   type
                
                
                  ="text/javascript"
                
                
                  ></
                
                
                  script
                
                
                  >
                
                
                  <
                
                
                  script 
                
                
                  src
                
                
                  ="../../dept/demoApp/scripts/Mold/MoldP_moldDialog.js"
                
                
                   type
                
                
                  ="text/javascript"
                
                
                  ></
                
                
                  script
                
                
                  >
                
                
                  <
                
                
                  script 
                
                
                  src
                
                
                  ="../../dept/demoApp/scripts/Mold/MoldP_moldField.js"
                
                
                   type
                
                
                  ="text/javascript"
                
                
                  ></
                
                
                  script
                
                
                  >
                
                
                  <
                
                
                  script 
                
                
                  src
                
                
                  ="../../dept/demoApp/scripts/Suppliercategory/SuppliercategoryOa_suppliercategoryDialog.js"
                
                
                   type
                
                
                  ="text/javascript"
                
                
                  ></
                
                
                  script
                
                
                  >
                
                
                  <
                
                
                  script 
                
                
                  src
                
                
                  ="../../dept/demoApp/scripts/Suppliercategory/SuppliercategoryOa_suppliercategoryField.js"
                
                
                   type
                
                
                  ="text/javascript"
                
                
                  ></
                
                
                  script
                
                
                  >
                
                
                  <
                
                
                  script 
                
                
                  src
                
                
                  ="../../dept/demoApp/scripts/Bank/BankOa_bankDialog.js"
                
                
                   type
                
                
                  ="text/javascript"
                
                
                  ></
                
                
                  script
                
                
                  >
                
                
                  <
                
                
                  script 
                
                
                  src
                
                
                  ="../../dept/demoApp/scripts/Bank/BankOa_bankField.js"
                
                
                   type
                
                
                  ="text/javascript"
                
                
                  ></
                
                
                  script
                
                
                  >
                
                
                  <
                
                
                  script 
                
                
                  src
                
                
                  ="../../dept/demoApp/scripts/Machine/MachineP_machineDialog.js"
                
                
                   type
                
                
                  ="text/javascript"
                
                
                  ></
                
                
                  script
                
                
                  >
                
                
                  <
                
                
                  script 
                
                
                  src
                
                
                  ="../../dept/demoApp/scripts/Machine/MachineP_machineField.js"
                
                
                   type
                
                
                  ="text/javascript"
                
                
                  ></
                
                
                  script
                
                
                  >
                
                
                  <
                
                
                  script 
                
                
                  src
                
                
                  ="../../dept/demoApp/scripts/Inventory/InventoryE_inventoryDialog.js"
                
                
                   type
                
                
                  ="text/javascript"
                
                
                  ></
                
                
                  script
                
                
                  >
                
                
                  <
                
                
                  script 
                
                
                  src
                
                
                  ="../../dept/demoApp/scripts/Basedocment/BasedocmentOa_basedocmentDialog.js"
                
                
                   type
                
                
                  ="text/javascript"
                
                
                  ></
                
                
                  script
                
                
                  >
                
                
                  <
                
                
                  script 
                
                
                  src
                
                
                  ="../../dept/demoApp/scripts/Basedocment/BasedocmentOa_basedocmentField.js"
                
                
                   type
                
                
                  ="text/javascript"
                
                
                  ></
                
                
                  script
                
                
                  >
                
                
                  <
                
                
                  script 
                
                
                  src
                
                
                  ="../../dept/demoApp/scripts/Basedoctype/BasedoctypeOa_basedoctypeDialog.js"
                
                
                   type
                
                
                  ="text/javascript"
                
                
                  ></
                
                
                  script
                
                
                  >
                
                
                  <
                
                
                  script 
                
                
                  src
                
                
                  ="../../dept/demoApp/scripts/Basedoctype/BasedoctypeOa_basedoctypeField.js"
                
                
                   type
                
                
                  ="text/javascript"
                
                
                  ></
                
                
                  script
                
                
                  >
                
                
                  <
                
                
                  script 
                
                
                  src
                
                
                  ="../../dept/demoApp/scripts/Tax/TaxE_taxDialog.js"
                
                
                   type
                
                
                  ="text/javascript"
                
                
                  ></
                
                
                  script
                
                
                  >
                
                
                  <
                
                
                  script 
                
                
                  src
                
                
                  ="../../dept/demoApp/scripts/Tax/TaxE_taxField.js"
                
                
                   type
                
                
                  ="text/javascript"
                
                
                  ></
                
                
                  script
                
                
                  >
                
              

  。

  。

完事代码如下:

                
                  ///
                
                
                  <summary>
                
                
                  ///
                
                
                   define the gloable parameter to save the rel obj data
        
                
                
                  ///
                
                
                  </summary>
                
                
                  public
                
                
                  static
                
                 Dictionary<
                
                  string
                
                , 
                
                  string
                
                > deepRef = 
                
                  new
                
                 Dictionary<
                
                  string
                
                , 
                
                  string
                
                >
                
                  ();
        
                
                
                  ///
                
                
                  <summary>
                
                
                  ///
                
                
                   通过表的字段 获取相关的引用字段依赖的对象 直到没有依赖为止
        
                
                
                  ///
                
                
                  </summary>
                
                
                  ///
                
                
                  <param name="headField">
                
                
                  表字段列表
                
                
                  </param>
                
                
                  ///
                
                
                  <returns></returns>
                
                
                  public
                
                
                  static
                
                 Dictionary<
                
                  string
                
                ,
                
                  string
                
                >  getRelRef(List<IniItemsTableItem>
                
                   headField)
        {
            HashSet
                
                <
                
                  string
                
                > refset = 
                
                  new
                
                 HashSet<
                
                  string
                
                >
                
                  ();
           
                
                
                  //
                
                
                   HashSet<string> refset_result = new HashSet<string>();
                
                
                  foreach
                
                 (
                
                  var
                
                 item 
                
                  in
                
                
                   headField)
            {
                
                
                
                  if
                
                 (!item.controlType.StartsWith(
                
                  "
                
                
                  hz_
                
                
                  "
                
                ))
                
                  //
                
                
                   is not the field of  reference
                
                
                                  {
                    
                
                
                  continue
                
                
                  ;
                }
                
                
                
                  string
                
                [] fieldarr = item.dataIndex.Split(
                
                  '
                
                
                  _
                
                
                  '
                
                );
                
                  //
                
                
                  the constructor is :[tabble]_[field]
                
                
                  
                refset.Add(fieldarr[
                
                
                  0
                
                ]);
                
                  //
                
                
                  the first prefix
                
                
                  
            }
            dataOperate dao 
                
                = 
                
                  new
                
                
                   dataOperate();
            dao.DBServer 
                
                = 
                
                  "
                
                
                  info
                
                
                  "
                
                
                  ;
            SqlConnection conn 
                
                =
                
                   dao.createCon();
            
                
                
                  try
                
                
                  
            {
                
                
                
                  if
                
                 (refset.Count > 
                
                  0
                
                
                  )
                {
                    
                    
                
                
                  if
                
                 (conn.State !=
                
                   ConnectionState.Open)
                        conn.Open();
                
                
                  //
                
                
                  open connection
                
                
                    deepRef = 
                
                  new
                
                 Dictionary<
                
                  string
                
                , 
                
                  string
                
                >();
                
                  //
                
                
                  clear the relation obj data
                
                
                                      getRef(conn, refset);
                 

                }
                
                
                
                  return
                
                
                   deepRef;
            }
            
                
                
                  catch
                
                
                   (Exception)
            {

                
                
                
                  throw
                
                
                  ;
            }
            
                
                
                  finally
                
                
                  
            {
                
                
                
                  if
                
                 (conn.State ==
                
                   ConnectionState.Open)
                    conn.Close();
            }


            

        }
       
        
                
                
                  ///
                
                
                  <summary>
                
                
                  ///
                
                
                   get the relation obj 
        
                
                
                  ///
                
                
                  </summary>
                
                
                  ///
                
                
                  <param name="conn"></param>
                
                
                  ///
                
                
                  <param name="ref_field"></param>
                
                
                  ///
                
                
                  <returns></returns>
                
                
                  public
                
                
                  static
                
                 HashSet<
                
                  string
                
                > getRef(SqlConnection conn, HashSet<
                
                  string
                
                >
                
                   ref_field)
        {
            HashSet
                
                <
                
                  string
                
                > refset = 
                
                  new
                
                 HashSet<
                
                  string
                
                >
                
                  ();

            
                
                
                  string
                
                 refstr = 
                
                  string
                
                .Join(
                
                  "
                
                
                  ','
                
                
                  "
                
                
                  , ref_field);
            
                
                
                  if
                
                 (refstr != 
                
                  ""
                
                
                  )
            {
                refstr 
                
                = 
                
                  "
                
                
                  '
                
                
                  "
                
                 + refstr + 
                
                  "
                
                
                  '
                
                
                  "
                
                
                  ;

                
                
                
                  string
                
                 sql = 
                
                  "
                
                
                  SELECT dbo.GetSplitOfIndex(b.[field],'_',1) as refcode,a.[code]  FROM   (  select   replace(code,'_','') as uncode,* from     [SevenWOLDev].[dbo].[sys_tbl_view] )   as a inner join [SevenWOLDev].[dbo].[sys_fld_view]  as b    on a.uncode=dbo.GetSplitOfIndex(b.[field],'_',1)    where replace([table],'_','') in (
                
                
                  "
                
                 + refstr + 
                
                  "
                
                
                  ) and uitype='ref'
                
                
                  "
                
                
                  ;
                
                
                
                  //
                
                
                  get dataset relation obj
                
                
                DataSet ds =
                
                   dataOperate.getDataset(conn, sql);
                
                
                
                  if
                
                 (ds != 
                
                  null
                
                 && ds.Tables.Count > 
                
                  0
                
                
                  )
                {
                    DataTable dt 
                
                = ds.Tables[
                
                  0
                
                
                  ];
                    
                
                
                  if
                
                 (dt.Rows.Count > 
                
                  0
                
                
                  )
                    {
                        
                
                
                  //
                
                
                  rel ref exists
                
                
                  for
                
                 (
                
                  int
                
                 k = 
                
                  0
                
                ; k < dt.Rows.Count; k++
                
                  )
                        {
                            
                
                
                  string
                
                 vt = dt.Rows[k].ItemArray[
                
                  0
                
                
                  ].ToString();
                             
                
                
                  string
                
                 vv = dt.Rows[k].ItemArray[
                
                  1
                
                
                  ].ToString();
                            refset.Add(vt);
                
                
                  //
                
                
                  save current ref
                
                
                  if
                
                (!
                
                  deepRef.ContainsKey(vt))
                                deepRef.Add(vt, vv);
                
                
                  //
                
                
                   save all ref
                
                
                  
                             
                        }
                        
                
                
                  if
                
                 (refset.Count > 
                
                  0
                
                )
                
                  //
                
                
                   get the ref successfully
                
                
                                          {
                            
                
                
                  //
                
                
                  recursion get
                
                
                                              getRef(conn, refset);
                        }

                    }

                }




            }
            
                
                
                  else
                
                
                  
            { 
                
                
                
                  //
                
                
                  no ref
                
                
                              }
            
                
                
                  return
                
                
                   refset;
        }
                
              

  。

最后此篇关于c#递归应用完成js文件自动引用的文章就讲到这里了,如果你想了解更多关于c#递归应用完成js文件自动引用的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com