app直播商城源码,实现用户头像和排行榜功能

app直播商城源码用户头像的加载

  • 创建使用Resources加载图片的脚本,用来加载头像
  • 在得到用户信息时,已经把用户信息存储到GameMdeol中,用户名、金币数、头像从GameModel中直接加载

ResourcesManager

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ResourcesManager 
{
    /// <summary>
    /// 保存用户的头像
    /// 根据名字保存 string为用户名
    /// </summary>
    private static Dictionary<string, Sprite> nameSpriteDic = new Dictionary<string, Sprite>();

    public static Sprite GetSprite(string iconName)
    {
        if (nameSpriteDic.ContainsKey(iconName))//查找用户名是否在字典中
        {
            return nameSpriteDic[iconName];
        }
        else
        {
            Sprite[] sprites = Resources.LoadAll<Sprite>("headIcon");//获取所有的头像
            //头像名字组成为 字符串_数字 数字就为头像数组的下标 返回值为string数组
            string[] nameArr = iconName.Split('_');
            int index = int.Parse(nameArr[1]);//nameArr[1] 得到头像名字的数字,作为下标
            Sprite temp = sprites[index];//获取用户的头像
            nameSpriteDic.Add(iconName,temp);//添加到头像字典中
            return temp;
        }
    }

}

加载用户信息

using Protocol.Code;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class MainPanel : MonoBehaviour
{
    #region 字段 
    private Image headIcon;
    private Text txtUserName;
    private Text txtCoinCount;
    private Button btn_Rank;
    private Button btn_Bank;
    private Button btnStand;
    private Button btnOnline;
    #endregion

    #region Unity回调

    private void Awake()
    {
        Init();
    }
    #endregion

    #region 方法

    /// <summary>
    /// 初始化
    /// </summary>
    private void Init()
    {
        headIcon = transform.Find("mask/headIcon").GetComponent<Image>();
        txtUserName = transform.Find("txtUserName").GetComponent<Text>();
        txtCoinCount = transform.Find("txtCoinCount").GetComponent<Text>();        
        btn_Rank = transform.Find("btn_Rank").GetComponent<Button>();
        btn_Rank.onClick.AddListener(()=> 
        {
            //向服务器获取排行榜
            NetMsgCenter.Instance.SendMsg(OpCode.Account,AccountCode.GetRankList_CRES,null);
            //显示排行榜界面
            EventCenter.Broadcast(EventDefine.ShowRankListPanel);
        });
        btn_Bank = transform.Find("btn_Bank").GetComponent<Button>();
        btnStand = transform.Find("btnStand").GetComponent<Button>();
        btnOnline = transform.Find("btnOnline").GetComponent<Button>();

        ///加载用户信息

        //获取存储用户信息中的金币数
        txtCoinCount.text = Models.GameModel.userDto.Coin.ToString();
        //获取存储用户信息中的用户名
        txtUserName.text = Models.GameModel.userDto.UserName;
        //加载用户头像
        headIcon.sprite = ResourcesManager.GetSprite(Models.GameModel.userDto.IconName);
    }

    #endregion
}

排行榜的实现

  • 在点击排行榜按钮时,向服务器端发送排行榜请求
  • 显示排行榜界面
  • server端创建数据模型,反馈回客户端
  • app直播商城源码客户端处理server端的回应,在账号的模块类中发送到排行榜脚本中进行处理

添加请求排行榜信息的子操作码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Protocol.Code
{
    /// <summary>
    /// 账号模块下的操作码
    /// </summary>
    public class AccountCode
    {
        public const int Register_CREQ = 0;//客户端注册的子操作码
        public const int Register_SRES = 1;//注册Server端回应的操作码
        public const int Login_CREQ = 2;//登陆的子操作码
        public const int Login_SRES = 3;//登陆server端回应的操作码
        public const int GetUserInfo_CREQ = 4;//获得用户信息的子操作码
        public const int GetUserInfo_SRES = 5;//获得用户信息的Server端回应的操作码
        public const int GetRankList_CRES = 6;//获取排行榜的子操作码
        public const int GetRankList_SRES = 7;//获取排行榜的server端的回应操作码
    }
}

客户端的请求

 btn_Rank.onClick.AddListener(()=> 
        {
            //向服务器获取排行榜
            NetMsgCenter.Instance.SendMsg(OpCode.Account,AccountCode.GetRankList_CRES,null);
            //显示排行榜界面
            EventCenter.Broadcast(EventDefine.ShowRankListPanel);
        });

Server端创建数据模型(排行榜里内容的数据模型)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Protocol.Dto
{
    /// <summary>
    /// 排行榜所需内容的数据模型
    /// </summary>
    [Serializable]
    public class RankItemDto
    {
        public string UserName;
        public int Coin;

        public RankItemDto(string UserName, int Coin)
        {
            this.UserName = UserName;
            this.Coin = Coin;
        }

        public void Change(string UserName, int Coin)
        {
            this.UserName = UserName;
            this.Coin = Coin;
        }
    }
}

