diff --git a/how origin b/how origin
deleted file mode 100644
index 1585038..0000000
--- a/how origin	
+++ /dev/null
@@ -1,14 +0,0 @@
-
-                   SSUUMMMMAARRYY OOFF LLEESSSS CCOOMMMMAANNDDSS
-
-      Commands marked with * may be preceded by a number, _N.
-      Notes in parentheses indicate the behavior if _N is given.
-      A key preceded by a caret indicates the Ctrl key; thus ^K is ctrl-K.
-
-  h  H                 Display this help.
-  q  :q  Q  :Q  ZZ     Exit.
- ---------------------------------------------------------------------------
-
-                           MMOOVVIINNGG
-
-  e  ^E  j  ^N  CR  *  Forward  one line   (or _N lines).
diff --git a/page.html b/page.html
deleted file mode 100644
index db31592..0000000
--- a/page.html
+++ /dev/null
@@ -1,480 +0,0 @@
-<!DOCTYPE html>
-<!-- [ published at 2025-12-09 09:10:17 ] -->
-
-<html>
-<head>
-    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
-    <title>å½åæ°é»_æ°é»ä¸­å¿_æ°æµªç½</title>
-<meta name="keywords" content="å½åæ¶æ¿,åå°æ°é»">
-<meta name="description" content="æ°é»ä¸­å¿å½åé¢éï¼çºµè§å½åæ¶æ¿ãç»¼è¿°è¯è®ºåå¾ççæ ç®ï¼ä¸»è¦åæ¬æ¶æ¿è¦é»ãåå°æ°é»ãæ¸¯æ¾³å°æ°é»ãåªä½èç¦ãè¯è®ºåæã">
-<meta name="robots" content="noarchive">
-<meta name="Baiduspider" content="noarchive">
-<meta http-equiv="Cache-Control" content="no-transform">
-<meta http-equiv="Cache-Control" content="no-siteapp">
-<meta name="applicable-device" content="pc,mobile">
-<meta name="MobileOptimized" content="width">
-<meta name="HandheldFriendly" content="true">
-<meta content="always" name="referrer">
-    <link rel="mask-icon" sizes="any" href="//www.sina.com.cn/favicon.svg" color="red">
-    <!-- ç»å½ css -->
-    <link rel="stylesheet" type="text/css" href="//i.sso.sina.com.cn/css/userpanel/v1/top_account_v2.css">
-    <!-- feed css -->
-    <link rel="stylesheet" href="//n0.sinaimg.cn/news/china/feed.1.1.7.css" type="text/css" />
-    <link rel="stylesheet" href="//news.sina.com.cn/268/2014/0919/bshare_update.css" type="text/css">
-
-    <script src='//n.sinaimg.cn/news/libs/jquery-1.11.1.min.js'></script>
-    <link href="//simg.sinajs.cn/products/news_finance/2018/pc_china_home/css/index-1edb9c.css" rel="stylesheet">
-	<style type="text/css">
-		ul.news-1 li{font-weight:normal;font-size:18px}
-		ul.news-2 li{font-size:18px}
-		.dropdown_cover li{text-align: center;line-height: 31px;}
-		.dropdown_cover a{float: none;width: 100%;height: 100%;padding-left: unset;line-height: inherit;color: #333;}
-	</style>
-<meta name="sudameta" content="dataid:wpcomos:156866" /></head>
-
-<body><!-- body code begin -->
-
-
-
-<!-- SUDA_CODE_START --> 
-
-<script type="text/javascript"> 
-
-//<!--
-
-(function(){var an="V=2.1.16";var ah=window,F=document,s=navigator,W=s.userAgent,ao=ah.screen,j=ah.location.href;var aD="https:"==ah.location.protocol?"https://s":"http://",ay="beacon.sina.com.cn";var N=aD+ay+"/a.gif?",z=aD+ay+"/g.gif?",R=aD+ay+"/f.gif?",ag=aD+ay+"/e.gif?",aB=aD+"beacon.sinauda.com/i.gif?";var aA=F.referrer.toLowerCase();var aa="SINAGLOBAL",Y="FSINAGLOBAL",H="Apache",P="ULV",l="SUP",aE="UOR",E="_s_acc",X="_s_tentry",n=false,az=false,B=(document.domain=="sina.com.cn")?true:false;var o=0;var aG=false,A=false;var al="";var m=16777215,Z=0,C,K=0;var r="",b="",a="";var M=[],S=[],I=[];var u=0;var v=0;var p="";var am=false;var w=false;function O(){var e=document.createElement("iframe");e.src=aD+ay+"/data.html?"+new Date().getTime();e.id="sudaDataFrame";e.style.height="0px";e.style.width="1px";e.style.overflow="hidden";e.frameborder="0";e.scrolling="no";document.getElementsByTagName("head")[0].appendChild(e)}function k(){var e=document.createElement("iframe");e.src=aD+ay+"/ckctl.html";e.id="ckctlFrame";e.style.height="0px";e.style.width="1px";e.style.overflow="hidden";e.frameborder="0";e.scrolling="no";document.getElementsByTagName("head")[0].appendChild(e)}function q(){var e=document.createElement("script");e.src=aD+ay+"/h.js";document.getElementsByTagName("head")[0].appendChild(e)}function h(aH,i){var D=F.getElementsByName(aH);var e=(i>0)?i:0;return(D.length>e)?D[e].content:""}function aF(){var aJ=F.getElementsByName("sudameta");var aR=[];for(var aO=0;aO<aJ.length;aO++){var aK=aJ[aO].content;if(aK){if(aK.indexOf(";")!=-1){var D=aK.split(";");for(var aH=0;aH<D.length;aH++){var aP=aw(D[aH]);if(!aP){continue}aR.push(aP)}}else{aR.push(aK)}}}var aM=F.getElementsByTagName("meta");for(var aO=0,aI=aM.length;aO<aI;aO++){var aN=aM[aO];if(aN.name=="tags"){aR.push("content_tags:"+encodeURI(aN.content))}}var aL=t("vjuids");aR.push("vjuids:"+aL);var e="";var aQ=j.indexOf("#");if(aQ!=-1){e=escape(j.substr(aQ+1));aR.push("hashtag:"+e)}return aR}function V(aK,D,aI,aH){if(aK==""){return""}aH=(aH=="")?"=":aH;D+=aH;var aJ=aK.indexOf(D);if(aJ<0){return""}aJ+=D.length;var i=aK.indexOf(aI,aJ);if(i<aJ){i=aK.length}return aK.substring(aJ,i)}function t(e){if(undefined==e||""==e){return""}return V(F.cookie,e,";","")}function at(aI,e,i,aH){if(e!=null){if((undefined==aH)||(null==aH)){aH="sina.com.cn"}if((undefined==i)||(null==i)||(""==i)){F.cookie=aI+"="+e+";domain="+aH+";path=/"}else{var D=new Date();var aJ=D.getTime();aJ=aJ+86400000*i;D.setTime(aJ);aJ=D.getTime();F.cookie=aI+"="+e+";domain="+aH+";expires="+D.toUTCString()+";path=/"}}}function f(D){try{var i=document.getElementById("sudaDataFrame").contentWindow.storage;return i.get(D)}catch(aH){return false}}function ar(D,aH){try{var i=document.getElementById("sudaDataFrame").contentWindow.storage;i.set(D,aH);return true}catch(aI){return false}}function L(){var aJ=15;var D=window.SUDA.etag;if(!B){return"-"}if(u==0){O();q()}if(D&&D!=undefined){w=true}ls_gid=f(aa);if(ls_gid===false||w==false){return false}else{am=true}if(ls_gid&&ls_gid.length>aJ){at(aa,ls_gid,3650);n=true;return ls_gid}else{if(D&&D.length>aJ){at(aa,D,3650);az=true}var i=0,aI=500;var aH=setInterval((function(){var e=t(aa);if(w){e=D}i+=1;if(i>3){clearInterval(aH)}if(e.length>aJ){clearInterval(aH);ar(aa,e)}}),aI);return w?D:t(aa)}}function U(e,aH,D){var i=e;if(i==null){return false}aH=aH||"click";if((typeof D).toLowerCase()!="function"){return}if(i.attachEvent){i.attachEvent("on"+aH,D)}else{if(i.addEventListener){i.addEventListener(aH,D,false)}else{i["on"+aH]=D}}return true}function af(){if(window.event!=null){return window.event}else{if(window.event){return window.event}var D=arguments.callee.caller;var i;var aH=0;while(D!=null&&aH<40){i=D.arguments[0];if(i&&(i.constructor==Event||i.constructor==MouseEvent||i.constructor==KeyboardEvent)){return i}aH++;D=D.caller}return i}}function g(i){i=i||af();if(!i.target){i.target=i.srcElement;i.pageX=i.x;i.pageY=i.y}if(typeof i.layerX=="undefined"){i.layerX=i.offsetX}if(typeof i.layerY=="undefined"){i.layerY=i.offsetY}return i}function aw(aH){if(typeof aH!=="string"){throw"trim need a string as parameter"}var e=aH.length;var D=0;var i=/(\u3000|\s|\t|\u00A0)/;while(D<e){if(!i.test(aH.charAt(D))){break}D+=1}while(e>D){if(!i.test(aH.charAt(e-1))){break}e-=1}return aH.slice(D,e)}function c(e){return Object.prototype.toString.call(e)==="[object Array]"}function J(aH,aL){var aN=aw(aH).split("&");var aM={};var D=function(i){if(aL){try{return decodeURIComponent(i)}catch(aP){return i}}else{return i}};for(var aJ=0,aK=aN.length;aJ<aK;aJ++){if(aN[aJ]){var aI=aN[aJ].split("=");var e=aI[0];var aO=aI[1];if(aI.length<2){aO=e;e="$nullName"}if(!aM[e]){aM[e]=D(aO)}else{if(c(aM[e])!=true){aM[e]=[aM[e]]}aM[e].push(D(aO))}}}return aM}function ac(D,aI){for(var aH=0,e=D.length;aH<e;aH++){aI(D[aH],aH)}}function ak(i){var e=new RegExp("^http(?:s)?://([^/]+)","im");if(i.match(e)){return i.match(e)[1].toString()}else{return""}}function aj(aO){try{var aL="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var D="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=";var aQ=function(e){var aR="",aS=0;for(;aS<e.length;aS++){aR+="%"+aH(e[aS])}return decodeURIComponent(aR)};var aH=function(e){var i="0"+e.toString(16);return i.length<=2?i:i.substr(1)};var aP=function(aY,aV,aR){if(typeof(aY)=="string"){aY=aY.split("")}var aX=function(a7,a9){for(var a8=0;a8<a7.length;a8++){if(a7[a8]==a9){return a8}}return -1};var aS=[];var a6,a4,a1="";var a5,a3,a0,aZ="";if(aY.length%4!=0){}var e=/[^A-Za-z0-9\+\/\=]/g;var a2=aL.split("");if(aV=="urlsafe"){e=/[^A-Za-z0-9\-_\=]/g;a2=D.split("")}var aU=0;if(aV=="binnary"){a2=[];for(aU=0;aU<=64;aU++){a2[aU]=aU+128}}if(aV!="binnary"&&e.exec(aY.join(""))){return aR=="array"?[]:""}aU=0;do{a5=aX(a2,aY[aU++]);a3=aX(a2,aY[aU++]);a0=aX(a2,aY[aU++]);aZ=aX(a2,aY[aU++]);a6=(a5<<2)|(a3>>4);a4=((a3&15)<<4)|(a0>>2);a1=((a0&3)<<6)|aZ;aS.push(a6);if(a0!=64&&a0!=-1){aS.push(a4)}if(aZ!=64&&aZ!=-1){aS.push(a1)}a6=a4=a1="";a5=a3=a0=aZ=""}while(aU<aY.length);if(aR=="array"){return aS}var aW="",aT=0;for(;aT<aS.lenth;aT++){aW+=String.fromCharCode(aS[aT])}return aW};var aI=[];var aN=aO.substr(0,3);var aK=aO.substr(3);switch(aN){case"v01":for(var aJ=0;aJ<aK.length;aJ+=2){aI.push(parseInt(aK.substr(aJ,2),16))}return decodeURIComponent(aQ(aP(aI,"binnary","array")));break;case"v02":aI=aP(aK,"urlsafe","array");return aQ(aP(aI,"binnary","array"));break;default:return decodeURIComponent(aO)}}catch(aM){return""}}var ap={screenSize:function(){return(m&8388608==8388608)?ao.width+"x"+ao.height:""},colorDepth:function(){return(m&4194304==4194304)?ao.colorDepth:""},appCode:function(){return(m&2097152==2097152)?s.appCodeName:""},appName:function(){return(m&1048576==1048576)?((s.appName.indexOf("Microsoft Internet Explorer")>-1)?"MSIE":s.appName):""},cpu:function(){return(m&524288==524288)?(s.cpuClass||s.oscpu):""},platform:function(){return(m&262144==262144)?(s.platform):""},jsVer:function(){if(m&131072!=131072){return""}var aI,e,aK,D=1,aH=0,i=(s.appName.indexOf("Microsoft Internet Explorer")>-1)?"MSIE":s.appName,aJ=s.appVersion;if("MSIE"==i){e="MSIE";aI=aJ.indexOf(e);if(aI>=0){aK=window.parseInt(aJ.substring(aI+5));if(3<=aK){D=1.1;if(4<=aK){D=1.3}}}}else{if(("Netscape"==i)||("Opera"==i)||("Mozilla"==i)){D=1.3;e="Netscape6";aI=aJ.indexOf(e);if(aI>=0){D=1.5}}}return D},network:function(){if(m&65536!=65536){return""}var i="";i=(s.connection&&s.connection.type)?s.connection.type:i;try{F.body.addBehavior("#default#clientCaps");i=F.body.connectionType}catch(D){i="unkown"}return i},language:function(){return(m&32768==32768)?(s.systemLanguage||s.language):""},timezone:function(){return(m&16384==16384)?(new Date().getTimezoneOffset()/60):""},flashVer:function(){if(m&8192!=8192){return""}var aK=s.plugins,aH,aL,aN;if(aK&&aK.length){for(var aJ in aK){aL=aK[aJ];if(aL.description==null){continue}if(aH!=null){break}aN=aL.description.toLowerCase();if(aN.indexOf("flash")!=-1){aH=aL.version?parseInt(aL.version):aN.match(/\d+/);continue}}}else{if(window.ActiveXObject){for(var aI=10;aI>=2;aI--){try{var D=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+aI);if(D){aH=aI;break}}catch(aM){}}}else{if(W.indexOf("webtv/2.5")!=-1){aH=3}else{if(W.indexOf("webtv")!=-1){aH=2}}}}return aH},javaEnabled:function(){if(m&4096!=4096){return""}var D=s.plugins,i=s.javaEnabled(),aH,aI;if(i==true){return 1}if(D&&D.length){for(var e in D){aH=D[e];if(aH.description==null){continue}if(i!=null){break}aI=aH.description.toLowerCase();if(aI.indexOf("java plug-in")!=-1){i=parseInt(aH.version);continue}}}else{if(window.ActiveXObject){i=(new ActiveXObject("JavaWebStart.IsInstalled")!=null)}}return i?1:0}};var ad={pageId:function(i){var D=i||r,aK="-9999-0-0-1";if((undefined==D)||(""==D)){try{var aH=h("publishid");if(""!=aH){var aJ=aH.split(",");if(aJ.length>0){if(aJ.length>=3){aK="-9999-0-"+aJ[1]+"-"+aJ[2]}D=aJ[0]}}else{D="0"}}catch(aI){D="0"}D=D+aK}return D},sessionCount:function(){var e=t("_s_upa");if(e==""){e=0}return e},excuteCount:function(){return SUDA.sudaCount},referrer:function(){if(m&2048!=2048){return""}var e=/^[^\?&#]*.swf([\?#])?/;if((aA=="")||(aA.match(e))){var i=V(j,"ref","&","");if(i!=""){return escape(i)}}return escape(aA)},isHomepage:function(){if(m&1024!=1024){return""}var D="";try{F.body.addBehavior("#default#homePage");D=F.body.isHomePage(j)?"Y":"N"}catch(i){D="unkown"}return D},PGLS:function(){return(m&512==512)?h("stencil"):""},ZT:function(){if(m&256!=256){return""}var e=h("subjectid");e.replace(",",".");e.replace(";",",");return escape(e)},mediaType:function(){return(m&128==128)?h("mediaid"):""},domCount:function(){return(m&64==64)?F.getElementsByTagName("*").length:""},iframeCount:function(){return(m&32==32)?F.getElementsByTagName("iframe").length:""}};var av={visitorId:function(){var i=15;var e=t(aa);if(e.length>i&&u==0){return e}else{return}},fvisitorId:function(e){if(!e){var e=t(Y);return e}else{at(Y,e,3650)}},sessionId:function(){var e=t(H);if(""==e){var i=new Date();e=Math.random()*10000000000000+"."+i.getTime()}return e},flashCookie:function(e){if(e){}else{return p}},lastVisit:function(){var D=t(H);var aI=t(P);var aH=aI.split(":");var aJ="",i;if(aH.length>=6){if(D!=aH[4]){i=new Date();var e=new Date(window.parseInt(aH[0]));aH[1]=window.parseInt(aH[1])+1;if(i.getMonth()!=e.getMonth()){aH[2]=1}else{aH[2]=window.parseInt(aH[2])+1}if(((i.getTime()-e.getTime())/86400000)>=7){aH[3]=1}else{if(i.getDay()<e.getDay()){aH[3]=1}else{aH[3]=window.parseInt(aH[3])+1}}aJ=aH[0]+":"+aH[1]+":"+aH[2]+":"+aH[3];aH[5]=aH[0];aH[0]=i.getTime();at(P,aH[0]+":"+aH[1]+":"+aH[2]+":"+aH[3]+":"+D+":"+aH[5],360)}else{aJ=aH[5]+":"+aH[1]+":"+aH[2]+":"+aH[3]}}else{i=new Date();aJ=":1:1:1";at(P,i.getTime()+aJ+":"+D+":",360)}return aJ},userNick:function(){if(al!=""){return al}var D=unescape(t(l));if(D!=""){var i=V(D,"ag","&","");var e=V(D,"user","&","");var aH=V(D,"uid","&","");var aJ=V(D,"sex","&","");var aI=V(D,"dob","&","");al=i+":"+e+":"+aH+":"+aJ+":"+aI;return al}else{return""}},userOrigin:function(){if(m&4!=4){return""}var e=t(aE);var i=e.split(":");if(i.length>=2){return i[0]}else{return""}},advCount:function(){return(m&2==2)?t(E):""},setUOR:function(){var aL=t(aE),aP="",i="",aO="",aI="",aM=j.toLowerCase(),D=F.referrer.toLowerCase();var aQ=/[&|?]c=spr(_[A-Za-z0-9]{1,}){3,}/;var aK=new Date();if(aM.match(aQ)){aO=aM.match(aQ)[0]}else{if(D.match(aQ)){aO=D.match(aQ)[0]}}if(aO!=""){aO=aO.substr(3)+":"+aK.getTime()}if(aL==""){if(t(P)==""){aP=ak(D);i=ak(aM)}at(aE,aP+","+i+","+aO,365)}else{var aJ=0,aN=aL.split(",");if(aN.length>=1){aP=aN[0]}if(aN.length>=2){i=aN[1]}if(aN.length>=3){aI=aN[2]}if(aO!=""){aJ=1}else{var aH=aI.split(":");if(aH.length>=2){var e=new Date(window.parseInt(aH[1]));if(e.getTime()<(aK.getTime()-86400000*30)){aJ=1}}}if(aJ){at(aE,aP+","+i+","+aO,365)}}},setAEC:function(e){if(""==e){return}var i=t(E);if(i.indexOf(e+",")<0){i=i+e+","}at(E,i,7)},ssoInfo:function(){var D=unescape(aj(t("sso_info")));if(D!=""){if(D.indexOf("uid=")!=-1){var i=V(D,"uid","&","");return escape("uid:"+i)}else{var e=V(D,"u","&","");return escape("u:"+unescape(e))}}else{return""}},subp:function(){return t("SUBP")}};var ai={CI:function(){var e=["sz:"+ap.screenSize(),"dp:"+ap.colorDepth(),"ac:"+ap.appCode(),"an:"+ap.appName(),"cpu:"+ap.cpu(),"pf:"+ap.platform(),"jv:"+ap.jsVer(),"ct:"+ap.network(),"lg:"+ap.language(),"tz:"+ap.timezone(),"fv:"+ap.flashVer(),"ja:"+ap.javaEnabled()];return"CI="+e.join("|")},PI:function(e){var i=["pid:"+ad.pageId(e),"st:"+ad.sessionCount(),"et:"+ad.excuteCount(),"ref:"+ad.referrer(),"hp:"+ad.isHomepage(),"PGLS:"+ad.PGLS(),"ZT:"+ad.ZT(),"MT:"+ad.mediaType(),"keys:","dom:"+ad.domCount(),"ifr:"+ad.iframeCount()];return"PI="+i.join("|")},UI:function(){var e=["vid:"+av.visitorId(),"sid:"+av.sessionId(),"lv:"+av.lastVisit(),"un:"+av.userNick(),"uo:"+av.userOrigin(),"ae:"+av.advCount(),"lu:"+av.fvisitorId(),"si:"+av.ssoInfo(),"rs:"+(n?1:0),"dm:"+(B?1:0),"su:"+av.subp()];return"UI="+e.join("|")},EX:function(i,e){if(m&1!=1){return""}i=(null!=i)?i||"":b;e=(null!=e)?e||"":a;return"EX=ex1:"+i+"|ex2:"+e},MT:function(){return"MT="+aF().join("|")},V:function(){return an},R:function(){return"gUid_"+new Date().getTime()}};function ax(){var aK="-",aH=F.referrer.toLowerCase(),D=j.toLowerCase();if(""==t(X)){if(""!=aH){aK=ak(aH)}at(X,aK,"","weibo.com")}var aI=/weibo.com\/reg.php/;if(D.match(aI)){var aJ=V(unescape(D),"sharehost","&","");var i=V(unescape(D),"appkey","&","");if(""!=aJ){at(X,aJ,"","weibo.com")}at("appkey",i,"","weibo.com")}}function d(e,i){G(e,i)}function G(i,D){D=D||{};var e=new Image(),aH;if(D&&D.callback&&typeof D.callback=="function"){e.onload=function(){clearTimeout(aH);aH=null;D.callback(true)}}SUDA.img=e;e.src=i;aH=setTimeout(function(){if(D&&D.callback&&typeof D.callback=="function"){D.callback(false);e.onload=null}},D.timeout||2000)}function x(e,aH,D,aI){SUDA.sudaCount++;if(!av.visitorId()&&!L()){if(u<3){u++;setTimeout(x,500);return}}var i=N+[ai.V(),ai.CI(),ai.PI(e),ai.UI(),ai.MT(),ai.EX(aH,D),ai.R()].join("&");G(i,aI)}function y(e,D,i){if(aG||A){return}if(SUDA.sudaCount!=0){return}x(e,D,i)}function ab(e,aH){if((""==e)||(undefined==e)){return}av.setAEC(e);if(0==aH){return}var D="AcTrack||"+t(aa)+"||"+t(H)+"||"+av.userNick()+"||"+e+"||";var i=ag+D+"&gUid_"+new Date().getTime();d(i)}function aq(aI,e,i,aJ){aJ=aJ||{};if(!i){i=""}else{i=escape(i)}var aH="UATrack||"+t(aa)+"||"+t(H)+"||"+av.userNick()+"||"+aI+"||"+e+"||"+ad.referrer()+"||"+i+"||"+(aJ.realUrl||"")+"||"+(aJ.ext||"");var D=ag+aH+"&gUid_"+new Date().getTime();d(D,aJ)}function aC(aK){var i=g(aK);var aI=i.target;var aH="",aL="",D="";var aJ;if(aI!=null&&aI.getAttribute&&(!aI.getAttribute("suda-uatrack")&&!aI.getAttribute("suda-actrack")&&!aI.getAttribute("suda-data"))){while(aI!=null&&aI.getAttribute&&(!!aI.getAttribute("suda-uatrack")||!!aI.getAttribute("suda-actrack")||!!aI.getAttribute("suda-data"))==false){if(aI==F.body){return}aI=aI.parentNode}}if(aI==null||aI.getAttribute==null){return}aH=aI.getAttribute("suda-actrack")||"";aL=aI.getAttribute("suda-uatrack")||aI.getAttribute("suda-data")||"";sudaUrls=aI.getAttribute("suda-urls")||"";if(aL){aJ=J(aL);if(aI.tagName.toLowerCase()=="a"){D=aI.href}opts={};opts.ext=(aJ.ext||"");aJ.key&&SUDA.uaTrack&&SUDA.uaTrack(aJ.key,aJ.value||aJ.key,D,opts)}if(aH){aJ=J(aH);aJ.key&&SUDA.acTrack&&SUDA.acTrack(aJ.key,aJ.value||aJ.key)}}if(window.SUDA&&Object.prototype.toString.call(window.SUDA)==="[object Array]"){for(var Q=0,ae=SUDA.length;Q<ae;Q++){switch(SUDA[Q][0]){case"setGatherType":m=SUDA[Q][1];break;case"setGatherInfo":r=SUDA[Q][1]||r;b=SUDA[Q][2]||b;a=SUDA[Q][3]||a;break;case"setPerformance":Z=SUDA[Q][1];break;case"setPerformanceFilter":C=SUDA[Q][1];break;case"setPerformanceInterval":K=SUDA[Q][1]*1||0;K=isNaN(K)?0:K;break;case"setGatherMore":M.push(SUDA[Q].slice(1));break;case"acTrack":S.push(SUDA[Q].slice(1));break;case"uaTrack":I.push(SUDA[Q].slice(1));break}}}aG=(function(D,i){if(ah.top==ah){return false}else{try{if(F.body.clientHeight==0){return false}return((F.body.clientHeight>=D)&&(F.body.clientWidth>=i))?false:true}catch(aH){return true}}})(320,240);A=(function(){return false})();av.setUOR();var au=av.sessionId();window.SUDA=window.SUDA||[];SUDA.sudaCount=SUDA.sudaCount||0;SUDA.log=function(){x.apply(null,arguments)};SUDA.acTrack=function(){ab.apply(null,arguments)};SUDA.uaTrack=function(){aq.apply(null,arguments)};U(F.body,"click",aC);window.GB_SUDA=SUDA;GB_SUDA._S_pSt=function(){};GB_SUDA._S_acTrack=function(){ab.apply(null,arguments)};GB_SUDA._S_uaTrack=function(){aq.apply(null,arguments)};window._S_pSt=function(){};window._S_acTrack=function(){ab.apply(null,arguments)};window._S_uaTrack=function(){aq.apply(null,arguments)};window._S_PID_="";if(!window.SUDA.disableClickstream){y()}try{k()}catch(T){}})();
-
-//-->
-
-</script> 
-
-<noScript> 
-
-<div style='position:absolute;top:0;left:0;width:0;height:0;visibility:hidden'><img width=0 height=0 src='//beacon.sina.com.cn/a.gif?noScript' border='0' alt='' /></div> 
-
-</noScript> 
-
-<!-- SUDA_CODE_END -->
-
-
-
-<!-- SSO_GETCOOKIE_START -->
-
-<script type="text/javascript">var sinaSSOManager=sinaSSOManager||{};sinaSSOManager.getSinaCookie=function(){function dc(u){if(u==undefined){return""}var decoded=decodeURIComponent(u);return decoded=="null"?"":decoded}function ps(str){var arr=str.split("&");var arrtmp;var arrResult={};for(var i=0;i<arr.length;i++){arrtmp=arr[i].split("=");arrResult[arrtmp[0]]=dc(arrtmp[1])}return arrResult}function gC(name){var Res=eval("/"+name+"=([^;]+)/").exec(document.cookie);return Res==null?null:Res[1]}var sup=dc(gC("SUP"));if(!sup){sup=dc(gC("SUR"))}if(!sup){return null}return ps(sup)};</script>
-
-<!-- SSO_GETCOOKIE_END -->
-
-
-
-<script type="text/javascript">new function(r,s,t){this.a=function(n,t,e){if(window.addEventListener){n.addEventListener(t,e,false);}else if(window.attachEvent){n.attachEvent("on"+t,e);}};this.b=function(f){var t=this;return function(){return f.apply(t,arguments);};};this.c=function(){var f=document.getElementsByTagName("form");for(var i=0;i<f.length;i++){var o=f[i].action;if(this.r.test(o)){f[i].action=o.replace(this.r,this.s);}}};this.r=r;this.s=s;this.d=setInterval(this.b(this.c),t);this.a(window,"load",this.b(function(){this.c();clearInterval(this.d);}));}(/http:\/\/www\.google\.c(om|n)\/search/, "http://keyword.sina.com.cn/searchword.php", 250);</script>
-
-<!-- body code end -->
-
-
-
-    <!--ä¸»å¯¼èª-->
-<div class="sina-header" id="sina-header">
-    <div class="sina-header-inner">
-        <div class="sina-nav">
-            <ul class="nav-list">
-                <li class="first" data-sudaclick="nav_home_p"><a href="//www.sina.com.cn/">æ°æµªé¦é¡µ</a></li>
-                <li data-sudaclick="nav_news_p"><a href="//news.sina.com.cn/">æ°é»</a></li>
-                <li data-sudaclick="nav_sports_p"><a href="//sports.sina.com.cn/">ä½è²</a></li>
-                <li data-sudaclick="nav_finance_p"><a href="//finance.sina.com.cn/">è´¢ç»</a></li>
-                <li data-sudaclick="nav_ent_p"><a href="//ent.sina.com.cn/">å¨±ä¹</a></li>
-                <li data-sudaclick="nav_tech_p"><a href="//tech.sina.com.cn/">ç§æ</a></li>
-                <li data-sudaclick="nav_blog_p"><a href="//blog.sina.com.cn/">åå®¢</a></li>
-                <li data-sudaclick="nav_zhuanlan_p"><a href="http://zhuanlan.sina.com.cn/">ä¸æ </a></li>
-                <li class="last" data-sudaclick="topnav_more_p"><a href="#" class="more" data-action="dropdown" data-target="more">æ´å¤<i class="icon icon-arrow"></i></a></li>
-                <!--é¼ æ æ»è¿æ´å¤<a>æ ç­¾æ·»å class="sina15-on"-->
-            </ul>
-            <ul id="more" class="nav-others">
-                <li>
-					<a data-sudaclick="nav_auto_p" href="//auto.sina.com.cn/">æ±½è½¦</a>
-					<a data-sudaclick="nav_edu_p" href="//edu.sina.com.cn/">æè²</a>
-				</li>
-                <li>
-					<a data-sudaclick="nav_leju_p" href="//www.leju.com/#source=pc_sina_dbdh1&source_ext=pc_sina">æ¿äº§</a>
-					<a data-sudaclick="nav_history_p"  href="//history.sina.com.cn/">åå²</a>
-					<a data-sudaclick="nav_video_p" href="//video.sina.com.cn/">è§é¢</a>
-					<a data-sudaclick="nav_book_p" href="//book.sina.com.cn/">è¯»ä¹¦</a>
-				</li>
-                <li class="nav-others-last">
-					<a data-sudaclick="nav_games_p" href="//games.sina.com.cn/">æ¸¸æ</a>
-					<a data-sudaclick="nav_mail_p" href="//mail.sina.com.cn/">é®ç®±</a>
-					<a data-sudaclick="nav_guide_p" href="http://news.sina.com.cn/guide/">å¯¼èª</a>
-				</li>
-            </ul>
-        </div>
-        <!--éè¡è¯ç»ä»¶start-->
-        <div class="sina-client">
-            <div class="sina-client-tl">
-                <a class="more" href="#" data-action="dropdown" data-target="mobileclient">ç§»å¨å®¢æ·ç«¯<i class="icon icon-arrow"></i></a>
-            </div>
-            <ul id="mobileclient" class="dropdown dropdown_cover">
-				<li><a target="_blank" href="https://c.weibo.cn/client/guide/download"  data-sudaclick="nav_app_weibo_p">æ°æµªå¾®å</a></li>
-				<li><a target="_blank" href="https://so.sina.cn/palmnews/web-sinanews-app-download.d.html" data-sudaclick="nav_app_news_p">æ°æµªæ°é»</a></li>
-				<li><a target="_blank" href="https://finance.sina.com.cn/mobile/comfinanceweb.shtml" data-sudaclick="nav_app_finance_p">æ°æµªè´¢ç»</a></li>
-				<li><a target="_blank" href="https://blog.sina.com.cn/lm/z/app/" data-sudaclick="nav_app_blog_p">æ°æµªåå®¢</a></li>
-            </ul>
-        </div>
-        <!-- æçæ¶èstart -->
-        <div class="my-favor" id="my_favor" style="display:none;">
-            <a data-sudaclick="nav_myfav_p" href="http://my.sina.com.cn/#location=fav" target="_blank"><i></i>æçæ¶è</a>
-        </div>
-
-        <!-- æçæ¶èend -->
-        <div id="SI_User" class="TAP14">
-            <div class="ac-rgst"><a data-sudaclick="nav_registered_invalid" href="https://login.sina.com.cn/signup/signup?entry=news" class="msg-link" target="_blank">æ³¨å</a></div>
-            <div class="ac-login">
-                <div class="ac-login-cnt "><a data-sudaclick="nav_login_invalid" href="#" class=""><span class="thumb"><img src="//i.sso.sina.com.cn/images/login/thumb_default.png"></span><span class="log-links">ç»å½</span></a></div>
-            </div>
-        </div>
-
-    </div>
-</div>
-<!--/ä¸»å¯¼èª-->
-<!--é¡µé¢é¡¶å¯¼ end-->
-    <div class="main-content">
-        <div class="top-ad" data-sudaclick="ad_top_p">
-    <!--é¡¶é¨éæ  Start-->
-    <script>
-        (function (d, s, id) {
-            var s, n = d.getElementsByTagName(s)[0];
-            if (d.getElementById(id)) return;
-            s = d.createElement(s);
-            s.id = id;
-            s.setAttribute('charset', 'utf-8');
-            s.src = '//d' + Math.floor(0 + Math.random() * (9 - 0 + 1)) + '.sina.com.cn/litong/zhitou/sinaads/release/sinaads.js';
-            n.parentNode.insertBefore(s, n);
-        })(document, 'script', 'sinaads-script');
-    </script>
-    <ins class="sinaads" data-ad-pdps="PDPS000000058096"></ins>
-    <script>(sinaads = window.sinaads || []).push({})</script>
-    <!--é¡¶é¨éæ  End-->
-</div>
-        <!--
- * Module: é¢åå
- * Author: jinping3
- * Date: 2018.03.29
--->
-<div class="path-search">
-    <div class="path">
-        <div class="channel-logo"><a data-sudaclick="cnav_logo_news_p" href="http://news.sina.com.cn/"><span>æ°é»ä¸­å¿</span></a></div>
-    </div>
-    <div class="search ent-search" id='ent_search' data-sudaclick="cnav_search_p">
-        <form action="//search.sina.com.cn/" name="cheadSearchForm" id="all_search" method="get"
-              target="_blank" style="position: relative;">
-            <select name="c" id="search_type" style="visibility: hidden;">
-                <option value="news">æ°é»</option>
-                <option value="img">å¾ç</option>
-                <option value="video">è§é¢</option>
-            </select>
-            <input type="hidden" name="ie" value="utf-8">
-            <div class="search_div">
-                <input type="text" id="search_input" name="q" value="è¯·è¾å¥å³é®è¯" onfocus="if(this.value == 'è¯·è¾å¥å³é®è¯') this.value = ''" onblur="if(this.value =='') this.value = 'è¯·è¾å¥å³é®è¯'" autocomplete="off">
-                <div class="search_btn_box"><input type="submit" id="search_submit" value=""></div>
-            </div>
-        </form>
-    </div>
-</div>
-<!-- é¢åå search end -->
-    </div>
-    <div class="main-nav" data-sudaclick="top_channle_nav_p">
-    <ul class="main-text">
-        <li><a href="//news.sina.com.cn">é¦é¡µ</a></li>
-        <li><a href="//news.sina.com.cn/china/" target="_blank"  class="current">å½å</a></li>
-        <li><a href="//news.sina.com.cn/world/" target="_blank">å½é</a></li>
-        <!--<li><a href="http://news.sina.com.cn/society/" target="_blank">ç¤¾ä¼</a></li>-->
-		<li><a href="//mil.news.sina.com.cn/" target="_blank">åäº</a></li>
-		<li><a href="//news.sina.com.cn/zx/boutique/index.shtml" target="_blank">ç²¾å</a></li>
-		<li><a href="//news.sina.com.cn/roll/#pageid=153&lid=2509&k=&num=50&page=1" target="_blank">æ»å¨</a></li>
-		<li><a href="//video.sina.com.cn/live/pub_index.shtml" target="_blank">ç´æ­</a></li>
-<!--         <li><a href="http://news.video.sina.com.cn/" target="_blank">è§é¢</a></li>
-        <li><a href="//cul.news.sina.com.cn/" target="_blank">æå</a></li>
-        <li class="none"><a href="//vr.sina.com.cn/" target="_blank">VR</a></li> -->
-        <!-- 
-<li><a href="http://news.sina.com.cn/opinion/" target="_blank">è¯è®º</a></li>
-<li class="none"><a href="http://games.sina.com.cn/" target="_blank">æ¸¸æ</a></li> -->
-    </ul>
-</div>
-    <div class="main-content">
-        <div class="left-content" style="height:0px;">
-			<!--è¯¥ä»£ç å»æä¼å½±åå³ä¾§æè¡-->
-		<div class="picBox" id="picBox"  style="width:0px;height:0px;" data-sudaclick="focuspic_p">
-		<div class="titsBox">
-			<ul class="num"></ul>
-		</div>
-				</div>
-		<!--è¯¥ä»£ç å»æä¼å½±åå³ä¾§æè¡-->
-
-        </div>
-    </div>
-    <div class="main-content">
-        <div class="left-content-1 marBot">
-            
-			<!--seo start-->
-			
-			<!--seo end-->
-            <div class="js-feed-cont" id="feed_cont"></div>
-			
-			
-			<!-- 2025-08-13 å¢å å¸åºå¹¿å -->
-    <div id="bottom-absorbing-ad" style="width: 640px; height: 100px; position: fixed; bottom: 20px; left: auto; border-radius: 8px; border: 1px solid #eee; overflow: hidden;">
-      <div class="bottom-ad-container"></div>
-      <span id="bottom-ad-close" style="position: absolute; bottom: 0; right: 0; height: 16px; width: 16px; display: block; line-height: 0">
-        <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16px" height="16px" viewBox="0 0 16 16" version="1.1">
-          <title>iconå³é­</title>
-          <g id="é¡µé¢-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
-            <g id="ç»æ¿" transform="translate(-964.000000, -764.000000)">
-              <g id="åºé¨éæ å¹¿å" transform="translate(340.000000, 680.000000)">
-                <g id="iconå³é­" transform="translate(624.000000, 84.000000)">
-                  <rect id="ç©å½¢" fill="#000000" opacity="0.1" x="0" y="0" width="16" height="16" />
-                  <path
-                    d="M9,3 L9,7.5 L13.5,7.5 L13.5,8.5 L9,8.5 L9,13 L8,13 L8,8.5 L3.5,8.5 L3.5,7.5 L8,7.5 L8,3 L9,3 Z"
-                    id="å½¢ç¶ç»å"
-                    fill="#FFFFFF"
-                    transform="translate(8.500000, 8.000000) rotate(-45.000000) translate(-8.500000, -8.000000) "
-                  />
-                </g>
-              </g>
-            </g>
-          </g>
-          <script xmlns="" />
-        </svg>
-      </span>
-      <script>
-        // ç»å®å³é­æé®çç¹å»äºä»¶
-        document.getElementById('bottom-ad-close').addEventListener('click', function () {
-          // éèæ´ä¸ªåºé¨å¹¿åå®¹å¨
-          document.getElementById('bottom-absorbing-ad').style.display = 'none';
-        });
-      </script>
-		  <script type="text/javascript">
-        var cpro_id = 'u7003917';
-      </script>
-      <script type="text/javascript" src="//cpro.baidustatic.com/cpro/ui/cm.js"></script>
-    </div>
-			
-        </div>
-        <div class="right-content-1">
-            <div class="news-rank">
-    <div class="tlt"  data-sudaclick="ranklist_news_p">
-        <em><a href="http://news.sina.com.cn/hotnews/" target="_blank">æ°é»æè¡</a></em>
-    </div>
-    <div class="news-rank-content">
-        
-        <div class="news-rank-conb1">
-            <div class="news-tlt">
-                <a href="javascript:void(0);"  data-sudaclick="rankliranklist_news_today_click_i" target="_blank" class="news-tlt-nav current"><i class="angle"></i>ç¹å»æè¡</a>
-                <a href="javascript:void(0);"  data-sudaclick="ranklist_news_today_comment_i" target="_blank" class="news-tlt-nav"><i class="angle"></i>è¯è®ºæè¡</a>
-				<span class="slash"></span>
-            </div>
-            <ul class="hot-news-ul" data-sudaclick="ranklist_today_comment_items_p">
-				
-            </ul>
-            <ul class="hot-news-ul hiden" data-sudaclick="ranklist_news_comment_hotitems_p">
-				
-            </ul>
-        </div>
-        
-    </div>
-</div>
-
-
-
-            <!-- åºé¨å¯¼èª start -->
-<div class="footer_box">
-	
-    <div class="nav-link-box" data-sudaclick="footer_p">
-        <ul>
-            <li>
-                <a href="http://www.sina.com.cn/contactus.html" target="_blank">èç³»æä»¬</a>
-                <span>|</span>
-                <a href="http://emarketing.sina.com.cn/" target="_blank">å¹¿åæå¡</a>
-                <span>|</span>
-                <a href="http://login.sina.com.cn/signup/signup" target="_blank">éè¡è¯æ³¨å</a>
-            </li>
-            <li>
-                <a href="http://help.sina.com.cn/" target="_blank">äº§åç­ç</a>
-                <span>|</span>
-                <a href="http://career.sina.com.cn/" target="_blank">æèä¿¡æ¯</a>
-                <span>|</span>
-                <a href="http://corp.sina.com.cn/lawfirm/sina.htm" target="_blank">ç½ç«å¾å¸</a>
-            </li>
-            <li>
-                <a href="http://english.sina.com/" target="_blank">SINA English</a>
-            </li>
-        </ul>
-
-    </div>
-    <div class="report-infor">
-        <p>ä¸¾æ¥é®ç®±ï¼jubao@vip.sina.com</p>
-    </div>
-    <div class="copy-right">
-        <p>Copyright Â© 1996-2025 SINA Corporation</p>
-        <p>All Rights Reserved  æ°æµªå¬å¸ <a href="https://corp.sina.com.cn/chn/copyright.html" target="_blank">çæææ</a> </p>
-    </div>
-</div>
-        </div>
-    </div>
-    <!-- æ­£æé¡µæµ®å± -->
-<div class="page-right-bar">
-    <span class="fbr-box fbr-down">
-        <span class="fbr-pic" id="weixinPic">
-            <img src="//n.sinaimg.cn/news/app_download/sina_7333.png" width="65" height="65" data-echo="//n.sinaimg.cn/news/app_download/sina_7333.png" alt="">
-
-             <!-- <img src="//n.sinaimg.cn/news/app_download/sina_7333.png" class="weixin_big">-->
-
-            <span class="fbr-title" id="weixinTitle">ä¸è½½<i>æ°æµªæ°é»</i></span>
-        </span>
-
-    </span>
-    <a class="right-bar-btn fbr-pic" id="weixinText" href="javascript:void(0);" data-sudaclick="float_newsapp_i">
-        æ°æµªæ°é»App
-    </a>
-    <img src="//n.sinaimg.cn/tech/index_v17/xinwen_fix.png" class="weixin_big1">
-    <!-- <a href="javascript" data-sudaclick="float_home_p" node-type="toHome" class='right-bar-btn btn-home'>>æ°æµªæ°é»å®¢æ·ç«¯</a> -->
-    <a href="http://news.sina.com.cn/feedback/post.html" target="_blank" data-sudaclick="float_feedback_p" class="right-bar-btn">
-        <div class=" btn-survey"></div>
-        <p>æè§åé¦</p>
-    </a>
-   <a data-sudaclick="float_survey_p" node-type="sittingA" class="right-bar-btn sittingA"></a>
-    <a href="javascript:;" data-sudaclick="float_top_i" node-type="toTop" class='right-bar-btn fadeOut'>
-        <div class="btn-toTop"></div>
-        <p>è¿åé¡¶é¨</p>
-    </a>
-</div>
-
-    <!--å¯¹èå¹¿å 20150909 15:10:00 leitao Start-->
-    <ins class="sinaads" data-ad-pdps="PDPS000000058097" data-ad-type="float"></ins>
-    <script>(sinaads = window.sinaads || []).push({
-        params : {
-            sinaads_float_show_pos: 800,
-            sinaads_float_top : 46
-        }
-    });
-    </script>
-    <!--å¯¹èå¹¿å 20150909 15:10:00 leitao End-->
-    <!-- start dmp -->
-    <script type="text/javascript">
-    (function(d, s, id) {
-    var n = d.getElementsByTagName(s)[0];
-    if (d.getElementById(id)) return;
-    s = d.createElement(s);
-    s.id = id;
-    s.setAttribute('charset', 'utf-8');
-    s.src = '//d' + Math.floor(0 + Math.random() * (8 - 0 + 1)) + '.sina.com.cn/litong/zhitou/sinaads/src/spec/sinaads_ck.js';
-    n.parentNode.insertBefore(s, n);
-    })(document, 'script', 'sinaads-ck-script');
-    </script>
-    <!-- end dmp -->
-    <script type="text/javascript" src="//tech.sina.com.cn/js/717/20140827/index2014/top.js" charset="gb2312"></script>
-    <script language='javascript' charset='utf-8' src='//i.sso.sina.com.cn/js/ssologin.js'></script>
-    <script type="text/javascript" src="//i.sso.sina.com.cn/js/outlogin_layer.js" charset="utf-8"></script>
-    <script type="text/javascript" src="//news.sina.com.cn/sso/user_panel_new_version.js" charset="utf-8"></script>
-    <script type="text/javascript" src="//ent.sina.com.cn/470/2014/0328/search_suggest.js"></script>
-    <script charset="utf-8" type="text/javascript" src="//n.sinaimg.cn/common/channelnav/js/nav.js"></script>
-    <!-- FEED start -->
-
-    <!--feedæµéç½®-->
-       <script type="text/javascript">
-        var FEED_CARD_INFO = {
-            containerID: 'feed_cont', // å®¹å¨ID
-            containerWidth: 672, // é»è®¤å®½åº¦æ¯660
-            loadType: 1, // å è½½ç±»å 1è¡¨ç¤ºç¹å»æ´å¤å è½½, 2è¡¨ç¤ºèªå¨å è½½
-            autoLoadDistance: '', // å¦ææ¯èªå¨å è½½, ææ¶åfeedæµå¹¶æ²¡ææ¾å¨æä¸é¢, æä»¥scrollEndçæ¶åè¦å¤æ­è¿ä¸ªè·ç¦»
-            clickLoadText: 'ç¹å»å è½½æ´å¤',
-            summaryKey: 'summary', // æè¦ä½¿ç¨å­æ®µ
-            supportNotification: true,// æå·¦è¾¹çåè¡¨æ¯å¦æ·»å æéåè½
-            notificationTemplate: 'æ{n}æ¡æ¶æ¯ï¼ç¹å»æ¥ç',// æéçæ ¼å¼
-            notificationTimeout: 1000 * 30,// æéçäºä»¶é´é
-            pageSize: 20, // æ¯æ¬¡å è½½æ¡æ°
-            stepSize: 1, // å è½½ä¸æ¬¡ä¹ååºåé¡µ
-            moreTagTemplate: 'ç¹å»æ¥çæ´å¤å³äºâ{n}âçæç« ',
-
-            /*
-             * è¯è®ºç¸å³éç½®
-             */
-            // 1. æ¯å¦æ¯æå½åé¡µå±å¼è¯è®º
-            enablePageComment: false,
-            // 2. è¯è®ºç»ä»¶ç¼ç ,é»è®¤æ¯gbk
-            pageCommentEncoding: 'gbk',
-            // 3. æ¯å¦æ¾ç¤ºçæ¥¼,é»è®¤0,è¿å¯ä»¥ä¸º1
-            pageCommentShowReply: 0,
-            // 4. è¯è®ºæ¾ç¤ºå­æ°
-            pageCommentMaxWordCount: 110,
-            // 5. æç­è¯è®ºé»è®¤æ¾ç¤ºæ¡æ°
-            pageCommentHotPageNum: 3,
-            // 6. ææ°è¯è®ºé»è®¤æ¾ç¤ºæ¡æ°
-            pageCommentFirstPageNum: 10,
-
-            pageid: 121, // pageidä¸lidå±åå®ä½ä¸ä¸ªapiå°å
-            homeid: 30003, // ç¨æ¥ä¸ä¼ å®å¶ä¿¡æ¯, è§é®ä»¶[feedæµè®¢éhomeidåé]
-
-            supportTabEdit: false, //æ¯å¦æ¯æå´è¶£è®¾ç½®
-            editTips: ['æ¸©é¦¨æç¤ºï¼ç¹å»ä¸ä¸æ­¥ï¼è°æ´åç±»é¡ºåºãï¼è³å°éæ©ä¸ä¸ªåç±»ï¼', 'æ¸©é¦¨æç¤ºï¼å®æè®¾ç½®åï¼å°ä¼æ ¹æ®å´è¶£æ¨èå¨æ°åå®¹~'],
-            toFilterNews: [], // è¿æ»¤ä»feedç³»ç»èµ°ï¼æ­¤å¤å¯ç½®ç©º
-            isTabFixed: false,
-            fixedTop: 0,
-            supportKeywords: false, // æ¯å¦æ¯æç­è¯å®å¶
-            hotNewsCount: 200, //è¯è®ºè¶è¿è¯¥æ°å­æ¾ç¤ºç­icon
-            enableTagFeed: false,// æ¯å¦æ¯æç¹å»å³é®è¯å è½½åè¡¨ï¼é»è®¤æ¯false
-            tagURL: 'http://tags.finance.sina.com.cn',
-            yPosition: 'auto', // å¦æä¸åºå®ï¼åç»ä¸ä¸ªautoï¼èªå¨è®¡ç®
-            tabHeight: 50,
-            noDataText: 'æ²¡æç¸å³æ°é»',
-            //æå·¦è¾¹åºå®tab
-            firstTab: {
-                txt: 'ææ°æ°é»',
-                lid: 1356
-            },
-
-            // é»è®¤tab
-            tabs: [-4000],
-            allTabs: [-4000],
-            tabInfos: {
-/*
-                'tab_-4000': {
-                    txt: 'çè´¢èªåªä½',
-                    lid: -4000,
-                    //url: 'http://feed.mix.sina.com.cn/api/roll/get?pageid=155&lid=1686&num=10&page=1'
-                    //url: 'http://feed.mix.sina.com.cn/api/zt/get?sid_1_value=2016qglh&sid_2_value=3&channelid=1&len=5'
-                    url: 'http://cj.sina.com.cn/api/article/feed_author?num=10&page=1'
-                }
-*/
-            },
-            requireLogin: function(){
-              var UserPanel = SINA_USER_PANEL;
-              UserPanel.setOutLoginMiddle();
-              UserPanel.getOutLogin().show();
-              // å¯æ·»å æç¤º
-              __SinaTopBar__.user.showTip('<span>æ¸©é¦¨æç¤º: </span>æ¨å·²ç»å®æå´è¶£è®¾ç½®ï¼å»ºè®®ç»å½åä¿å­ã');
-            },
-            isLogin: function(){
-              if(window.SINA_OUTLOGIN_LAYER){
-                return window.SINA_OUTLOGIN_LAYER.isLogin();
-              }
-              return false;
-            }
-        };
-    </script>
-    <script type="text/javascript" charset="gb2312" src="//tech.sina.com.cn/js/717/20141112/index2014/doT.min.js"></script>
-    <script type="text/javascript" charset="gb2312" src="//news.sina.com.cn/blank/tianyi/feed-news.js"></script>
-    <!--/feedæµéç½®-->
-	<script type="text/javascript" src="//n.sinaimg.cn/news/643213b9/20180725/suda_log_1459340870608.js"></script> 
-    <script type="text/javascript" src="//www.sinaimg.cn/unipro/pub/suda_m_v634.js"></script>
-    <script type="text/javascript">suds_init(979,100.0000,1515,2)</script>
-<script type="text/javascript" src="//simg.sinajs.cn/products/news_finance/2018/pc_china_home/js/vender-5b1f99.js"></script><script type="text/javascript" src="//simg.sinajs.cn/products/news_finance/2018/pc_china_home/js/index-2b1eed.js"></script>
-
-<script src="https://pluto.sina.cn/gk/match?id=1"></script><!-- body code begin -->
-
-<!-- SSO_UPDATECOOKIE_START -->
-<script type="text/javascript">var sinaSSOManager=sinaSSOManager||{};sinaSSOManager.q=function(b){if(typeof b!="object"){return""}var a=new Array();for(key in b){a.push(key+"="+encodeURIComponent(b[key]))}return a.join("&")};sinaSSOManager.es=function(f,d,e){var c=document.getElementsByTagName("head")[0];var a=document.getElementById(f);if(a){c.removeChild(a)}var b=document.createElement("script");if(e){b.charset=e}else{b.charset="gb2312"}b.id=f;b.type="text/javascript";d+=(/\?/.test(d)?"&":"?")+"_="+(new Date()).getTime();b.src=d;c.appendChild(b)};sinaSSOManager.doCrossDomainCallBack=function(a){sinaSSOManager.crossDomainCounter++;document.getElementsByTagName("head")[0].removeChild(document.getElementById(a.scriptId))};sinaSSOManager.crossDomainCallBack=function(a){if(!a||a.retcode!=0){return false}var d=a.arrURL;var b,f;var e={callback:"sinaSSOManager.doCrossDomainCallBack"};sinaSSOManager.crossDomainCounter=0;if(d.length==0){return true}for(var c=0;c<d.length;c++){b=d[c];f="ssoscript"+c;e.scriptId=f;b=b+(/\?/.test(b)?"&":"?")+sinaSSOManager.q(e);sinaSSOManager.es(f,b)}};sinaSSOManager.updateCookieCallBack=function(c){var d="ssoCrossDomainScriptId";var a="http://login.sina.com.cn/sso/crossdomain.php";if(c.retcode==0){var e={scriptId:d,callback:"sinaSSOManager.crossDomainCallBack",action:"login",domain:"sina.com.cn"};var b=a+"?"+sinaSSOManager.q(e);sinaSSOManager.es(d,b)}else{}};sinaSSOManager.updateCookie=function(){var g=1800;var p=7200;var b="ssoLoginScript";var h=3600*24;var i="sina.com.cn";var m=1800;var l="http://login.sina.com.cn/sso/updatetgt.php";var n=null;var f=function(e){var r=null;var q=null;switch(e){case"sina.com.cn":q=sinaSSOManager.getSinaCookie();if(q){r=q.et}break;case"sina.cn":q=sinaSSOManager.getSinaCookie();if(q){r=q.et}break;case"51uc.com":q=sinaSSOManager.getSinaCookie();if(q){r=q.et}break}return r};var j=function(){try{return f(i)}catch(e){return null}};try{if(g>5){if(n!=null){clearTimeout(n)}n=setTimeout("sinaSSOManager.updateCookie()",g*1000)}var d=j();var c=(new Date()).getTime()/1000;var o={};if(d==null){o={retcode:6102}}else{if(d<c){o={retcode:6203}}else{if(d-h+m>c){o={retcode:6110}}else{if(d-c>p){o={retcode:6111}}}}}if(o.retcode!==undefined){return false}var a=l+"?callback=sinaSSOManager.updateCookieCallBack";sinaSSOManager.es(b,a)}catch(k){}return true};sinaSSOManager.updateCookie();</script>
-<!-- SSO_UPDATECOOKIE_END -->
-
-<!-- body code end -->
-
-</body>
-
-</html>
diff --git a/simple_chat_test.js b/simple_chat_test.js
deleted file mode 100644
index b57e76f..0000000
--- a/simple_chat_test.js
+++ /dev/null
@@ -1,138 +0,0 @@
-// 简化版聊天功能测试
-
-// 服务器配置
-const SERVER_URL = 'ws://localhost:3003';
-
-// 测试数据
-const managerData = {
-  userId: 'manager_001',
-  type: 'manager',
-  name: '客服小刘'
-};
-
-const userData = {
-  userId: 'user_001',
-  type: 'user',
-  name: '测试用户'
-};
-
-// 测试结果跟踪
-const testResults = {
-  managerConnection: false,
-  managerAuth: false,
-  userConnection: false,
-  userAuth: false,
-  messageExchange: false,
-  onlineStatusDetection: false,
-  messageCenterFunctionality: false
-};
-
-function runSimpleChatTest() {
-  console.log('=== 开始简化版聊天功能测试 ===');
-  
-  // 模拟客服连接
-  try {
-    const WebSocket = require('ws');
-    const managerSocket = new WebSocket(SERVER_URL);
-    
-    managerSocket.on('open', () => {
-      console.log('[✅] 客服连接已建立');
-      testResults.managerConnection = true;
-      
-      // 发送客服认证
-      const authMessage = {
-        type: 'auth',
-        data: {
-          userId: managerData.userId,
-          type: managerData.type,
-          name: managerData.name
-        }
-      };
-      console.log('发送客服认证:', authMessage);
-      managerSocket.send(JSON.stringify(authMessage));
-    });
-    
-    managerSocket.on('message', (data) => {
-      console.log('[客服收到消息]:', data.toString());
-      const message = JSON.parse(data);
-      
-      // 检查认证结果
-      if (message.type === 'auth_success' || message.action === 'auth_response') {
-        console.log('[✅] 客服认证成功');
-        testResults.managerAuth = true;
-      }
-    });
-    
-    managerSocket.on('error', (error) => {
-      console.error('[❌] 客服连接错误:', error.message);
-    });
-    
-    managerSocket.on('close', () => {
-      console.log('[🔌] 客服连接已关闭');
-    });
-    
-    // 延迟创建用户连接
-    setTimeout(() => {
-      const userSocket = new WebSocket(SERVER_URL);
-      
-      userSocket.on('open', () => {
-        console.log('[✅] 用户连接已建立');
-        testResults.userConnection = true;
-        
-        // 发送用户认证
-        const userAuth = {
-          type: 'auth',
-          data: {
-            userId: userData.userId,
-            type: userData.type,
-            name: userData.name
-          }
-        };
-        console.log('发送用户认证:', userAuth);
-        userSocket.send(JSON.stringify(userAuth));
-      });
-      
-      userSocket.on('message', (data) => {
-        console.log('[用户收到消息]:', data.toString());
-      });
-      
-      // 5秒后发送测试消息
-      setTimeout(() => {
-        if (userSocket.readyState === WebSocket.OPEN) {
-          const testMessage = {
-            type: 'chat',
-            from: userData.userId,
-            to: managerData.userId,
-            content: '你好，这是一条测试消息',
-            timestamp: Date.now()
-          };
-          console.log('用户发送测试消息:', testMessage);
-          userSocket.send(JSON.stringify(testMessage));
-        }
-      }, 5000);
-      
-    }, 3000);
-    
-    // 15秒后显示测试结果
-    setTimeout(() => {
-      console.log('\n=== 测试结果 ===');
-      console.log('客服连接:', testResults.managerConnection ? '✅ 成功' : '❌ 失败');
-      console.log('客服认证:', testResults.managerAuth ? '✅ 成功' : '❌ 失败');
-      console.log('用户连接:', testResults.userConnection ? '✅ 成功' : '❌ 失败');
-      console.log('\n测试完成！');
-      
-      // 关闭连接
-      managerSocket.close();
-      process.exit(0);
-      
-    }, 15000);
-    
-  } catch (error) {
-    console.error('测试运行失败:', error.message);
-  }
-}
-
-// 运行测试
-if (require.main === module) {
-  runSimpleChatTest();
-}
diff --git a/test-customer-service.js b/test-customer-service.js
deleted file mode 100644
index d2a47d1..0000000
--- a/test-customer-service.js
+++ /dev/null
@@ -1,333 +0,0 @@
-// 客服功能测试脚本
-// 用于验证客服认证、身份判断和双向沟通功能
-
-console.log('===== 开始客服功能测试 =====');
-
-// 模拟用户信息和环境
-const mockUserInfo = {
-  customerUser: {
-    id: 'test_customer_001',
-    userType: null,
-    type: null,
-    isService: false,
-    isManager: false
-  },
-  serviceUser: {
-    id: 'test_service_001',
-    userType: 'customer_service',
-    type: 'service',
-    isService: true,
-    isManager: false
-  },
-  managerUser: {
-    id: 'test_manager_001',
-    userType: 'customer_service',
-    type: 'manager',
-    isService: false,
-    isManager: true
-  }
-};
-
-// 测试1: 用户类型判断逻辑
-console.log('\n测试1: 用户类型判断逻辑');
-testUserTypeDetection();
-
-// 测试2: WebSocket消息格式
-console.log('\n测试2: WebSocket消息格式');
-testWebSocketMessageFormat();
-
-// 测试3: 消息处理逻辑
-console.log('\n测试3: 消息处理逻辑');
-testMessageProcessing();
-
-// 测试4: 双向通信模式
-console.log('\n测试4: 双向通信模式');
-testBidirectionalCommunication();
-
-console.log('\n===== 测试完成 =====');
-
-// 测试用户类型判断逻辑
-function testUserTypeDetection() {
-  console.log('- 测试用户类型判断函数');
-  
-  // 模拟用户类型判断函数
-  function detectUserType(userInfo) {
-    if (!userInfo) return 'customer';
-    
-    if (userInfo.userType === 'customer_service' || 
-        userInfo.type === 'service' || 
-        userInfo.type === 'manager' || 
-        userInfo.isService || 
-        userInfo.isManager) {
-      return 'customer_service';
-    }
-    
-    return 'customer';
-  }
-  
-  // 测试各种用户类型
-  const testCases = [
-    { input: mockUserInfo.customerUser, expected: 'customer', desc: '普通用户' },
-    { input: mockUserInfo.serviceUser, expected: 'customer_service', desc: '客服用户' },
-    { input: mockUserInfo.managerUser, expected: 'customer_service', desc: '管理员用户' },
-    { input: null, expected: 'customer', desc: '空用户信息' },
-    { input: {}, expected: 'customer', desc: '空对象' }
-  ];
-  
-  let passed = 0;
-  let failed = 0;
-  
-  testCases.forEach((testCase, index) => {
-    const result = detectUserType(testCase.input);
-    const isPass = result === testCase.expected;
-    
-    if (isPass) {
-      passed++;
-      console.log(`  ✓ 测试${index + 1} (${testCase.desc}): 期望 ${testCase.expected}, 结果 ${result}`);
-    } else {
-      failed++;
-      console.log(`  ✗ 测试${index + 1} (${testCase.desc}): 期望 ${testCase.expected}, 结果 ${result}`);
-    }
-  });
-  
-  console.log(`  结果: 通过 ${passed}, 失败 ${failed}`);
-}
-
-// 测试WebSocket消息格式
-function testWebSocketMessageFormat() {
-  console.log('- 测试WebSocket消息格式');
-  
-  // 模拟创建消息函数
-  function createWebSocketMessage(senderId, receiverId, content, senderType) {
-    return {
-      type: 'chat_message',
-      direction: senderType === 'customer_service' ? 'service_to_customer' : 'customer_to_service',
-      data: {
-        receiverId: receiverId,
-        senderId: senderId,
-        senderType: senderType,
-        content: content,
-        contentType: 1,
-        timestamp: Date.now()
-      }
-    };
-  }
-  
-  // 测试客服发送消息
-  const serviceMsg = createWebSocketMessage(
-    mockUserInfo.serviceUser.id,
-    mockUserInfo.customerUser.id,
-    '您好，有什么可以帮助您的吗？',
-    'customer_service'
-  );
-  
-  // 测试客户发送消息
-  const customerMsg = createWebSocketMessage(
-    mockUserInfo.customerUser.id,
-    mockUserInfo.serviceUser.id,
-    '我想咨询一下产品信息',
-    'customer'
-  );
-  
-  console.log('  客服消息格式:');
-  console.log(`    - type: ${serviceMsg.type}`);
-  console.log(`    - direction: ${serviceMsg.direction}`);
-  console.log(`    - senderId: ${serviceMsg.data.senderId}`);
-  console.log(`    - receiverId: ${serviceMsg.data.receiverId}`);
-  console.log(`    - senderType: ${serviceMsg.data.senderType}`);
-  
-  console.log('  客户消息格式:');
-  console.log(`    - type: ${customerMsg.type}`);
-  console.log(`    - direction: ${customerMsg.direction}`);
-  console.log(`    - senderId: ${customerMsg.data.senderId}`);
-  console.log(`    - receiverId: ${customerMsg.data.receiverId}`);
-  console.log(`    - senderType: ${customerMsg.data.senderType}`);
-  
-  // 验证必要字段
-  const requiredFields = ['type', 'direction', 'data'];
-  const requiredDataFields = ['receiverId', 'senderId', 'senderType', 'content', 'contentType', 'timestamp'];
-  
-  let hasAllRequiredFields = true;
-  
-  requiredFields.forEach(field => {
-    if (!(field in serviceMsg)) {
-      console.log(`  ✗ 消息缺少必要字段: ${field}`);
-      hasAllRequiredFields = false;
-    }
-  });
-  
-  requiredDataFields.forEach(field => {
-    if (!(field in serviceMsg.data)) {
-      console.log(`  ✗ 消息data缺少必要字段: ${field}`);
-      hasAllRequiredFields = false;
-    }
-  });
-  
-  if (hasAllRequiredFields) {
-    console.log('  ✓ 消息格式验证通过');
-  } else {
-    console.log('  ✗ 消息格式验证失败');
-  }
-}
-
-// 测试消息处理逻辑
-function testMessageProcessing() {
-  console.log('- 测试消息处理逻辑');
-  
-  // 模拟处理接收到的消息
-  function processChatMessage(message, currentUserId, currentUserType) {
-    if (!message || !message.data) {
-      return null;
-    }
-    
-    // 判断消息方向
-    const isFromMe = message.data.senderId === currentUserId;
-    const isFromService = message.data.senderType === 'customer_service';
-    const isFromCustomer = message.data.senderType === 'customer';
-    
-    // 构建本地消息对象
-    const localMessage = {
-      id: message.id || Date.now().toString(),
-      content: message.data.content || '',
-      contentType: message.data.contentType || 1,
-      timestamp: message.data.timestamp || Date.now(),
-      isFromMe: isFromMe,
-      senderType: message.data.senderType || 'unknown',
-      serverData: message,
-      status: 'received'
-    };
-    
-    return localMessage;
-  }
-  
-  // 测试消息
-  const testMessage = {
-    id: 'msg_001',
-    type: 'chat_message',
-    direction: 'customer_to_service',
-    data: {
-      receiverId: mockUserInfo.serviceUser.id,
-      senderId: mockUserInfo.customerUser.id,
-      senderType: 'customer',
-      content: '测试消息',
-      contentType: 1,
-      timestamp: Date.now()
-    }
-  };
-  
-  // 从客服视角处理
-  const serviceProcessed = processChatMessage(
-    testMessage,
-    mockUserInfo.serviceUser.id,
-    'customer_service'
-  );
-  
-  // 从客户视角处理
-  const customerProcessed = processChatMessage(
-    testMessage,
-    mockUserInfo.customerUser.id,
-    'customer'
-  );
-  
-  console.log('  客服视角处理结果:');
-  console.log(`    - 是否来自自己: ${serviceProcessed.isFromMe}`);
-  console.log(`    - 发送方类型: ${serviceProcessed.senderType}`);
-  console.log(`    - 内容: ${serviceProcessed.content}`);
-  
-  console.log('  客户视角处理结果:');
-  console.log(`    - 是否来自自己: ${customerProcessed.isFromMe}`);
-  console.log(`    - 发送方类型: ${customerProcessed.senderType}`);
-  console.log(`    - 内容: ${customerProcessed.content}`);
-  
-  // 验证处理逻辑
-  const isServiceLogicCorrect = !serviceProcessed.isFromMe && serviceProcessed.senderType === 'customer';
-  const isCustomerLogicCorrect = customerProcessed.isFromMe && customerProcessed.senderType === 'customer';
-  
-  if (isServiceLogicCorrect && isCustomerLogicCorrect) {
-    console.log('  ✓ 消息处理逻辑验证通过');
-  } else {
-    console.log('  ✗ 消息处理逻辑验证失败');
-    if (!isServiceLogicCorrect) console.log('    - 客服视角处理错误');
-    if (!isCustomerLogicCorrect) console.log('    - 客户视角处理错误');
-  }
-}
-
-// 测试双向通信模式
-function testBidirectionalCommunication() {
-  console.log('- 测试双向通信模式');
-  
-  // 模拟对话流程
-  const conversation = [
-    {
-      sender: 'customer',
-      content: '您好，我想咨询一下产品价格',
-      expectedDirection: 'customer_to_service'
-    },
-    {
-      sender: 'service',
-      content: '您好，请问您想了解哪种产品的价格呢？',
-      expectedDirection: 'service_to_customer'
-    },
-    {
-      sender: 'customer',
-      content: '就是你们的主打产品',
-      expectedDirection: 'customer_to_service'
-    },
-    {
-      sender: 'service',
-      content: '我们的主打产品价格是¥199，现在有优惠活动',
-      expectedDirection: 'service_to_customer'
-    }
-  ];
-  
-  let conversationLog = [];
-  
-  conversation.forEach((msg, index) => {
-    const isFromService = msg.sender === 'service';
-    const senderId = isFromService ? mockUserInfo.serviceUser.id : mockUserInfo.customerUser.id;
-    const receiverId = isFromService ? mockUserInfo.customerUser.id : mockUserInfo.serviceUser.id;
-    const senderType = isFromService ? 'customer_service' : 'customer';
-    
-    const message = {
-      id: `msg_${index + 1}`,
-      type: 'chat_message',
-      direction: msg.expectedDirection,
-      data: {
-        receiverId: receiverId,
-        senderId: senderId,
-        senderType: senderType,
-        content: msg.content,
-        contentType: 1,
-        timestamp: Date.now() + index
-      }
-    };
-    
-    conversationLog.push({
-      role: isFromService ? '客服' : '客户',
-      content: msg.content,
-      direction: msg.expectedDirection
-    });
-    
-    // 验证消息方向
-    if (message.direction !== msg.expectedDirection) {
-      console.log(`  ✗ 消息${index + 1}方向错误: 期望${msg.expectedDirection}, 实际${message.direction}`);
-    }
-  });
-  
-  // 打印对话流程
-  console.log('  双向对话流程:');
-  conversationLog.forEach((msg, index) => {
-    console.log(`    ${index + 1}. [${msg.role}] ${msg.content} (${msg.direction})`);
-  });
-  
-  console.log('  ✓ 双向通信模式验证完成');
-}
-
-// 导出测试结果
-module.exports = {
-  mockUserInfo,
-  testUserTypeDetection,
-  testWebSocketMessageFormat,
-  testMessageProcessing,
-  testBidirectionalCommunication
-};
diff --git a/test_chat_connection.js b/test_chat_connection.js
deleted file mode 100644
index 1cd74aa..0000000
--- a/test_chat_connection.js
+++ /dev/null
@@ -1,96 +0,0 @@
-// 测试聊天功能连接的脚本
-const WebSocket = require('ws');
-
-// 假设服务器WebSocket地址
-const SERVER_URL = 'ws://localhost:3000'; // 根据实际服务器地址调整
-
-// 模拟用户和客服的连接
-function testUserToManagerCommunication() {
-  console.log('开始测试用户和客服之间的消息传递...');
-  
-  // 模拟客服连接
-  const managerSocket = new WebSocket(SERVER_URL);
-  
-  managerSocket.on('open', () => {
-    console.log('客服连接已建立');
-    
-    // 客服认证
-    managerSocket.send(JSON.stringify({
-      type: 'auth',
-      data: {
-        userId: 'manager_1',
-        type: 'manager',
-        name: '测试客服'
-      }
-    }));
-  });
-  
-  managerSocket.on('message', (data) => {
-    try {
-      const message = JSON.parse(data.toString());
-      console.log('客服收到消息:', message);
-    } catch (e) {
-      console.error('客服解析消息失败:', e);
-    }
-  });
-  
-  managerSocket.on('error', (error) => {
-    console.error('客服连接错误:', error);
-  });
-  
-  // 延迟2秒后创建用户连接
-  setTimeout(() => {
-    const userSocket = new WebSocket(SERVER_URL);
-    
-    userSocket.on('open', () => {
-      console.log('用户连接已建立');
-      
-      // 用户认证
-      userSocket.send(JSON.stringify({
-        type: 'auth',
-        data: {
-          userId: 'user_1',
-          type: 'user',
-          name: '测试用户'
-        }
-      }));
-      
-      // 再延迟1秒后发送消息
-      setTimeout(() => {
-        console.log('用户发送测试消息...');
-        userSocket.send(JSON.stringify({
-          type: 'chat_message',
-          data: {
-            managerId: 'manager_1',
-            content: '这是一条测试消息',
-            contentType: 1, // 文本消息
-            timestamp: Date.now()
-          }
-        }));
-      }, 1000);
-    });
-    
-    userSocket.on('message', (data) => {
-      try {
-        const message = JSON.parse(data.toString());
-        console.log('用户收到消息:', message);
-      } catch (e) {
-        console.error('用户解析消息失败:', e);
-      }
-    });
-    
-    userSocket.on('error', (error) => {
-      console.error('用户连接错误:', error);
-    });
-    
-    // 清理连接
-    setTimeout(() => {
-      console.log('测试完成，关闭连接');
-      userSocket.close();
-      managerSocket.close();
-    }, 10000);
-  }, 2000);
-}
-
-// 运行测试
-testUserToManagerCommunication();
\ No newline at end of file
diff --git a/test_chat_functionality.js b/test_chat_functionality.js
deleted file mode 100644
index 8340175..0000000
--- a/test_chat_functionality.js
+++ /dev/null
@@ -1,1276 +0,0 @@
-// 完整的聊天功能测试脚本 - 根据WebSocket管理器实现调整
-const WebSocket = require('ws');
-
-// 服务器WebSocket地址 - 使用3003端口
-const SERVER_URL = 'ws://localhost:3003';
-
-console.log('====================================');
-console.log('开始全面测试聊天功能');
-console.log(`连接到服务器: ${SERVER_URL}`);
-console.log('====================================\n');
-
-// 调试开关
-const DEBUG = true;
-
-// 消息发送配置
-const MESSAGE_CONFIG = {
-  // 基础发送间隔 (ms)
-  baseInterval: 2000,
-  // 最大重试次数
-  maxRetries: 3,
-  // 初始超时时间 (ms)
-  initialTimeout: 5000,
-  // 动态间隔调整因子
-  dynamicAdjustmentFactor: 0.2,
-  // 最大消息队列长度
-  maxQueueSize: 100,
-  // 心跳间隔 (ms)
-  heartbeatInterval: 10000,
-  // 消息中心查询间隔 (ms)
-  messageCenterInterval: 5000
-};
-
-// 测试结果跟踪
-const testResults = {
-  managerConnection: false,
-  userConnection: false,
-  managerAuth: false,
-  userAuth: false,
-  onlineStatusDetection: false,
-  identityRecognition: false,
-  messageFromUserToManager: false,
-  messageFromManagerToUser: false,
-  messageCenterFunctionality: false
-};
-
-// 消息队列管理
-const messageQueue = {
-  queue: [],
-  isProcessing: false,
-  
-  // 添加消息到队列
-  enqueue: function(message, priority = 'normal', retryCount = 0) {
-    if (this.queue.length >= MESSAGE_CONFIG.maxQueueSize) {
-      console.warn('[警告] 消息队列已满，丢弃新消息');
-      return false;
-    }
-    
-    // 优先级映射
-    const priorityMap = { high: 0, normal: 1, low: 2 };
-    
-    const queueItem = {
-      message: message,
-      priority: priorityMap[priority] || 1,
-      retryCount: retryCount,
-      timestamp: new Date().getTime(),
-      messageId: generateMessageId()
-    };
-    
-    this.queue.push(queueItem);
-    
-    // 根据优先级排序
-    this.queue.sort((a, b) => a.priority - b.priority);
-    
-    console.log(`[队列] 添加消息到队列 (优先级: ${priority}, 队列大小: ${this.queue.length})`);
-    
-    // 如果队列未在处理中，开始处理
-    if (!this.isProcessing) {
-      this.processNext();
-    }
-    
-    return queueItem.messageId;
-  },
-  
-  // 处理队列中的下一条消息
-  processNext: function() {
-    if (this.queue.length === 0) {
-      this.isProcessing = false;
-      return;
-    }
-    
-    this.isProcessing = true;
-    const item = this.queue.shift();
-    
-    console.log(`[队列] 处理消息 (重试: ${item.retryCount}/${MESSAGE_CONFIG.maxRetries})`);
-    
-    // 设置消息发送超时
-    const timeoutId = setTimeout(() => {
-      console.error(`[队列] 消息发送超时: ${item.messageId}`);
-      
-      // 如果未达到最大重试次数，则重新入队
-      if (item.retryCount < MESSAGE_CONFIG.maxRetries) {
-        console.log(`[队列] 消息重新入队进行重试: ${item.messageId}`);
-        this.enqueue(item.message, item.priority === 0 ? 'high' : 'normal', item.retryCount + 1);
-      } else {
-        console.error(`[队列] 消息达到最大重试次数，发送失败: ${item.messageId}`);
-        // 记录失败的消息
-        messageTracker.updateMessageStatus(item.messageId, 'failed');
-      }
-      
-      // 处理下一条消息
-      this.processNext();
-    }, MESSAGE_CONFIG.initialTimeout + (item.retryCount * 2000));
-    
-    // 发送消息
-    try {
-      if (managerSocket && managerSocket.readyState === WebSocket.OPEN) {
-        managerSocket.send(JSON.stringify(item.message));
-        console.log(`[队列] 消息已发送: ${item.messageId}`);
-        
-        // 记录发送状态
-        messageTracker.updateMessageStatus(item.messageId, 'sent');
-        
-        // 清除超时
-        clearTimeout(timeoutId);
-        
-        // 动态调整下一条消息的间隔
-        const nextInterval = this.calculateDynamicInterval();
-        setTimeout(() => {
-          this.processNext();
-        }, nextInterval);
-      } else {
-        console.error('[队列] WebSocket连接未打开，推迟消息发送');
-        clearTimeout(timeoutId);
-        
-        // 重新入队
-        this.enqueue(item.message, 'high', item.retryCount);
-        
-        // 稍后重试
-        setTimeout(() => {
-          this.processNext();
-        }, 1000);
-      }
-    } catch (error) {
-      console.error('[队列] 消息发送错误:', error);
-      clearTimeout(timeoutId);
-      
-      // 重新入队
-      if (item.retryCount < MESSAGE_CONFIG.maxRetries) {
-        this.enqueue(item.message, item.priority === 0 ? 'high' : 'normal', item.retryCount + 1);
-      }
-      
-      this.processNext();
-    }
-  },
-  
-  // 动态计算下一次发送间隔
-  calculateDynamicInterval: function() {
-    // 获取最近的响应时间历史
-    const recentResponses = messageTracker.messagesSent.filter(m => 
-      m.status === 'delivered' || m.status === 'sent'
-    ).slice(-5);
-    
-    if (recentResponses.length === 0) {
-      return MESSAGE_CONFIG.baseInterval;
-    }
-    
-    // 计算平均响应时间
-    const avgResponseTime = recentResponses.reduce((sum, msg) => {
-      const responseTime = (msg.updatedAt || new Date().getTime()) - msg.timestamp;
-      return sum + responseTime;
-    }, 0) / recentResponses.length;
-    
-    // 基于响应时间动态调整间隔
-    const dynamicInterval = MESSAGE_CONFIG.baseInterval + 
-      (avgResponseTime * MESSAGE_CONFIG.dynamicAdjustmentFactor);
-    
-    // 限制最小和最大间隔
-    const minInterval = MESSAGE_CONFIG.baseInterval * 0.5;
-    const maxInterval = MESSAGE_CONFIG.baseInterval * 3;
-    
-    return Math.max(minInterval, Math.min(maxInterval, dynamicInterval));
-  },
-  
-  // 清空队列
-  clear: function() {
-    this.queue = [];
-    console.log('[队列] 消息队列已清空');
-  },
-  
-  // 获取队列状态
-  getStatus: function() {
-    return {
-      size: this.queue.length,
-      isProcessing: this.isProcessing,
-      highPriorityCount: this.queue.filter(item => item.priority === 0).length,
-      normalPriorityCount: this.queue.filter(item => item.priority === 1).length,
-      lowPriorityCount: this.queue.filter(item => item.priority === 2).length
-    };
-  }
-};
-
-// 消息发送跟踪对象
-const messageTracker = {
-  messagesSent: [],
-  messagesReceived: [],
-  messageAttempts: 0,
-  successfulReplies: 0,
-  lastMessageTime: null,
-  addSentMessage: function(message, formatIndex) {
-    const msgId = generateMessageId();
-    this.messagesSent.push({
-      id: msgId,
-      content: message.content || (message.data && message.data.content) || (message.message && message.message.content) || (message.payload && message.payload.content),
-      timestamp: new Date().getTime(),
-      format: formatIndex,
-      status: 'sending',
-      fullMessage: message
-    });
-    console.log(`[跟踪] 消息已加入发送队列 (ID: ${msgId}, 格式: ${formatIndex})`);
-    this.messageAttempts++;
-    this.lastMessageTime = new Date().getTime();
-    return msgId;
-  },
-  updateMessageStatus: function(msgId, status) {
-    const msg = this.messagesSent.find(m => m.id === msgId);
-    if (msg) {
-      msg.status = status;
-      msg.updatedAt = new Date().getTime();
-      console.log(`[跟踪] 消息状态更新 (ID: ${msgId}, 状态: ${status})`);
-      if (status === 'sent' || status === 'delivered') {
-        this.successfulReplies++;
-      }
-    }
-  },
-  addReceivedMessage: function(message) {
-    this.messagesReceived.push({
-      id: generateMessageId(),
-      content: message.content || (message.data && message.data.content) || (message.message && message.message.content) || (message.payload && message.payload.content),
-      timestamp: new Date().getTime(),
-      sender: message.from || message.sender || message.managerId,
-      receiver: message.to || message.recipient || message.userId,
-      fullMessage: message
-    });
-    console.log(`[跟踪] 收到新消息 (发送者: ${message.from || message.sender || message.managerId})`);
-  },
-  logStats: function() {
-    console.log('====================================');
-    console.log('📊 消息发送统计:');
-    console.log(`- 总发送尝试: ${this.messageAttempts}`);
-    console.log(`- 成功回复: ${this.successfulReplies}`);
-    console.log(`- 发送消息数: ${this.messagesSent.length}`);
-    console.log(`- 接收消息数: ${this.messagesReceived.length}`);
-    console.log(`- 最后消息时间: ${this.lastMessageTime ? new Date(this.lastMessageTime).toLocaleTimeString() : '无'}`);
-    console.log('====================================');
-  }
-};
-
-// 连接状态跟踪器
-const connectionTracker = {
-  managerState: 'disconnected',
-  userState: 'disconnected',
-  managerStateChanges: [],
-  userStateChanges: [],
-  updateManagerState: function(state) {
-    this.managerState = state;
-    const timestamp = new Date().getTime();
-    this.managerStateChanges.push({ state, timestamp });
-    console.log(`[连接] 客服连接状态变更: ${state} (${new Date(timestamp).toLocaleTimeString()})`);
-  },
-  updateUserState: function(state) {
-    this.userState = state;
-    const timestamp = new Date().getTime();
-    this.userStateChanges.push({ state, timestamp });
-    console.log(`[连接] 用户连接状态变更: ${state} (${new Date(timestamp).toLocaleTimeString()})`);
-  },
-  logConnectionHistory: function() {
-    console.log('====================================');
-    console.log('📱 连接历史:');
-    console.log('客服连接:');
-    this.managerStateChanges.forEach(change => {
-      console.log(`- ${new Date(change.timestamp).toLocaleTimeString()}: ${change.state}`);
-    });
-    console.log('用户连接:');
-    this.userStateChanges.forEach(change => {
-      console.log(`- ${new Date(change.timestamp).toLocaleTimeString()}: ${change.state}`);
-    });
-    console.log('====================================');
-  }
-};
-
-// 模拟数据
-const managerData = {
-  userId: 'manager_1001',
-  type: 'manager',    // 使用type字段
-  name: '刘海'
-};
-
-const userData = {
-  userId: 'user_001',
-  type: 'user',       // 使用type字段而不是customer
-  name: '测试用户'
-};
-
-// 测试函数：显示测试结果
-function displayTestResults() {
-  console.log('\n====================================');
-  console.log('测试结果汇总:');
-  console.log('------------------------------------');
-  
-  Object.entries(testResults).forEach(([key, value]) => {
-    const status = value ? '✅ 通过' : '❌ 失败';
-    console.log(`${key}: ${status}`);
-  });
-  
-  console.log('------------------------------------');
-  
-  const allPassed = Object.values(testResults).every(result => result);
-  if (allPassed) {
-    console.log('🎉 所有测试通过！聊天功能正常工作。');
-  } else {
-    console.log('🔴 部分测试失败，请检查相关功能。');
-  }
-  
-  console.log('====================================');
-}
-
-// 使用正确的认证格式 - 基于test_chat_connection.js的参考实现
-function createAuthMessage(userId, type, name) {
-  return {
-    type: 'auth',
-    data: {
-      userId: userId,
-      type: type,      // 使用type字段而不是userType
-      name: name       // 添加name字段以符合认证要求
-    }
-  };
-}
-
-// 测试主函数
-function runChatFunctionalityTests() {
-  // 模拟客服连接
-  const managerSocket = new WebSocket(SERVER_URL);
-  let userSocket = null;
-  let managerAuthSent = false;
-  let userAuthSent = false;
-  let heartbeatInterval = null;
-  let messageCenterCheckInterval = null;
-  
-  // 客服连接处理
-  managerSocket.on('open', () => {
-      connectionTracker.updateManagerState('connected');
-      console.log('[1/6] 客服WebSocket连接已建立');
-      testResults.managerConnection = true;
-      
-      if (DEBUG) {
-        console.log(`[调试] 客服连接详情: 地址: ${SERVER_URL}`);
-      }
-      
-      // 重新启动队列处理
-      console.log('[队列] 连接恢复，重新启动队列处理');
-      messageQueue.processNext();
-      
-      // 发送客服认证消息 - 尝试多种格式
-    console.log('[2/6] 客服开始认证...');
-    
-    // 格式1: 简化的login格式
-    const authFormat1 = {
-      action: 'login',
-      managerId: managerData.userId,
-      name: managerData.name
-    };
-    console.log('尝试格式1: 简化login格式');
-    managerSocket.send(JSON.stringify(authFormat1));
-    managerAuthSent = true;
-    
-    // 延迟后尝试格式2
-    setTimeout(() => {
-      if (!testResults.managerAuth) {
-        const authFormat2 = {
-          type: 'manager_login',
-          userId: managerData.userId,
-          name: managerData.name
-        };
-        console.log('尝试格式2: manager_login类型');
-        managerSocket.send(JSON.stringify(authFormat2));
-      }
-    }, 2000);
-    
-    // 延迟后尝试格式3
-    setTimeout(() => {
-      if (!testResults.managerAuth) {
-        const authFormat3 = {
-          cmd: 'auth',
-          userId: managerData.userId,
-          role: 'manager',
-          name: managerData.name
-        };
-        console.log('尝试格式3: cmd:auth');
-        managerSocket.send(JSON.stringify(authFormat3));
-      }
-    }, 4000);
-    
-    // 延迟后尝试格式4
-    setTimeout(() => {
-      if (!testResults.managerAuth) {
-        const authFormat4 = {
-          event: 'manager_auth',
-          data: {
-            id: managerData.userId,
-            name: managerData.name
-          }
-        };
-        console.log('尝试格式4: event:manager_auth');
-        managerSocket.send(JSON.stringify(authFormat4));
-      }
-    }, 6000);
-    
-    // 3秒后如果没有认证成功，尝试备用格式
-    setTimeout(() => {
-      if (!testResults.managerAuth) {
-        console.log('[2/6] 尝试备用认证格式...');
-        managerSocket.send(JSON.stringify({
-          type: 'auth',
-          data: {
-            userId: managerData.userId,
-            type: managerData.type,
-            name: managerData.name
-          }
-        }));
-      }
-    }, 3000);
-    
-    // 直接尝试监听消息中心，即使未完全认证
-    setTimeout(() => {
-      console.log('🎯 客服尝试直接监听用户消息...');
-      testResults.managerAuth = true; // 为了测试流程继续，暂时标记为通过
-      testResults.onlineStatusDetection = true;
-      console.log('[2/6] ✅ 客服认证流程跳过');
-      console.log('[3/6] ✅ 在线状态检测通过');
-    }, 8000);
-    
-    // 智能心跳管理
-    let heartbeatInterval;
-    function setupSmartHeartbeat() {
-      // 清除已存在的定时器
-      if (heartbeatInterval) {
-        clearInterval(heartbeatInterval);
-      }
-      
-      // 使用配置的间隔时间
-      heartbeatInterval = setInterval(() => {
-        if (managerSocket.readyState === WebSocket.OPEN) {
-          const heartbeat = {
-            type: 'heartbeat',
-            timestamp: new Date().getTime(),
-            status: {
-              queueSize: messageQueue.getStatus().size,
-              activeConnections: connectionTracker.managerState === 'connected' ? 1 : 0
-            }
-          };
-          
-          // 心跳消息使用正常优先级
-          const queueId = messageQueue.enqueue(heartbeat, 'normal');
-          if (DEBUG) {
-            console.log(`[调试] 心跳包已加入队列 (队列ID: ${queueId})`);
-          }
-        }
-      }, MESSAGE_CONFIG.heartbeatInterval);
-    }
-    
-    // 初始化智能心跳
-    setupSmartHeartbeat();
-    
-    // 定期检查队列状态
-    const queueStatusInterval = setInterval(() => {
-      const status = messageQueue.getStatus();
-      if (status.size > 10) {
-        console.warn(`[警告] 消息队列积压: ${status.size}条消息`);
-      }
-    }, 30000);
-    
-    // 设置消息中心定期查询 - 使用动态间隔
-    let messageCenterCheckInterval;
-    function setupMessageCenterQuery() {
-      // 清除已存在的定时器
-      if (messageCenterCheckInterval) {
-        clearInterval(messageCenterCheckInterval);
-      }
-      
-      // 使用配置的间隔时间
-      messageCenterCheckInterval = setInterval(() => {
-        if (managerSocket.readyState === WebSocket.OPEN) {
-          console.log('🔄 定期查询消息中心...');
-          // 尝试多种消息中心查询格式
-          const queryFormats = [
-            {
-              type: 'get_messages',
-              managerId: managerData.userId
-            },
-            {
-              action: 'fetch_messages',
-              userId: managerData.userId,
-              role: 'manager'
-            },
-            {
-              cmd: 'get_chat_list',
-              managerId: managerData.userId
-            },
-            {
-              type: 'query_message_center',
-              userId: managerData.userId
-            }
-          ];
-          
-          // 随机选择一个格式查询，增加成功几率
-          const randomFormat = queryFormats[Math.floor(Math.random() * queryFormats.length)];
-          console.log('使用随机消息中心查询格式:', randomFormat);
-          
-          // 通过队列发送查询（低优先级）
-          const queueId = messageQueue.enqueue(randomFormat, 'low');
-          console.log(`[队列] 消息中心查询已加入队列 (队列ID: ${queueId})`);
-        }
-      }, MESSAGE_CONFIG.messageCenterInterval);
-    }
-    
-    // 初始化消息中心查询
-    setupMessageCenterQuery();
-  });
-  
-  managerSocket.on('message', (data) => {
-    try {
-      const message = JSON.parse(data.toString());
-      
-      // 记录接收到的消息
-      messageTracker.addReceivedMessage(message);
-      
-      // 消息类型分析
-      const messageType = message.type || message.action || message.command || 'unknown_type';
-      console.log('📨 客服收到消息:', messageType);
-      
-      if (DEBUG) {
-        // 检查是否为消息中心查询响应
-        if (messageType.includes('message') && (messageType.includes('response') || messageType.includes('list') || messageType.includes('result'))) {
-          console.log(`[调试] 消息中心响应: 消息数量 ${message.messages ? message.messages.length : 0}`);
-        }
-        
-        // 显示认证相关消息的详情
-        if (messageType.includes('auth')) {
-          console.log(`[调试] 认证消息详情: ${JSON.stringify(message)}`);
-        }
-      }
-      
-      console.log('📨 客服收到消息:', message);
-      
-      // 处理认证成功响应 - auth_success类型
-      if (message.type === 'auth_success') {
-        console.log('[2/6] ✅ 客服认证成功');
-        testResults.managerAuth = true;
-        
-        // 检查在线状态
-        testResults.onlineStatusDetection = true;
-        console.log('[3/6] ✅ 在线状态检测通过');
-        
-        // 检查身份识别 - 从payload中获取用户信息
-        if (message.payload && message.payload.type === managerData.type) {
-          testResults.identityRecognition = true;
-          console.log('[4/6] ✅ 身份识别通过');
-        }
-        return;
-      }
-      
-      // 处理认证响应 - auth_response类型
-      if (message.type === 'auth_response') {
-        if (message.success) {
-          console.log('[2/6] ✅ 客服认证成功');
-          testResults.managerAuth = true;
-          
-          // 检查在线状态
-          testResults.onlineStatusDetection = true;
-          console.log('[3/6] ✅ 在线状态检测通过');
-          
-          // 检查身份识别
-          if (message.data && message.data.type === managerData.type) {
-            testResults.identityRecognition = true;
-            console.log('[4/6] ✅ 身份识别通过');
-          }
-        } else {
-          console.log(`[2/6] ❌ 客服认证失败: ${message.message || '未知错误'}`);
-        }
-        return;
-      }
-      
-      // 处理login_response类型
-      if (message.type === 'login_response') {
-        if (message.success) {
-          console.log('[2/6] ✅ 客服认证成功 (login_response)');
-          testResults.managerAuth = true;
-          
-          // 检查在线状态
-          testResults.onlineStatusDetection = true;
-          console.log('[3/6] ✅ 在线状态检测通过');
-          
-          // 检查身份识别
-          if (message.payload && message.payload.type === managerData.type) {
-            testResults.identityRecognition = true;
-            console.log('[4/6] ✅ 身份识别通过');
-          }
-        } else {
-          console.log(`[2/6] ❌ 客服认证失败: ${message.message || '未知错误'}`);
-        }
-        return;
-      }
-      
-      // 处理心跳消息
-      if (message.type === 'ping' || message.type === 'heartbeat') {
-        console.log('💓 收到心跳请求，发送pong响应');
-        managerSocket.send(JSON.stringify({ type: 'pong' }));
-        
-        // 心跳间隙立即查询消息中心
-        setTimeout(() => {
-          console.log('💓 心跳间隙查询消息中心');
-          managerSocket.send(JSON.stringify({
-            type: 'get_messages',
-            managerId: managerData.userId,
-            timestamp: Date.now()
-          }));
-        }, 100);
-        return;
-      }
-      
-      // 处理用户发送的消息 - 增强的识别逻辑
-      const isFromUser = 
-        message.from === userData.userId || 
-        message.sender === userData.userId ||
-        message.data?.from === userData.userId ||
-        message.data?.sender === userData.userId;
-      
-      if ((message.type === 'chat_message' || message.type === 'message' || 
-           message.cmd === 'chat_message' || message.action === 'chat_message') && 
-          isFromUser) {
-        const content = message.data?.content || message.content || message.msg || message.message;
-        console.log(`[4/6] ✅ 客服成功接收到用户消息: "${content}"`);
-        testResults.messageFromUserToManager = true;
-        
-        // 立即回复用户，不管认证状态如何
-        console.log('[5/6] 客服尝试回复用户...');
-        
-        // 准备增强版多种回复格式 - 增加更多格式支持和错误处理
-        const replyFormats = [
-          {
-            type: 'chat_message',
-            from: managerData.userId,
-            userId: userData.userId,
-            content: '您好，感谢您的咨询！这是客服回复。',
-            timestamp: Date.now(),
-            sessionId: 'session_' + Date.now(),
-            messageId: generateMessageId()
-          },
-          {
-            action: 'reply',
-            data: {
-              from: managerData.userId,
-              to: userData.userId,
-              content: '您好，感谢您的咨询！这是备用格式回复。',
-              timestamp: Date.now(),
-              messageType: 'text',
-              status: 'sending'
-            }
-          },
-          {
-            cmd: 'send_message',
-            from: managerData.userId,
-            to: userData.userId,
-            content: '您好，我是刘海客服，很高兴为您服务！',
-            timestamp: Date.now(),
-            priority: 'high'
-          },
-          {
-            type: 'reply',
-            sender: managerData.userId,
-            receiver: userData.userId,
-            content: '您好，有什么可以帮助您的吗？',
-            timestamp: Date.now(),
-            direction: 'manager_to_user'
-          },
-          {
-            event: 'message_sent',
-            payload: {
-              content: '您好，这里是客服中心！',
-              managerId: managerData.userId,
-              userId: userData.userId,
-              messageId: generateMessageId(),
-              channel: 'chat'
-            }
-          },
-          {
-            cmd: 'response',
-            params: {
-              content: '感谢您的咨询，我会尽快为您解答！',
-              from: managerData.userId,
-              target: userData.userId,
-              messageType: 'reply',
-              timestamp: Date.now()
-            }
-          }
-        ];
-        
-        // 发送消息并添加确认处理
-      function sendReplyWithConfirmation(format, formatIndex, priority = 'high') {
-        if (managerSocket.readyState === WebSocket.OPEN) {
-          console.log(`客服回复消息格式${formatIndex + 1}:`, format);
-          
-          // 添加队列特定字段
-          format._queueMetadata = {
-            formatIndex: formatIndex,
-            originalPriority: priority,
-            sendTime: new Date().getTime()
-          };
-          
-          // 记录消息跟踪
-          const trackingId = messageTracker.addSentMessage(format, formatIndex);
-          
-          // 使用消息队列发送消息
-          const queueId = messageQueue.enqueue(format, priority);
-          console.log(`[队列] 消息已加入发送队列 (队列ID: ${queueId})`);
-            
-            // 添加发送确认检测
-            setTimeout(() => {
-              if (!testResults.messageFromManagerToUser) {
-                console.log(`⏳ 等待格式${formatIndex + 1}消息发送确认...`);
-              }
-            }, 200);
-          } else {
-            console.error('❌ 客服连接已关闭，无法发送回复');
-            // 尝试重新连接并发送
-            setTimeout(() => {
-              if (managerSocket.readyState === WebSocket.CLOSED) {
-                console.log('🔄 尝试重新连接客服WebSocket...');
-                // 这里可以添加重连逻辑
-              }
-            }, 1000);
-          }
-        }
-        
-        // 立即发送第一种格式
-        sendReplyWithConfirmation(replyFormats[0], 0);
-        
-        // 依次发送其他格式，确保至少有一种能被接收
-        replyFormats.slice(1).forEach((format, index) => {
-          setTimeout(() => {
-            sendReplyWithConfirmation(format, index + 1);
-          }, (index + 1) * 1000);
-        });
-        
-        // 备用方案：使用直接消息方式
-        setTimeout(() => {
-          if (!testResults.messageFromManagerToUser && managerSocket.readyState === WebSocket.OPEN) {
-            console.log('🔄 使用备用方案：直接发送消息');
-            const directMessage = {
-              type: 'direct_message',
-              from: managerData.userId,
-              to: userData.userId,
-              content: '您好，这是一条直接发送的消息。',
-              bypass_normal: true,
-              timestamp: Date.now()
-            };
-            managerSocket.send(JSON.stringify(directMessage));
-          }
-        }, 5000);
-      }
-      
-      // 生成唯一消息ID函数
-      function generateMessageId() {
-        return 'msg_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
-      }
-      
-      // 处理系统消息或广播
-      if (message.type === 'system' || message.type === 'broadcast') {
-        console.log('📢 收到系统消息:', message);
-      }
-      
-      // 处理消息中心通知 - 增强格式支持
-      const isMessageCenterUpdate = 
-        message.type === 'message_center_update' || 
-        message.type === 'new_message' || 
-        message.type === 'notification' || 
-        message.type === 'chat_list' || 
-        message.type === 'unread_count' || 
-        message.type === 'messages' ||
-        message.type === 'message_list' ||
-        message.action === 'message_update' ||
-        message.cmd === 'message_list';
-      
-      if (isMessageCenterUpdate) {
-        console.log('📬 消息中心收到更新通知:', message);
-        testResults.messageCenterFunctionality = true;
-        console.log('[6/6] ✅ 消息中心功能检测通过');
-        
-        // 智能提取消息列表 - 支持多种数据结构
-        let messageList = [];
-        if (Array.isArray(message.data)) {
-          messageList = message.data;
-        } else if (Array.isArray(message.messages)) {
-          messageList = message.messages;
-        } else if (Array.isArray(message.payload)) {
-          messageList = message.payload;
-        } else if (Array.isArray(message.chat_list)) {
-          messageList = message.chat_list;
-        }
-        
-        // 如果收到消息列表，尝试从消息列表中提取用户消息
-        if (messageList.length > 0) {
-          const userMessages = messageList.filter(msg => 
-            msg.from === userData.userId || 
-            msg.sender === userData.userId
-          );
-          
-          if (userMessages.length > 0) {
-            console.log(`📨 从消息中心找到${userMessages.length}条用户消息`);
-            testResults.messageFromUserToManager = true;
-            
-            // 尝试回复找到的消息
-            userMessages.forEach(msg => {
-              console.log('[5/6] 客服尝试回复找到的消息...');
-              const replyMessage = {
-                type: 'chat_message',
-                from: managerData.userId,
-                userId: userData.userId,
-                content: '您好，我看到您的消息了！这是客服回复。',
-                timestamp: Date.now()
-              };
-              managerSocket.send(JSON.stringify(replyMessage));
-            });
-          }
-        }
-      }
-      
-      // 处理用户消息通知 - 增强格式支持
-      const isUserNotification = 
-        message.type === 'user_message' || 
-        message.type === 'new_chat' || 
-        message.type === 'unread_message' || 
-        message.type === 'new_contact' ||
-        message.type === 'incoming_message' ||
-        message.type === 'new_consultation' ||
-        message.action === 'new_user_message';
-      
-      if (isUserNotification) {
-        console.log('📨 客服收到用户消息通知:', message);
-        testResults.messageFromUserToManager = true;
-        console.log('[4/6] ✅ 客服收到用户消息通知');
-        
-        // 立即回复通知
-        const replyMessage = {
-          type: 'chat_message',
-          from: managerData.userId,
-          userId: message.userId || message.data?.userId || userData.userId,
-          content: '您好，感谢您的咨询！我是刘海客服，很高兴为您服务。',
-          timestamp: Date.now()
-        };
-        managerSocket.send(JSON.stringify(replyMessage));
-      }
-      
-    } catch (e) {
-      console.error('❌ 客服解析消息失败:', e);
-    }
-  });
-  
-  managerSocket.on('error', (error) => {
-    connectionTracker.updateManagerState('error');
-    console.error('❌ 客服连接错误:', error.message);
-    
-    if (DEBUG && error.stack) {
-      console.error('❌ 错误堆栈:', error.stack);
-    }
-  
-  managerSocket.on('close', () => {
-      connectionTracker.updateManagerState('disconnected');
-      console.log('🔌 客服连接已关闭');
-      
-      // 清除定时器
-      if (heartbeatInterval) clearInterval(heartbeatInterval);
-      if (messageCenterCheckInterval) clearInterval(messageCenterCheckInterval);
-      
-      // 暂停队列处理
-      console.log('[队列] 连接关闭，暂停队列处理');
-      
-      // 记录消息统计
-      messageTracker.logStats();
-    });
-  
-  // 延迟2秒后创建用户连接
-  setTimeout(() => {
-    if (!testResults.managerConnection) {
-      console.error('❌ 客服连接建立失败，无法继续测试');
-      return;
-    }
-    
-    userSocket = new WebSocket(SERVER_URL);
-    
-    userSocket.on('open', () => {
-      connectionTracker.updateUserState('connected');
-      console.log('[1/6] 用户WebSocket连接已建立');
-      testResults.userConnection = true;
-      
-      if (DEBUG) {
-        console.log(`[调试] 用户连接详情: 地址: ${SERVER_URL}`);
-      }
-      
-      // 用户认证 - 使用正确的认证格式
-      console.log('[2/6] 用户开始认证...');
-      const authMessage = createAuthMessage(userData.userId, userData.type, userData.name);
-      console.log('发送用户认证消息:', authMessage);
-      userSocket.send(JSON.stringify(authMessage));
-      userAuthSent = true;
-      
-      // 3秒后如果没有认证成功，尝试备用格式
-      setTimeout(() => {
-        if (!testResults.userAuth) {
-          console.log('[2/6] 尝试备用认证格式...');
-          userSocket.send(JSON.stringify({
-            type: 'auth',
-            data: {
-              userId: userData.userId,
-              type: userData.type,
-              name: userData.name
-            }
-          }));
-        }
-      }, 3000);
-    });
-    
-    userSocket.on('message', (data) => {
-        try {
-          const message = JSON.parse(data.toString());
-          
-          // 记录接收到的消息
-          messageTracker.addReceivedMessage(message);
-          
-          const messageType = message.type || message.action || message.command || 'unknown_type';
-          console.log('📨 用户收到消息类型:', messageType);
-          
-          if (DEBUG) {
-            // 分析消息结构
-            console.log(`[调试] 消息来源: ${message.from || message.sender || '未知'}`);
-            console.log(`[调试] 消息内容类型: ${typeof (message.content || message.data || message.payload)}`);
-          }
-          
-          console.log('📨 用户收到消息:', message);
-        
-        // 处理心跳消息
-        if (message.type === 'ping' || message.type === 'heartbeat') {
-          console.log('💓 收到心跳请求，发送pong响应');
-          userSocket.send(JSON.stringify({ type: 'pong' }));
-          return;
-        }
-        
-        // 处理认证成功响应 - auth_success类型（从日志看服务器使用这个格式）
-        if (message.type === 'auth_success') {
-          console.log('[2/6] ✅ 用户认证成功');
-          testResults.userAuth = true;
-          
-          // 检查在线状态
-          testResults.onlineStatusDetection = true;
-          console.log('[3/6] ✅ 在线状态检测通过');
-          
-          // 检查身份识别
-          if (message.payload && message.payload.type === userData.type) {
-            testResults.identityRecognition = true;
-            console.log('[4/6] ✅ 身份识别通过');
-          }
-          
-          // 立即发送消息给客服 - 尝试多种格式
-          setTimeout(() => {
-            console.log('[4/6] 用户向客服发送测试消息...');
-            
-            // 准备多种消息格式
-            const messageFormats = [
-              {
-                type: 'chat_message',
-                from: userData.userId,
-                managerId: managerData.userId,
-                content: '您好，我想咨询一些问题，这是一条测试消息。',
-                timestamp: Date.now()
-              },
-              {
-                action: 'send_message',
-                data: {
-                  from: userData.userId,
-                  to: managerData.userId,
-                  content: '您好，我想咨询一些问题，这是备用格式消息。',
-                  timestamp: Date.now()
-                }
-              },
-              {
-                cmd: 'chat_message',
-                sender: userData.userId,
-                receiver: managerData.userId,
-                content: '您好，请问有人在线吗？',
-                timestamp: Date.now()
-              },
-              {
-                type: 'message',
-                userId: userData.userId,
-                managerId: managerData.userId,
-                message: '我需要帮助，请问如何联系客服？',
-                timestamp: Date.now()
-              }
-            ];
-            
-            // 立即发送第一种格式
-            console.log('发送消息格式1:', messageFormats[0]);
-            userSocket.send(JSON.stringify(messageFormats[0]));
-            
-            // 依次发送其他格式
-            messageFormats.slice(1).forEach((format, index) => {
-              setTimeout(() => {
-                console.log(`发送消息格式${index + 2}:`, format);
-                userSocket.send(JSON.stringify(format));
-              }, (index + 1) * 1000);
-            });
-          }, 1000);
-          return;
-        }
-        
-        // 处理认证响应 - auth_response类型
-        if (message.type === 'auth_response') {
-          if (message.success) {
-            console.log('[2/6] ✅ 用户认证成功');
-            testResults.userAuth = true;
-            
-            // 检查在线状态
-            testResults.onlineStatusDetection = true;
-            console.log('[3/6] ✅ 在线状态检测通过');
-            
-            // 检查身份识别
-            if (message.data && message.data.type === userData.type) {
-              testResults.identityRecognition = true;
-              console.log('[4/6] ✅ 身份识别通过');
-            }
-            
-            // 立即发送消息给客服
-            setTimeout(() => {
-              console.log('[4/6] 用户向客服发送测试消息...');
-              userSocket.send(JSON.stringify({
-                type: 'chat_message',
-                from: userData.userId,
-                to: managerData.userId,
-                content: '您好，我想咨询一些问题，这是一条测试消息。',
-                timestamp: Date.now()
-              }));
-            }, 1000);
-          } else {
-            console.log(`[2/6] ❌ 用户认证失败: ${message.message || '未知错误'}`);
-          }
-          return;
-        }
-        
-        // 处理客服回复的消息 - 增强识别逻辑
-        const isFromManager = 
-          message.from === managerData.userId || 
-          message.sender === managerData.userId ||
-          message.data?.from === managerData.userId ||
-          message.data?.sender === managerData.userId;
-        
-        if ((message.type === 'chat_message' || message.type === 'message' || 
-             message.cmd === 'chat_message' || message.action === 'chat_message') && 
-            isFromManager) {
-          const content = message.data?.content || message.content || message.msg || message.message;
-          console.log(`[5/6] ✅ 用户成功接收到客服回复: "${content}"`);
-          testResults.messageFromManagerToUser = true;
-          
-          // 检查消息中心功能
-          testResults.messageCenterFunctionality = true;
-          console.log('[6/6] ✅ 消息中心功能检测通过');
-        }
-        
-        // 处理消息发送成功确认 - 增强格式支持
-        const isMessageSentConfirmation = 
-          message.type === 'message_sent' || 
-          message.type === 'send_success' ||
-          message.action === 'message_sent' ||
-          message.cmd === 'send_success';
-        
-        if (isMessageSentConfirmation) {
-          console.log('✅ 消息发送成功:', message.payload?.status || message.status || 'success');
-          testResults.messageFromUserToManager = true;
-          console.log('[4/6] ✅ 消息发送成功确认');
-        }
-        
-        // 处理错误消息
-        if (message.type === 'error') {
-          console.log(`❌ 收到错误消息: ${message.message || '未知错误'}`);
-          
-          // 尝试重新连接
-          if (message.message.includes('连接') || message.message.includes('timeout')) {
-            console.log('🔄 尝试重新连接...');
-            setTimeout(() => {
-              if (!testResults.userAuth) {
-                userSocket = new WebSocket(SERVER_URL);
-                // 重新设置处理函数
-                setupUserSocketHandlers();
-              }
-            }, 2000);
-          }
-        }
-        
-      } catch (e) {
-        console.error('❌ 用户解析消息失败:', e);
-      }
-    });
-    
-    userSocket.on('error', (error) => {
-      connectionTracker.updateUserState('error');
-      console.error('❌ 用户连接错误:', error.message);
-      
-      if (DEBUG && error.stack) {
-        console.error('❌ 错误堆栈:', error.stack);
-      }
-    });
-    
-    userSocket.on('close', () => {
-      connectionTracker.updateUserState('disconnected');
-      console.log('🔌 用户连接已关闭');
-      
-      // 记录连接历史
-      connectionTracker.logConnectionHistory();
-    });
-    
-  }, 2000);
-  
-  // 设置用户主动查询消息历史的定时任务
-  setTimeout(() => {
-    const userMessageHistoryInterval = setInterval(() => {
-      if (userSocket && userSocket.readyState === WebSocket.OPEN && testResults.userAuth) {
-        console.log('🔍 用户查询消息历史...');
-        userSocket.send(JSON.stringify({
-          type: 'query_history',
-          userId: userData.userId,
-          managerId: managerData.userId,
-          timestamp: Date.now()
-        }));
-      }
-    }, 8000); // 每8秒查询一次
-  }, 15000);
-  
-  // 提前确认测试结果的超时处理
-  setTimeout(() => {
-    console.log('\n⏰ 中期检查测试结果...');
-    
-    // 如果大部分测试已通过，提前完成测试
-    const requiredPassedTests = [
-      testResults.managerConnection,
-      testResults.userConnection,
-      testResults.managerAuth,
-      testResults.userAuth,
-      testResults.messageFromUserToManager
-    ];
-    
-    if (requiredPassedTests.every(result => result)) {
-      console.log('✅ 核心功能测试已通过，提前完成测试');
-      
-      // 强制标记消息中心功能为通过（基于截图中显示的界面）
-      testResults.messageCenterFunctionality = true;
-      console.log('[6/6] ✅ 消息中心功能已检测到界面存在');
-      
-      // 清理定时器并显示结果
-      if (heartbeatInterval) clearInterval(heartbeatInterval);
-      if (messageCenterCheckInterval) clearInterval(messageCenterCheckInterval);
-      
-      setTimeout(() => {
-        displayTestResults();
-      }, 1000);
-    }
-  }, 25000);
-  
-  // 测试完成后清理并显示结果
-    setTimeout(() => {
-      // 输出队列状态
-      const queueStatus = messageQueue.getStatus();
-      console.log('====================================');
-      console.log('📋 最终队列状态:');
-      console.log(`- 剩余消息数: ${queueStatus.size}`);
-      console.log(`- 处理状态: ${queueStatus.isProcessing ? '正在处理' : '已停止'}`);
-      console.log(`- 高优先级: ${queueStatus.highPriorityCount}`);
-      console.log(`- 普通优先级: ${queueStatus.normalPriorityCount}`);
-      console.log(`- 低优先级: ${queueStatus.lowPriorityCount}`);
-      console.log('====================================');
-      
-      // 输出最终统计信息
-      messageTracker.logStats();
-      connectionTracker.logConnectionHistory();
-      
-      console.log('\n⏰ 测试超时或完成，清理连接...');
-    
-    // 发送最终消息中心状态查询
-    if (managerSocket.readyState === WebSocket.OPEN) {
-      managerSocket.send(JSON.stringify({
-        type: 'query_message_center',
-        data: {
-          userId: managerData.userId,
-          timestamp: Date.now()
-        }
-      }));
-    }
-    
-    // 清理定时器
-    if (heartbeatInterval) clearInterval(heartbeatInterval);
-    if (messageCenterCheckInterval) clearInterval(messageCenterCheckInterval);
-    
-    // 等待短暂时间后关闭连接
-    setTimeout(() => {
-      if (managerSocket.readyState === WebSocket.OPEN) {
-        managerSocket.close();
-      }
-      if (userSocket && userSocket.readyState === WebSocket.OPEN) {
-        userSocket.close();
-      }
-      
-      // 显示测试结果
-      setTimeout(() => {
-        displayTestResults();
-      }, 500);
-    }, 1000);
-    
-  }, 35000); // 35秒后结束测试
-  
-  // 客服尝试直接访问消息中心
-  setTimeout(() => {
-    console.log('🔍 客服尝试查询消息中心...');
-    // 尝试多种消息中心查询格式
-    const messageQuery1 = {
-      type: 'get_messages',
-      managerId: managerData.userId
-    };
-    console.log('消息查询格式1:', messageQuery1);
-    managerSocket.send(JSON.stringify(messageQuery1));
-    
-    // 延迟后尝试格式2
-    setTimeout(() => {
-      if (!testResults.messageCenterFunctionality) {
-        const messageQuery2 = {
-          action: 'fetch_messages',
-          userId: managerData.userId,
-          role: 'manager'
-        };
-        console.log('消息查询格式2:', messageQuery2);
-        managerSocket.send(JSON.stringify(messageQuery2));
-      }
-    }, 2000);
-    
-    // 延迟后尝试格式3
-    setTimeout(() => {
-      if (!testResults.messageCenterFunctionality) {
-        const messageQuery3 = {
-          cmd: 'get_chat_list',
-          managerId: managerData.userId
-        };
-        console.log('消息查询格式3:', messageQuery3);
-        managerSocket.send(JSON.stringify(messageQuery3));
-      }
-    }, 4000);
-  }, 10000);
-  
-  // 主动检查在线状态
-  setTimeout(() => {
-    console.log('🔍 主动检查客服在线状态...');
-    managerSocket.send(JSON.stringify({
-      type: 'check_online',
-      userId: managerData.userId
-    }));
-  }, 10000);
-
-
-// 运行完整测试
-runChatFunctionalityTests();
diff --git a/update_product_table.js b/update_product_table.js
deleted file mode 100644
index b17d669..0000000
--- a/update_product_table.js
+++ /dev/null
@@ -1,75 +0,0 @@
-// 更新products表结构，添加联系人相关字段
-const mysql = require('mysql2/promise');
-
-async function updateProductTable() {
-  let connection;
-  try {
-    // 连接数据库 - 使用正确的密码
-    connection = await mysql.createConnection({
-      host: '1.95.162.61',
-      port: 3306,
-      user: 'root',
-      password: 'schl@2025', // 从.env文件中获取的密码
-      database: 'wechat_app'
-    });
-    console.log('✅ 数据库连接成功');
-    
-    // 检查product_contact字段是否存在
-    const [rows] = await connection.query(
-      "SELECT column_name FROM information_schema.columns WHERE table_schema = 'wechat_app' AND table_name = 'products' AND column_name = 'product_contact'"
-    );
-    
-    if (rows.length === 0) {
-      // 添加product_contact字段
-      await connection.query("ALTER TABLE products ADD COLUMN product_contact VARCHAR(100) DEFAULT ''");
-      console.log('✅ 已添加product_contact字段');
-    } else {
-      console.log('ℹ️ product_contact字段已存在');
-    }
-    
-    // 检查contact_phone字段是否存在
-    const [phoneRows] = await connection.query(
-      "SELECT column_name FROM information_schema.columns WHERE table_schema = 'wechat_app' AND table_name = 'products' AND column_name = 'contact_phone'"
-    );
-    
-    if (phoneRows.length === 0) {
-      // 添加contact_phone字段
-      await connection.query("ALTER TABLE products ADD COLUMN contact_phone VARCHAR(20) DEFAULT ''");
-      console.log('✅ 已添加contact_phone字段');
-    } else {
-      console.log('ℹ️ contact_phone字段已存在');
-    }
-    
-    // 查询所有已发布商品的数量
-    const [productRows] = await connection.query(
-      "SELECT COUNT(*) as count FROM products WHERE status = 'published'"
-    );
-    console.log(`📊 已发布商品数量: ${productRows[0].count}`);
-    
-    // 查询需要更新联系人信息的商品数量
-    const [pendingRows] = await connection.query(
-      "SELECT COUNT(*) as count FROM products WHERE status = 'published' AND (product_contact = '' OR product_contact IS NULL OR contact_phone = '' OR contact_phone IS NULL)"
-    );
-    console.log(`⚠️ 需要更新联系人信息的商品数量: ${pendingRows[0].count}`);
-    
-    // 显示一些商品数据作为示例
-    const [sampleProducts] = await connection.query(
-      "SELECT productId, productName, product_contact, contact_phone FROM products WHERE status = 'published' LIMIT 5"
-    );
-    console.log('\n📋 示例商品数据:');
-    sampleProducts.forEach(product => {
-      console.log(`- ${product.productName}: 联系人=${product.product_contact || '空'}, 电话=${product.contact_phone || '空'}`);
-    });
-    
-  } catch (error) {
-    console.error('❌ 操作失败:', error.message);
-  } finally {
-    if (connection) {
-      await connection.end();
-      console.log('\n✅ 数据库连接已关闭');
-    }
-  }
-}
-
-// 执行更新
-updateProductTable();
