Browse Source

增加好友系统

LiuQilin 7 years ago
parent
commit
1764f3e307

+ 20 - 1
Assets/AtlasUtility/Script/Editor/TestEditor.cs

@@ -15,6 +15,21 @@ namespace AtlasUtility
     {
         #region Variable
 
+        public List<int> Ints
+        {
+            get
+            {
+                Debug.Log("get");
+                return ints;
+            }
+            set
+            {
+                Debug.Log("set");
+                ints = value;
+            }
+        }
+        public List<int> ints = new List<int>();
+
         public Test Script;
 
         #endregion
@@ -30,6 +45,10 @@ namespace AtlasUtility
 
             if (GUILayout.Button("Test"))
             {
+                Ints = new List<int>();
+                Ints.Add(1);
+                Ints.RemoveAt(0);
+
                 //List<string> strings = new List<string>();
                 //StreamReader streamReader = new StreamReader("C:\\Users\\liu\\Desktop\\123.txt");
                 //strings = streamReader.ReadToEnd().Split(new[] {"\r\n"}, StringSplitOptions.None).ToList();
@@ -50,7 +69,7 @@ namespace AtlasUtility
                 //    Test(serialNumbers[i], nicknames[i]);
                 //}
 
-                Test("1709110834024000936", "孝顺的大白");
+                //Test("1709110834024000936", "孝顺的大白");
             }
         }
 

+ 2 - 0
Assets/Resource/Prefab/Object/DebugMode.prefab

@@ -129,6 +129,8 @@ MonoBehaviour:
   - {fileID: 2100000, guid: 91a83bc59ad093c499f353b165d031b8, type: 2}
   - {fileID: 1496129780866346, guid: 03f5f694f13d5b44c924fb59c9bf7b8f, type: 2}
   - {fileID: 1449331818472170, guid: d30fd90e19065bd4c93efcb54dc8261d, type: 2}
+  - {fileID: 1729611064873092, guid: 2419a390c1816dd4298ae3170193f310, type: 2}
+  - {fileID: 1626347861987158, guid: 7b82777cdb999ce468b189ea45f9d28d, type: 2}
   AtlasList:
   - {fileID: 21300004, guid: b31bbacb2e0ff3d459f4878983a39b50, type: 3}
   - {fileID: 21300006, guid: b31bbacb2e0ff3d459f4878983a39b50, type: 3}

+ 1 - 1
Assets/Resource/Prefab/PrefabUI/ApplicantItem.prefab.meta

@@ -4,5 +4,5 @@ timeCreated: 1511232059
 licenseType: Pro
 NativeFormatImporter:
   userData: 
-  assetBundleName: 
+  assetBundleName: ui
   assetBundleVariant: 

+ 4 - 4
Assets/Resource/Prefab/PrefabUI/Canvas.prefab

@@ -1982,7 +1982,7 @@ GameObject:
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 0
   m_StaticEditorFlags: 0
-  m_IsActive: 0
+  m_IsActive: 1
 --- !u!1 &1132159904803572
 GameObject:
   m_ObjectHideFlags: 1
@@ -10345,7 +10345,7 @@ GameObject:
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 0
   m_StaticEditorFlags: 0
-  m_IsActive: 1
+  m_IsActive: 0
 --- !u!1 &1700563574369704
 GameObject:
   m_ObjectHideFlags: 1
@@ -43591,7 +43591,7 @@ MonoBehaviour:
     m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
     m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
     m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
-    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_DisabledColor: {r: 1, g: 1, b: 1, a: 1}
     m_ColorMultiplier: 1
     m_FadeDuration: 0.1
   m_SpriteState:
@@ -69431,7 +69431,7 @@ CanvasGroup:
   m_PrefabInternal: {fileID: 100100000}
   m_GameObject: {fileID: 1132125090877062}
   m_Enabled: 1
-  m_Alpha: 0
+  m_Alpha: 1
   m_Interactable: 1
   m_BlocksRaycasts: 1
   m_IgnoreParentGroups: 0

+ 1 - 1
Assets/Resource/Prefab/PrefabUI/FriendItem.prefab.meta

@@ -4,5 +4,5 @@ timeCreated: 1511232041
 licenseType: Pro
 NativeFormatImporter:
   userData: 
-  assetBundleName: 
+  assetBundleName: ui
   assetBundleVariant: 

+ 11 - 0
Assets/Resource/XML/lan/ChineseSimplified.xml

@@ -242,6 +242,17 @@
     <AH_SendMessageButtonTitle desc=""><![CDATA[发送]]></AH_SendMessageButtonTitle>
     <AH_CloseButtonTitle desc=""><![CDATA[关闭]]></AH_CloseButtonTitle>
   </UI>
