Unity uGUI 登錄及注冊功能


    上次我們已經完成了登錄界面的模擬功能,今天咱們把上次沒做完的繼續完善下!那么廢話少說直接開始吧!

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM