程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 微風IM 3.3 系列之一 實現新用戶注冊,im新用戶注冊

微風IM 3.3 系列之一 實現新用戶注冊,im新用戶注冊

編輯:C#入門知識

微風IM 3.3 系列之一 實現新用戶注冊,im新用戶注冊


登陸窗口如下:

本文首先來實現“注冊新賬號功能”

第一步:

打開VS2010 ,找到BasicForm窗體類,這個類是美化窗體的一個基類,我們可以從此窗體繼承

第二步,創建新窗體

RegisterUser.cs

把新窗體RegisterUser繼承的Form類改成BasicForm類

如下圖:

現在新窗體就可以使用BasicForm的樣式了,效果如下:

拖入控件,界面如下:

第三步:

 先來回顧一下,在數據庫中相應的表:

我們知道使用TCP通信的時候,客戶端與服務器端進行交互,並不與數據庫直接交互,而是由客戶端與服務器通信,服務器再和數據庫通信。

所以,注冊用戶的流程就是

(1):客戶端注冊頁面中,通過TCP通信,把用戶想要注冊“用戶ID”,“昵稱”,“密碼”發送給服務器。

 (2)  :服務器對發來的”用戶ID“進行驗證,與數據庫交互,判斷此”用戶ID“是否已經存在,存在則發返回信息給”客戶端“,告知其”用戶已經存在。

          如果“用戶ID”符合要求,則插入數據庫相關表中,返回消息給“客戶端”,告知其注冊已經成功

(3):“用戶ID”,“昵稱”,“密碼”需要一個類來存放,我們這裡直接使用RcUsers數據表對應的實體類:RcUsers,  此類支持Protobuf.net序列化

          (通過TCP通信,在客戶端與服務器之間傳遞數據類,必須把類序列化成二進制數據,對方收到後,再反序列化出來,我們使用網上開源的protobuf.net序列化器。

           當然序列化,反序列化的工作是由 開源的networkcomms2.3.1框架幫我們完成的)

using System; using System.Collections; using System.Collections.Generic; using System.Data; using ProtoBuf; using SimpleIM.Data; namespace SimpleIM.Business { [ProtoContract] public class RcUsers { #region Constructors public RcUsers() { } #endregion #region Private Properties private int id = -1; private string userID = string.Empty; private string name = string.Empty; private string password = string.Empty; private string declaring = string.Empty; private int status = -1; private int groupID = -1; private bool isMale = false; private int userLevel = -1; private bool enabled = false; private DateTime registerTime = DateTime.UtcNow; private DateTime lastLoginTime = DateTime.UtcNow; #endregion #region Public Properties [ProtoMember(1)] public int Id { get { return id; } set { id = value; } } [ProtoMember(2)] public string UserID { get { return userID; } set { userID = value; } } [ProtoMember(3)] public string Name { get { return name; } set { name = value; } } [ProtoMember(4)] public string Password { get { return password; } set { password = value; } } [ProtoMember(5)] public string Declaring { get { return declaring; } set { declaring = value; } } [ProtoMember(6)] public int Status { get { return status; } set { status = value; } } [ProtoMember(7)] public int GroupID { get { return groupID; } set { groupID = value; } } [ProtoMember(8)] public bool IsMale { get { return isMale; } set { isMale = value; } } [ProtoMember(9)] public int UserLevel { get { return userLevel; } set { userLevel = value; } } [ProtoMember(10)] public bool Enabled { get { return enabled; } set { enabled = value; } } [ProtoMember(11)] public DateTime RegisterTime { get { return registerTime; } set { registerTime = value; } } [ProtoMember(12)] public DateTime LastLoginTime { get { return lastLoginTime; } set { lastLoginTime = value; } } #endregion } } RcUsers類 View Code

RCUsers類是由CodeSmith模板生成的, 可以參見本博客關於CodeSmith的其他相應文章

NetworkComms網絡通信框架配套CodeSmith模板使用簡介   模板下載地址:  【模板下載】分享我所使用的數據庫框架

我們在微風IM中,使用的存儲過程,數據層代碼,實體類,邏輯層代碼都是通過使用CodeSmith模板生成的(添加功能,需要做對應的修改),極大的提高了工作效率。

言歸正傳,我們開始進行注冊相關的開發:

客戶端代碼:

//定義一個契約類 用於傳遞相關的信息給服務器
            RcUsers currentUser = new RcUsers();
            //給屬性賦值
            currentUser.UserID = txtUserID.Text.Trim();
            currentUser.Password = txtPsw.Text.Trim();
            currentUser.Name = txtNickName.Text.Trim();

            //同步方法  傳遞並序列化契約類到服務器,並從獲取獲取返回的信息  (返回的信息類型為ResMessage)
            //RegUser 發送的消息類型
            //ResRegUser  接收返回的消息類型
            ResMessage regContract = Common.TcpConn.SendReceiveObject<ResMessage>("RegUser", "ResRegUser", 8000, currentUser);

            if (regContract.Message == "注冊成功")
            {
                BasicMsgBoxForm form = new BasicMsgBoxForm("注冊成功", "信息窗口", MessageBoxButtons.OK, MessageBoxIcon.None);
                form.StartPosition = FormStartPosition.CenterScreen;
                form.ShowDialog();

                txtNickName.Text = "";
                txtUserID.Text = "";
                txtPsw.Text = "";
                txtRePsw.Text = "";
                 
            }
            else
            {
                BasicMsgBoxForm form = new BasicMsgBoxForm(regContract.Message, "信息窗口", MessageBoxButtons.OK, MessageBoxIcon.Error);
                form.StartPosition = FormStartPosition.CenterScreen;
                form.ShowDialog();
            }

using System;
using System.Collections.Generic;
using System.Text;
using ProtoBuf;


namespace SimpleIM.Business
{
    //操作結果的返回信息,可通用
    [ProtoContract]
    public class ResMessage
    {

        [ProtoMember(1)]
        public string Message;

        public ResMessage() { }

        public ResMessage(string message)
        {
            this.Message = message;
        }
    }
}

服務器端相應的代碼:

 //注冊新用戶
            NetworkComms.AppendGlobalIncomingPacketHandler<RcUsers>("RegUser", IncomingRegisterUser);
復制代碼 復制代碼
      //注冊新用戶
        private void IncomingRegisterUser(PacketHeader header, Connection connection, RcUsers contract)
        {
            try
            {
                
                //聲明一個契約類  用於返回數據給客戶端
                ResMessage resMessage = new ResMessage();

                //判斷用戶是否存在
                RcUsers user = DoRcUsers.GetByUserID(contract.UserID);

                if (user .Id>-1)
                {
                    //如果存在,在不進行數據庫操作,直接返回信息給客戶端
                    resMessage.Message = "用戶ID已經存在";
                }
                else
                {
                    //如果不存在,則添加用戶到數據庫中
//修改一下用戶的相關信息,暫時手工設定一下,您可根據情況修改
contract.Declaring = "春暖花開"; contract.Status = -1; contract.IsMale = true; contract.UserLevel = 1; contract.Enabled = false; contract.RegisterTime = DateTime.Now; contract.LastLoginTime = DateTime.Now;
//此處 為了簡便 指定了一個組 contract.GroupID = 115; //添加用戶到數據庫中 DoRcUsers.Save(contract); resMessage.Message = "注冊成功"; } //返回信息給客戶端端 connection.SendObject("ResRegUser", resMessage); } catch (Exception ex) { LogTools.LogException(ex, "IncomingChangePsw"); } }
復制代碼 復制代碼

效果圖如下:

現在主頁面上就能夠看到新注冊的用戶了

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved