2026-02-03 11:35:19 +08:00
|
|
|
|
using Assets.MyGame.Scripts.Net.WebResponses;
|
|
|
|
|
|
using Newtonsoft.Json;
|
|
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
using UnityEngine.SceneManagement;
|
|
|
|
|
|
|
|
|
|
|
|
namespace Assets.MyGame.Scripts.Net
|
|
|
|
|
|
{
|
|
|
|
|
|
public class WebSocketReponseList
|
|
|
|
|
|
{
|
2026-02-13 19:23:01 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取房间列表 room
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="msg"></param>
|
|
|
|
|
|
public static void GetRoomListChineseChessResult(string msg)
|
|
|
|
|
|
{
|
2026-03-09 09:25:01 +08:00
|
|
|
|
var var1 = UIManager.Instance.Show<UIChineseChessDistrict>(UIPanel.MainGamePanelZGXQ, msg);
|
2026-02-13 19:23:01 +08:00
|
|
|
|
}
|
2026-02-26 11:05:56 +08:00
|
|
|
|
public static void GetGoldConfigSuccessChineseChessResult(string msg)
|
|
|
|
|
|
{
|
|
|
|
|
|
UIManager.Instance.Get<ChineseChessMainPanel>(UIPanel.MainGamePanelZGXQ).subUIManager.ShowAsync(UIPanel.ZGXQGameExplain);
|
|
|
|
|
|
}
|
2026-03-09 09:25:01 +08:00
|
|
|
|
|
2026-02-03 11:35:19 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 获取房间列表 room
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="msg"></param>
|
|
|
|
|
|
public static void GetRoomListResult(string msg)
|
|
|
|
|
|
{
|
|
|
|
|
|
var var1 = UIManager.Instance.Get<UIHomeMain>(UIPanel.HomeMainPanel);
|
2026-03-09 09:25:01 +08:00
|
|
|
|
|
2026-03-18 17:26:14 +08:00
|
|
|
|
var selectRoomPanel = var1.subUIManager.Get<UIHome_BY_SelectRoomLevelPanel>(UIPanel.SelectRoomLeavePenel);
|
2026-03-09 09:25:01 +08:00
|
|
|
|
if (selectRoomPanel != null && selectRoomPanel.isMySelectRoom)
|
|
|
|
|
|
selectRoomPanel.panel_UIHome_BY_MySelectRoomPenel.Show(msg);
|
|
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
var v = JsonConvert.DeserializeObject<WebSocketResponseBase<List<GetRoomList>>>(msg).arguments[0];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var item in v)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (item.currentOnlinePlayerCount < item.maxPlayerCount)
|
|
|
|
|
|
{
|
|
|
|
|
|
WebSocketSendList.GetRoomInfo(item.roomId);
|
|
|
|
|
|
break;
|
|
|
|
|
|
//if (item)
|
|
|
|
|
|
//{
|
|
|
|
|
|
//UIHome_BY_SelectRoomLevelPanel.StartGame(item);
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-02-03 11:35:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 加入房间 room
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="msg"></param>
|
|
|
|
|
|
public static void RoomJoinNotice(string msg)
|
|
|
|
|
|
{
|
2026-03-09 09:25:01 +08:00
|
|
|
|
string sceneName = "";
|
2026-02-03 11:35:19 +08:00
|
|
|
|
UIPanel uIPanel = UIPanel.None;
|
|
|
|
|
|
switch (GameManager.Instance.gameData.currGameType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case GameType.JQQD:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case GameType.defaultPanel:
|
|
|
|
|
|
break;
|
2026-03-12 10:48:53 +08:00
|
|
|
|
case GameType.FLZY:
|
|
|
|
|
|
sceneName = "FLZY";
|
|
|
|
|
|
uIPanel = UIPanel.MainGamePanelFLZY;
|
2026-02-03 11:35:19 +08:00
|
|
|
|
break;
|
2026-05-07 03:46:03 +08:00
|
|
|
|
case GameType.YYSC:
|
|
|
|
|
|
sceneName = "YYSC";
|
|
|
|
|
|
|
|
|
|
|
|
uIPanel = UIPanel.MainGamePanelYYSC;
|
|
|
|
|
|
|
2026-02-03 11:35:19 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case GameType.ZGXQ:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case GameType.XJMH:
|
|
|
|
|
|
sceneName = "XJMH";
|
2026-03-09 09:25:01 +08:00
|
|
|
|
uIPanel = UIPanel.MainGamePanelXJMH;
|
2026-02-03 11:35:19 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case GameType.HHWK:
|
2026-03-18 17:26:14 +08:00
|
|
|
|
sceneName = "HHWK";
|
|
|
|
|
|
uIPanel = UIPanel.MainGamePanelHHWK;
|
2026-02-03 11:35:19 +08:00
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2026-03-09 09:25:01 +08:00
|
|
|
|
|
|
|
|
|
|
UIManager.Instance.ShowAsync(uIPanel, UIPanel.HomeMainPanel, msg);
|
2026-02-03 11:35:19 +08:00
|
|
|
|
//这里
|
2026-03-09 09:25:01 +08:00
|
|
|
|
var v = SceneManager.GetSceneByName("XJMH");
|
|
|
|
|
|
if (v.IsValid() && v.isLoaded)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-03 11:35:19 +08:00
|
|
|
|
UIManager.Instance.Close(UIPanel.HomeMainPanel);
|
2026-03-18 17:26:14 +08:00
|
|
|
|
WebSocketManager.Instance.isGame = true;
|
2026-03-09 09:25:01 +08:00
|
|
|
|
|
2026-02-03 11:35:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
2026-03-09 09:25:01 +08:00
|
|
|
|
/// 房间列表 room
|
2026-02-03 11:35:19 +08:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="msg"></param>
|
|
|
|
|
|
public static void RoomInfo(string msg)
|
|
|
|
|
|
{
|
2026-03-18 17:26:14 +08:00
|
|
|
|
WebSocketManager.Instance.isGame = false;
|
2026-02-03 11:35:19 +08:00
|
|
|
|
var roomData = JsonConvert.DeserializeObject<WebSocketResponseBase<RoomChangeResponse>>(msg).arguments[0];
|
|
|
|
|
|
if (roomData != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
GameManager.Instance.gameData.currRoomData = roomData;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
Debug.LogError("roomdata是空:" + msg);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
public static void RoomKillNotice(string msg)
|
|
|
|
|
|
{
|
2026-03-31 17:00:05 +08:00
|
|
|
|
CreateFishManager.Instance.Ws_DieFish(msg);
|
2026-02-03 11:35:19 +08:00
|
|
|
|
}
|
2026-05-27 19:47:06 +08:00
|
|
|
|
public static void RoomFireNotice(string msg)
|
|
|
|
|
|
{
|
|
|
|
|
|
FireCannonSendData fireCannonSendData = JsonConvert.DeserializeObject<WebSocketResponseBase<FireCannonSendData>>(msg).arguments[0];
|
|
|
|
|
|
var syncGameData = fireCannonSendData.extra;
|
|
|
|
|
|
|
|
|
|
|
|
EventCenter.Instance.EventTrigger<FireCannonSendData>(ConstEventString.SyncGameData_FireBullet, fireCannonSendData);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-09 10:44:38 +08:00
|
|
|
|
public static void SyncPlayerGold(string msg)
|
|
|
|
|
|
{
|
2026-03-10 15:36:10 +08:00
|
|
|
|
var gold = JsonConvert.DeserializeObject<WebSocketResponseBase<long>>(msg).arguments[0];
|
2026-04-22 23:08:46 +08:00
|
|
|
|
switch (GameManager.Instance.gameData.currGameType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case GameType.JQQD:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case GameType.defaultPanel:
|
|
|
|
|
|
UIManager.Instance.Get<GameMainPanel_FishBase>(UIPanel.MainGamePanelDefault).currSitData.goldNum = gold;
|
2026-05-27 19:47:06 +08:00
|
|
|
|
|
2026-04-22 23:08:46 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case GameType.FLZY:
|
|
|
|
|
|
UIManager.Instance.Get<GameMainPanel_FishBase>(UIPanel.MainGamePanelFLZY).currSitData.goldNum = gold;
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
2026-05-07 03:46:03 +08:00
|
|
|
|
case GameType.YYSC:
|
|
|
|
|
|
UIManager.Instance.Get<GameMainPanel_FishBase>(UIPanel.MainGamePanelYYSC).currSitData.goldNum = gold;
|
2026-04-22 23:08:46 +08:00
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
case GameType.ZGXQ:
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
case GameType.XJMH:
|
|
|
|
|
|
UIManager.Instance.Get<GameMainPanel_FishBase>(UIPanel.MainGamePanelXJMH).currSitData.goldNum = gold;
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
case GameType.HHWK:
|
|
|
|
|
|
UIManager.Instance.Get<GameMainPanel_FishBase>(UIPanel.MainGamePanelHHWK).currSitData.goldNum = gold;
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2026-02-09 10:44:38 +08:00
|
|
|
|
}
|
2026-03-09 09:25:01 +08:00
|
|
|
|
public static void GetRoomInfoResult(string msg)
|
|
|
|
|
|
{
|
|
|
|
|
|
//GameManager.Instance.StartGame();RoomChangeResponse
|
|
|
|
|
|
var roomData = JsonConvert.DeserializeObject<WebSocketResponseBase<RoomChangeResponse>>(msg).arguments[0];
|
|
|
|
|
|
UIHome_BY_SelectRoomLevelPanel.StartGame(roomData);
|
|
|
|
|
|
}
|
|
|
|
|
|
public static void SyncGameDataResult(string msg)
|
|
|
|
|
|
{
|
|
|
|
|
|
var syncGameData = JsonConvert.DeserializeObject<WebSocketResponseBase<SyncGameData>>(msg).arguments[0];
|
|
|
|
|
|
switch (syncGameData.frameType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case FrameDataType.none:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case FrameDataType.rotateTurrect:
|
|
|
|
|
|
EventCenter.Instance.EventTrigger<SyncGameData>(ConstEventString.SyncGameData_Rotate, syncGameData);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case FrameDataType.fireBullet:
|
2026-05-27 19:47:06 +08:00
|
|
|
|
//EventCenter.Instance.EventTrigger<SyncGameData>(ConstEventString.SyncGameData_FireBullet, syncGameData);
|
2026-03-09 09:25:01 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case FrameDataType.createFish:
|
|
|
|
|
|
EventCenter.Instance.EventTrigger<SyncGameData>(ConstEventString.SyncGameData_CreateFish, syncGameData);
|
|
|
|
|
|
break;
|
2026-03-18 17:26:14 +08:00
|
|
|
|
case FrameDataType.changeAutoTarget:
|
2026-03-09 09:25:01 +08:00
|
|
|
|
EventCenter.Instance.EventTrigger<SyncGameData>(ConstEventString.SyncGameData_ChangeTargetMonster, syncGameData);
|
2026-04-22 16:22:28 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case FrameDataType.randomDieFish:
|
2026-04-22 18:15:22 +08:00
|
|
|
|
EventCenter.Instance.EventTrigger<SyncGameData>(ConstEventString.SyncGameData_RendromDieFish, syncGameData);
|
2026-03-09 09:25:01 +08:00
|
|
|
|
break;
|
2026-05-28 18:16:45 +08:00
|
|
|
|
case FrameDataType.freezeFish:
|
|
|
|
|
|
EventCenter.Instance.EventTrigger<SyncGameData>(ConstEventString.SyncGameData_FreezeFish, syncGameData);
|
2026-06-13 18:23:25 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case FrameDataType.changeTurretState:
|
|
|
|
|
|
EventCenter.Instance.EventTrigger<SyncGameData>(ConstEventString.SyncGameData_TurretState, syncGameData);
|
|
|
|
|
|
|
2026-06-13 22:34:43 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case FrameDataType.changeTurret:
|
|
|
|
|
|
EventCenter.Instance.EventTrigger<SyncGameData>(ConstEventString.SyncGameData_ChangeTurret, syncGameData);
|
2026-05-28 18:16:45 +08:00
|
|
|
|
break;
|
2026-03-09 09:25:01 +08:00
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2026-02-03 11:35:19 +08:00
|
|
|
|
|
2026-03-09 09:25:01 +08:00
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
public static void LeaveRoomResult(string msg)
|
|
|
|
|
|
{
|
2026-03-18 17:26:14 +08:00
|
|
|
|
//WebSocketManager.Instance.isGame = false;
|
|
|
|
|
|
|
2026-03-09 09:25:01 +08:00
|
|
|
|
//GameManager.Instance.StartGame();RoomChangeResponse
|
2026-03-18 17:26:14 +08:00
|
|
|
|
var userid = JsonConvert.DeserializeObject<WebSocketResponseBase<string>>(msg).arguments[0];
|
|
|
|
|
|
switch (GameManager.Instance.gameData.currGameType)
|
2026-03-09 09:25:01 +08:00
|
|
|
|
{
|
2026-03-18 17:26:14 +08:00
|
|
|
|
case GameType.JQQD:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case GameType.defaultPanel:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case GameType.FLZY:
|
|
|
|
|
|
{
|
|
|
|
|
|
var panel = UIManager.Instance.Get<GameMainPanel_FLZY>(UIPanel.MainGamePanelFLZY);
|
2026-05-01 06:26:50 +08:00
|
|
|
|
if (panel.currSitData.user== userid)
|
|
|
|
|
|
{
|
|
|
|
|
|
UIManager.Instance.ShowAsync(UIPanel.HomeMainPanel, UIPanel.MainGamePanelFLZY);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2026-03-18 17:26:14 +08:00
|
|
|
|
foreach (var item in panel.list_Sits)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (item.user == userid)
|
|
|
|
|
|
{
|
|
|
|
|
|
item.gameObject.SetActive(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
2026-05-07 03:46:03 +08:00
|
|
|
|
case GameType.YYSC:
|
|
|
|
|
|
{
|
|
|
|
|
|
var panel = UIManager.Instance.Get<GameMainPanel_YYSC>(UIPanel.MainGamePanelYYSC);
|
|
|
|
|
|
if (panel.currSitData.user == userid)
|
|
|
|
|
|
{
|
|
|
|
|
|
UIManager.Instance.ShowAsync(UIPanel.HomeMainPanel, UIPanel.MainGamePanelYYSC);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
foreach (var item in panel.list_Sits)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (item.user == userid)
|
|
|
|
|
|
{
|
|
|
|
|
|
item.gameObject.SetActive(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-03-18 17:26:14 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case GameType.ZGXQ:
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
case GameType.XJMH:
|
|
|
|
|
|
{
|
|
|
|
|
|
var panel = UIManager.Instance.Get<GameMainPanel_XJMH>(UIPanel.MainGamePanelXJMH);
|
2026-05-01 06:26:50 +08:00
|
|
|
|
if (panel.currSitData.user == userid)
|
|
|
|
|
|
{
|
|
|
|
|
|
UIManager.Instance.ShowAsync(UIPanel.HomeMainPanel, UIPanel.MainGamePanelXJMH);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2026-03-18 17:26:14 +08:00
|
|
|
|
foreach (var item in panel.list_Sits)
|
|
|
|
|
|
{
|
|
|
|
|
|
Debug.Log(item.user+"---"+ userid);
|
|
|
|
|
|
if (item.user == userid)
|
|
|
|
|
|
{
|
|
|
|
|
|
Debug.Log("推出星际迷航");
|
|
|
|
|
|
item.gameObject.SetActive(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case GameType.HHWK:
|
|
|
|
|
|
{
|
|
|
|
|
|
var panel = UIManager.Instance.Get<GameMainPanel_HHWK>(UIPanel.MainGamePanelHHWK);
|
2026-05-01 06:26:50 +08:00
|
|
|
|
if (panel.currSitData.user == userid)
|
|
|
|
|
|
{
|
|
|
|
|
|
UIManager.Instance.ShowAsync(UIPanel.HomeMainPanel, UIPanel.MainGamePanelHHWK);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2026-03-18 17:26:14 +08:00
|
|
|
|
foreach (var item in panel.list_Sits)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (item.user == userid)
|
|
|
|
|
|
{
|
|
|
|
|
|
item.gameObject.SetActive(false);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
2026-03-09 09:25:01 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-18 17:26:14 +08:00
|
|
|
|
|
2026-03-09 09:25:01 +08:00
|
|
|
|
}
|
2026-04-15 18:30:37 +08:00
|
|
|
|
|
|
|
|
|
|
// ---------------- Customer ----------------
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 发起会话回调(用户端)
|
|
|
|
|
|
/// isOk=false 时弹错误提示;isOk=true 时自动加入会话房间
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public static void Customer_OnConversationStarted(CustomerConversationStartedResult result)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!result.isOk)
|
|
|
|
|
|
{
|
|
|
|
|
|
UIManager.Instance.ShowBoardError(result.msg);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
// 加入会话房间,之后才能收发消息
|
|
|
|
|
|
//WebSocketSendList.Customer_JoinConversation(result.conversation.id);
|
|
|
|
|
|
// TODO: 通知客服 UI 显示会话(替换为你的实际 Panel 调用)
|
|
|
|
|
|
UIManager.Instance.Get<UIHomeMain>(UIPanel.HomeMainPanel).subUIManager.Get<UIHome_BY_ServicePanel>(UIPanel.ServicePanel)?.OnConversationStarted(result);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 消息接收回调(用户端 & 客服端)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public static void Customer_OnMessageReceived(CustomerMessageReceived msg)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
// TODO: 通知客服 UI 追加消息(替换为你的实际 Panel 调用)
|
|
|
|
|
|
UIManager.Instance.Get<UIHomeMain>(UIPanel.HomeMainPanel).subUIManager.Get<UIHome_BY_ServicePanel>(UIPanel.ServicePanel)?.OnMessageReceived(msg);
|
|
|
|
|
|
Debug.Log($"[Customer] 收到消息 from {msg.senderName}({msg.senderType}): {msg.content}");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 新会话通知(客服端)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public static void Customer_OnNewConversation(CustomerNewConversationNotice notice)
|
|
|
|
|
|
{
|
|
|
|
|
|
// 客服端自动加入会话房间
|
|
|
|
|
|
WebSocketSendList.Customer_JoinConversation(notice.conversationId);
|
|
|
|
|
|
// TODO: 通知客服端 UI 显示新会话(替换为你的实际 Panel 调用)
|
|
|
|
|
|
// UIManager.Instance.Get<UICustomerServicePanel>(UIPanel.CustomerServicePanel)?.OnNewConversation(notice);
|
|
|
|
|
|
Debug.Log($"[Customer] 新会话来了,userId={notice.userId},userName={notice.userName}");
|
|
|
|
|
|
}
|
2026-02-03 11:35:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|