+  <ApplicantItem>
+    <MinutesAgo desc=""><![CDATA[[&value&]分钟前]]></MinutesAgo>
+    <HoursAgo desc=""><![CDATA[[&value&]小时前]]></HoursAgo>
+    <DaysAgo desc=""><![CDATA[[&value&]天前]]></DaysAgo>
+    <Accept desc=""><![CDATA[接受]]></Accept>
+    <Deny desc=""><![CDATA[拒绝]]></Deny>
+    <ConnectError desc=""><![CDATA[连接服务器失败]]></ConnectError>
+    <FriendFullSelf desc=""><![CDATA[您的好友已满]]></FriendFullSelf>
+    <FriendFullOther desc=""><![CDATA[对方好友已满]]></FriendFullOther>
+    <AcceptFriendSucceed desc=""><![CDATA[添加好友成功]]></AcceptFriendSucceed>
+  </ApplicantItem>
   <CommentItem>
     <AddFriend desc=""><![CDATA[加为好友]]></AddFriend>
     <SendMessage desc=""><![CDATA[私信]]></SendMessage>

+ 11 - 0
Assets/Resource/XML/lan/ChineseTraditional.xml

@@ -242,6 +242,17 @@
     <AH_SendMessageButtonTitle desc=""><![CDATA[]]></AH_SendMessageButtonTitle>
     <AH_CloseButtonTitle desc=""><![CDATA[]]></AH_CloseButtonTitle>
   </UI>
+  <ApplicantItem>
+    <MinutesAgo desc=""><![CDATA[]]></MinutesAgo>
+    <HoursAgo desc=""><![CDATA[]]></HoursAgo>
+    <DaysAgo desc=""><![CDATA[]]></DaysAgo>
+    <Accept desc=""><![CDATA[]]></Accept>
+    <Deny desc=""><![CDATA[]]></Deny>
+    <ConnectError desc=""><![CDATA[]]></ConnectError>
+    <FriendFullSelf desc=""><![CDATA[]]></FriendFullSelf>
+    <FriendFullOther desc=""><![CDATA[]]></FriendFullOther>
+    <AcceptFriendSucceed desc=""><![CDATA[]]></AcceptFriendSucceed>
+  </ApplicantItem>
   <CommentItem>
     <AddFriend desc=""><![CDATA[]]></AddFriend>
     <SendMessage desc=""><![CDATA[]]></SendMessage>

+ 11 - 0
Assets/Resource/XML/lan/English.xml

@@ -242,6 +242,17 @@ Program 水怪
     <AH_SendMessageButtonTitle desc=""><![CDATA[]]></AH_SendMessageButtonTitle>
     <AH_CloseButtonTitle desc=""><![CDATA[]]></AH_CloseButtonTitle>
   </UI>
+  <ApplicantItem>
+    <MinutesAgo desc=""><![CDATA[]]></MinutesAgo>
+    <HoursAgo desc=""><![CDATA[]]></HoursAgo>
+    <DaysAgo desc=""><![CDATA[]]></DaysAgo>
+    <Accept desc=""><![CDATA[]]></Accept>
+    <Deny desc=""><![CDATA[]]></Deny>
+    <ConnectError desc=""><![CDATA[]]></ConnectError>
+    <FriendFullSelf desc=""><![CDATA[]]></FriendFullSelf>
+    <FriendFullOther desc=""><![CDATA[]]></FriendFullOther>
+    <AcceptFriendSucceed desc=""><![CDATA[]]></AcceptFriendSucceed>
+  </ApplicantItem>
   <CommentItem>
     <AddFriend desc=""><![CDATA[]]></AddFriend>
     <SendMessage desc=""><![CDATA[]]></SendMessage>

BIN
Assets/Resource/Xlsx/language_config.xlsx


+ 11 - 0
Assets/Script/Label/LanguageLabel.cs

@@ -240,6 +240,17 @@ public class LanguageLabel
 	public static string UI__AH_SendMessageButtonTitle = "UI__AH_SendMessageButtonTitle";
 	public static string UI__AH_CloseButtonTitle = "UI__AH_CloseButtonTitle";
 	
+	public static string ApplicantItem = "ApplicantItem";
+	public static string ApplicantItem__MinutesAgo = "ApplicantItem__MinutesAgo";
+	public static string ApplicantItem__HoursAgo = "ApplicantItem__HoursAgo";
+	public static string ApplicantItem__DaysAgo = "ApplicantItem__DaysAgo";
+	public static string ApplicantItem__Accept = "ApplicantItem__Accept";
+	public static string ApplicantItem__Deny = "ApplicantItem__Deny";
+	public static string ApplicantItem__ConnectError = "ApplicantItem__ConnectError";
+	public static string ApplicantItem__FriendFullSelf = "ApplicantItem__FriendFullSelf";
+	public static string ApplicantItem__FriendFullOther = "ApplicantItem__FriendFullOther";
+	public static string ApplicantItem__AcceptFriendSucceed = "ApplicantItem__AcceptFriendSucceed";
+	
 	public static string CommentItem = "CommentItem";
 	public static string CommentItem__AddFriend = "CommentItem__AddFriend";
 	public static string CommentItem__SendMessage = "CommentItem__SendMessage";

+ 106 - 110
Assets/Script/Manage/HttpManager.cs

@@ -24,6 +24,15 @@ public class MailItemLabel
     public static string Icon3 = "Icon3";
 }
 
+public class ResultCode
+{
+    public static string Error = "error";
+    public static string NoError = "{\"error\":0}";
+
+    public static int FriendFullSelf = 1011;
+    public static int FriendFullOther = 1012;
+}
+
 public class MyCredentials : ICredentialsByHost
 {
     public NetworkCredential NetworkCredential;
@@ -143,7 +152,7 @@ public class HttpManager : Regist
     public static string DownloadURL = NewBaseURL + "/user/load";
     public static string RandomURL = NewBaseURL + "/user/rand";
     public static string ThanksGiftInfoURL = NewBaseURL + "/index/gift";
-    public static string GetApplicantListURL = NewBaseURL + "/buddy/list";
+    public static string GetApplicantListURL = NewBaseURL + "/buddy/blist";
     public static string GetBuddyListURL = NewBaseURL + "/buddy/index";
     public static string ApplyBuddyURL = NewBaseURL + "/buddy/apply";
     public static string DeleteBuddyURL = NewBaseURL + "/buddy/remove";
@@ -154,28 +163,32 @@ public class HttpManager : Regist
 
     public void Awake()
     {
-        URLRequestData requestData = new URLRequestData();
-        requestData.Add("u", 1710065808151506837);
-        URLRequest.CreateStrURLRequest(true, GetApplicantListURL, requestData, data => Debug.Log("获取好友列表返回结果 " + data), URLRequest.Method.POST);
-
-        requestData = new URLRequestData();
-        requestData.Add("u", 1710065808151506837);
-        URLRequest.CreateStrURLRequest(true, GetBuddyListURL, requestData, data => Debug.Log("查看好友列表返回结果 " + data), URLRequest.Method.POST);
-
-        requestData = new URLRequestData();
-        requestData.Add("u", 1710065808151506837);
-        requestData.Add("b", 1710065808151506837);
-        URLRequest.CreateStrURLRequest(true, ApplyBuddyURL, requestData, data => Debug.Log("申请好友返回结果 " + data), URLRequest.Method.POST);
-
-        requestData = new URLRequestData();
-        requestData.Add("u", 1710065808151506837);
-        requestData.Add("b", 1710065808151506837);
-        URLRequest.CreateStrURLRequest(true, AcceptApplicantURL, requestData, data => Debug.Log("同意加为好友返回结果 " + data), URLRequest.Method.POST);
-
-        requestData = new URLRequestData();
-        requestData.Add("u", 1710065808151506837);
-        requestData.Add("b", 1710065808151506837);
-        URLRequest.CreateStrURLRequest(true, DeleteBuddyURL, requestData, data => Debug.Log("删除/拒绝好友返回结果 " + data), URLRequest.Method.POST);
+        //URLRequestData requestData = new URLRequestData();
+        //requestData.Add("u", 1710065808151506837);
+        //URLRequest.CreateStrURLRequest(true, GetApplicantListURL, requestData, data => Debug.Log("获取申请列表返回结果 " + data), URLRequest.Method.POST);
+
+        //URLRequestData requestData = new URLRequestData();
+        //requestData.Add("u", 1710065808151506837);
+        //URLRequest.CreateStrURLRequest(true, GetBuddyListURL, requestData, data => Debug.Log("查看好友列表返回结果 " + data), URLRequest.Method.POST);
+
+        //URLRequestData requestData = new URLRequestData();
+        //requestData.Add("b", 1709110835792772697);
+        //requestData.Add("u", 1709207727231988804);
+        //URLRequest.CreateStrURLRequest(true, ApplyBuddyURL, requestData, data => Debug.Log("申请好友返回结果 " + data), URLRequest.Method.POST);
+
+        //requestData.Add("b", 1709207727231988804);
+        //requestData.Add("u", 1709110835792772697);
+        //URLRequest.CreateStrURLRequest(true, ApplyBuddyURL, requestData, data => Debug.Log("申请好友返回结果 " + data), URLRequest.Method.POST);
+
+        //requestData = new URLRequestData();
+        //requestData.Add("u", 1710065808151506837);
+        //requestData.Add("b", 1710065808151506837);
+        //URLRequest.CreateStrURLRequest(true, AcceptApplicantURL, requestData, data => Debug.Log("同意加为好友返回结果 " + data), URLRequest.Method.POST);
+
+        //requestData = new URLRequestData();
+        //requestData.Add("u", 1710065808151506837);
+        //requestData.Add("b", 1710065808151506837);
+        //URLRequest.CreateStrURLRequest(true, DeleteBuddyURL, requestData, data => Debug.Log("删除/拒绝好友返回结果 " + data), URLRequest.Method.POST);
     }
 
     public void Update()
@@ -994,87 +1007,78 @@ public class HttpManager : Regist
 
     public static void GetApplicantList(Action<List<AccountData>> succeedCallback, Action failedCallback, string selfSerialNumber = null)
     {
-        DelayCall.Call
+        if (selfSerialNumber == null)
+        {
+            selfSerialNumber = SerialNumber;
+        }
+
+        URLRequestData requestData = new URLRequestData();
+        requestData.Add("u", selfSerialNumber);
+        URLRequest.CreateURLRequest
         (
-            2f,
-            () =>
+            true,
+            GetApplicantListURL,
+            requestData,
+            jData =>
             {
-                List<AccountData> accountDatas = new List<AccountData>();
-                accountDatas.Add(new AccountData("测试账号0", "测试ID0", DateTime.Now.Ticks.ToString()));
-                accountDatas.Add(new AccountData("测试账号1", "测试ID1", DateTime.Now.Ticks.ToString()));
-                accountDatas.Add(new AccountData("测试账号2", "测试ID2", DateTime.Now.Ticks.ToString()));
-                succeedCallback.Invoke(accountDatas);
-            }
+                //Debug.Log(jData.ToJson());
+                if (jData.Inst_Object.ContainsKey("l"))
+                {
+                    jData = jData["l"];
+                    List<AccountData> accountDatas = new List<AccountData>();
+                    for (int i = 0; i < jData.Count; i++)
+                    {
+                        string serialNumber = (string)jData[i]["i"];
+                        string nickname = (string)jData[i]["n"];
+                        string dateString = (string)jData[i]["t"];
+                        accountDatas.Add(new AccountData(nickname, serialNumber, dateString));
+                    }
+                    succeedCallback.Invoke(accountDatas);
+                }
+                else
+                {
+                    failedCallback.Invoke();
+                }
+            },
+            URLRequest.Method.POST
         );
-
-        //if (selfSerialNumber == null)
-        //{
-        //    selfSerialNumber = SerialNumber;
-        //}
-
-        //URLRequestData requestData = new URLRequestData();
-        //requestData.Add("u", selfSerialNumber);
-        //URLRequest.CreateURLRequest
-        //(
-        //    true,
-        //    GetApplicantListURL,
-        //    requestData,
-        //    jData =>
-        //    {
-        //        if (jData.Inst_Object.ContainsKey("i"))
-        //        {
-        //            List<AccountData> accountDatas = new List<AccountData>();
-        //            for (int i = 0; i < jData.Count; i++)
-        //            {
-        //                string serialNumber = (string)jData[i]["i"];
-        //                string nickname = (string)jData[i]["n"];
-        //                accountDatas.Add(new AccountData(nickname, serialNumber));
-        //            }
-        //            succeedCallback.Invoke(accountDatas);
-        //        }
-        //        else
-        //        {
-        //            failedCallback.Invoke();
-        //        }
-        //    },
-        //    URLRequest.Method.POST
-        //);
     }
 
     public static void GetBuddyList(Action<List<AccountData>> succeedCallback, Action failedCallback, string selfSerialNumber = null)
     {
-        //if (selfSerialNumber == null)
-        //{
-        //    selfSerialNumber = SerialNumber;
-        //}
+        if (selfSerialNumber == null)
+        {
+            selfSerialNumber = SerialNumber;
+        }
 
-        //URLRequestData requestData = new URLRequestData();
-        //requestData.Add("u", selfSerialNumber);
-        //URLRequest.CreateURLRequest
-        //(
-        //    true,
-        //    GetBuddyListURL,
-        //    requestData,
-        //    jData =>
-        //    {
-        //        if (jData.Inst_Object.ContainsKey("i"))
-        //        {
-        //            List<AccountData> accountDatas = new List<AccountData>();
-        //            for (int i = 0; i < jData.Count; i++)
-        //            {
-        //                string serialNumber = (string) jData[i]["i"];
-        //                string nickname = (string) jData[i]["n"];
-        //                accountDatas.Add(new AccountData(nickname, serialNumber));
-        //            }
-        //            succeedCallback.Invoke(accountDatas);
-        //        }
-        //        else
-        //        {
-        //            failedCallback.Invoke();
-        //        }
-        //    },
-        //    URLRequest.Method.POST
-        //);
+        URLRequestData requestData = new URLRequestData();
+        requestData.Add("u", selfSerialNumber);
+        URLRequest.CreateURLRequest
+        (
+            true,
+            GetBuddyListURL,
+            requestData,
+            jData =>
+            {
+                if (jData.Inst_Object.ContainsKey("i"))
+                {
+                    List<AccountData> accountDatas = new List<AccountData>();
+                    for (int i = 0; i < jData.Count; i++)
+                    {
+                        string serialNumber = (string)jData[i]["i"];
+                        string nickname = (string)jData[i]["n"];
+                        string dateString = (string)jData[i]["t"];
+                        accountDatas.Add(new AccountData(nickname, serialNumber, dateString));
+                    }
+                    succeedCallback.Invoke(accountDatas);
+                }
+                else
+                {
+                    failedCallback.Invoke();
+                }
+            },
+            URLRequest.Method.POST
+        );
     }
 
     public static void DeleteBuddy(string targetSerialNumber, Action succeedCallback, Action failedCallback, string selfSerialNumber = null)
@@ -1094,19 +1098,11 @@ public class HttpManager : Regist
             requestData,
             data =>
             {
-                try
+                if (data.Trim() == ResultCode.NoError)
                 {
-                    JsonData jData = JsonMapper.ToObject(data);
-                    if ((int) jData["error"] == 0)
-                    {
-                        succeedCallback.Invoke();
-                    }
-                    else
-                    {
-                        failedCallback.Invoke();
-                    }
+                    succeedCallback.Invoke();
                 }
-                catch (Exception)
+                else
                 {
                     failedCallback.Invoke();
                 }
@@ -1115,7 +1111,7 @@ public class HttpManager : Regist
         );
     }
 
-    public static void AcceptApplicant(string targetSerialNumber, Action succeedCallback, Action failedCallback, string selfSerialNumber = null)
+    public static void AcceptApplicant(string targetSerialNumber, Action<JsonData> succeedCallback, Action failedCallback, string selfSerialNumber = null)
     {
         if (selfSerialNumber == null)
         {
@@ -1134,10 +1130,10 @@ public class HttpManager : Regist
             {
                 try
                 {
-                    JsonData jData = JsonMapper.ToObject(data);
+                    JsonData jData = JsonMapper.ToObject(data.Trim());
                     if ((int)jData["error"] == 0)
                     {
-                        succeedCallback.Invoke();
+                        succeedCallback.Invoke(jData);
                     }
                     else
                     {

+ 1 - 0
Assets/Script/Manage/ResourceManager.cs

@@ -50,6 +50,7 @@ public enum ObjType
     MessageBox,
     HudText,
     MailItem,
+    ApplicantItem,
     GardenInfoItem,
     PlazaroomMemberItem,
     PlazaroomInfoItem,

+ 3 - 1
Assets/Script/Manage/VisitManager.cs

@@ -61,6 +61,7 @@ public class VisitManager : Regist
     #endregion
 
     public static int MaxTipAmt = 10;
+    public static Action OnExitVisteeGarden;
 
     public static int MaxStachConfigAmt = 8;
     public static float PullArchiveTime = 0.5f;
@@ -344,6 +345,7 @@ public class VisitManager : Regist
         SetPlayerCommentPanel();
         SetPlayerRankPanel();
         SetPlayerNickName();
+        OnExitVisteeGarden.SafeInvoke();
     }
 
     public static void EnterVisiteeGarden()
@@ -895,7 +897,7 @@ public class VisitManager : Regist
                         ShowVisitFailPanel,
                         (jData) =>
                         {
-                            Debug.Log(jData.ToJson());
+                            //Debug.Log(jData.ToJson());
                             XmlDocument document = new XmlDocument();
                             document.LoadXml(data["l"].ToString());
                             EnterVisiteeGarden(new VisitData(jData, document));

+ 1 - 1
Assets/Script/Object/CommentItem.cs

@@ -91,7 +91,7 @@ public class CommentItem : Regist
 
         VisitButton.onClick.AddListener(Visit);
         
-        Manager.OnLevelChange += (level) =>
+        Manager.OnLevelChange += level =>
         {
             ContentText.text = ResourceManager.Get<Text>(ObjectLabel.C_CostLab).text;
         };

+ 4 - 3
Assets/Script/Social/AddFriendPanel.cs

@@ -11,11 +11,12 @@ public class AccountData
     public string SerialNumber;
     public DateTime LastLoginDate;
 
-    public AccountData(string nickname, string serialNumber, string lastLoginTimestamp)
+    public AccountData(string nickname, string serialNumber, string dateString)
     {
         Nickname = nickname;
         SerialNumber = serialNumber;
-        LastLoginDate = DateUtil.GetTime(lastLoginTimestamp);
+        //Debug.Log(dateString);
+        LastLoginDate = DateTime.Parse(dateString);
     }
 }
 
@@ -68,7 +69,7 @@ public class AddFriendPanel : Regist
         ChangeButton.onClick.AddListener(OnChangeButtonClick);
         CloseButton.onClick.AddListener(ClosePanel);
 
-        RecommendDatas.Add(new AccountData("测试账号", "测试ID", "170000000000"));
+        //RecommendDatas.Add(new AccountData("测试账号", "测试ID", "2017-11-22 14:42:11"));
     }
 
     public static void OpenPanel()

+ 112 - 4
Assets/Script/Social/ApplicantItem.cs

@@ -1,7 +1,7 @@
 using System;
 using System.Collections;
 using System.Collections.Generic;
-
+using LitJson;
 using UnityEngine;
 using UnityEngine.UI;
 
@@ -36,6 +36,8 @@ public class ApplicantItem : VirtualScrollRectItem
     public Button AcceptButton;
     public Button RefuseButton;
 
+    public AccountData AccountData;
+
     #endregion
 
     public override bool Init()
@@ -45,15 +47,121 @@ public class ApplicantItem : VirtualScrollRectItem
             return true;
         }
 
+        Dictionary<string, Transform> childDictionary = new Dictionary<string, Transform>();
+        Auxiliary.CompileDic(transform, childDictionary);
+
+        NicknameTitle = childDictionary[ApplicantItemLabel.Nickname].GetComponent<Text>();
+        ContentTitle = childDictionary[ApplicantItemLabel.Content].GetComponent<Text>();
+        VisitButtonTitle = childDictionary[ApplicantItemLabel.VisitButtonTitle].GetComponent<Text>();
+        AcceptButtonText = childDictionary[ApplicantItemLabel.AcceptButtonText].GetComponent<Text>();
+        RefuseButtonText = childDictionary[ApplicantItemLabel.RefuseButtonText].GetComponent<Text>();
+        VisitButton = childDictionary[ApplicantItemLabel.VisitButton].GetComponent<Button>();
+        AcceptButton = childDictionary[ApplicantItemLabel.AcceptButton].GetComponent<Button>();
+        RefuseButton = childDictionary[ApplicantItemLabel.RefuseButton].GetComponent<Button>();
 
+        LanguageManager.Add(AcceptButtonText, new MulLanStr(LanguageLabel.ApplicantItem__Accept));
+        LanguageManager.Add(RefuseButtonText, new MulLanStr(LanguageLabel.ApplicantItem__Deny));
+
+        VisitButton.onClick.AddListener(OnVisitButtonClick);
+        AcceptButton.onClick.AddListener(OnAcceptButtonClick);
+        RefuseButton.onClick.AddListener(OnRefuseButtonClick);
+
+        Manager.OnLevelChange += level =>
+        {
+            VisitButtonTitle.text = ResourceManager.Get<Text>(ObjectLabel.C_CostLab).text;
+        };
 
         return false;
     }
 
 
-    public void Reset(string nickname, string serialNumber, DateTime lastLoginDate)
+    public void Reset(AccountData accountData)
+    {
+        AccountData = accountData;
+        NicknameTitle.text = accountData.Nickname;
+        TimeSpan timeSpan = HttpManager.CurrentDateTime.Subtract(accountData.LastLoginDate);
+        if (timeSpan.TotalMinutes < 60)
+        {
+            string content = Language.GetStr(LanguageLabel.ApplicantItem__MinutesAgo);
+            content = content.Replace(TransferLabel.Value, timeSpan.TotalMinutes.ToString("0"));
+            ContentTitle.text = content;
+        }
+        else if (timeSpan.TotalHours < 24)
+        {
+            string content = Language.GetStr(LanguageLabel.ApplicantItem__HoursAgo);
+            content = content.Replace(TransferLabel.Value, timeSpan.TotalMinutes.ToString("0"));
+            ContentTitle.text = content;
+        }
+        else
+        {
+            string content = Language.GetStr(LanguageLabel.ApplicantItem__DaysAgo);
+            content = content.Replace(TransferLabel.Value, timeSpan.TotalMinutes.ToString("0"));
+            ContentTitle.text = content;
+        }
+    }
+
+
+    public void OnVisitButtonClick()
+    {
+        FriendPanel.ClosePanel();
+        CounterAction counterAction = new CounterAction(FriendPanel.OpenPanel);
+        counterAction.Bind(ref VisitManager.OnExitVisteeGarden);
+        VisitManager.Visit(ConfigSource.SerialNumber, AccountData.SerialNumber);
+    }
+
+    public void OnAcceptButtonClick()
+    {
+        if (FriendPanel.FriendItems.Count >= FriendPanel.MaxFriend)
+        {
+            Bubble.Show(null, Language.GetStr(LanguageLabel.ApplicantItem__FriendFullSelf));
+        }
+        else
+        {
+            AcceptButton.interactable = false;
+            HttpManager.AcceptApplicant(AccountData.SerialNumber, AcceptApplicantSucceed, AcceptApplicantFailed);
+        }
+    }
+
+    public void AcceptApplicantFailed()
+    {
+        AcceptButton.interactable = true;
+        Bubble.Show(null, Language.GetStr(LanguageLabel.ApplicantItem__ConnectError));
+    }
+
+    public void AcceptApplicantSucceed(JsonData jsonData)
+    {
+        AcceptButton.interactable = true;
+        if ((int) jsonData[ResultCode.Error] == ResultCode.FriendFullSelf)
+        {
+            Bubble.Show(null, Language.GetStr(LanguageLabel.ApplicantItem__FriendFullSelf));
+        }
+        else if ((int)jsonData[ResultCode.Error] == ResultCode.FriendFullOther)
+        {
+            Bubble.Show(null, Language.GetStr(LanguageLabel.ApplicantItem__FriendFullOther));
+        }
+        else
+        {
+            Bubble.Show(null, Language.GetStr(LanguageLabel.ApplicantItem__AcceptFriendSucceed));
+            FriendPanel.SaveApplicantItem(this);
+        }
+    }
+
+    public void OnRefuseButtonClick()
+    {
+        RefuseButton.interactable = false;
+        HttpManager.DeleteBuddy(AccountData.SerialNumber, RefuseApplicantSucceed, RefuseApplicantFailed);
+    }
+
+    public void RefuseApplicantFailed()
+    {
+        RefuseButton.interactable = true;
+        Bubble.Show(null, Language.GetStr(LanguageLabel.ApplicantItem__ConnectError));
+    }
+
+    public void RefuseApplicantSucceed()
     {
-        NicknameTitle.text = nickname;
-        //ContentTitle.text = 
+        Debug.Log("RefuseApplicantSucceed");
+        RefuseButton.interactable = true;
+        FriendPanel.SaveApplicantItem(this);
     }
 }

+ 78 - 0
Assets/Script/Social/FriendItem.cs

@@ -0,0 +1,78 @@
+using System.Collections;
+using System.Collections.Generic;
+
+using UnityEngine;
+using UnityEngine.UI;
+
+public class FriendItemLabel
+{
+	public static string FriendItem = "FriendItem";
+	public static string Nickname = "Nickname";
+	public static string Content = "Content";
+	public static string Frame = "Frame";
+	public static string VisitButton = "VisitButton";
+	public static string VisitButtonTitle = "VisitButtonTitle";
+	public static string VisitImagePlus = "VisitImagePlus";
+	public static string VerticalGroup = "VerticalGroup";
+	public static string SendMessageButtonParent = "SendMessageButtonParent";
+	public static string SendMessageButton = "SendMessageButton";
+	public static string NewMessageFlagImage = "NewMessageFlagImage";
+	public static string SendMessageButtonText = "SendMessageButtonText";
+	public static string DeleteButtonParent = "DeleteButtonParent";
+	public static string DeleteButton = "DeleteButton";
+	public static string DeleteButtonText = "DeleteButtonText";
+}
+
+public class FriendItem : VirtualScrollRectItem
+{
+    #region Config
+    
+    public Text NicknameTitle;
+    public Text ContentTitle;
+    public Text VisitButtonTitle;
+    public Text SendMessageButtonText;
+    public Text DeleteButtonText;
+    public Image NewMessageFlagImage;
+    public Button VisitButton;
+    public Button SendMessageButton;
+    public Button DeleteButton;
+
+    public AccountData AccountData;
+
+    #endregion
+
+    public override bool Init()
+    {
+        if (base.Init())
+        {
+            return true;
+        }
+
+        Dictionary<string, Transform> childDictionary = new Dictionary<string, Transform>();
+        Auxiliary.CompileDic(transform, childDictionary);
+
+        NicknameTitle = childDictionary[FriendItemLabel.Nickname].GetComponent<Text>();
+        ContentTitle = childDictionary[FriendItemLabel.Content].GetComponent<Text>();
+        VisitButtonTitle = childDictionary[FriendItemLabel.VisitButtonTitle].GetComponent<Text>();
+        SendMessageButtonText = childDictionary[FriendItemLabel.SendMessageButtonText].GetComponent<Text>();
+        DeleteButtonText = childDictionary[FriendItemLabel.DeleteButtonText].GetComponent<Text>();
+        NewMessageFlagImage = childDictionary[FriendItemLabel.NewMessageFlagImage].GetComponent<Image>();
+        VisitButton = childDictionary[FriendItemLabel.VisitButton].GetComponent<Button>();
+        SendMessageButton = childDictionary[FriendItemLabel.SendMessageButton].GetComponent<Button>();
+        DeleteButton = childDictionary[FriendItemLabel.DeleteButton].GetComponent<Button>();
+
+        //LanguageManager.Add(AcceptButtonText, new MulLanStr(LanguageLabel.ApplicantItem__Accept));
+        //LanguageManager.Add(RefuseButtonText, new MulLanStr(LanguageLabel.ApplicantItem__Deny));
+
+        //VisitButton.onClick.AddListener(OnVisitButtonClick);
+        //AcceptButton.onClick.AddListener(OnAcceptButtonClick);
+        //RefuseButton.onClick.AddListener(OnRefuseButtonClick);
+
+        Manager.OnLevelChange += level =>
+        {
+            VisitButtonTitle.text = ResourceManager.Get<Text>(ObjectLabel.C_CostLab).text;
+        };
+
+        return false;
+    }
+}

