net中一些所封装的类(Control)

本文介绍了一个针对 ASP.NET 开发的实用工具类,该工具类包含多种功能,如字符串加密、数据绑定、下拉列表操作、文本框值设置、树形视图创建、响应页面跳转等。这些功能简化了日常开发任务,提高了开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://blog.youkuaiyun.com/verybigmouthz/archive/2004/12/16/218294.aspx

 

using System;
using System.IO;
using System.Web;
using System.Data;
using System.Web.UI;
using System.Collections;
using System.Web.UI.WebControls;
using Microsoft.Web.UI.WebControls;
using System.Drawing;
using System.Text;  
using OWC;
 
namespace JSL.MVC.Page
{
 
/// <summary>
 
/// Controls 的摘要说明。
 
/// </summary>
 public class Controls
 {
  
private Controls()
  {
  }
  
#region string
  
public static string Encrypto(string Source)
  {
   System.Security.Cryptography.HashAlgorithm HashCryptoService;
   HashCryptoService 
= new System.Security.Cryptography.SHA1Managed();

   
byte[] bytIn = System.Text.UTF8Encoding.UTF8.GetBytes(Source);
   
byte[] bytOut = HashCryptoService.ComputeHash(bytIn);
   
return Convert.ToBase64String(bytOut);
  }
  
#endregion

  
#region BaseDataList
  
public void BindBaseList(System.Web.UI.WebControls.BaseDataList bdl_object,DataSet ds, string tbName)
  {
   bdl_object.DataSource
=ds.Tables[tbName];
   bdl_object.DataBind();
  }

  
public void BindBaseList(System.Web.UI.WebControls.BaseDataList bdl_object,DataTable dt)
  {
   bdl_object.DataSource
=dt;
   bdl_object.DataBind();
  }
  
#endregion

  
#region DropDownList
  
public static void CreateDropDownList(DropDownList ddl_object, DataTable dt, string s_text,string s_value)
  {
   ddl_object.DataSource 
= dt;
   ddl_object.DataTextField  
= s_text;
   ddl_object.DataValueField 
= s_value;
   ddl_object.DataBind();
  }

  
public static void CreateDropDownList(DropDownList ddl_object, DataSet ds, string s_text,string s_value)
  {
   ddl_object.DataSource     
=  ds;
   ddl_object.DataTextField  
= s_text;
   ddl_object.DataValueField 
= s_value;
   ddl_object.DataBind();
  }

  
public static void CreateDropDownList(DropDownList ddl_object, string s_text, string s_value)
  {
   ListItem li 
= new ListItem(s_text, s_value);
   ddl_object.Items.Add(li);
  }

  
public static void CreateDropDownList(DropDownList ddl_object, string[] s_text, string[] s_value)
  {
   
for (int i = 0; i < s_text.Length; i++)
   {
    ListItem li 
= new ListItem(s_text[i],s_value[i]);
    ddl_object.Items.Add(li);
   }
  }

  
public static void CopyDropDownList(DropDownList ddl_source, DropDownList ddl_target)
  {
   ddl_target.Items.Clear();
   ddl_target.DataTextField  
= ddl_source.DataTextField;
   ddl_target.DataTextFormatString 
= ddl_source.DataTextFormatString;
   ddl_target.DataValueField 
= ddl_source.DataValueField;
   
for (int i = 0; i < ddl_source.Items.Count; i++)
   {
    ddl_target.Items.Add(ddl_source.Items[i]);
   }
  }

  
public static void SetDropDownListValue(DropDownList ddl_object, string s_value)
  {
   
foreach(ListItem li in ddl_object.Items)
   {
    
if (li.Value == s_value)
    {
     ddl_object.SelectedValue 
= s_value;
     
break;
    }
    
else
    {
     ddl_object.SelectedValue 
= null;
    }
   }
  }

  
public static void SetDropDownListValue(DropDownList[] ddl_object,string[] s_value)
  {
   
int i = 0;
   
foreach(DropDownList ddl in ddl_object)
   {
    SetDropDownListValue(ddl,s_value[i
++]);
   }
  }
  
#endregion

  
#region TextBox
  
protected static void CopyTextBox(TextBox tb_source, TextBox tb_target)
  {
   tb_target.Text 
= tb_source.Text;
  }

  
protected static void SetTextBoxValue(TextBox tb_object, string s_value)
  {
   tb_object.Text 
= s_value;
  }

  
protected static void SetTextBoxValue(TextBox[] tb_object,string[] s_value)
  {
   
int i = 0;
   
foreach(TextBox dt in tb_object)
   {
    SetTextBoxValue(dt,s_value[i
++]);
   }
  }
  
#endregion

  
#region TreeView
  
/// <summary>
  
/// 创建树形结构
  
/// </summary>
  
/// <param name="dt">要传入的数据表</param>
  
/// <param name="treenodecollection">树结点容器集合</param>
  
/// <param name="MapNodeData">结点主键</param>
  
/// <param name="MapText">显示内容</param>
  
/// <param name="MapNavigateURL">导航路径</param>
  
/// <param name="ImageURL">图片地址</param>
  
/// <param name="ParentName">结点父键</param>
  
/// <param name="RelationOperation">结点过滤关系运算符</param>
  
/// <param name="ParentValue">运算比较值</param>
  
/// <param name="ParentValueType">比较值类型</param>
  
/// <param name="SortExpression">排序方式</param>
  
/// <param name="bcheckbox">选择框显示与否</param>
  
/// <param name="MapStatus">选择框的内容</param>
  
/// <param name="MapTarget">用于树保存时的分层标记</param>
  public static void  CreateViewTree(DataTable dt, TreeNodeCollection treenodecollection,
   
string MapNodeData, string MapText, string MapNavigateURL, string ParentName, 
   
string RelationOperation, string ParentValue, string ParentValueType,string SortExpression,
   
bool bcheckbox, string MapStatus, string MapTarget)
  {
   
if (ParentValueType == "'") ParentValue = ParentValueType + ParentValue + ParentValueType;

   
string str = ParentName + RelationOperation + ParentValue;
   DataRow[] drs 
= dt.Select( ParentName + RelationOperation + ParentValue, SortExpression);
   
foreach(DataRow dr in drs)
   {
    TreeNode treenode    
= new TreeNode();
    treenode.Text      
= dr[MapText].ToString();
    
try
    {
     treenode.NavigateUrl 
= dr[MapNavigateURL].ToString();
    }
    
catch{treenode.NavigateUrl = "";}
    treenode.CheckBox    
= bcheckbox;
    
if (MapTarget != "" && MapTarget != null) treenode.TreeNodeXsltSrc  = dr[MapTarget].ToString();
    
if (treenode.CheckBox)
    {
     
bool  bcheck ;
     
try
     {
      bcheck 
= (dr[MapStatus].ToString() == "1");
     }
     
catch{bcheck = false;}
     treenode.Checked    
=bcheck ;
    }
    
string  treenodenodedata = treenode.NodeData    = dr[MapNodeData].ToString();
    treenodecollection.Add(treenode);
    
if (ParentValueType == "'") treenodenodedata =ParentValueType+ treenodenodedata + ParentValueType;

    DataRow[] tmpdrs 
= dt.Select(ParentName + RelationOperation + treenodenodedata, SortExpression);
    
if ( tmpdrs.Length > 0)
    {
     CreateViewTree(dt,treenode.Nodes,MapNodeData,MapText,MapNavigateURL,ParentName,RelationOperation,treenode.NodeData,ParentValueType,SortExpression,bcheckbox,MapStatus,MapTarget);
    }
   }
  }
  
#endregion

  
#region Session
  
public static bool CheckSession(string CheckSession,System.Web.UI.Page WebPage)
  {
   
bool b=false;
   
foreach(string sTmp in WebPage.Session.Keys)
   {
    
if (sTmp.Equals(CheckSession))
    { 
     b 
= true;
     
break;
    }
   }
   
return b;
  }

  
public static void CheckSession(string CheckSession,System.Web.UI.Page WebPage,string ErrorPage)
  {
   
bool b=false;
   
foreach(string sTmp in WebPage.Session.Keys)
   {
    
if (sTmp.Equals(CheckSession))
    { 
     b 
= true;
     
break;
    }
   }

   
if (!b) WebPage.Response.Redirect(ErrorPage);
  }
  
#endregion

  
#region Reponse
  
public static  void ResponsePage(System.Web.UI.Page WebPage,string sUrl,string sChoose)
  {
   
try
   {
    
switch(sChoose)
    {
     
case "1":   
      WebPage.Response.Write(
"<script>window.location.href='"+sUrl+"';</script>");
      
break;
     
case "2":
      WebPage.Server.Transfer(sUrl );
      
break;
     
case "3":
      WebPage.Response.Redirect(sUrl);
      
break;
     
case "debug":
      WebPage.Response.Write(
"<script>alert('"+sUrl+"')</script>");
      
break;
     
default :
      WebPage.Response.Write(sUrl);
      
break;
    }
   }
   
catch
   {
    WebPage.Response.Write(
"Error URL:"+sUrl);
   }
  }
  
#endregion

  
#region Server To Client JAVASCRIPT
  
public void javaScript(string alert ,System.Web.UI.Page WebPage)
  {
   WebPage.RegisterStartupScript(
"script","<script language=javascript>alert('"+alert+"');</script>");
  }
  
#endregion

  
#region Split DataGrid
  
public  static string[] SplitPage(System.Web.UI.Page CurPage,DataGrid dgSplit,DataTable dtSplit,int iRowsSplitPage )
  {
   
string PAGE_OBJECT = "page"+dgSplit.ID;
   
string sPage = "1";
   
int iCurPage = 1;
   
if (CurPage.Request.QueryString[PAGE_OBJECT]!=null) sPage = CurPage.Request.QueryString[PAGE_OBJECT].ToString();
   
try   { iCurPage = Int32.Parse(sPage); }
   
catch  { iCurPage = 1; }
   
   
int start = (int)((iCurPage - 1* iRowsSplitPage);
   
if (start < 0) start = 0;
   
int to = (int)(iCurPage * iRowsSplitPage);

   DataView dv 
= dtSplit.DefaultView;
   
int iResults = dv.Count;
   
int a1=0;
   
int iPageCount = Math.DivRem(iResults,iRowsSplitPage,out a1);
   
if (a1>0) iPageCount++
   
if (iCurPage >  iPageCount || iCurPage<= 0)  iCurPage = 1;
   
if (iCurPage == iPageCount)    to = dv.Count; 
   
   DataTable dt 
= dv.Table.Clone();
   DataRow dr;
   
for(int i=start;i<iResults;i++)
   {
    
if(i<to) 
    {
     dr 
= dt.NewRow();
     
for(int k=0;k<dv.Table.Columns.Count;k++)
     {
      
//      if (k==0)
      
//       dr[k] = iResults - i;
      
//      else
      dr[k] = dv.Table.Rows[i][k];
     }
     dt.Rows.Add(dr);
    }
   }
   dt.AcceptChanges();

   DataView dvResult 
= new DataView(dt);
   dgSplit.DataSource 
= dvResult;
   dgSplit.DataBind();
   
//   dgSplit.Visible = !(dvResult.Count == 0);

   
string strNav = "";
   
int iEndPage = iPageCount;
   strNav 
+= "<a href='?"+PAGE_OBJECT+"="+ 1.ToString() + "'>首  页</a>  ";
   
if (iCurPage>1)   
   { 
    strNav 
+= "<a href='?"+PAGE_OBJECT+"="+ (iCurPage - 1).ToString() + "'>上  页</a>  ";
   }
   
else
   {
    strNav 
+= " 上  页 "
   }
   
if (iCurPage>11)  
   {
    strNav 
+= "<a href='?"+PAGE_OBJECT+"=1'>1</a> ...";
   }
   
if (iPageCount > iCurPage + 10)  iEndPage = iCurPage + 10;
   
for (int i = iCurPage - 10; i < iEndPage + 1; i++)
   {
    
if(i>=1)
    {
     
if (i==iCurPage)
     {
      strNav 
+="<font color=#990000><strong>"+ i.ToString() + "</strong></font> "
     }
     
else
     {
      strNav 
+= "<a href='?"+PAGE_OBJECT+"="+ i.ToString() + "'>"+ i.ToString() +"</a> "
     }
    }
   }

   
if ((iCurPage+10< iPageCount) 
    strNav 
+= "... <a href='?"+PAGE_OBJECT+"="+ iPageCount.ToString() + "'>"+ iPageCount.ToString() + "</a>"
   
if (iCurPage < iPageCount)  
   {
    strNav 
+= " <a href='?"+PAGE_OBJECT+"="+ (iCurPage+1).ToString() + "'>下  页</a>  "
   }
   
else
   {
    strNav 
+= " 下  页 "
   }
   strNav 
+= " <a href='?"+PAGE_OBJECT+"="+ (iPageCount).ToString() + "'>末  页</a>  "

 
   
string[] strNavResult = new string[2];  
   strNavResult[
0= strNav;
   strNavResult[
1= "[共"+ iResults.ToString() +"条][第"+ (start+1).ToString() +"-"+ to.ToString()  +"条][共"+ iPageCount.ToString() +"页]" ;

   
return strNavResult;
  }
  
#endregion

  
#region DataGrid To Excel
  
public static void DataGrid2Excel(DataGrid dg, string filename)
  {
   OWC.SpreadsheetClass xlsheet 
= new SpreadsheetClass();
   
int ihead = 0;
   
foreach(DataGridColumn dgc in dg.Columns)
   {
    xlsheet.ActiveSheet.Cells[
1, ihead + 1= dgc.HeaderText;
//    xlsheet.get_Range(xlsheet.Cells[1, 1], xlsheet.Cells[1, i + 1]).Font.Bold = true;
//    xlsheet.get_Range(xlsheet.Cells[1, 1], xlsheet.Cells[1, i + 1]).Font.Color = "red";
    ihead++;
    }

   
int icols = dg.Items[0].Cells.Count;
   
for (int j = 0; j < dg.Items.Count; j++)
   {
    
for (int i = 0; i < icols; i++)
    {
     xlsheet.ActiveSheet.Cells[j 
+ 2, i + 1= dg.Items[j].Cells[i].Text.Replace("&nbsp;"," ");
    }
   }

   
try
   {
    
//System.Web.HttpContext.Current.Server.MapPath
    xlsheet.ActiveSheet.Export(filename, OWC.SheetExportActionEnum.ssExportActionOpenInExcel);
   }
   
catch
   {
    
return;
   }
  }
  
#endregion

  
#region HostName
  
public static string GetHostName()
  {
   
return System.Net.Dns.GetHostName();
  }

  
public static System.Net.IPHostEntry GetHostByName(string hostname)
  {
   
return System.Net.Dns.GetHostByName(hostname);
  }

  
#endregion

  
#region Process
  
private void KillProcess(string processName)
  {
   System.Diagnostics.Process myproc
= new System.Diagnostics.Process();
   
//得到所有打开的进程
   try
   {
    
foreach (System.Diagnostics.Process thisproc in System.Diagnostics.Process.GetProcessesByName(processName)) 
    {
     
if(!thisproc.CloseMainWindow())
     {
      thisproc.Kill();
     }
    }
   }
   
catch(Exception Exc)
   {
    ;
   }
  }
  
#endregion

  
#region Execel
  
/// <summary>
  
/// Class to export a number of web controls to Excel.
  
/// Pass BuildExcelTable your control, then call ExportToBrowser() to write down to the browser.  
  
/// This will open a new instance of Excel.
  
/// If you want to open the Excel file in the current browser window, comment out the Response.AddHEader line.
  
/// </summary>
  public class ExcelWriter
  {
   
protected string m_szExcelHtnml;
   
private string szFileName;
   
private bool bStripBreaks;

   
public void BuildExcelTable(object DG)
   { 
    
//Header Styles
    StringWriter sw = new StringWriter();
    HtmlTextWriter ht 
= new HtmlTextWriter(sw);
 
    
string sObjectTypeName = DG.GetType().Name.ToString();
    
switch (sObjectTypeName)
    {
     
case "DataGrid":
      ((DataGrid)DG).ShowHeader 
= true;
      ((DataGrid)DG).RenderControl(ht);
      
break;
     
case "DataList":
      ((DataList)DG).RenderControl(ht);
      
break;
     
case "TextBox":
      ((TextBox)DG).RenderControl(ht);
      
break;
     
case "Label":
      ht.Write(((Label)DG).Text);
      
break;
     
case "TableRow":
      ht.Write(
"<table>");
      ((TableRow)DG).RenderControl(ht);
      ht.Write(
"</table>");
      
break;
     
case "Table":
      ((Table)DG).RenderControl(ht);     
      
break;
     
default:
      
break;
    }
     
    m_szExcelHtnml 
+= sw.ToString();
   
   }

   
public void ExportToBrowser()
   {
    
if(szFileName == "" || szFileName == null)
    {
     szFileName 
= "ExcelFile.xls";
    }

    
if(bStripBreaks)
    {
     m_szExcelHtnml 
= m_szExcelHtnml.Replace("<br>"" ");
     m_szExcelHtnml 
= m_szExcelHtnml.Replace("<BR>"" ");
    }
    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.ClearHeaders();
    HttpContext.Current.Response.AddHeader(
"Content-Disposition""attachment; filename=" + szFileName);
    HttpContext.Current.Response.ContentType 
= "application/vnd.ms-excel";
    HttpContext.Current.Response.Write(m_szExcelHtnml);
    HttpContext.Current.Response.Flush();
    HttpContext.Current.Response.End();
   }

   
public string FileName
   {
    
get
    {
     
return szFileName;
    }
    
set
    {
     szFileName 
= value;
    }
   }

   
public bool StripBreakTags
   {
    
get
    {
     
return bStripBreaks;
    }
    
set
    {
     bStripBreaks 
= value;
    }
   }
  }
  
#endregion

  
#region PDF
  
public  class  PDFGenerator  
  {  
   
static  float  pageWidth  =  594.0f;  
   
static  float  pageDepth  =  828.0f;  
   
static  float  pageMargin  =  30.0f;  
   
static  float  fontSize  =  20.0f;  
   
static  float  leadSize  =  10.0f;  
    
static  StreamWriter  pPDF=new  StreamWriter("E:/myPDF.pdf");  
    
static  MemoryStream  mPDF=  new  MemoryStream();  
    
static  void  ConvertToByteAndAddtoStream(string  strMsg)  
   {  
    Byte[]  buffer
=null;  
    buffer
=ASCIIEncoding.ASCII.GetBytes(strMsg);  
    mPDF.Write(buffer,
0,buffer.Length);    
    buffer
=null;  
   }  
 
   
static  string  xRefFormatting(long  xValue)  
   {  
    
string  strMsg  =xValue.ToString();  
    
int  iLen=strMsg.Length;  
    
if  (iLen<10)  
    {  
     StringBuilder  s
=new  StringBuilder();  
     
int  i=10-iLen;  
     s.Append(
'0',i);  
     strMsg
=s.ToString()  +  strMsg;  
    }  
    
return  strMsg;  
   }  
 
   
static  void  Main(string[]  args)  
   {  
    ArrayList  xRefs
=new  ArrayList();  
    
//Byte[]  buffer=null;  
    float  yPos  =0f;  
    
long  streamStart=0;  
    
long  streamEnd=0;  
    
long  streamLen  =0;  
    
string  strPDFMessage=null;  
    
//PDF文档头信息  
    strPDFMessage="%PDF-1.1 ";  
    ConvertToByteAndAddtoStream(strPDFMessage);  
 
    xRefs.Add(mPDF.Length);  
    strPDFMessage
="1  0  obj ";  
    ConvertToByteAndAddtoStream(strPDFMessage);  
    strPDFMessage
="<<  /Length  2  0  R  >> ";  
    ConvertToByteAndAddtoStream(strPDFMessage);  
    strPDFMessage
="stream ";  
    ConvertToByteAndAddtoStream(strPDFMessage);  
    
////////PDF文档描述  
    streamStart=mPDF.Length;  
    
//字体  
    strPDFMessage="BT /F0  "  +  fontSize  +"  Tf ";  
    ConvertToByteAndAddtoStream(strPDFMessage);  
    
//PDF文档实体高度  
    yPos  =  pageDepth  -  pageMargin;  
    strPDFMessage
=pageMargin  +  "  "  +  yPos  +"  Td "  ;  
    ConvertToByteAndAddtoStream(strPDFMessage);  
    strPDFMessage
=  leadSize+"  TL "  ;  
    ConvertToByteAndAddtoStream(strPDFMessage);  
 
    
//实体内容  
    strPDFMessage=  "(http://www.wenhui.org)Tj "  ;  
    ConvertToByteAndAddtoStream(strPDFMessage);  
    strPDFMessage
=  "ET ";  
    ConvertToByteAndAddtoStream(strPDFMessage);  
    streamEnd
=mPDF.Length;  
 
    streamLen
=streamEnd-streamStart;  
    strPDFMessage
=  "endstream endobj ";  
    ConvertToByteAndAddtoStream(strPDFMessage);  
    
//PDF文档的版本信息  
    xRefs.Add(mPDF.Length);  
    strPDFMessage
="2  0  obj "+  streamLen  +  " endobj ";  
    ConvertToByteAndAddtoStream(strPDFMessage);  
 
    xRefs.Add(mPDF.Length);  
    strPDFMessage
="3  0  obj <</Type/Page/Parent  4  0  R/Contents  1  0  R>> endobj ";  
    ConvertToByteAndAddtoStream(strPDFMessage);  
 
    xRefs.Add(mPDF.Length);  
    strPDFMessage
="4  0  obj <</Type  /Pages  /Count  1 ";  
    ConvertToByteAndAddtoStream(strPDFMessage);  
    strPDFMessage
="/Kids[ 3  0  R ] ";  
    ConvertToByteAndAddtoStream(strPDFMessage);  
    strPDFMessage
="/Resources<</ProcSet[/PDF/Text]/Font<</F0  5  0  R>>  >> ";  
    ConvertToByteAndAddtoStream(strPDFMessage);  
    strPDFMessage
="/MediaBox  [  0  0  "+  pageWidth  +  "  "  +  pageDepth  +  "  ] >> endobj ";  
    ConvertToByteAndAddtoStream(strPDFMessage);  
 
    xRefs.Add(mPDF.Length);  
    strPDFMessage
="5  0  obj <</Type/Font/Subtype/Type1/BaseFont/Courier/Encoding/WinAnsiEncoding>> endobj ";  
    ConvertToByteAndAddtoStream(strPDFMessage);  
 
    xRefs.Add(mPDF.Length);  
    strPDFMessage
="6  0  obj <</Type/Catalog/Pages  4  0  R>> endobj ";  
    ConvertToByteAndAddtoStream(strPDFMessage);  
 
    streamStart
=mPDF.Length;  
    strPDFMessage
="xref 0  7 0000000000  65535  f   ";  
    
for(int  i=0;i<xRefs.Count;i++)  
    {  
     strPDFMessage
+=xRefFormatting((long)  xRefs[i])+"  00000  n   ";  
    }  
    ConvertToByteAndAddtoStream(strPDFMessage);  
    strPDFMessage
="trailer << /Size  "+  (xRefs.Count+1)+" /Root  6  0  R >> ";  
    ConvertToByteAndAddtoStream(strPDFMessage);  
 
    strPDFMessage
="startxref "  +  streamStart+" %%EOF ";  
    ConvertToByteAndAddtoStream(strPDFMessage);  
    mPDF.WriteTo(pPDF.BaseStream);  
 
    mPDF.Close();  
    pPDF.Close();  
   }  
  } 

  
#endregion

  
#region Up Load Fille
  
public  static string UpFile(System.Web.UI.HtmlControls.HtmlInputFile infile, string savefilepath, string savefilename, string choose)
  {
   
string filename = infile.PostedFile.FileName;
   
if (infile.PostedFile!=null && infile.Value != "" )
   {
    
int i;
    
switch (choose)
    {
     
case ".":
      i 
= filename.LastIndexOf(".");
      savefilename 
+= filename.Substring(i);
      
break;
     
default:
      i 
= filename.LastIndexOf("/");
      
if (i <= 0)  i = filename.LastIndexOf("/");
      savefilename 
+= choose + filename.Substring(i + 1);
      
break;
    }
    
if (savefilepath.EndsWith("/"|| savefilepath.EndsWith("/"))
     filename 
= savefilepath + savefilename;
    
else
     filename 
= savefilepath + "/" + savefilename;
    savefilepath 
= System.Web.HttpContext.Current.Server.MapPath(filename);
    infile.PostedFile.SaveAs(savefilepath);
    
return filename;
   }
   
else
   {
    
return null;
   }
  }
  
#endregion
 }
}


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值