ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-12-07 17:04:16  阅读:133  来源: 互联网

标签:dto app private 头像 源码 void using SRES public


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直播商城源码实现用户头像和排行榜的内容了。

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

标签:dto,app,private,头像,源码,void,using,SRES,public
来源: https://blog.csdn.net/QQ1981747098/article/details/121773344

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有