+ 12 - 0
Assets/Script/Social/FriendItem.cs.meta

@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 1d919f420320adb408fe6a160eee36a1
+timeCreated: 1511336082
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 80 - 7
Assets/Script/Social/FriendPanel.cs

@@ -8,13 +8,40 @@ public class FriendPanel : Regist
 {
     #region Config
 
-	public static Text NicknameTitle;
+    public static int MaxFriend
+    {
+        get { return maxFriend; }
+        set
+        {
+            maxFriend = value;
+            UpdateFriendAmountText();
+        }
+    }
+    public static int maxFriend;
+
+    public static List<VirtualScrollRectItem> FriendItems
+    {
+        get
+        {
+            UpdateFriendAmountText();
+            return friendItems;
+        }
+        set
+        {
+            UpdateFriendAmountText();
+            friendItems = value;
+        }
+    }
+    public static List<VirtualScrollRectItem> friendItems = new List<VirtualScrollRectItem>();
+
+    public static Text NicknameTitle;
 	public static Text ContentTitle;
 	public static Text CloseButtonTitle;
 	public static Text ApplicantTitle;
 	public static Text PanelTitle;
 	public static Text AcceptAllButtonTitle;
 	public static Text AddFriendTitle;
+	public static Text FriendAmountText;
     public static Image NewApplicantFlagImage;
     public static Button OpenPanelButton;
     public static Button AcceptAllButton;
@@ -29,8 +56,8 @@ public class FriendPanel : Regist
     public static VirtualScrollRectPlus ApplicantScrollRect;
 
     private static float RefreshApplicantTime = 15f;
-    private static float RefreshApplicantTimer;
-    private static List<VirtualScrollRectItem> ApplicantItems = new List<VirtualScrollRectItem>();
+    private static float RefreshApplicantTimer = RefreshApplicantTime;
+    private static List<ApplicantItem> ApplicantItems = new List<ApplicantItem>();
 
     public static TweenOutline OpenPanelButtonOutlineTween;
 
@@ -47,6 +74,7 @@ public class FriendPanel : Regist
         PanelTitle = ResourceManager.Get<Text>(ObjectLabel.AF_PanelTitle);
         AcceptAllButtonTitle = ResourceManager.Get<Text>(ObjectLabel.AF_AcceptAllButtonTitle);
         AddFriendTitle = ResourceManager.Get<Text>(ObjectLabel.AF_AddFriendTitle);
+        FriendAmountText = ResourceManager.Get<Text>(ObjectLabel.AF_FriendAmountText);
         NewApplicantFlagImage = ResourceManager.Get<Image>(ObjectLabel.AF_NewApplicantFlagImage);
         AcceptAllButton = ResourceManager.Get<Button>(ObjectLabel.AF_AcceptAllButton);
         AddFriendButton = ResourceManager.Get<Button>(ObjectLabel.AF_AddFriendButton);
@@ -97,6 +125,34 @@ public class FriendPanel : Regist
         }
     }
 
+
+    private static void UpdateFriendAmountText()
+    {
+        FriendAmountText.text = $"{friendItems.Count}/{maxFriend}";
+    }
+
+
+    public static void AddFriendItem()
+    {
+
+    }
+
+    public static void SaveFriendItem()
+    {
+        
+    }
+
+
+    public static void SaveApplicantItem(ApplicantItem item)
+    {
+        ResourceManager.Save(item);
+        ApplicantItems.Remove(item);
+        if (ApplicantItems.Count == 0)
+        {
+            NewApplicantFlagImage.SetActive(false);
+        }
+    }
+
     private static void RefreshApplicant()
     {
         HttpManager.GetApplicantList(RefreshApplicantCallback, () => { });
@@ -108,16 +164,25 @@ public class FriendPanel : Regist
         {
             ResourceManager.Save(applicantItem);
         }   
-        ApplicantItems = new List<VirtualScrollRectItem>();
+        ApplicantItems = new List<ApplicantItem>();
         for (int i = 0; i < accountDatas.Count; i++)
         {
-            
+            ApplicantItem item = ResourceManager.Get(ApplicantItemLabel.ApplicantItem, Folder.UI, false, ApplicantScrollRect.content, false, ObjType.ApplicantItem, typeof(ApplicantItem)).GetComponent<ApplicantItem>();
+            item.Init();
+            item.Reset(accountDatas[i]);
+            ApplicantItems.Add(item);
+        }
+        if (ApplicantItems.Count > 0)
+        {
+            NewApplicantFlagImage.SetActive(true);
+        }
+        else
+        {
+            NewApplicantFlagImage.SetActive(false);
         }
     }
 
 
-
-
     public static void OpenPanel()
     {
         AudioManager.PlayClip(ResourceLabel.BtnClip);
@@ -137,11 +202,15 @@ public class FriendPanel : Regist
         {
             AcceptAllButton.SetActive(true);
             AddFriendButton.SetActive(false);
+            ApplicantScrollRect.SetActive(true);
+            FriendScrollRect.SetActive(false);
         }
         else
         {
             AcceptAllButton.SetActive(false);
             AddFriendButton.SetActive(true);
+            ApplicantScrollRect.SetActive(false);
+            FriendScrollRect.SetActive(true);
         }
     }
 
@@ -154,5 +223,9 @@ public class FriendPanel : Regist
     private static void OnAcceptAllButtonClick()
     {
         AudioManager.PlayClip(ResourceLabel.BtnClip);
+        foreach (var applicantItem in ApplicantItems)
+        {
+            applicantItem.OnAcceptButtonClick();
+        }
     }
 }

+ 1 - 1
Assets/Script/Tool/LabelUtility/SerializeObject.prefab

@@ -55,4 +55,4 @@ MonoBehaviour:
   Languages:
   - {fileID: 4900000, guid: 6bf784d003b5c104e94531afb827212a, type: 3}
   Prefabs:
-  - {fileID: 1948781497737682, guid: 8647d80b558fa724a84d05f9e6aee9bc, type: 2}
+  - {fileID: 1729611064873092, guid: 2419a390c1816dd4298ae3170193f310, type: 2}