Server端创建数据模型(排行榜的数据模型)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Protocol.Dto
{
    /// <summary>
    ///排行榜的数据模型
    /// </summary>
    [Serializable]
    public class RankListDto
    {
        public List<RankItemDto> rankList;

        public RankListDto()
        {
            rankList = new List<RankItemDto>();
        }
        public void Clear()
        {
            rankList.Clear();
        }
        public void Add(RankItemDto dto)
        {
            rankList.Add(dto);
        }
    }
}

查找到数据库中的用户名和金币,构建数据模型


        /// <summary>
        /// 获取排行榜信息
        /// </summary>
        public static RankListDto GetRankListDto()
        {
            MySqlCommand cmd = new MySqlCommand(" select Username,Coin from userinfo order by Coin desc ", sqlConnect);
            MySqlDataReader reader = cmd.ExecuteReader();
            rankListDto.Clear();
            if (reader.HasRows)
            {
                while (reader.Read())//一直查询,直到查找完毕
                {
                    RankItemDto dto = new RankItemDto(reader.GetString("UserName"),reader.GetInt32("Coin"));
                    rankListDto.Add(dto);                   
                }
                reader.Close();
                return rankListDto;
            }
            reader.Close();
            return null;
        }

    }

Server端处理客户端的请求,并返回给排行榜的数据模型

using GameServer.DadaBase;
using MyServer;
using Protocol.Code;
using Protocol.Dto;

namespace GameServer.Logic
{
    /// <summary>
    /// 账号模块的处理
    /// </summary>
    public class AccountHandler : IHandler
    {
        public void DisConnected(ClientPeer clientPeer)
        {
            DatabaseManager.OffLine(clientPeer);
        }
        /// <summary>
        /// 处理所有的子操作码
        /// </summary>
        public void Receive(ClientPeer client, int subCode, object value)
        {
            switch (subCode)
            {
                case AccountCode.Register_CREQ:
                    Register(client,value as AccountDto);
                    break;
                case AccountCode.Login_CREQ:
                    Login(client,value as AccountDto);
                    break;
                case AccountCode.GetUserInfo_CREQ:
                    GetUserInfo(client);
                    break;
                case AccountCode.GetRankList_CRES:
                    GetRankList(client);
                    break;
                   
            }
        }

        /// <summary>
        /// 客户端请求排行榜的处理
        /// </summary>
        private void GetRankList(ClientPeer client)
        {
            SingleExecute.Instacne.Execute(()=> 
            {
               RankListDto dto= DatabaseManager.GetRankListDto();
                client.SendMsg(OpCode.Account, AccountCode.GetRankList_SRES, dto);
            });
        }

        /// <summary>
        /// 客户端请求获得用户信息的处理
        /// </summary>
        private void GetUserInfo(ClientPeer client)
        {
            SingleExecute.Instacne.Execute(()=> 
            {
                UserDto dto = DatabaseManager.GetUserInfo(client);
                client.SendMsg(OpCode.Account, AccountCode.GetUserInfo_SRES, dto);
            });
        }

        /// <summary>
        /// 客户端请求登陆的处理
        /// </summary>
        private void Login(ClientPeer client, AccountDto dto)
        {
            SingleExecute.Instacne.Execute(()=> 
            {
                if (DatabaseManager.IsExistUserName(dto.userName)==false)
                {
                    //用户名不存在
                    client.SendMsg(OpCode.Account, AccountCode.Login_SRES, -1);
                    return;
                }
                if (DatabaseManager.IsMatch(dto.userName,dto.password)==false)
                {
                    //账号密码不匹配
                    client.SendMsg(OpCode.Account, AccountCode.Login_SRES, -2);
                    return;
                }
                if (DatabaseManager.IsOnline(dto.userName))
                {
                    //当前用户已在线
                    client.SendMsg(OpCode.Account, AccountCode.Login_SRES, -3);
                    return;
                }
                DatabaseManager.Login(dto.userName,client);
                //登陆成功
                client.SendMsg(OpCode.Account, AccountCode.Login_SRES, 0);
            });
        }

        /// <summary>
        ///客户端注册请求的处理
        /// </summary>
        private void Register(ClientPeer client, AccountDto dto)
        {
            ///单线程执行
            ///作用:防止多个线程同时访问,数据错乱
            SingleExecute.Instacne.Execute(()=> 
            {
                //判断数据库中是否存在该用户,存在就给客户端返回-1
                if (DatabaseManager.IsExistUserName(dto.userName))
                {
                    client.SendMsg(OpCode.Account, AccountCode.Register_SRES, -1);
                    return;
                }
                //判断数据库中是否存在该用户,不存在就创建该用户并给客户端返回0
                DatabaseManager.CreatUser(dto.userName, dto.password);
                client.SendMsg(OpCode.Account, AccountCode.Register_SRES, 0);
            });
           
        }
    }
}

app直播商城源码客户端处理Server端的回应,发送到排行榜脚本中处理

