frmMicroAppletAdmin.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  1. using LYFZ.Model;
  2. using NetDimension.NanUI;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.ComponentModel;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. namespace LYFZ.Software.MainBusiness.MicroApplet
  10. {
  11. public class frmMicroAppletAdmin : LYFZ.Software.MicroApplet.frmMicroAppletAdmin
  12. {
  13. frmAdminPage frmPage = null;
  14. string gotoUrl = "";
  15. public frmMicroAppletAdmin(string parameter = "/panel/setting/store")
  16. {
  17. if (Environment.OSVersion.Version.Major >= 6)
  18. {
  19. try
  20. {
  21. frmPage = new frmAdminPage();
  22. gotoUrl = parameter;
  23. this.UcNavigationTool.LabTitle = "微信小程序后台管理";
  24. this.Load += frmMicroAppletAdmin_Load;
  25. this.btnRefresh.Click += btnRefresh_Click;
  26. this.btnSetAccount.Click += BtnSetAccount_Click;
  27. this.frmPage.ContextMenuHandler.RunContextMenu += ContextMenuHandler_RunContextMenu;
  28. this.Shown += FrmMicroAppletAdmin_Shown;
  29. this.frmPage.LoadHandler.OnLoadEnd += LoadHandler_OnLoadEnd;
  30. this.frmPage.LoadHandler.OnLoadStart += LoadHandler_OnLoadStart;
  31. this.comAccountList.SelectedIndexChanged += ComAccountList_SelectedIndexChanged;
  32. }
  33. catch
  34. {
  35. MessageBoxCustom.Show("您的系统不支持微信小程序功能,请使用 Win7 或以上系统。");
  36. this.Enabled = false;
  37. }
  38. }
  39. else {
  40. MessageBoxCustom.Show("您的系统不支持微信小程序功能,请使用 Win7 或以上系统。");
  41. this.Enabled = false;
  42. }
  43. }
  44. /// <summary>
  45. /// 是否初始化完成
  46. /// </summary>
  47. bool isInitialization = false;
  48. private void ComAccountList_SelectedIndexChanged(object sender, EventArgs e)
  49. {
  50. if (isInitialization)
  51. {
  52. if (this.comAccountList.SelectedItem != null)
  53. {
  54. MicroAppToken = "";
  55. BLL.MicroApplet.MicroAppletAccount mAccount = (BLL.MicroApplet.MicroAppletAccount)((ItemValue)this.comAccountList.SelectedItem).Value;
  56. CurrentMicroAppletShopID = mAccount.ShopID;
  57. LoadMicroAppletPage(mAccount);
  58. }
  59. }
  60. }
  61. private void BtnSetAccount_Click(object sender, EventArgs e)
  62. {
  63. frmMicroAppletAccountManager frmaccountManager = new frmMicroAppletAccountManager();
  64. frmaccountManager.ShowDialog();
  65. if (frmaccountManager.isUpdate)
  66. {
  67. if (LoadMicroConfigure())
  68. {
  69. if (String.IsNullOrEmpty(CurrentMicroAppletShopID))
  70. {
  71. CurrentMicroAppletShopID = LYFZ.Software.MainBusiness.CommonLogical.SuccessfulLogin.CurrentCompanyInfoID;
  72. }
  73. isInitialization = false;
  74. if (_MicroAppletAccountList.Count > 0)
  75. {
  76. BindMicroAppletAccountList(this.comAccountList, CurrentMicroAppletShopID);
  77. }
  78. LoadMicroAppletPage(GetMicroAppletAccount(CurrentMicroAppletShopID));
  79. }
  80. else
  81. {
  82. MessageBoxCustom.Show("获取小程序帐号信息失败,请确认是否正确配置相关信息");
  83. }
  84. }
  85. }
  86. static string userInfo = "";
  87. //bool isSetLocalStorage = false;
  88. private void LoadHandler_OnLoadStart(object sender, Chromium.Event.CfxOnLoadStartEventArgs e)
  89. {
  90. //http://ivision.lyfz.net/login
  91. // if (!isSetLocalStorage)
  92. {
  93. SetSetLocalStorage();
  94. }
  95. }
  96. private void LoadHandler_OnLoadEnd(object sender, Chromium.Event.CfxOnLoadEndEventArgs e)
  97. {
  98. SetSetLocalStorage();
  99. }
  100. void SetSetLocalStorage()
  101. {
  102. //添加登录后的用户信息
  103. this.frmPage.Chromium.ExecuteJavascript("localStorage.setItem('isClient',true);");
  104. this.frmPage.Chromium.ExecuteJavascript(String.Format("localStorage.setItem('userInfo',JSON.stringify({0}));", userInfo));
  105. // isSetLocalStorage = true;
  106. }
  107. public static string CurrentMicroAppletShopID = "";
  108. private void FrmMicroAppletAdmin_Shown(object sender, EventArgs e)
  109. {
  110. if (LoadMicroConfigure())
  111. {
  112. if (String.IsNullOrEmpty(CurrentMicroAppletShopID))
  113. {
  114. CurrentMicroAppletShopID = LYFZ.Software.MainBusiness.CommonLogical.SuccessfulLogin.CurrentCompanyInfoID;
  115. }
  116. if (_MicroAppletAccountList.Count > 0)
  117. {
  118. BindMicroAppletAccountList(this.comAccountList, CurrentMicroAppletShopID);
  119. }
  120. LoadMicroAppletPage(GetMicroAppletAccount(CurrentMicroAppletShopID));
  121. }
  122. else {
  123. MessageBoxCustom.Show("获取小程序帐号信息失败,请确认是否正确配置相关信息");
  124. }
  125. }
  126. void LoadMicroAppletPage(BLL.MicroApplet.MicroAppletAccount mAccount)
  127. {
  128. isInitialization = true;
  129. LYFZ.ComponentLibrary.FrmLoadHandling.LoadDoWorkMethod(delegate (object obj, BackgroundWorker backgroundWorker)
  130. {
  131. try
  132. {
  133. backgroundWorker.ReportProgress(0, "正在验证授权...");
  134. if (!String.IsNullOrEmpty(mAccount.Account) && !String.IsNullOrEmpty(mAccount.Password))
  135. {
  136. // if (String.IsNullOrEmpty(MicroAppToken))
  137. {
  138. MicroAppLoginReturn loginModel = CompanyLoginReturnToken(mAccount.Account, mAccount.Password);
  139. if (loginModel.Code != 200)
  140. {
  141. MicroAppToken = "";
  142. MessageBoxCustom.Show("获取授权失败:" + loginModel.Message, backgroundWorker: backgroundWorker);
  143. }
  144. }
  145. }
  146. else
  147. {
  148. MicroAppToken = "";
  149. MessageBoxCustom.Show(String.Format("您还没有开通“利亚方舟影楼版微信小程序”"), backgroundWorker: backgroundWorker);
  150. }
  151. }
  152. catch (Exception ex)
  153. {
  154. MessageBoxCustom.Show(String.Format("获取授权时错误:{0}", ex.Message), backgroundWorker: backgroundWorker);
  155. }
  156. });
  157. if (this.plExMainContainer.Controls.Count <= 0)
  158. {
  159. this.frmPage.SetEmbeddedWindows(this.plExMainContainer);
  160. }
  161. if (!String.IsNullOrEmpty(MicroAppToken))
  162. {
  163. frmPage.LoadUrl(this.GetMicroAppletUrl(String.Format("{0}{1}", microAppDomainName, gotoUrl), mAccount));
  164. // frmPage.LoadUrl("http://lyfz.app.local/H5UI/index.html");
  165. // frmPage.LoadUrl("http://res.app.local/H5UI/index.html");
  166. // frmPage.LoadUrl("https://html5test.com/");
  167. // frmPage.LoadUrl("http://www.baidu.com/");
  168. //frmPage.LoadUrl("http://benediktmeurer.de/ARES-6/");
  169. //frmPage.LoadUrl("https://react-md.mlaursen.com/components/pickers/date");
  170. }
  171. else
  172. {
  173. frmPage.LoadUrl("http://www.lyfz.net/index/miniapp_desc");
  174. }
  175. }
  176. void frmMicroAppletAdmin_Load(object sender, EventArgs e)
  177. {
  178. this.comAccountList.Enabled = LYFZ.BLL.BLL_ErpUser.GetRights(LYFZ.BLL.BLL_ErpUser.CurrentUserRights.MicroAppletManage, CustomAttributes.OperatingAuthority.MicroAppletAccountSwicth);
  179. this.btnSetAccount.Enabled = LYFZ.BLL.BLL_ErpUser.GetRights(LYFZ.BLL.BLL_ErpUser.CurrentUserRights.MicroAppletManage, CustomAttributes.OperatingAuthority.MicroAppletAccountSet);
  180. }
  181. LYFZ.Model.Model_ErpSystemConfigure Config = new Model.Model_ErpSystemConfigure();
  182. LYFZ.BLL.BLL_ErpSystemConfigure bllConfig = new BLL.BLL_ErpSystemConfigure();
  183. public static string MicroAppToken = "";
  184. public static string MicroAppBindingCode = "";
  185. public static string microAppInterfaceDomainName = "http://wxyx.lyfz.net";
  186. public static string microAppDomainName = "http://ivision.lyfz.net";
  187. static string AuthCompanyLogin = String.Format("{0}/api.php/Auth/companyLogin", microAppInterfaceDomainName);
  188. string GetaccountAndPwdString(BLL.MicroApplet.MicroAppletAccount mAccount)
  189. {
  190. string pwdMd5 = "";
  191. if (!String.IsNullOrEmpty(mAccount.Password))
  192. {
  193. pwdMd5 = LYFZ.WinAPI.SDKSecurity.MD5Encrypt(mAccount.Password).ToLower();
  194. }
  195. return String.Format("account_number={0}&password={1}", mAccount.Account, pwdMd5);
  196. }
  197. string GetMicroAppletUrl(string url, BLL.MicroApplet.MicroAppletAccount mAccount)
  198. {
  199. if (url.Contains("?"))
  200. {
  201. return String.Format("{0}&{1}", url, GetaccountAndPwdString(mAccount));
  202. }
  203. else
  204. {
  205. return String.Format("{0}?{1}", url, GetaccountAndPwdString(mAccount));
  206. }
  207. }
  208. public static MicroAppLoginReturn CompanyLoginReturnToken(string account, string pwd)
  209. {
  210. MicroAppLoginReturn retModel = new MicroAppLoginReturn();
  211. try
  212. {
  213. string postData = String.Format("&phone_no={0}&password={1}&openid=&verification_code=", account, LYFZ.WinAPI.SDKSecurity.MD5Encrypt(pwd).ToLower());
  214. string postReturnString = LYFZ.WinAPI.CustomPublicMethod.HttpWebRequestPOST(AuthCompanyLogin, postData, Encoding.UTF8);
  215. if (postReturnString.IndexOf("{") == 0)
  216. {
  217. dynamic postReturnObj = Newtonsoft.Json.JsonConvert.DeserializeObject(postReturnString);
  218. if (Convert.ToInt32(postReturnObj["meta"]["code"]) == 200)
  219. {
  220. MicroAppToken = postReturnObj["body"]["token"];
  221. retModel.UserInfo = Newtonsoft.Json.JsonConvert.SerializeObject(postReturnObj["body"]);
  222. retModel.AppToken = MicroAppToken;
  223. userInfo = retModel.UserInfo;
  224. string getReturnString = HttpWebRequestGET(String.Format("{0}/api.php/IvisionBackstage/getBindAccount", microAppInterfaceDomainName), MicroAppToken, Encoding.UTF8);
  225. dynamic getReturnObj = Newtonsoft.Json.JsonConvert.DeserializeObject(getReturnString);
  226. if (getReturnString.IndexOf("{") == 0 && Convert.ToInt32(getReturnObj["meta"]["code"]) == 200)
  227. {
  228. retModel.Code = 200;
  229. retModel.Message = "OK";
  230. retModel.Bind_code = getReturnObj["body"]["bind_code"];
  231. }
  232. }
  233. else
  234. {
  235. MicroAppToken = "";
  236. retModel.Message = postReturnObj["meta"]["message"];
  237. }
  238. }
  239. else
  240. {
  241. MicroAppToken = "";
  242. retModel.Message = postReturnString;
  243. }
  244. }
  245. catch (Exception ex)
  246. {
  247. retModel.Message = ex.Message;
  248. }
  249. return retModel;
  250. }
  251. static List<LYFZ.Model.Model_ErpCompanyInfo> _CompayList = new List<Model.Model_ErpCompanyInfo>();
  252. public static List<BLL.MicroApplet.MicroAppletAccount> _MicroAppletAccountList = new List<BLL.MicroApplet.MicroAppletAccount>();
  253. public static bool LoadMicroConfigure()
  254. {
  255. bool retBl = false;
  256. try
  257. {
  258. _MicroAppletAccountList = new BLL.BLL_ErpSystemConfigure().GetMicroAppletAccountList();
  259. if (_CompayList.Count <= 0)
  260. {
  261. _CompayList = new LYFZ.BLL.BLL_ErpCompanyInfo().GetModelList("1=1");
  262. }
  263. retBl = true;
  264. }
  265. catch (Exception ex)
  266. {
  267. MessageBoxCustom.Show("加载微信小程序帐号信息时出错:" + ex.Message);
  268. }
  269. return retBl;
  270. }
  271. static LYFZ.Model.Model_ErpCompanyInfo GetCompanyInfo(string shopID)
  272. {
  273. if (_CompayList.Any(c => c.Company_DividedShop.ToLower() == shopID.ToLower()))
  274. {
  275. return _CompayList.Find(c => c.Company_DividedShop.ToLower() == shopID.ToLower());
  276. }
  277. else
  278. {
  279. return new Model.Model_ErpCompanyInfo();
  280. }
  281. }
  282. public static void BindMicroAppletAccountList(ComponentLibrary.ComboBoxEx comBox, string dfShopID)
  283. {
  284. comBox.Items.Clear();
  285. foreach (BLL.MicroApplet.MicroAppletAccount mAccount in _MicroAppletAccountList)
  286. {
  287. LYFZ.Model.Model_ErpCompanyInfo comp = GetCompanyInfo(mAccount.ShopID);
  288. ItemValue item = new ItemValue(mAccount, String.Format("【{0}】{1}", comp.Company_Name,mAccount.Account));
  289. comBox.Items.Add(item);
  290. if (dfShopID.Trim().Length > 0 && mAccount.ShopID.ToLower() == dfShopID.ToLower())
  291. {
  292. comBox.SelectedItem = item;
  293. }
  294. else if (dfShopID.Trim().Length <= 0 && mAccount.ShopID.ToLower() == LYFZ.Software.MainBusiness.CommonLogical.SuccessfulLogin.CurrentCompanyInfoID.ToLower())
  295. {
  296. comBox.SelectedItem = item;
  297. }
  298. }
  299. }
  300. public static BLL.MicroApplet.MicroAppletAccount GetMicroAppletAccount(string shopID)
  301. {
  302. if (_MicroAppletAccountList.Any(m => m.ShopID.ToLower() == shopID.ToLower()))
  303. {
  304. return _MicroAppletAccountList.Find(m => m.ShopID.ToLower() == shopID.ToLower());
  305. }
  306. else {
  307. return new BLL.MicroApplet.MicroAppletAccount();
  308. }
  309. }
  310. private void ContextMenuHandler_RunContextMenu(object sender, Chromium.Event.CfxRunContextMenuEventArgs e)
  311. {
  312. e.SetReturnValue(true);
  313. }
  314. void btnRefresh_Click(object sender, EventArgs e)
  315. {
  316. // isSetLocalStorage = false;
  317. myRefresh(this.cbDelHuanChun.Checked);
  318. }
  319. void myRefresh(bool isDelHuanChun)
  320. {
  321. if (isDelHuanChun)
  322. {
  323. CurrentMicroAppletShopID = "";
  324. MicroAppToken = "";
  325. this.frmPage.Browser.ReloadIgnoreCache();
  326. if (this.comAccountList.SelectedItem != null)
  327. {
  328. BLL.MicroApplet.MicroAppletAccount mAccount = (BLL.MicroApplet.MicroAppletAccount)((ItemValue)this.comAccountList.SelectedItem).Value;
  329. LoadMicroAppletPage(mAccount);
  330. }
  331. }
  332. else
  333. {
  334. this.frmPage.Browser.Reload();
  335. }
  336. }
  337. /// <summary>
  338. /// Web GET方式提交
  339. /// </summary>
  340. /// <param name="url"></param>
  341. /// <param name="_Encoding">字符编码</param>
  342. /// <returns></returns>
  343. public static string HttpWebRequestGET(string url, string token, Encoding _Encoding = null, bool isUrlDecode = true)
  344. {
  345. try
  346. {
  347. System.GC.Collect();
  348. if (_Encoding == null)
  349. {
  350. _Encoding = System.Text.Encoding.Default;
  351. }
  352. if (System.Net.ServicePointManager.DefaultConnectionLimit < 512)
  353. {
  354. System.Net.ServicePointManager.DefaultConnectionLimit = 512;
  355. }
  356. LYFZ.WinAPI.CustomPublicMethod.SetServicePointManagerSecurityProtocol(url);
  357. System.Net.HttpWebRequest webRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
  358. webRequest.Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/json,*/*";
  359. webRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Zune 4.7; BOIE9;ZHCN)";
  360. webRequest.Method = "GET";
  361. webRequest.Timeout = 600000;
  362. webRequest.KeepAlive = false;
  363. webRequest.ProtocolVersion = System.Net.HttpVersion.Version10;
  364. webRequest.Headers.Add("token", token);
  365. // webRequest.Headers.Add(headers);
  366. /* if (_ContentType != null)
  367. {
  368. webRequest.ContentType = _ContentType;
  369. }
  370. if (myCookieContainer != null)
  371. {
  372. webRequest.CookieContainer = myCookieContainer;
  373. }*/
  374. System.Threading.Thread.Sleep(5);
  375. using (System.Net.WebResponse wr = webRequest.GetResponse())
  376. {
  377. System.IO.StreamReader str = new System.IO.StreamReader(wr.GetResponseStream(), _Encoding);
  378. string strMsg = str.ReadToEnd();
  379. str.Close();
  380. str.Dispose();
  381. str = null;
  382. webRequest.Abort();
  383. webRequest = null;
  384. if (isUrlDecode)
  385. {
  386. strMsg = System.Web.HttpUtility.UrlDecode(strMsg);
  387. }
  388. return strMsg;
  389. //在这里对接收到的页面内容进行处理
  390. }
  391. }
  392. catch (Exception ex)
  393. {
  394. System.Net.ServicePointManager.Expect100Continue = false;
  395. return "Request failed,Exception:" + ex.Message;
  396. }
  397. }
  398. /// <summary>
  399. /// Web POST方式提交
  400. /// </summary>
  401. /// <param name="url"></param>
  402. /// <param name="postData"></param>
  403. /// <param name="_Encoding">字符编码</param>
  404. /// <param name="_ContentType"> Content-typeHTTP 标头的值</param>
  405. /// <returns></returns>
  406. public static string HttpWebRequestPOST(string url, string postData, MicroAppLoginReturn appLogin, Encoding _Encoding = null, bool isUrlDecode = true)
  407. {
  408. try
  409. {
  410. //string postData = "CustomerID=LYFZTYUF"
  411. // + "&ShareTitle=" + System.Web.HttpUtility.UrlEncode("OK!Test")
  412. // + "&ShareDescription=" + System.Web.HttpUtility.UrlEncode("利亚方舟微相册分享体验微 信号:340508706@qq.com");
  413. System.GC.Collect();
  414. if (_Encoding == null)
  415. {
  416. _Encoding = Encoding.Default;
  417. }
  418. byte[] byteArray = _Encoding.GetBytes(postData);
  419. if (System.Net.ServicePointManager.DefaultConnectionLimit < 512)
  420. {
  421. System.Net.ServicePointManager.DefaultConnectionLimit = 512;
  422. }
  423. //这一句一定要写在创建连接的前面。使用回调的方法进行证书验证。
  424. // System.Net.ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
  425. LYFZ.WinAPI.CustomPublicMethod.SetServicePointManagerSecurityProtocol(url);
  426. // string url = "http://localhost:8000/webService/POSTText?t=" + DateTime.Now.ToString("yyyyMMddhhmmss"); //POST到网站
  427. System.Net.HttpWebRequest webRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(new Uri(url));
  428. // System.Net.CookieContainer cookies = new System.Net.CookieContainer();
  429. // webRequest.CookieContainer=cookies;
  430. webRequest.Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*";
  431. webRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Zune 4.7; BOIE9;ZHCN)";
  432. webRequest.KeepAlive = false;
  433. webRequest.ProtocolVersion = System.Net.HttpVersion.Version10;
  434. webRequest.Method = "POST";
  435. webRequest.Headers.Add("token", appLogin.AppToken);
  436. webRequest.Headers.Add("bindcode", appLogin.Bind_code);
  437. webRequest.ContentType = "application/x-www-form-urlencoded";
  438. webRequest.ContentLength = byteArray.Length;
  439. /* webRequest.Headers.Add(headers);
  440. if (myCookieContainer != null)
  441. {
  442. webRequest.CookieContainer = myCookieContainer;
  443. }*/
  444. System.IO.Stream newStream = webRequest.GetRequestStream();
  445. newStream.Write(byteArray, 0, byteArray.Length);
  446. newStream.Close();
  447. newStream = null;
  448. //接收返回信息:
  449. webRequest.Timeout = 600000;
  450. System.Threading.Thread.Sleep(10);
  451. using (System.Net.WebResponse wr = webRequest.GetResponse())
  452. {
  453. System.IO.StreamReader str = new System.IO.StreamReader(wr.GetResponseStream(), _Encoding);
  454. string strMsg = str.ReadToEnd();
  455. str.Close();
  456. str.Dispose();
  457. str = null;
  458. webRequest.Abort();
  459. webRequest = null;
  460. if (isUrlDecode)
  461. {
  462. strMsg = System.Web.HttpUtility.UrlDecode(strMsg);
  463. }
  464. return strMsg;
  465. //在这里对接收到的页面内容进行处理
  466. }
  467. }
  468. catch (Exception ex)
  469. {
  470. System.Net.ServicePointManager.Expect100Continue = false;
  471. return "Request failed,Exception:" + ex.Message;
  472. }
  473. }
  474. }
  475. }