上次我們已經完成了登錄界面的模擬功能,今天咱們把上次沒做完的繼續完善下!那么廢話少說直接開始吧!
PS:本次完善的功能有:
1,增加對數據庫的操作。
2,使用了MD5Key值加密
3,完善登錄和組測功能
4,環境Win8.1+Unity4.6+mysql
1,咱們就接着上次的工程繼續吧,所以就不再新建工程了。
2,引入對數據庫的操作,因此我們封裝了一個SqlAccess類。
SqlAccess.cs
/****************************** * 對數據庫操作的封裝 * @Author wuzhang * 2014/12/4 *****************************/ using UnityEngine; using System; using System.Data; using System.Collections; using MySql.Data.MySqlClient; using MySql.Data; using System.IO; public class SqlAccess { public static MySqlConnection dbConnection; //如果只是在本地的話,寫localhost就可以。 // static string host = "localhost"; //如果是局域網,那么寫上本機的局域網IP static string host = "127.0.0.1"; static string id = "root"; static string pwd = ""; static string database = "login"; public SqlAccess() { OpenSql(); } public static void OpenSql() { try { string connectionString = string.Format("Server = {0};port={4};Database = {1}; User ID = {2}; Password = {3};",host,database,id,pwd,"3306"); dbConnection = new MySqlConnection(connectionString); dbConnection.Open(); } catch (Exception e) { throw new Exception("服務器連接失敗,請重新檢查是否打開MySql服務。" + e.Message.ToString()); } } public DataSet CreateTable (string name, string[] col, string[] colType) { if (col.Length != colType.Length) { throw new Exception ("columns.Length != colType.Length"); } string query = "CREATE TABLE " + name + " (" + col[0] + " " + colType[0]; for (int i = 1; i < col.Length; ++i) { query += ", " + col[i] + " " + colType[i]; } query += ")"; return ExecuteQuery(query); } public DataSet CreateTableAutoID (string name, string[] col, string[] colType) { if (col.Length != colType.Length) { throw new Exception ("columns.Length != colType.Length"); } string query = "CREATE TABLE " + name + " (" + col[0] + " " + colType[0] + " NOT NULL AUTO_INCREMENT"; for (int i = 1; i < col.Length; ++i) { query += ", " + col[i] + " " + colType[i]; } query += ", PRIMARY KEY ("+ col[0] +")" + ")"; Debug.Log(query); return ExecuteQuery(query); } //插入一條數據,包括所有,不適用自動累加ID。 public DataSet InsertInto (string tableName, string[] values) { string query = "INSERT INTO " + tableName + " VALUES (" + "'"+ values[0]+ "'"; for (int i = 1; i < values.Length; ++i) { query += ", " + "'"+values[i]+ "'"; } query += ")"; Debug.Log(query); return ExecuteQuery (query); } //插入部分ID public DataSet InsertInto (string tableName, string[] col,string[] values) { if (col.Length != values.Length) { throw new Exception ("columns.Length != colType.Length"); } string query = "INSERT INTO " + tableName + " (" + col[0]; for (int i = 1; i < col.Length; ++i) { query += ", "+col[i]; } query += ") VALUES (" + "'"+ values[0]+ "'"; for (int i = 1; i < values.Length; ++i) { query += ", " + "'"+values[i]+ "'"; } query += ")"; Debug.Log(query); return ExecuteQuery (query); } /// <summary> /// 返回表的查詢結果 /// </summary> /// <returns>The all.</returns> /// <param name="Name">Name.</param> public DataSet SelectAll(string Name) { string query ="select * from "+" "+Name; return ExecuteQuery (query); } /// <summary> /// 條件查找 /// </summary> /// <returns>The where.</returns> /// <param name="tableName">Table name.</param> /// <param name="items">Items.</param> /// <param name="col">Col.</param> /// <param name="operation">Operation.</param> /// <param name="values">Values.</param> public DataSet SelectWhere (string tableName, string[] items, string[] col, string[] operation, string[] values) { if (col.Length != operation.Length || operation.Length != values.Length) { throw new Exception ("col.Length != operation.Length != values.Length"); } string query = "SELECT " + items[0]; for (int i = 1; i < items.Length; ++i) { query += ", " + items[i]; } query += " FROM " + tableName + " WHERE " + col[0] + operation[0] + "'" + values[0] + "' "; for (int i = 1; i < col.Length; ++i) { query += " AND " + col[i] + operation[i] + "'" + values[0] + "' "; } return ExecuteQuery (query); } /// <summary> /// 更新表信息 /// </summary> /// <returns>The into.</returns> /// <param name="tableName">Table name.</param> /// <param name="cols">Cols.</param> /// <param name="colsvalues">Colsvalues.</param> /// <param name="selectkey">Selectkey.</param> /// <param name="selectvalue">Selectvalue.</param> public DataSet UpdateInto (string tableName, string []cols,string []colsvalues,string selectkey,string selectvalue) { string query = "UPDATE "+tableName+" SET "+cols[0]+" = "+colsvalues[0]; for (int i = 1; i < colsvalues.Length; ++i) { query += ", " +cols[i]+" ="+ colsvalues[i]; } query += " WHERE "+selectkey+" = "+selectvalue+" "; return ExecuteQuery (query); } /// <summary> /// 條件刪除 /// </summary> /// <param name="tableName">Table name.</param> /// <param name="cols">Cols.</param> /// <param name="colsvalues">Colsvalues.</param> public DataSet Delete(string tableName,string []cols,string []colsvalues) { string query = "DELETE FROM "+tableName + " WHERE " +cols[0] +" = " + colsvalues[0]; for (int i = 1; i < colsvalues.Length; ++i) { query += " or " +cols[i]+" = "+ colsvalues[i]; } Debug.Log(query); return ExecuteQuery (query); } /// <summary> /// 關閉數據庫 /// </summary> public void Close() { if(dbConnection != null) { dbConnection.Close(); dbConnection.Dispose(); dbConnection = null; } } public DataSet ExistOrNot(string sql) { if(dbConnection.State==ConnectionState.Open) { Debug.Log (sql); DataSet ds = new DataSet(); //表的集合 try { MySqlDataAdapter da = new MySqlDataAdapter(sql, dbConnection); da.Fill(ds); } catch (Exception ee) { throw new Exception("SQL:" + sql + "/n" + ee.Message.ToString()); } finally { } return ds; } return null; } /// <summary> /// 返回檢索結果 /// </summary> /// <returns>The query.</returns> /// <param name="sqlString">Sql string.</param> public static DataSet ExecuteQuery(string sqlString) { if(dbConnection.State==ConnectionState.Open) { DataSet ds = new DataSet(); //表的集合 try { MySqlDataAdapter da = new MySqlDataAdapter(sqlString, dbConnection); da.Fill(ds); } catch (Exception ee) { throw new Exception("SQL:" + sqlString + "/n" + ee.Message.ToString()); } finally { } return ds; } return null; } /// <summary> /// 讀取數據集 /// </summary> /// <param name="ds">Ds.</param> public void ReadDs(DataSet ds) { if(ds!=null) { DataTable user = ds.Tables[0]; foreach(DataRow row in user.Rows) { foreach(DataColumn colum in user.Columns) { Debug.Log (row[colum]); } } } } }
3,對用戶注冊的密碼采用加密存儲,所以還有一個加密類。
Encryption.cs
//------------------------------------------------------------------------------ // <auto-generated> // 此代碼由工具生成。 // 運行時版本:4.0.30319.34014 // // 對此文件的更改可能會導致不正確的行為,並且如果 // 重新生成代碼,這些更改將會丟失。 // </auto-generated> //------------------------------------------------------------------------------ using System; using System.Security.Cryptography; using System.Text; namespace AssemblyCSharp { public class Encryption { public Encryption () { } /// <summary> /// 內容加密 /// </summary> /// <param name="ContentInfo">要加密內容</param> /// <param name="strkey">key值</param> /// <returns></returns> public string encryptionContent(string ContentInfo,string strkey) { byte[] keyArray = UTF8Encoding.UTF8.GetBytes(strkey); RijndaelManaged encryption = new RijndaelManaged(); encryption.Key = keyArray; encryption.Mode = CipherMode.ECB; encryption.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = encryption.CreateEncryptor(); byte[] _EncryptArray = UTF8Encoding.UTF8.GetBytes(ContentInfo); byte[] resultArray = cTransform.TransformFinalBlock(_EncryptArray, 0, _EncryptArray.Length); return System.Convert.ToBase64String(resultArray, 0, resultArray.Length); } /// <summary> /// 內容解密 /// </summary> /// <param name="encryptionContent">被加密內容</param> /// <param name="strkey">key值</param> /// <returns></returns> public string decipheringContent(string encryptionContent,string strkey) { byte[] keyArray = UTF8Encoding.UTF8.GetBytes(strkey); RijndaelManaged decipher = new RijndaelManaged(); decipher.Key = keyArray; decipher.Mode = CipherMode.ECB; decipher.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = decipher.CreateDecryptor(); byte[] _EncryptArray =System.Convert.FromBase64String(encryptionContent); byte[] resultArray = cTransform.TransformFinalBlock(_EncryptArray, 0, _EncryptArray.Length); return UTF8Encoding.UTF8.GetString(resultArray); } } }
3,准備工作基本已經完成,由於代碼還需要對數據庫的操作,所以我們還要建數據庫。
3.1,打開mysql的服務。
3.2 登錄root用戶

由於我沒有設置密碼,所以下一步直接回車就OK了
OK 已經成功進入了。

使用Login數據庫


目前狀態標為空吧,那么我們就去登錄試試吧!
為什么登陸失敗呢?呵呵,沒有為什么,還沒注冊。
那就去注冊個用戶吧。
好吧,原來真的要注冊,信息還不能為空。
注冊成功了嗎?我們有兩個方法可以知道。
1,最簡單的就是直接登錄。
哎,跳轉了啊,居然登錄成功了!
那注冊信息成功了。
2,去數據庫查看注冊的信息吧!Come On,Go!

好吧,為什么呢?原來咱們使用了Md5 key值加密過了!神奇吧!
咱們再注冊一個相同的信息
不好意思,用戶已存在了!
再次查看數據庫:

還是原來的信息,那個點擊密碼我還沒做,因為沒有找到好的思路,假如我們當輸入用戶信息時就去數據庫匹配相同的感覺效率太差了。
假如我我們在Awake()時把數據庫的所有密碼全從數據庫讀出來開並解密再進行行匹配,原則上是可行的,希望大家提供好的建議!!!
OK,附上工程源碼: http://pan.baidu.com/s/1hq1k6zi