using Protocol.Code;
using Protocol.Dto;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class AccountHandler : BaseHandler
{
    
    public override void OnReceive(int subCode, object value)
    {
        switch (subCode)
        {
            case AccountCode.Register_SRES:
                Register_SRES((int)value);
                break;
            case AccountCode.Login_SRES:
                Login_SRES((int)value);
                break;
            case AccountCode.GetUserInfo_SRES:
                GetUserInfo_SRES(value as UserDto);
                break;
            case AccountCode.GetRankList_SRES:
                GetRankList_SRES(value as RankListDto);
                break;
        }
    }

    /// <summary>
    /// 处理服务器端注册后的回应
    /// </summary>
    private void Register_SRES(int value)
    {
        if (value==-1)
        {
            EventCenter.Broadcast(EventDefine.Hint,"该用户已经被注册");
            return;
        }
        if (value==0)
        {
            EventCenter.Broadcast(EventDefine.Hint, "注册成功");
        }
    }

    /// <summary>
    ///  处理服务器端登陆后的回应
    /// </summary>
    private void Login_SRES(int value)
    {
       
        switch (value)
        {
            case -3:
                EventCenter.Broadcast(EventDefine.Hint, "当前用户已在线");
                break;              
            case -2:
                EventCenter.Broadcast(EventDefine.Hint, "账号密码不匹配");
                break;
            case -1:
                EventCenter.Broadcast(EventDefine.Hint, "用户名不存在");
                break;
            case 0:
                //请求获得用户信息
                NetMsgCenter.Instance.SendMsg(OpCode.Account,AccountCode.GetUserInfo_CREQ,null);
                EventCenter.Broadcast(EventDefine.Hint, "登陆成功");
                break;
        }
    }

    /// <summary>
    /// 处理获取用户信息服务器端的回应
    /// </summary>
    private void GetUserInfo_SRES(UserDto dto)
    {
        Models.GameModel.userDto = dto;//把用户信息存储到数据中心(model层)
        SceneManager.LoadScene("02.Main");
    }

    /// <summary>
    /// 处理获取排行榜信息服务器的回应
    /// </summary>
    /// <param name="dto"></param>
    private void GetRankList_SRES(RankListDto dto)
    {
        //把排行榜信息发送到RankPanel去处理
        EventCenter.Broadcast(EventDefine.SendRankListDto,dto);
    }
}

排行榜脚本的处理

sing System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
using Protocol.Dto;

public class RankPanel : MonoBehaviour
{
    public GameObject m_ItemPre; 


    private Button btn_Close;
    private Transform m_Parent;

    private void Awake()
    {
        EventCenter.AddListener(EventDefine.ShowRankListPanel, Show);
        EventCenter.AddListener<RankListDto>(EventDefine.SendRankListDto,GetRankListDto);
        btn_Close = transform.Find("btn_Close").GetComponent<Button>();
        btn_Close.onClick.AddListener(()=> 
        {
            OnCloseButtonClick();
        });
        m_Parent = transform.Find("List/ScrollRect/Parent").transform;
    }

    private void OnCloseButtonClick()
    {
        transform.DOScale(Vector3.zero, 0.3f);
    }
    private void Show()
    {
        transform.DOScale(Vector3.one, 0.3f);
    }
    /// <summary>
    /// 得到排行榜的数据传输模型
    /// </summary>
    private void GetRankListDto(RankListDto dto)
    {
        for (int i = 0; i < dto.rankList.Count; i++)
        {
     
            //如果当前名字和自身名字相同
            if (dto.rankList[i].UserName==Models.GameModel.userDto.UserName)
            {
                GameObject go = Instantiate(m_ItemPre, m_Parent);
                go.transform.Find("Index/txtIndex").GetComponent<Text>().text = (i + 1).ToString();
                go.transform.Find("Index/txtIndex").GetComponent<Text>().color = Color.red;
                go.transform.Find("txtUserName").GetComponent<Text>().text = "我";
                go.transform.Find("txtUserName").GetComponent<Text>().color = Color.red;
                go.transform.Find("txtCoin").GetComponent<Text>().text = dto.rankList[i].Coin.ToString();
                go.transform.Find("txtCoin").GetComponent<Text>().color = Color.red;
            }
            else
            {
                GameObject go = Instantiate(m_ItemPre, m_Parent);
                go.transform.Find("Index/txtIndex").GetComponent<Text>().text = (i + 1).ToString();
                go.transform.Find("txtUserName").GetComponent<Text>().text = dto.rankList[i].UserName;
                go.transform.Find("txtCoin").GetComponent<Text>().text = dto.rankList[i].Coin.ToString();
           
            }
        }
    }
    private void OnDestroy()
    {
        EventCenter.RemoveListener(EventDefine.ShowRankListPanel, Show);
        EventCenter.RemoveListener<RankListDto>(EventDefine.SendRankListDto, GetRankListDto);
    }
}

以上就是app直播商城源码实现用户头像和排行榜的内容了。

声明:本文由云豹科技转发自我是赵某人博客,如有侵权请联系作者删除

上一篇:ABP VNext框架基础知识介绍(1)--框架基础类继承关系


下一篇:Shell的字符串表达式介绍-实践及企业案例脚本剖析