C#实战项目第二集

第二讲只要向大家介绍用户登录模块的实现,在这一讲中主要向大家介绍了实体类、简单工厂类、加密类的使用,由于在项目中这些都是基本类库框架所以没有再做太多的介绍,所以我将这些类库的实现罗列出来供大家学习参考。
以下是我的讲座的下载地址:
http://www.verycd.com/topics/121681/
http://www.verycd.com/topics/34358/
http://www.verycd.com/topics/87555/

o_暴风截屏20080309194226.jpg

  1
  2using System;
  3using System.Collections.Generic;
  4using System.Text;
  5using System.Data;
  6using System.Configuration;
  7using System.Data.Common;
  8using System.Data.SqlClient;
  9using System.Data.OleDb;
 10using System.Data.Odbc;
 11using System.Data.OracleClient;
 12using System.IO;
 13
 14namespace WebHelper.DB
 15{
 16    /// <summary>
 17    /// DatabaseHelper是一个对数据库的封装库,主要针对小型数据库开发
 18    /// 有着很好的跨数据库功能,但针对专有数据库优化不足
 19    /// </summary>

 20    public class DatabaseHelper : IDisposable
 21    {
 22        private string strConnectionString;
 23        private DbConnection objConnection;
 24        private DbCommand objCommand;
 25        private DbProviderFactory objFactory = null;
 26        private bool boolHandleErrors;
 27        private string strLastError;
 28        private bool boolLogError;
 29        private string strLogFile;
 30
 31        /// <summary>
 32        /// Initializes a new instance of the <see cref="DatabaseHelper"/> class.
 33        /// </summary>
 34        /// <param name="connectionstring">The connectionstring.</param>
 35        /// <param name="provider">The provider.</param>

 36        public DatabaseHelper(string connectionstring, Providers provider)
 37        {
 38            strConnectionString = connectionstring;
 39            switch (provider)
 40            {
 41                case Providers.SqlServer:
 42                    objFactory = SqlClientFactory.Instance;
 43                    break;
 44                case Providers.OleDb:
 45                    objFactory = OleDbFactory.Instance;
 46                    break;
 47                case Providers.Oracle:
 48                    objFactory = OracleClientFactory.Instance;
 49                    break;
 50                case Providers.ODBC:
 51                    objFactory = OdbcFactory.Instance;
 52                    break;
 53                case Providers.ConfigDefined:
 54                    string providername = ConfigurationManager.ConnectionStrings["connectionstring"].ProviderName;
 55                    switch (providername)
 56                    {
 57                        case "System.Data.SqlClient":
 58                            objFactory = SqlClientFactory.Instance;
 59                            break;
 60                        case "System.Data.OleDb":
 61                            objFactory = OleDbFactory.Instance;
 62                            break;
 63                        case "System.Data.OracleClient":
 64                            objFactory = OracleClientFactory.Instance;
 65                            break;
 66                        case "System.Data.Odbc":
 67                            objFactory = OdbcFactory.Instance;
 68                            break;
 69                    }

 70                    break;
 71
 72            }

 73            objConnection = objFactory.CreateConnection();
 74            objCommand = objFactory.CreateCommand();
 75
 76            objConnection.ConnectionString = strConnectionString;
 77            objCommand.Connection = objConnection;
 78        }

 79
 80        /// <summary>
 81        /// Initializes a new instance of the <see cref="DatabaseHelper"/> class.
 82        /// </summary>
 83        /// <param name="provider">The provider.</param>

 84        public DatabaseHelper(Providers provider)
 85            : this(ConfigurationManager.ConnectionStrings["connectionstring"].ConnectionString, provider)
 86        {
 87        }

 88
 89        /// <summary>
 90        /// Initializes a new instance of the <see cref="DatabaseHelper"/> class.
 91        /// </summary>
 92        /// <param name="connectionstring">The connectionstring.</param>

 93        public DatabaseHelper(string connectionstring)
 94            : this(connectionstring, Providers.SqlServer)
 95        {
 96        }

 97
 98        /// <summary>
 99        /// Initializes a new instance of the <see cref="DatabaseHelper"/> class.
100        /// </summary>

101        public DatabaseHelper()
102            : this(ConfigurationManager.ConnectionStrings["connectionstring"].ConnectionString, Providers.ConfigDefined)
103        {
104        }

105
106        /// <summary>
107        /// Gets or sets a value indicating whether [handle errors].
108        /// </summary>
109        /// <value><c>true</c> if [handle errors]; otherwise, <c>false</c>.</value>

110        public bool HandleErrors
111        {
112            get
113            {
114                return boolHandleErrors;
115            }

116            set
117            {
118                boolHandleErrors = value;
119            }

120        }

121
122        /// <summary>
123        /// Gets the last error.
124        /// </summary>
125        /// <value>The last error.</value>

126        public string LastError
127        {
128            get
129            {
130                return strLastError;
131            }

132        }

133
134        /// <summary>
135        /// Gets or sets a value indicating whether [log errors].
136        /// </summary>
137        /// <value><c>true</c> if [log errors]; otherwise, <c>false</c>.</value>

138        public bool LogErrors
139        {
140            get
141            {
142                return boolLogError;
143            }

144            set
145            {
146                boolLogError = value;
147            }

148        }

149
150        /// <summary>
151        /// Gets or sets the log file.
152        /// </summary>
153        /// <value>The log file.</value>

154        public string LogFile
155        {
156            get
157            {
158                return strLogFile;
159            }

160            set
161            {
162                strLogFile = value;
163            }

164        }

165
166        /// <summary>
167        /// Adds the parameter.
168        /// </summary>
169        /// <param name="name">The name.</param>
170        /// <param name="value">The value.</param>
171        /// <returns></returns>

172        public int AddParameter(string name, object value)
173        {
174            DbParameter p = objFactory.CreateParameter();
175            p.ParameterName = name;
176            p.Value = value;
177            return objCommand.Parameters.Add(p);
178        }

179
180        /// <summary>
181        /// Adds the parameter.
182        /// </summary>
183        /// <param name="parameter">The parameter.</param>
184        /// <returns></returns>

185        public int AddParameter(DbParameter parameter)
186        {
187            return objCommand.Parameters.Add(parameter);
188        }

189
190        /// <summary>
191        /// Gets the command.
192        /// </summary>
193        /// <value>The command.</value>

194        public DbCommand Command
195        {
196            get
197            {
198                return objCommand;
199            }

200        }

201
202        /// <summary>
203        /// Begins the transaction.
204        /// </summary>

205        public void BeginTransaction()
206        {
207            if (objConnection.State == System.Data.ConnectionState.Closed)
208            {
209                objConnection.Open();
210            }

211            objCommand.Transaction = objConnection.BeginTransaction();
212        }

213
214        /// <summary>
215        /// Commits the transaction.
216        /// </summary>

217        public void CommitTransaction()
218        {
219            objCommand.Transaction.Commit();
220            objConnection.Close();
221        }

222
223        /// <summary>
224        /// Rollbacks the transaction.
225        /// </summary>

226        public void RollbackTransaction()
227        {
228            objCommand.Transaction.Rollback();
229            objConnection.Close();
230        }

231
232        /// <summary>
233        /// Executes the non query.
234        /// </summary>
235        /// <param name="query">The query.</param>
236        /// <returns></returns>

237        public int ExecuteNonQuery(string query)
238        {
239            return ExecuteNonQuery(query, CommandType.Text, ConnectionState.CloseOnExit);
240        }

241
242        /// <summary>
243        /// Executes the non query.
244        /// </summary>
245        /// <param name="query">The query.</param>
246        /// <param name="commandtype">The commandtype.</param>
247        /// <returns></returns>

248        public int ExecuteNonQuery(string query, CommandType commandtype)
249        {
250            return ExecuteNonQuery(query, commandtype, ConnectionState.CloseOnExit);
251        }

252
253        /// <summary>
254        /// Executes the non query.
255        /// </summary>
256        /// <param name="query">The query.</param>
257        /// <param name="connectionstate">The connectionstate.</param>
258        /// <returns></returns>

259        public int ExecuteNonQuery(string query, ConnectionState connectionstate)
260        {
261            return ExecuteNonQuery(query, CommandType.Text, connectionstate);
262        }

263
264        /// <summary>
265        /// Executes the non query.
266        /// </summary>
267        /// <param name="query">The query.</param>
268        /// <param name="commandtype">The commandtype.</param>
269        /// <param name="connectionstate">The connectionstate.</param>
270        /// <returns></returns>

271        public int ExecuteNonQuery(string query, CommandType commandtype, ConnectionState connectionstate)
272        {
273            objCommand.CommandText = query;
274            objCommand.CommandType = commandtype;
275            int i = -1;
276            try
277            {
278                if (objConnection.State == System.Data.ConnectionState.Closed)
279                {
280                    objConnection.Open();
281                }

282                i = objCommand.ExecuteNonQuery();
283            }

284            catch (Exception ex)
285            {
286                HandleExceptions(ex);
287            }

288            finally
289            {
290                objCommand.Parameters.Clear();
291                if (connectionstate == ConnectionState.CloseOnExit)
292                {
293                    objConnection.Close();
294                }

295            }

296
297            return i;
298        }

299
300        /// <summary>
301        /// Executes the scalar.
302        /// </summary>
303        /// <param name="query">The query.</param>
304        /// <returns></returns>

305        public object ExecuteScalar(string query)
306        {
307            return ExecuteScalar(query, CommandType.Text, ConnectionState.CloseOnExit);
308        }

309
310        /// <summary>
311        /// Executes the scalar.
312        /// </summary>
313        /// <param name="query">The query.</param>
314        /// <param name="commandtype">The commandtype.</param>
315        /// <returns></returns>

316        public object ExecuteScalar(string query, CommandType commandtype)
317        {
318            return ExecuteScalar(query, commandtype, ConnectionState.CloseOnExit);
319        }

320
321        /// <summary>
322        /// Executes the scalar.
323        /// </summary>
324        /// <param name="query">The query.</param>
325        /// <param name="connectionstate">The connectionstate.</param>
326        /// <returns></returns>

327        public object ExecuteScalar(string query, ConnectionState connectionstate)
328        {
329            return ExecuteScalar(query, CommandType.Text, connectionstate);
330        }

331
332        /// <summary>
333        /// Executes the scalar.
334        /// </summary>
335        /// <param name="query">The query.</param>
336        /// <param name="commandtype">The commandtype.</param>
337        /// <param name="connectionstate">The connectionstate.</param>
338        /// <returns></returns>

339        public object ExecuteScalar(string query, CommandType commandtype, ConnectionState connectionstate)
340        {
341            objCommand.CommandText = query;
342            objCommand.CommandType = commandtype;
343            object o = null;
344            try
345            {
346                if (objConnection.State == System.Data.ConnectionState.Closed)
347                {
348                    objConnection.Open();
349                }

350                o = objCommand.ExecuteScalar();
351            }

352            catch (Exception ex)
353            {
354                HandleExceptions(ex);
355            }

356            finally
357            {
358                objCommand.Parameters.Clear();
359                if (connectionstate == ConnectionState.CloseOnExit)
360                {
361                    objConnection.Close();
362                }

363            }

364
365            return o;
366        }

367
368        /// <summary>
369        /// Executes the reader.
370        /// </summary>
371        /// <param name="query">The query.</param>
372        /// <returns></returns>

373        public DbDataReader ExecuteReader(string query)
374        {
375            return ExecuteReader(query, CommandType.Text, ConnectionState.CloseOnExit);
376        }

377
378        /// <summary>
379        /// Executes the reader.
380        /// </summary>
381        /// <param name="query">The query.</param>
382        /// <param name="commandtype">The commandtype.</param>
383        /// <returns></returns>

384        public DbDataReader ExecuteReader(string query, CommandType commandtype)
385        {
386            return ExecuteReader(query, commandtype, ConnectionState.CloseOnExit);
387        }

388
389        /// <summary>
390        /// Executes the reader.
391        /// </summary>
392        /// <param name="query">The query.</param>
393        /// <param name="connectionstate">The connectionstate.</param>
394        /// <returns></returns>

395        public DbDataReader ExecuteReader(string query, ConnectionState connectionstate)
396        {
397            return ExecuteReader(query, CommandType.Text, connectionstate);
398        }

399
400        /// <summary>
401        /// Executes the reader.
402        /// </summary>
403        /// <param name="query">The query.</param>
404        /// <param name="commandtype">The commandtype.</param>
405        /// <param name="connectionstate">The connectionstate.</param>
406        /// <returns></returns>

407        public DbDataReader ExecuteReader(string query, CommandType commandtype, ConnectionState connectionstate)
408        {
409            objCommand.CommandText = query;
410            objCommand.CommandType = commandtype;
411            DbDataReader reader = null;
412            try
413            {
414                if (objConnection.State == System.Data.ConnectionState.Closed)
415                {
416                    objConnection.Open();
417                }

418                if (connectionstate == ConnectionState.CloseOnExit)
419                {
420                    reader = objCommand.ExecuteReader(CommandBehavior.CloseConnection);
421                }

422                else
423                {
424                    reader = objCommand.ExecuteReader();
425                }

426
427            }

428            catch (Exception ex)
429            {
430                HandleExceptions(ex);
431            }

432            finally
433            {
434                objCommand.Parameters.Clear();
435            }

436
437            return reader;
438        }

439
440        /// <summary>
441        /// Executes the data set.
442        /// </summary>
443        /// <param name="query">The query.</param>
444        /// <returns></returns>

445        public DataSet ExecuteDataSet(string query)
446        {
447            return ExecuteDataSet(query, CommandType.Text, ConnectionState.CloseOnExit);
448        }

449
450        /// <summary>
451        /// Executes the data set.
452        /// </summary>
453        /// <param name="query">The query.</param>
454        /// <param name="commandtype">The commandtype.</param>
455        /// <returns></returns>

456        public DataSet ExecuteDataSet(string query, CommandType commandtype)
457        {
458            return ExecuteDataSet(query, commandtype, ConnectionState.CloseOnExit);
459        }

460
461        /// <summary>
462        /// Executes the data set.
463        /// </summary>
464        /// <param name="query">The query.</param>
465        /// <param name="connectionstate">The connectionstate.</param>
466        /// <returns></returns>

467        public DataSet ExecuteDataSet(string query, ConnectionState connectionstate)
468        {
469            return ExecuteDataSet(query, CommandType.Text, connectionstate);
470        }

471
472        /// <summary>
473        /// Executes the data set.
474        /// </summary>
475        /// <param name="query">The query.</param>
476        /// <param name="commandtype">The commandtype.</param>
477        /// <param name="connectionstate">The connectionstate.</param>
478        /// <returns></returns>

479        public DataSet ExecuteDataSet(string query, CommandType commandtype, ConnectionState connectionstate)
480        {
481            DbDataAdapter adapter = objFactory.CreateDataAdapter();
482            objCommand.CommandText = query;
483            objCommand.CommandType = commandtype;
484            adapter.SelectCommand = objCommand;
485            DataSet ds = new DataSet();
486            try
487            {
488                adapter.Fill(ds);
489            }

490            catch (Exception ex)
491            {
492                HandleExceptions(ex);
493            }

494            finally
495            {
496                objCommand.Parameters.Clear();
497                if (connectionstate == ConnectionState.CloseOnExit)
498                {
499                    if (objConnection.State == System.Data.ConnectionState.Open)
500                    {
501                        objConnection.Close();
502                    }

503                }

504            }

505            return ds;
506        }

507        /// <summary>
508        /// 将DataReader对象转换为DataTable
509        /// </summary>
510        /// <param name="reader">
511        /// DataReader对象
512        /// </param>
513        /// <returns></returns>

514        public DataTable ReaderToTable(DbDataReader reader)
515        {
516            DataTable newTable = new DataTable();
517            DataColumn col;
518            DataRow row;
519            for (int i = 0; i < reader.FieldCount - 1; i++)
520            {
521                col = new DataColumn();
522                col.ColumnName = reader.GetName(i);
523                col.DataType = reader.GetFieldType(i);
524                newTable.Columns.Add(col);
525            }

526
527            while (reader.Read())
528            {
529                row = newTable.NewRow();
530                for (int j = 0; j < reader.FieldCount - 1; j++)
531                {
532                    row[j] = reader[j];
533                }

534                newTable.Rows.Add(row);
535            }

536            return newTable;
537        }

538
539        /// <summary>
540        /// Handles the exceptions.
541        /// </summary>
542        /// <param name="ex">The ex.</param>

543        private void HandleExceptions(Exception ex)
544        {
545            if (LogErrors)
546            {
547                WriteToLog(ex.Message);
548            }

549            if (HandleErrors)
550            {
551                strLastError = ex.Message;
552            }

553            else
554            {
555                throw ex;
556            }

557        }

558
559        /// <summary>
560        /// Writes to log.
561        /// </summary>
562        /// <param name="msg">The MSG.</param>

563        private void WriteToLog(string msg)
564        {
565            StreamWriter writer = File.AppendText(LogFile);
566            writer.WriteLine(DateTime.Now.ToString() + " - " + msg);
567            writer.Close();
568        }

569
570        /// <summary>
571        /// 执行与释放或重置非托管资源相关的应用程序定义的任务。
572        /// </summary>

573        public void Dispose()
574        {
575            objConnection.Close();
576            objConnection.Dispose();
577            objCommand.Dispose();
578        }

579
580    }

581    /// <summary>
582    /// 指定数据提供者的类型
583    /// </summary>

584    public enum Providers
585    {
586        SqlServer, OleDb, Oracle, ODBC, ConfigDefined
587    }

588    /// <summary>
589    /// 指定连接状态
590    /// </summary>

591    public enum ConnectionState
592    {
593        KeepOpen, CloseOnExit
594    }

595}

  1using System;
  2using System.Data;
  3using System.Configuration;
  4using System.Web;
  5using System.Web.Security;
  6using System.Web.UI;
  7using System.Web.UI.WebControls;
  8using System.Web.UI.WebControls.WebParts;
  9using System.Web.UI.HtmlControls;
 10using System.IO;
 11using System.Text;
 12using System.Security.Cryptography;
 13
 14/// <summary>
 15/// DESEncryptor 的摘要说明
 16/// </summary>

 17namespace WebHelper.InterService
 18  {
 19        //此类的实例代码如下:
 20        //      DESEncryptor myDES = new DESEncryptor();
 21        //myDES.EncryptKey = "12345678";
 22        //myDES.InputString = "楚广明";
 23        //myDES.DesEncrypt();
 24        //Response.Write("楚广明加密后得到:"+myDES.OutString);
 25        //string tempString = myDES.OutString;
 26
 27        //Response.Write("<br>");
 28
 29        //myDES.DecryptKey = "12345678";
 30        //myDES.InputString = tempString;
 31        //myDES.DesDecrypt();
 32        //Response.Write(tempString + "解密后得到" + myDES.OutString);
 33
 34        //Response.Write("<br>");
 35        //myDES.InputString = "楚广明";
 36        //myDES.MD5Encrypt();
 37        //Response.Write("楚广明MD5后得到:" + myDES.OutString);
 38
 39
 40        //Response.Write("<br>");
 41      public class DESEncryptor
 42      {
 43
 44         私有成员
 74 
 75         公共属性
133 
134         构造函数
142
143         DES加密字符串
171
172         DES解密字符串
201
202         DES加密文件
245
246         DES解密文件
290
291         MD5
304    }

305}

306
307

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using WebHelper.DB;
using WebHelper.InterService;
/// <summary>
/// User 的摘要说明
/// </summary>

public class User
{
        
private string _username;
        
private string _userpwd;
        
private DateTime _addtime;
        
private DESEncryptor myDES = new DESEncryptor();
        
public User()
        
{
            myDES.EncryptKey 
= "admin123";
            myDES.DecryptKey 
= "admin123";
        }


        
/// <summary>
        
/// Construct
        
/// </summary>

        public User (string username,string userpwd,DateTime addtime):this()
        
{
            
this._username = username;
            
this._userpwd = userpwd;
            
this._addtime = addtime;
        }


        
/// <summary>
        
/// username
        
/// </summary>

        public string username
        
{
            
getreturn _username;}
            
set{ _username = value; }
        }


        
/// <summary>
        
/// userpwd
        
/// </summary>

        public string userpwd
        
{
            
get
            
{
                myDES.InputString 
= _userpwd;
                myDES.DesDecrypt();
                
return myDES.OutString;
            }

            
set
            
{
                myDES.InputString 
= value;
                myDES.DesEncrypt();
                _userpwd 
= myDES.OutString;
            }

        }


        
/// <summary>
        
/// AddTime
        
/// </summary>

        public DateTime AddTime
        
{
            
getreturn _addtime;}
            
set{ _addtime = value; }
        }


        
public Boolean Add()
        
{
            
//if (_username != "" && _userpwd != "" && _addtime.ToString() != "")
            
//{
            
//    DatabaseHelper db = new DatabaseHelper();
            
//    db.BeginTransaction();

            
//    db.AddParameter("@username", _username);
            
//    db.AddParameter("@userpwd", _userpwd);
            
//    db.AddParameter("@datetime", _addtime);
            
//    int i = db.ExecuteNonQuery("insert into tb_User(username,userpwd,AddTime) values(@username,@userpwd,@datetime)",
            
//                                WebHelper.DB.ConnectionState.KeepOpen);
            
//    if (i > 0)
            
//    {
            
//        db.CommitTransaction();
            
//        return true;
            
//    }
            
//    else
            
//        return false;
            
//}
            
//else
            
//{
            
//    return false;
            
//}
            if (_username != "" && _userpwd != "" && _addtime.ToString() != "")
            
{
                DatabaseHelper db 
= new DatabaseHelper();
                db.BeginTransaction();

                db.AddParameter(
"@username", _username);
                db.AddParameter(
"@userpwd", _userpwd);
                db.AddParameter(
"@datetime", _addtime);
                
int i = db.ExecuteNonQuery("insert into tb_User(username,userpwd,AddTime) values(@username,@userpwd,@datetime)",
                                            WebHelper.DB.ConnectionState.KeepOpen);
                
if (i > 0)
                
{
                    db.CommitTransaction();
                    
return true;
                }

                
else
                    
return false;
            }

            
else
            
{
                
return false;
            }


        }

        
public Boolean Delete()
        
{
            
if (_username != "" && _userpwd != "")
            
{
                DatabaseHelper db 
= new DatabaseHelper();
                db.BeginTransaction();

                db.AddParameter(
"@username", _username);
                db.AddParameter(
"@userpwd", _userpwd);
                
int i = db.ExecuteNonQuery("delete from tb_User where username=@username and userpwd=@userpwd",
                                            WebHelper.DB.ConnectionState.KeepOpen);
                
if (i > 0)
                
{
                    db.CommitTransaction();
                    
return true;
                }

                
else
                    
return false;
            }

            
else
            
{
                
return false;
            }

        }

        
public Boolean Update(string strNewPwd)
        
{
            
if (_username != "" && _userpwd != "")
            
{
                DatabaseHelper db 
= new DatabaseHelper();
                db.BeginTransaction();

                db.AddParameter(
"@username", _username);
                db.AddParameter(
"@userpwd", _userpwd);
                db.AddParameter(
"@newuserpwd",strNewPwd);
                
int i = db.ExecuteNonQuery("update tb_User set userpwd=@newuserpwd where username=@username and userpwd=@userpwd",
                                            WebHelper.DB.ConnectionState.KeepOpen);
                
if (i > 0)
                
{
                    db.CommitTransaction();
                    
return true;
                }

                
else
                    
return false;
            }

            
else
            
{
                
return false;
            }

        }

        
public Boolean Select()
        
{
            
if (_username != "" && _userpwd != "")
            
{
                DatabaseHelper db 
= new DatabaseHelper();

                db.AddParameter(
"@username", _username);
                db.AddParameter(
"@userpwd", _userpwd);
                
object i = db.ExecuteScalar("select count(*) from tb_User where username=@username and userpwd=@userpwd");
                
if ((int)i > 0)
                
{
                    
return true;
                }

                
else
                
{
                    
return false;
                }

            }

            
else
            
{
                
return false;
            }

        }


}

posted @   楚广明  阅读(4981)  评论(24编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示