站三界导航
首页 文章资讯
  • jQuery tab切换代码
    jQuery tab切换代码

    html<divid="wrap"><divid="tit"><spanclass="select">标题1</span><span>标题2</span><span>标题3</span></div><ulid="con"><liclass="show">内容111</li><li>内容222</li><li>内容333</li></ul></div>css*{margin:0;padding:0;list-style:none;}#wrap{width:600px;margin:100pxauto0;overflow:hidden;}#tit{height:30px;width:600px;}#titspan{float:left;height:30px;line-height:30px;width:200px;font-size:20px;text-align:center;color:#ccc;background:green;}#conli{display:none;height:200px;width:600px;background:pink;font-size:100px;line-height:200px;text-align:center;}#titspan.select{background:red;color:#ccc;}#conli.show{display:block;}js$('#titspan').click(function(){vari=$(this).index();//下标第一种写法//vari=$('tit').index(this);//下标第二种写法$(this).addClass('select').siblings().removeClass('select');$('#conli').eq(i).show().siblings().hide();});

    • jQuery代码
    • 336阅读
    • 2022-05-04

  • jQuery鼠标滑过动画
    jQuery鼠标滑过动画

    html<divclass="wrap"><divclass="before"></div><divclass="content">鼠标划过</div><divclass="after"></div></div>css.wrap{width:100px;height:100px;background-color:rgb(240,236,236);position:relative;left:200px;overflow:hidden;}.before{width:100%;height:100%;background-color:rosybrown;position:absolute;left:-100px;top:0;opacity:0;}.after{width:100%;height:100%;background-color:rosybrown;position:absolute;right:0px;z-index:-1;}.content{position:absolute;z-index:3;}js$('.wrap').mouseenter(function(){$(this).find('.before').css('opacity','1').animate({'left':'0'},200)$(this).find('.after').css({'z-index':'-2','width':'100px'})})$('.wrap').mouseleave(function(){$(this).find('.before').css({'opacity':'0','left':'-100px'})$(this).find('.after').css('z-index','2').animate({'width':'0'},200)})

    • jQuery代码
    • 339阅读
    • 2022-05-04

  • css边框线环绕
    css边框线环绕

    html<div></div>csshtml,body{height:100%;background-color:#000;}div{width:200px;height:200px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);border:1pxsolid#eee;}div::after,div::before{/*固定在div下*/z-index:-1;position:absolute;top:0;right:0;bottom:0;left:0;/*撑开一点大小*/margin:-5%;box-shadow:inset0px0px2px#fff;animation:clipMe8slinearinfinite;}div::before{content:"";}div::after{content:"";/*提前运动4s*/animation-delay:-4s;}@keyframesclipMe{0%,100%{clip:rect(0px,220.0px,2px,0px);}25%{clip:rect(0px,2px,220.0px,0px);}50%{clip:rect(218.0px,220.0px,220.0px,0px);}75%{clip:rect(0px,220.0px,220.0px,218.0px);}}

    • CSS代码
    • 265阅读
    • 2022-05-04

  • 日历背景变色
    日历背景变色

    html<divclass="calendar"><divclass="header"><adata-action="prev-month"href="javascript:void(0)"title="PreviousMonth"><i></i></a><divclass="text"data-render="month-year"></div><adata-action="next-month"href="javascript:void(0)"title="NextMonth"><i></i></a></div><divclass="months"data-flow="left"><divclass="monthmonth-a"><divclass="renderrender-a"></div></div><divclass="monthmonth-b"><divclass="renderrender-b"></div></div></div></div>cssbody{margin:0;color:#444;background-color:#98c2c2;font:30018px/18pxRoboto,sans-serif;transition:background.4sease-in-out0s;}*,:after,:before{box-sizing:border-box}.pull-left{float:left}.pull-right{float:right}.clearfix:after,.clearfix:before{content:'';display:table}.clearfix:after{clear:both;display:block}.calendar{width:300px;font-size:100%;margin:50pxauto0;-webkit-perspective:1000px;perspective:1000px;cursor:default;position:relative}.calendar.header{height:100px;position:relative;color:#fff}.calendar.header.text{position:absolute;top:0;left:0;right:0;bottom:0;background-color:#308ff0;padding:15px;-webkit-transform:rotateX(90deg);transform:rotateX(90deg);-webkit-transform-origin:bottom;transform-origin:bottom;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:.4sease-in-out0s;box-shadow:06px20px0rgba(0,0,0,.19),08px17px0rgba(0,0,0,.2);opacity:0}.calendar.header.text>span{text-align:center;padding:26px;display:block}.calendar.header.active.text{-webkit-transform:rotateX(0deg);transform:rotateX(0deg);opacity:1}.months{width:100%;height:280px;position:relative}.months.hr{height:1px;margin:15px0;background:#ccc}.month{padding:15px;width:inherit;height:inherit;background:#fff;position:absolute;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:all.4sease-in-out0s;box-shadow:06px20px0rgba(0,0,0,.19),08px17px0rgba(0,0,0,.2)}.months[data-flow="left"].month{-webkit-transform:rotateY(-180deg);transform:rotateY(-180deg)}.months[data-flow="right"].month{-webkit-transform:rotateY(180deg);transform:rotateY(180deg)}.table{width:100%;font-size:10px;font-weight:400;display:table}.table.row{display:table-row}.table.row.head{color:#308ff0;text-transform:uppercase}.table.row.cell{width:14.28%;padding:5px;text-align:center;display:table-cell}.table.row.cell.disable{color:#ccc}.table.row.cellspan{display:block;width:28px;height:28px;line-height:28px;transition:color,background.4sease-in-out0s}.table.row.cell.activespan{color:#fff;background-color:#308ff0}.months.month[data-active="true"]{-webkit-transform:rotateY(0);transform:rotateY(0)}.header[data-action]{color:inherit;position:absolute;top:50%;margin-top:-20px;width:40px;height:40px;z-index:1;opacity:0;transition:all.4sease-in-out0s}.header[data-action]>i{width:20px;height:20px;display:block;position:absolute;left:50%;top:50%;margin-top:-10px;margin-left:-10px}.header[data-action]>i:before,.header[data-action]>i:after{top:50%;margin-top:-1px;content:'';position:absolute;height:2px;width:20px;border-top:2pxsolid;border-radius:2px}.header[data-action*="prev"]{left:15px}.header[data-action*="next"]{right:15px}.header[data-action*="prev"]>i:before,.header[data-action*="prev"]>i:after{left:0}.header[data-action*="prev"]>i:before{top:3px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.header[data-action*="prev"]>i:after{top:auto;bottom:3px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.header[data-action*="next"]>i:before,.header[data-action*="next"]>i:after{right:0}.header[data-action*="next"]>i:before{top:auto;bottom:3px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.header[data-action*="next"]>i:after{top:3px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.header.active[data-action]{opacity:1}[data-theme="jan"]{background-color:#90CAF9}[data-theme="jan"].row.head{color:#1E88E5}[data-theme="jan"].header.text,[data-theme="jan"].table.row.cell.activespan{background-color:#1E88E5}[data-theme="feb"]{background-color:#81D4FA}[data-theme="feb"].row.head{color:#039BE5}[data-theme="feb"].header.text,[data-theme="feb"].table.row.cell.activespan{background-color:#039BE5}[data-theme="mar"]{background-color:#80CBC4}[data-theme="mar"].row.head{color:#00897B}[data-theme="mar"].header.text,[data-theme="mar"].table.row.cell.activespan{background-color:#00897B}[data-theme="apr"]{background-color:#C5E1A5}[data-theme="apr"].row.head{color:#7CB342}[data-theme="apr"].header.text,[data-theme="apr"].table.row.cell.activespan{background-color:#7CB342}[data-theme="may"]{background-color:#FFE082}[data-theme="may"].row.head{color:#FFB300}[data-theme="may"].header.text,[data-theme="may"].table.row.cell.activespan{background-color:#FFB300}[data-theme="jun"]{background-color:#FFAB91}[data-theme="jun"].row.head{color:#F4511E}[data-theme="jun"].header.text,[data-theme="jun"].table.row.cell.activespan{background-color:#F4511E}[data-theme="jul"]{background-color:#CE93D8}[data-theme="jul"].row.head{color:#8E24AA}[data-theme="jul"].header.text,[data-theme="jul"].table.row.cell.activespan{background-color:#8E24AA}[data-theme="aug"]{background-color:#B39DDB}[data-theme="aug"].row.head{color:#5E35B1}[data-theme="aug"].header.text,[data-theme="aug"].table.row.cell.activespan{background-color:#5E35B1}[data-theme="sep"]{background-color:#EF9A9A}[data-theme="sep"].row.head{color:#E53935}[data-theme="sep"].header.text,[data-theme="sep"].table.row.cell.activespan{background-color:#E53935}[data-theme="oct"]{background-color:#CE93D8}[data-theme="oct"].row.head{color:#8E24AA}[data-theme="oct"].header.text,[data-theme="oct"].table.row.cell.activespan{background-color:#8E24AA}[data-theme="nov"]{background-color:#BCAAA4}[data-theme="nov"].row.head{color:#6D4C41}[data-theme="nov"].header.text,[data-theme="nov"].table.row.cell.activespan{background-color:#6D4C41}[data-theme="dec"]{background-color:#B0BEC5}[data-theme="dec"].row.head{color:#546E7A}[data-theme="dec"].header.text,[data-theme="dec"].table.row.cell.activespan{background-color:#546E7A}jsvarCalendar=function(t){this.divId=t.RenderID?t.RenderID:'[data-render="calendar"]',this.DaysOfWeek=t.DaysOfWeek?t.DaysOfWeek:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],this.Months=t.Months?t.Months:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];vare=newDate;this.CurrentMonth=e.getMonth(),this.CurrentYear=e.getFullYear();varr=t.Format;this.f="string"==typeofr?r.charAt(0).toUpperCase():"M"};Calendar.prototype.nextMonth=function(){11==this.CurrentMonth?(this.CurrentMonth=0,this.CurrentYear=this.CurrentYear+1):this.CurrentMonth=this.CurrentMonth+1,this.divId='[data-active="false"].render',this.showCurrent()},Calendar.prototype.prevMonth=function(){0==this.CurrentMonth?(this.CurrentMonth=11,this.CurrentYear=this.CurrentYear-1):this.CurrentMonth=this.CurrentMonth-1,this.divId='[data-active="false"].render',this.showCurrent()},Calendar.prototype.previousYear=function(){this.CurrentYear=this.CurrentYear-1,this.showCurrent()},Calendar.prototype.nextYear=function(){this.CurrentYear=this.CurrentYear+1,this.showCurrent()},Calendar.prototype.showCurrent=function(){this.Calendar(this.CurrentYear,this.CurrentMonth)},Calendar.prototype.checkActive=function(){1==document.querySelector(".months").getAttribute("class").includes("active")?document.querySelector(".months").setAttribute("class","months"):document.querySelector(".months").setAttribute("class","monthsactive"),"true"==document.querySelector(".month-a").getAttribute("data-active")?(document.querySelector(".month-a").setAttribute("data-active",!1),document.querySelector(".month-b").setAttribute("data-active",!0)):(document.querySelector(".month-a").setAttribute("data-active",!0),document.querySelector(".month-b").setAttribute("data-active",!1)),setTimeout(function(){document.querySelector(".calendar.header").setAttribute("class","headeractive")},200),document.querySelector("body").setAttribute("data-theme",this.Months[document.querySelector('[data-active="true"].render').getAttribute("data-month")].toLowerCase())},Calendar.prototype.Calendar=function(t,e){"number"==typeoft&&(this.CurrentYear=t),"number"==typeoft&&(this.CurrentMonth=e);varr=(newDate).getDay(),n=(newDate).getMonth(),a=(newDate).getFullYear(),o=newDate(t,e,1).getDay(),i=newDate(t,e+1,0).getDate(),u=0==e?newDate(t-1,11,0).getDate():newDate(t,e,0).getDate(),s="<span>"+this.Months[e]+" "+t+"</span>",d='<divclass="table">';d+='<divclass="rowhead">';for(varc=0;c<7;c++)d+='<divclass="cell">'+this.DaysOfWeek[c]+"</div>";d+="</div>";for(varh,l=dm="M"==this.f?1:0==o?-5:2,v=(c=0,0);v<6;v++){d+='<divclass="row">';for(varm=0;m<7;m++){if((h=c+dm-o)<1)d+='<divclass="celldisable">'+(u-o+l++)+"</div>";elseif(h>i)d+='<divclass="celldisable">'+l+++"</div>";else{d+='<divclass="cell'+(r==h&&this.CurrentMonth==n&&this.CurrentYear==a?"active":"")+'"><span>'+h+"</span></div>",l=1}c%7==6&&h>=i&&(v=10),c++}d+="</div>"}d+="</div>",document.querySelector('[data-render="month-year"]').innerHTML=s,document.querySelector(this.divId).innerHTML=d,document.querySelector(this.divId).setAttribute("data-date",this.Months[e]+"-"+t),document.querySelector(this.divId).setAttribute("data-month",e)},window.onload=function(){vart=newCalendar({RenderID:".render-a",Format:"M"});t.showCurrent(),t.checkActive();vare=document.querySelectorAll(".header[data-action]");for(i=0;i<e.length;i++)e[i].onclick=function(){if(document.querySelector(".calendar.header").setAttribute("class","header"),"true"==document.querySelector(".months").getAttribute("data-loading"))returndocument.querySelector(".calendar.header").setAttribute("class","headeractive"),!1;vare;document.querySelector(".months").setAttribute("data-loading","true"),this.getAttribute("data-action").includes("prev")?(t.prevMonth(),e="left"):(t.nextMonth(),e="right"),t.checkActive(),document.querySelector(".months").setAttribute("data-flow",e),document.querySelector('.month[data-active="true"]').addEventListener("webkitTransitionEnd",function(){document.querySelector(".months").removeAttribute("data-loading")}),document.querySelector('.month[data-active="true"]').addEventListener("transitionend",function(){document.querySelector(".months").removeAttribute("data-loading")})}};

    • JS代码
    • 252阅读
    • 2022-05-04

  • js倒计时代码
    js倒计时代码

    html<divid="all"><divclass="timetext"><div>2023年元旦倒计时</div><div>元旦时间:2023年1月1日</div><div>目前距离2023年元旦还有</div><div><spanid="t_d"></span><spanid="t_h"></span><spanid="t_m"></span><spanid="t_s"></span></div></div></div>jsfunctiongetRTime(){varEndTime=newDate("2023/01/0100:00:00");//截止时间varNowTime=newDate();vart=EndTime.getTime()-NowTime.getTime();vard=Math.floor(t/1000/60/60/24);varh=Math.floor(t/1000/60/60%24);varm=Math.floor(t/1000/60%60);vars=Math.floor(t/1000%60);document.getElementById("t_d").innerHTML=d+"天";document.getElementById("t_h").innerHTML=h+"时";document.getElementById("t_m").innerHTML=m+"分";document.getElementById("t_s").innerHTML=s+"秒";}setInterval(getRTime,0);

    • jQuery代码
    • 311阅读
    • 2022-05-04

  • 带搜索框的下拉选择器
    带搜索框的下拉选择器

    html<p>带搜索框的下拉选择器</p><divid="List"></div><divid="List1"></div><inputid="b1"type="button"value="取值">css*{margin:0px;padding:0px;box-sizing:border-box;}body{background:#59CDE9;/*fallbackforoldbrowsers*/background:-webkit-linear-gradient(toright,#0A2A88,#59CDE9);/*Chrome10-25,Safari5.1-6*/background:linear-gradient(toright,#0A2A88,#59CDE9);/*W3C,IE10+/Edge,Firefox16+,Chrome26+,Opera12+,Safari7+*/border-top:#59CDE9;}.List{position:relative;width:500px;margin-top:15px;cursor:pointer;left:50%;margin-left:-250px;/*transform:translateX(-50%);*/}.selectBox{position:relative;width:100%;height:30px;line-height:30px;padding:0px5px;/*background-color:aquamarine;*/border:1pxsolidrgba(200,200,200,1);border-radius:3px;display:flex;flex-direction:row;justify-content:space-between;align-items:center;cursor:pointer;z-index:1;}.selectBox.selectContent{width:calc(100%-20px);overflow:hidden;white-space:nowrap;color:white;/*background-color:blue;*/}.selectBox.clear{width:10px;color:gray;font-size:12px;}.selectBox.ico{width:0px;height:0px;border:7pxsolidtransparent;border-top:5pxsolidblack;margin-top:5px;margin-left:5px;}.itemBox{position:absolute;width:100%;height:300px;overflow-y:auto;background-color:rgb(255,255,255);display:flex;flex-direction:column;transition-duration:0.1s;z-index:190;cursor:pointer;/*border:1pxsolidgray;*/box-shadow:gray0px0px5px;border-radius:5px;margin-top:3px;/*opacity:1;*/}.itemBox.lookup{position:sticky;top:0px;width:100%;height:30px;line-height:30px;background-color:rgb(255,255,255);display:inline-flex;flex-direction:row;flex-wrap:nowrap;align-items:center;/*overflow:hidden;*/border-bottom:1pxsolidrgba(222,222,222,1);}.Listinput[type=checkbox]{width:20px;background-color:white;}.itemBox.lookupinput[type=text]{width:calc(100%-25px);height:30px;line-height:100%;outline:none;border:none;/*background-color:aqua;*/border-bottom:1pxsolidrgba(222,222,222,1);}.itemBox.item{/*padding:5px0px;*/height:30px;line-height:30px;cursor:pointer;}.itemBox.item:hover{background-image:linear-gradient(toright,rgba(0,0,0,0.3),rgba(255,255,255,0.3));color:white;}.itemBox.itemlabel{display:inline-block;width:calc(100%-20px);height:100%;/*background-color:burlywood;*/cursor:pointer;}.itemClose{height:0px;/*opacity:0;*//*display:none;*/transition-duration:0.1s;}input[value=取值]{padding:5px20px;}js/***@function在给定容器上创建带搜索框的下拉菜单*@param{*}obj要绑定的容器ID,*@param{*}_Data包含text和value的对象数组*/functionList(obj,_Data){this.Obj=obj;this.data=_Data;this.mmm="";/***@function初始化实例*///List.prototype.init=function(){varc=document.getElementById(this.Obj);c.classList.add("List");vars1=document.createElement("div");s1.className="selectBox";s1.onclick=function(e){if(e.target.className!="clear"){varcon=document.querySelector("#"+obj+".itemBox");varcon1=document.querySelector("#"+obj+"input[type=text]");if(con.classList.toString().indexOf("itemClose")>0){con.classList.remove("itemClose");con1.focus();}else{con.classList.add("itemClose");}}else{varcon=document.querySelector("#"+obj+".itemBox");varcc1=document.querySelector('#'+obj+".selectContent");cc1.innerHTML="";varccdd=document.querySelector('#'+obj+".lookup>input[type=checkbox]");varcc=document.querySelectorAll('#'+obj+".itemBox>.item>input");ccdd.checked=false;for(vari=0;i<cc.length;i++){cc[i].checked=false;}}}s1.onmouseover=function(){varm="";varmm;mm=document.querySelector("#"+obj+".selectContent");m=mm.innerText||"";m=m.substring(0,m.length-1);varm1=m.split(",").join("\n");mm.title=m1;}vars2=document.createElement("div");s2.className="selectContent";s2.title="";vars4=document.createElement("div");s4.className="clear";s4.innerHTML="✕";vars3=document.createElement("div");s3.className="ico";s1.append(s2);s1.append(s4);s1.append(s3);vari1=document.createElement("div");i1.className="itemBoxitemClose";vari2=document.createElement("div");i2.className="lookup";vari3=document.createElement("input");i3.type="checkbox";i3.onclick=function(){varccdd=document.querySelector('#'+obj+".lookup>input[type=checkbox]");varcc=document.querySelectorAll('#'+obj+".itemBox>.item>input");varll=document.querySelectorAll('#'+obj+".itemBox>.item>label");varcc1=document.querySelector('#'+obj+".selectContent");if(ccdd.checked==true){varmmm="";for(vari=0;i<cc.length;i++){cc[i].checked=true;mmm+=ll[i].innerText+',';}//mmm=mmm.substr(0,mmm.length-1);cc1.innerText=mmm;}else{varmmm="";for(vari=0;i<cc.length;i++){cc[i].checked=false;}cc1.innerText=mmm;}}vari4=document.createElement("input");i4.type="text";i4.onkeyup=function(e){varccdd=document.querySelector('#'+obj+".lookup>input[type=text]");variii=document.querySelector('#'+obj+".itemBox");varchild=iii.lastElementChild;while(child.className!='lookup'){iii.removeChild(child);child=iii.lastElementChild;}if(ccdd.value!=''){for(iin_Data){if(_Data[i].text.indexOf(ccdd.value)>0){varm=document.createElement("div");m.className="item";varm1=document.createElement("input");m1.id=obj+"-item"+i;m1.type="checkbox";varcc1=document.querySelector('#'+obj+".selectContent");if(cc1.innerText.indexOf(_Data[i].text,0)>=0)m1.checked="checked"m1.onclick=function(){varcc=document.querySelectorAll('#'+obj+".itemBox>.item>input");varll=document.querySelectorAll('#'+obj+".itemBox>.item>label");varmmm=cc1.innerText;for(vari=0;i<cc.length;i++){if(cc[i].checked==true&&mmm.indexOf(ll[i].innerText+',')<0)mmm+=ll[i].innerText+',';if(cc[i].checked==false&&mmm.indexOf(ll[i].innerText+',')>=0){mmm=mmm.replace(ll[i].innerText+',','');}}//mmm=mmm.substr(0,mmm.length-1);cc1.innerText=mmm;};varm2=document.createElement("label");m2.htmlFor=obj+"-item"+i;m2.innerText=_Data[i].text;m.append(m1);m.append(m2);iii.append(m);}}}else{for(iin_Data){varm=document.createElement("div");m.className="item";varm1=document.createElement("input");m1.id=this.Obj+"-item"+i;m1.type="checkbox";varcc1=document.querySelector('#'+obj+".selectContent");if(cc1.innerText.indexOf(_Data[i].text+',',0)>=0)m1.checked="checked"m1.onclick=function(){varcc=document.querySelectorAll('#'+obj+".itemBox>.item>input");varll=document.querySelectorAll('#'+obj+".itemBox>.item>label");varmmm="";for(vari=0;i<cc.length;i++){if(cc[i].checked==true)mmm+=ll[i].innerText+',';}//mmm=mmm.substr(0,mmm.length-1);cc1.innerText=mmm;};varm2=document.createElement("label");m2.htmlFor=this.Obj+"-item"+i;m2.innerText=_Data[i].text;m.append(m1);m.append(m2);iii.append(m);}}}i2.append(i3);i2.append(i4);i1.append(i2);for(vari=0;i<this.data.length;i++){varm=document.createElement("div");m.className="item";varm1=document.createElement("input");m1.id=this.Obj+"-item"+i;m1.type="checkbox";m1.onclick=function(){varcc=document.querySelectorAll('#'+obj+".itemBox>.item>input");varll=document.querySelectorAll('#'+obj+".itemBox>.item>label");varmmm="";for(vari=0;i<cc.length;i++){if(cc[i].checked==true)mmm+=ll[i].innerText+',';}varcc1=document.querySelector('#'+obj+".selectContent");//mmm=mmm.substr(0,mmm.length-1);cc1.innerText=mmm;};varm2=document.createElement("label");m2.htmlFor=this.Obj+"-item"+i;m2.innerText=this.data[i].text;m.append(m1);m.append(m2);i1.append(m);}c.append(s1);c.append(i1);//}/***@function获取选择项的显示文本列表*@returns返回以','分隔的字符串列表*/List.prototype.getText=function(){varm="";m=document.querySelector("#"+this.Obj+".selectContent").innerText;m=m.substr(0,m.length-1);m=m.split(",").sort().join(",");returnm;}/***@function获取选择项的值列表*@returns返回以','分隔的字符串列表*/List.prototype.getValue=function(){varm="";varv="";m=document.querySelector("#"+this.Obj+".selectContent").innerText;m=m.substring(0,m.length-1);varm1=m.split(",");for(vari=0;i<this.data.length;i++){if(m1.indexOf(this.data[i].text)>=0){v+=this.data[i].value+',';}}v=v.substring(0,v.length-1);returnv;}}/***@function点击控件之外的地方隐藏下拉框*@param{*}e系统参数*/document.onclick=function(e){//console.log(e.path)varclassName="";vary=true;for(iine.path){//遍历所有点击的路径if(e.path[i].className&&e.path[i].className=='List'){//如果点击的是预定类型的控件varconn=document.querySelectorAll(".List");for(varj=0;j<conn.length;j++){//遍历预定类型的所有控件if(e.path[i].id!=conn[j].id){//遍历所预定类型控件,将除当前控件外的所有下拉框全部隐藏varcon=document.querySelectorAll("#"+conn[j].id+".itemBox");for(varii=0;ii<con.length;ii++){con[ii].classList.add("itemClose");}}}y=false;className=e.path[i].className;}}if(y){//如果点击的位置非预定类型控件或点击之外的位置,隐藏所有预定类型下拉框varcon=document.querySelectorAll(".List.itemBox");for(vari=0;i<con.length;i++){con[i].classList.add("itemClose");}}}//模拟数据varm=[];for(vari=0;i<10;i++){m1=newArray;m1.text="部门"+i;m1.value="item"+Math.floor((Math.random()*1000));m.push(m1);}varmm=[];for(vari=0;i<20;i++){m1=newArray;m1.text="会计科目"+i;m1.value="item"+Math.floor((Math.random()*1000));mm.push(m1);}varn1=newList("List",m);//n1.init();varn2=newList("List1",mm);//n2.init();varb=document.getElementById("b1");b.onclick=function(){confirm("第一个控件的选择项:\n选择的文本是:"+n1.getText()+"\n对应的键值是:"+n1.getValue());confirm("第二个控件的选择项:\n选择的文本是:"+n2.getText()+"\n对应的键值是:"+n2.getValue());}

    • jQuery代码
    • 287阅读
    • 2022-05-04

  • 让设计稿还原度更高!两款高手都在用的B端设计走查神器
    让设计稿还原度更高!两款高手都在用的B端设计走查神器

    B端设计师在工作当中一定会遇到这样的情况:因为上线的项目与设计稿不符而与前端进行争论、为了知道开发颜色使用是否准确只有“截图”,然后在设计软件当中“吸色”来进行判断。所以在我们工作当中设计走查就成为项目流程当中非常重要的一环。虽然走查的流程往往比较复杂无聊,但是为了保证设计稿与上线项目的一致,我们就需要有“趁手的武器”才能够项目的高度还原。不知道你们自己有什么好用的走查神器,我今天给大家分享两款我自己非常常用的浏览器插件:Copiexl这是一款字节跳动出品的高效走查插件,它的原理十分简单,首先打开需要校验的线上项目;接着上传你的设计稿图片;然后通过降低设计稿的透明度,达到项目快速走查的目的。开发哪里有问题,一眼便知。简单教大家如何安装使用这样一款插件:1.安装方法:首先打开软件的官方网站(https://copixel.bytedance.com/),点击免费下载(这里只支持Chrome浏览器,如果你是Safari、Firefox、Opera等浏览器,在官网往下滚动,同样也是提供了下载入口)点击下载过后,就会跳转到Google的应用商店当中,点击安装即可,与浏览器插件的安装方式类似(这里需要搭梯子)2.使用教程选择合适的页面设计尺寸建议按照主流窗口尺寸的宽度设计,如:1366px、1440px、1920px;推荐最小设计尺寸使用1366px、1440px,最大设计尺寸1920px(宽)。目的是按照1:1导出设计图,与开发页面显示效果一致该如何输出设计稿?Copiexl浏览器插件的原理是将你的设计稿悬浮在前端还原的页面当中进行对比,这样就能快速知道自己的设计页面有何问题。因此我们需要将设计稿进行一次性导出成PNG文件。这样可以批量导入到插件当中,直接切换设计稿提高走查效率。如何使用打开前端实现好的页面,使用你刚刚安装好的浏览器插件“Copixel”,添加UI设计图。通过调整设计图位置、大小和透明度使其与开发页面高度重合,配合有截图标注功能的软件(比如:Xinp)进行找茬标记。使用走查文档标记存在问题的地方并说明问题,这样就能高效完成项目走查。然后将有问题的走查内容直接分享给开发即可。CSSPeeperhttps://csspeeper.com/这是一个设计走查/样式复制/资源下载的效率神器,它能够轻松查看网页端当中所有元素的CSS属性,并且不需要像Chrome浏览器那样“右键”–“检查”浏览器元素,然后在许许多多的代码当中寻找你需要的CSS代码。我们只需要点击插件,选择元素就能够快速检查样式。场景一:设计走查比如当前端工程师完成页面过后,需要设计师进行一个页面的走查,这个时候很多同学往往就会靠着自己的像素眼进行一一的比对,如果稍微有点经验的B端设计师会打开浏览器自带的检查,进行元素的核对然而浏览器自带的检查其实更多是面向程序员进行设计的,对于我们设计师而言,能够看懂的却只有一小部分内容,显然检查的效率并不会太高效这时候使用CSSPeeper,就可以轻松对网页当中的CSS样式进行检查,我们不仅可以看到元素的常规属性,比如颜色、背景、间距;还可以看到元素的盒子模型,可以看到元素的Padding、Margin…通过这个插件,就能清晰的看见开发究竟是在哪一部分还原出现问题,并且能够很“欠揍”的在他面前秀一下~场景二:样式复制对于设计师来说,就不用再去纠结竞品究竟是如何设计?如何还原出来,因为任何网页上的元素,你都可以通过这个插件,去查看他的还原思路,并且知道它的设计样式以及属性同时可以点击颜色或者图片,将该页面用到的所有颜色或者图片总结出来进行汇总,可以导出,方便在设计风格上进行分析场景三:资源下载使用CSSPeeper能够快速查看在该页面当中,所用到哪些图标、图片。并且可以将这些资源快速下载到本地进行保存。这样你就可以成为资源小能手这也就是我工作当中最常使用的插件,你最常使用什么插件?一起来分享聊聊!!站三界导航:https://www.zhansanjie.com

    • 建站经验
    • 252阅读
    • 2022-04-28

  • 千万级流量的大型分布式系统架构设计
    千万级流量的大型分布式系统架构设计

    文中一部分为读书笔记,一部分是个人经验总结,对大型分布式网站架构有较好的参考价值。一、大型分布式网站架构技术1、大型网站的特点用户多,分布广泛大流量,高并发海量数据,服务高可用安全环境恶劣,易受网络攻击功能多,变更快,频繁发布从小到大,渐进发展以用户为中心免费服务,付费体验2、大型网站架构目标高性能:提供快速的访问体验。高可用:网站服务一直可以正常访问。可伸缩:通过硬件增加/减少,提高/降低处理能力。安全性:提供网站安全访问和数据加密、安全存储等策略。扩展性:方便地通过新增/移除方式,增加/减少新的功能/模块。敏捷性:随需应变,快速响应;3、大型网站架构模式分层:一般可分为应用层、服务层、数据层、管理层与分析层;分割:一般按照业务/模块/功能特点进行划分,比如应用层分为首页、用户中心。分布式:将应用分开部署(比如多台物理机),通过远程调用协同工作。集群:一个应用/模块/功能部署多份(如:多台物理机),通过负载均衡共同提供对外访问。缓存:将数据放在距离应用或用户最近的位置,加快访问速度。异步:将同步的操作异步化。客户端发出请求,不等待服务端响应,等服务端处理完毕后,使用通知或轮询的方式告知请求方。一般指:请求——响应——通知模式。冗余:增加副本,提高可用性、安全性与性能。安全:对已知问题有有效的解决方案,对未知/潜在问题建立发现和防御机制。自动化:将重复的、不需要人工参与的事情,通过工具的方式,使用机器完成。敏捷性:积极接受需求变更,快速响应业务发展需求。4、高性能架构以用户为中心,提供快速的网页访问体验。主要参数有较短的响应时间、较大的并发处理能力、较高的吞吐量与稳定的性能参数。可分为前端优化、应用层优化、代码层优化与存储层优化。前端优化:网站业务逻辑之前的部分;浏览器优化:减少HTTP请求数,使用浏览器缓存,启用压缩,CSSJS位置,JS异步,减少Cookie传输;CDN加速,反向代理;应用层优化:处理网站业务的服务器。使用缓存,异步,集群代码优化:合理的架构,多线程,资源复用(对象池,线程池等),良好的数据结构,JVM调优,单例,Cache等;存储优化:缓存、固态硬盘、光纤传输、优化读写、磁盘冗余、分布式存储(HDFS)、NoSQL等。5、高可用架构大型网站应该在任何时候都可以正常访问,正常提供对外服务。因为大型网站的复杂性,分布式,廉价服务器,开源数据库,操作系统等特点,要保证高可用是很困难的,也就是说网站的故障是不可避免的。如何提高可用性,就是需要迫切解决的问题。首先,需要从架构级别考虑,在规划的时候,就考虑可用性。行业内一般用几个9表示可用性指标,比如四个9(99.99),一年内允许的不可用时间是53分钟。不同层级使用的策略不同,一般采用冗余备份和失效转移解决高可用问题。应用层:一般设计为无状态的,对于每次请求,使用哪一台服务器处理是没有影响的。一般使用负载均衡技术(需要解决Session同步问题)实现高可用。服务层:负载均衡,分级管理,快速失败(超时设置),异步调用,服务降级,幂等设计等。数据层:冗余备份(冷,热备[同步,异步],温备),失效转移(确认,转移,恢复)。数据高可用方面著名的理论基础是CAP理论(持久性,可用性,数据一致性[强一致,用户一致,最终一致])6、可伸缩架构伸缩性是指在不改变原有架构设计的基础上,通过添加/减少硬件(服务器)的方式,提高/降低系统的处理能力。应用层:对应用进行垂直或水平切分。然后针对单一功能进行负载均衡(DNS、HTTP[反向代理]、IP、链路层)。服务层:与应用层类似;数据层:分库、分表、NoSQL等;常用算法Hash,一致性Hash。7、可扩展架构可以方便地进行功能模块的新增/移除,提供代码/模块级别良好的可扩展性。模块化,组件化:高内聚,低耦合,提高复用性,扩展性。稳定接口:定义稳定的接口,在接口不变的情况下,内部结构可以“随意”变化。设计模式:应用面向对象思想,原则,使用设计模式,进行代码层面的设计。消息队列:模块化的系统,通过消息队列进行交互,使模块之间的依赖解耦。分布式服务:公用模块服务化,提供其他系统使用,提高可重用性,扩展性。8、安全架构对已知问题有有效的解决方案,对未知/潜在问题建立发现和防御机制。对于安全问题,首先要提高安全意识,建立一个安全的有效机制,从政策层面,组织层面进行保障,比如服务器密码不能泄露,密码每月更新,并且三次内不能重复;每周安全扫描等。以制度化的方式,加强安全体系的建设。同时,需要注意与安全有关的各个环节。安全问题不容忽视,包括基础设施安全,应用系统安全,数据保密安全等。基础设施安全:硬件采购,操作系统,网络环境方面的安全。一般采用正规渠道购买高质量的产品,选择安全的操作系统,及时修补漏洞,安装杀毒软件防火墙。防范病毒,后门。设置防火墙策略,建立DDOS防御系统,使用攻击检测系统,进行子网隔离等手段。应用系统安全:在程序开发时,对已知常用问题,使用正确的方式,在代码层面解决掉。防止跨站脚本攻击(XSS),注入攻击,跨站请求伪造(CSRF),错误信息,HTML注释,文件上传,路径遍历等。还可以使用Web应用防火墙(比如:ModSecurity),进行安全漏洞扫描等措施,加强应用级别的安全。数据保密安全:存储安全(存储在可靠的设备,实时,定时备份),保存安全(重要的信息加密保存,选择合适的人员复杂保存和检测等),传输安全(防止数据窃取和数据篡改);常用的加解密算法(单项散列加密[MD5、SHA],对称加密[DES、3DES、RC]),非对称加密[RSA]等。9、敏捷性网站的架构设计,运维管理要适应变化,提供高伸缩性,高扩展性。方便的应对快速的业务发展,突增高流量访问等要求。除上面介绍的架构要素外,还需要引入敏捷管理,敏捷开发的思想。使业务,产品,技术,运维统一起来,随需应变,快速响应。10、大型架构举例以上采用七层逻辑架构,第一层客户层,第二层前端优化层,第三层应用层,第四层服务层,第五层数据存储层,第六层大数据存储层,第七层大数据处理层。客户层:支持PC浏览器和手机APP。差别是手机APP可以直接通过IP访问,反向代理服务器。前端层:使用DNS负载均衡,CDN本地加速以及反向代理服务;应用层:网站应用集群;按照业务进行垂直拆分,比如商品应用,会员中心等;服务层:提供公用服务,比如用户服务,订单服务,支付服务等;数据层:支持关系型数据库集群(支持读写分离),NOSQL集群,分布式文件系统集群;以及分布式Cache;大数据存储层:支持应用层和服务层的日志数据收集,关系数据库和NOSQL数据库的结构化和半结构化数据收集;大数据处理层:通过Mapreduce进行离线数据分析或Storm实时数据分析,并将处理后的数据存入关系型数据库。(实际使用中,离线数据和实时数据会按照业务要求进行分类处理,并存入不同的数据库中,供应用层或服务层使用)。二、大型电商网站系统架构演变过程一个成熟的大型网站(如淘宝、天猫、腾讯等)的系统架构并不是一开始设计时就具备完整的高性能、高可用、高伸缩等特性的,它是随着用户量的增加,业务功能的扩展逐渐演变完善的,在这个过程中,开发模式、技术架构、设计思想也发生了很大的变化,就连技术人员也从几个人发展到一个部门甚至一条产品线。所以成熟的系统架构是随着业务的扩展而逐步完善的,并不是一蹴而就;不同业务特征的系统,会有各自的侧重点,例如淘宝,要解决海量的商品信息的搜索、下单、支付;例如腾讯,要解决数亿用户的实时消息传输;百度它要处理海量的搜索请求。他们都有各自的业务特性,系统架构也有所不同。尽管如此我们也可以从这些不同的网站背景中,找出其中共用的技术,这些技术和手段广泛运用在大型网站系统的架构中,下面就通过介绍大型网站系统的演化过程,来认识这些技术和手段。1、最开始的网站架构最初的架构,应用程序、数据库、文件都部署在一台服务器上,如图:2、应用、数据、文件分离随着业务的扩展,一台服务器已经不能满足性能需求,故将应用程序、数据库、文件各自部署在独立的服务器上,并且根据服务器的用途配置不同的硬件,达到最佳的性能效果。3、利用缓存改善网站性能在硬件优化性能的同时,同时也通过软件进行性能优化,在大部分的网站系统中,都会利用缓存技术改善系统的性能,使用缓存主要源于热点数据的存在,大部分网站访问都遵循28原则(即80%的访问请求,最终落在20%的数据上),所以我们可以对热点数据进行缓存,减少这些数据的访问路径,提高用户体验。缓存实现常见的方式是本地缓存、分布式缓存。当然还有CDN、反向代理等,这个后面再讲。本地缓存,顾名思义是将数据缓存在应用服务器本地,可以存在内存中,也可以存在文件,OSCache就是常用的本地缓存组件。本地缓存的特点是速度快,但因为本地空间有限所以缓存数据量也有限。分布式缓存的特点是,可以缓存海量的数据,并且扩展非常容易,在门户类网站中常常被使用,速度按理没有本地缓存快,常用的分布式缓存是Memcached、Redis。4、使用集群改善应用服务器性能应用服务器作为网站的入口,会承担大量的请求,我们往往通过应用服务器集群来分担请求数。应用服务器前面部署负载均衡服务器调度用户请求,根据分发策略将请求分发到多个应用服务器节点。常用的负载均衡技术硬件的有F5,价格比较贵,软件的有LVS、Nginx、HAProxy。LVS是四层负载均衡,根据目标地址和端口选择内部服务器,Nginx和HAProxy是七层负载均衡,可以根据报文内容选择内部服务器,因此LVS分发路径优于Nginx和HAProxy,性能要高些,而Nginx和HAProxy则更具配置性,如可以用来做动静分离(根据请求报文特征,选择静态资源服务器还是应用服务器)。5、数据库读写分离和分库分表随着用户量的增加,数据库成为最大的瓶颈,改善数据库性能常用的手段是进行读写分离以及分库分表,读写分离顾名思义就是将数据库分为读库和写库,通过主备功能实现数据同步。分库分表则分为水平切分和垂直切分,水平切分则是对一个数据库特大的表进行拆分,例如用户表。垂直切分则是根据业务的不同来切分,如用户业务、商品业务相关的表放在不同的数据库中。6、使用CDN和反向代理提高网站性能假如我们的服务器都部署在成都的机房,对于四川的用户来说访问是较快的,而对于北京的用户访问是较慢的,这是由于四川和北京分别属于电信和联通的不同发达地区,北京用户访问需要通过互联路由器经过较长的路径才能访问到成都的服务器,返回路径也一样,所以数据传输时间比较长。对于这种情况,常常使用CDN解决,CDN将数据内容缓存到运营商的机房,用户访问时先从最近的运营商获取数据,这样大大减少了网络访问的路径。比较专业的CDN运营商有蓝汛、网宿。而反向代理,则是部署在网站的机房,当用户请求达到时首先访问反向代理服务器,反向代理服务器将缓存的数据返回给用户,如果没有缓存数据才会继续访问应用服务器获取,这样做减少了获取数据的成本。反向代理有Squid、Nginx。7、使用分布式文件系统用户一天天增加,业务量越来越大,产生的文件越来越多,单台的文件服务器已经不能满足需求,这时就需要分布式文件系统的支撑。常用的分布式文件系统有GFS、HDFS、TFS。8、使用NoSQL和搜索引擎对于海量数据的查询和分析,我们使用NoSQL数据库加上搜索引擎可以达到更好的性能。并不是所有的数据都要放在关系型数据中。常用的NoSQL有MongoDB、HBase、Redis,搜索引擎有Lucene、Solr、Elasticsearch。9、将应用服务器进行业务拆分随着业务进一步扩展,应用程序变得非常臃肿,这时我们需要将应用程序进行业务拆分,如百度分为新闻、网页、图片等业务。每个业务应用负责相对独立的业务运作。业务之间通过消息进行通信或者共享数据库来实现。10、搭建分布式服务这时我们发现各个业务应用都会使用到一些基本的业务服务,例如用户服务、订单服务、支付服务、安全服务,这些服务是支撑各业务应用的基本要素。我们将这些服务抽取出来利用分部式服务框架搭建分布式服务。阿里的Dubbo是一个不错的选择。三、一张图说明电商架构四、大型电商网站架构案例1、电商案例的原因分布式大型网站,目前看主要有几类:大型门户,比如网易,新浪等;SNS网站,比如校内,开心网等;电商网站,比如阿里巴巴,京东商城,国美在线,汽车之家等。大型门户一般是新闻类信息,可以使用CDN,静态化等方式优化,开心网等交互性比较多,可能会引入更多的NoSQL,分布式缓存,使用高性能的通信框架等。电商网站具备以上两类的特点,比如产品详情可以采用CDN,静态化,交互性高的需要采用NoSQL等技术。因此,我们采用电商网站作为案例,进行分析。2、电商网站需求客户需求:建立一个全品类的电子商务网站(B2C),用户可以在线购买商品,可以在线支付,也可以货到付款;用户购买时可以在线与客服沟通;用户收到商品后,可以给商品打分,评价;目前有成熟的进销存系统;需要与网站对接;希望能够支持3~5年,业务的发展;预计3~5年用户数达到1000万;定期举办双11、双12、三八男人节等活动;其他的功能参考京东或国美在线等网站。客户就是客户,不会告诉你具体要什么,只会告诉你他想要什么,我们很多时候要引导,挖掘客户的需求。好在提供了明确的参考网站。因此,下一步要进行大量的分析,结合行业,以及参考网站,给客户提供方案。需求功能矩阵需求管理传统的做法,会使用用例图或模块图(需求列表)进行需求的描述。这样做常常忽视掉一个很重要的需求(非功能需求),因此推荐大家使用需求功能矩阵,进行需求描述。本电商网站的需求矩阵如下:3、网站初级架构一般网站,刚开始的做法,是三台服务器,一台部署应用,一台部署数据库,一台部署NFS文件系统。这是前几年比较传统的做法,之前见到一个网站10万多会员,垂直服装设计门户,N多图片。使用了一台服务器部署了应用,数据库以及图片存储。出现了很多性能问题。如下图:但是,目前主流的网站架构已经发生了翻天覆地的变化。一般都会采用集群的方式,进行高可用设计。至少是下面这个样子:使用集群对应用服务器进行冗余,实现高可用;(负载均衡设备可与应用一块部署)使用数据库主备模式,实现数据备份和高可用;4、系统容量预估预估步骤:注册用户数-日均UV量-每日的PV量-每天的并发量;峰值预估:平常量的2~3倍;根据并发量(并发,事务数),存储容量计算系统容量。根据客户需求:3~5年用户数达到1000万注册用户,可以做每秒并发数预估:每天的UV为200万(二八原则);每日每天点击浏览30次;PV量:200*30=6000万;集中访问量:24*0.2=4.8小时会有6000万*0.8=4800万(二八原则);每分并发量:4.8*60=288分钟,每分钟访问4800/288=16.7万(约等于);每秒并发量:16.7万/60=2780(约等于);假设:高峰期为平常值的三倍,则每秒的并发数可以达到8340次。1毫秒=1.3次访问;没好好学数学后悔了吧?!(不知道以上算是否有错误,呵呵~~)服务器预估:(以tomcat服务器举例)按一台web服务器,支持每秒300个并发计算。平常需要10台服务器(约等于);[tomcat默认配置是150],高峰期需要30台服务器;容量预估:70/90原则系统CPU一般维持在70%左右的水平,高峰期达到90%的水平,是不浪费资源,并比较稳定的。内存,IO类似。以上预估仅供参考,因为服务器配置,业务逻辑复杂度等都有影响。在此CPU,硬盘,网络等不再进行评估。5、网站架构分析根据以上预估,有几个问题:需要部署大量的服务器,高峰期计算,可能要部署30台Web服务器。并且这三十台服务器,只有秒杀,活动时才会用到,存在大量的浪费。所有的应用部署在同一台服务器,应用之间耦合严重。需要进行垂直切分和水平切分。大量应用存在冗余代码服务器Session同步耗费大量内存和网络带宽数据需要频繁访问数据库,数据库访问压力巨大。大型网站一般需要做以下架构优化(优化是架构设计时,就要考虑的,一般从架构/代码级别解决,调优主要是简单参数的调整,比如JVM调优;如果调优涉及大量代码改造,就不是调优了,属于重构):业务拆分应用集群部署(分布式部署,集群部署和负载均衡)多级缓存单点登录(分布式Session)数据库集群(读写分离,分库分表)服务化消息队列其他技术6、网站架构优化(1)业务拆分根据业务属性进行垂直切分,划分为产品子系统,购物子系统,支付子系统,评论子系统,客服子系统,接口子系统(对接如进销存,短信等外部系统)。根据业务子系统进行等级定义,可分为核心系统和非核心系统。核心系统:产品子系统,购物子系统,支付子系统;非核心:评论子系统,客服子系统,接口子系统。业务拆分作用:提升为子系统可由专门的团队和部门负责,专业的人做专业的事,解决模块之间耦合以及扩展性问题;每个子系统单独部署,避免集中部署导致一个应用挂了,全部应用不可用的问题。等级定义作用:用于流量突发时,对关键应用进行保护,实现优雅降级;保护关键应用不受到影响。拆分后的架构图:参考部署方案2如上图每个应用单独部署,核心系统和非核心系统组合部署(2)应用集群部署(分布式,集群,负载均衡)分布式部署:将业务拆分后的应用单独部署,应用直接通过RPC进行远程通信;集群部署:电商网站的高可用要求,每个应用至少部署两台服务器进行集群部署;负载均衡:是高可用系统必须的,一般应用通过负载均衡实现高可用,分布式服务通过内置的负载均衡实现高可用,关系型数据库通过主备方式实现高可用。集群部署后架构图:(3)多级缓存缓存按照存放的位置一般可分为两类本地缓存和分布式缓存。本案例采用二级缓存的方式,进行缓存的设计。一级缓存为本地缓存,二级缓存为分布式缓存。(还有页面缓存,片段缓存等,那是更细粒度的划分)一级缓存,缓存数据字典,和常用热点数据等基本不可变/有规则变化的信息,二级缓存缓存需要的所有缓存。当一级缓存过期或不可用时,访问二级缓存的数据。如果二级缓存也没有,则访问数据库。缓存的比例,一般1:4,即可考虑使用缓存。(理论上是1:2即可)。根据业务特性可使用以下缓存过期策略:缓存自动过期;缓存触发过期;(4)单点登录(分布式Session)系统分割为多个子系统,独立部署后,不可避免的会遇到会话管理的问题。一般可采用Session同步,Cookies,分布式Session方式。电商网站一般采用分布式Session实现。再进一步可以根据分布式Session,建立完善的单点登录或账户管理系统。流程说明用户第一次登录时,将会话信息(用户Id和用户信息),比如以用户Id为Key,写入分布式Session;用户再次登录时,获取分布式Session,是否有会话信息,如果没有则调到登录页;一般采用Cache中间件实现,建议使用Redis,因此它有持久化功能,方便分布式Session宕机后,可以从持久化存储中加载会话信息;存入会话时,可以设置会话保持的时间,比如15分钟,超过后自动超时;结合Cache中间件,实现的分布式Session,可以很好的模拟Session会话。(5)数据库集群(读写分离,分库分表)大型网站需要存储海量的数据,为达到海量数据存储,高可用,高性能一般采用冗余的方式进行系统设计。一般有两种方式读写分离和分库分表。读写分离:一般解决读比例远大于写比例的场景,可采用一主一备,一主多备或多主多备方式。本案例在业务拆分的基础上,结合分库分表和读写分离。如下图:业务拆分后:每个子系统需要单独的库;如果单独的库太大,可以根据业务特性,进行再次分库,比如商品分类库,产品库;分库后,如果表中有数据量很大的,则进行分表,一般可以按照Id,时间等进行分表;(高级的用法是一致性Hash)在分库、分表的基础上,进行读写分离;相关中间件可参考Cobar(阿里,目前已不在维护),TDDL(阿里),Atlas(奇虎360),MyCat。分库分表后序列的问题,JOIN,事务的问题,会在分库分表主题分享中,介绍。(6)服务化将多个子系统公用的功能/模块,进行抽取,作为公用服务使用。比如本案例的会员子系统就可以抽取为公用的服务。(7)消息队列消息队列可以解决子系统/模块之间的耦合,实现异步,高可用,高性能的系统。是分布式系统的标准配置。本案例中,消息队列主要应用在购物,配送环节。用户下单后,写入消息队列,后直接返回客户端;库存子系统:读取消息队列信息,完成减库存;配送子系统:读取消息队列信息,进行配送;目前使用较多的MQ有ActiveMQ、RabbitMQ、ZeroMQ、MSMQ等,需要根据具体的业务场景进行选择。建议可以研究下RabbitMQ。(8)其他架构(技术)除了以上介绍的业务拆分,应用集群,多级缓存,单点登录,数据库集群,服务化,消息队列外。还有CDN,反向代理,分布式文件系统,大数据处理等系统。此处不详细介绍,大家可以问度娘/Google,有机会的话也可以分享给大家。7、架构汇总大型网站的架构是根据业务需求不断完善的,根据不同的业务特征会做特定的设计和考虑,本文只是讲述一个常规大型网站会涉及的一些技术和手段,希望能给大家带来启发。站三界导航:https://www.zhansanjie.com

    • 建站经验
    • 289阅读
    • 2022-04-28

  • 新手干货之网站建设中常见的一些问题
    新手干货之网站建设中常见的一些问题

    在互联网的时代中,网站建设其实是一个非常常见的事情了,几乎每一家企业都希望在互联网上,能够留下属于自己一个足迹,想要拥有一个可以展示自家产品的平台,但是在网站建设的过程中,真的有把每一个过程都做的很好嘛?是达到了自己想要的效果嘛?下面就为一些新手分享一下在网站建中比较常见的问题。问题一:域名问题域名的选择上,就是一个比较关键的问题,我们来看一下域名的权重排序,依次是(从高到低):.gov(政府机构)、.edu(教育机构)、.org(非营利机构)、.com、.cn等,那么在正常企业当中,首选的,利于优化的,应当是.com域名,好,在选好后缀之后,我们来聊一下,在起域名的时候,是否有考虑域名的含义,域名的长短,域名是否容易被记住,是否利于推广。这里,我们来剪短的总结一下,域名应该如何选择:正常企业,尽量选择.com为后缀的域名,尽量不要使用带中文的域名(有些浏览器不支持中午输入,影响客户体验),域名应当尽量短,容易记,比如:baidu.com,http://taobao.com这样用企业名称做域名的,相对体验较好。当然,域名的长短并不影响seo优化,所以不必担心。问题二:服务器带宽时下对于正常展示型企业而言,网站的服务器大部分采用了云服务器,时下国内比较有名的:阿里云、腾讯云等,那么在选择服务器上,是否get到相关的点了呢,这里我们简单的说一下服务器对网站的影响:带宽问题,在网站被打开的过程中,是用的统一服务器的带宽,在我们购买服务器时,应当注意服务器的带宽是否够用,如果服务器的带宽配置达不到访问量的需求时,网站便会出现打开缓慢,打不开等状况,这样,将严重影响客户体验。问题三:页面布局是否合理,美观有些企业网站的页面布局相对较为混乱,客户点进来之后找不到关键的点,不知道网站需要展示的中心内容是什么,杂乱无章,更或者,在页面设计上较为简陋,不够美观,大方,色系搭配不合理,这将严重影响客户的用户体验,更提不上交互体验了。再聊一下关于页面布局,我们拿首页来说,首页内容不是越多越好,也不要太过于简单,我们来说其中一个点,可能有些企业不懂网站收录问题,首页上面没有文章板块,这样导致首页没有更新内容输出,使得×××不更新,不利于网站排名的优化及推广。问题四:网站没做关键词优化有些企业,网站做完之后,就往那一放,达不到企业对外展示的效果,这可能,网站最基本的标题,关键词,以及描述都没有做,搜索引擎收录时,可能还是title标签中,前端最原本放置的文字内容状态,稍微好些的,可能还会有一个公司名称的标题,解决方法:将首页及内页的标题,关键词,描述都按照规则做一遍,添加与公司业务相关的关键词,这样,有利于搜索引擎收录,如果企业不会设置关键词,或者找不到途径,可以让之前做网站的公司或者技术人员在网站管理后台添加上相关的提交接口,以便后期添加或更改。问题五:网站没有友情链接或者友情链接无效很多企业不懂的seo推广的窍门,网站上根本没有友情链接的板块,或者,企业知道需要友情链接,但添加的都是一些大型网站的链接,别人根本不会与其达成互链,或者去添加一些与行业无关的网站有链,这样的问题,我们应该:需要与网站业务相关的行业网站,尽量与权重高的网站达成友情链接,这样利于seo优化。问题六:客服窗口弹出过于频繁很多营销型网站的通病,各式各样的弹窗,邀请客户沟通交流,但是,客户可能只是先看看网站内容,或是如果真的看中网站的相关业务,他才会有意向去沟通,因为频繁的弹窗,导致客户体验很差,从而流失客户。我们应该在设置弹窗时,注意相对的频率,次数,从客户体验的角度来想相关的问题,而不是一味的高频率弹窗,这样将得不偿失。问题七:网站过于精简,没有内容客户进入网站之后,看不到预期的内容,网站不够充实,太过于空,产品,也只是一个简单名称,连介绍都没有,说白了,网站没有内涵,没有能吸引客户的资源,从而流失客户,我们尽量将网站需要介绍的产品,企业资质,企业的优势,企业文化填写详细,完整,这样,有利于企业的对外的宣传,也有利于客户更深层次的了解企业,从而达成成交。问题八:没有联系方式有些企业,网站页面做的很好,内容也很扎实,但是,网站首页,内页,页尾等地方都没有放相关的联系方式,导致客户想与其沟通,达成成交都找不到任何途径,白白的流失了客户,解决方法,我们尽量在做到美观的情况下,在网站首页,右侧悬浮,页尾,内页(联系我们)等页面加上显眼,易找到的联系方式,比如电话号码,公司地址,公司联系qq,微信,微博、邮箱等,让客户能够在想联系企业时,第一时间能联系上。问题九:网站不更新内容还是老生常谈的问题,网站建设完,内容填充上线后,就不管不顾,导致网站在搜索引擎面前,相比同行没有任何优势,没有新鲜事物,使得排名一再下降,权重一直无法提高,客户点进来看到的可能还是一年前的文章,没有活力,使得客户对此无法产生信任。解决方法:网站尽量做到每天更新新鲜内容,比如,文章或是常见问题等,再不济,也要做到每周更新,保持网站活力。问题十:没有原创这里指的是正常企业网站,我们比不上新浪,搜狐,网易等大型门户网站,在这样的情况下,有些企业,可能为了省事,省心,文章,网站内容,都是通过转载,抄袭等方式获取,毫无原创感,这样对搜索引擎优化,对客户,都不是一件好事,从而会使的网站权重下降,排名降低,客户觉得在这个网站上看到的内容都是似曾相识,找不到新鲜感,找不到干货,解决方法:尽量写一些心得原创,或是企业新闻事迹,使得网站注入新鲜活力。好了,以上就是一些关于网站建设过程中的一些干货技巧,希望是可以帮助到大家,毕竟这些都是通用的一些技巧。也希望大家多多支持站三界导航。

    • 建站经验
    • 244阅读
    • 2022-04-28

  • 构建互联网高性能WEB系统经验总结
    构建互联网高性能WEB系统经验总结

    互联网发展至今各种应用层出不穷,用户量动辄上亿。所以如何构建一个优秀的高性能、高可靠的应用系统对每一个开发者至关重要。本文将我所学到和在工作中使用到的一些方法归纳总结,希望给其他同学起到一些借鉴作用,在以后的开发中遇到类似的问题,能快速的找到解决方案。本人主要使用语言是JAVA,所以下面不做特殊说明,都是使用JAVA语言高性能的关键 要想做到高性能,我总结了三点:缓存DNS缓存数据库缓存分布式缓存拆分业务拆分数据库拆分异步网络异步磁盘异步使用消息上面举了一些三点中常见的情况,无论什么地方遇到性能瓶颈,谨记这三点,大多数时候都能找到解决方案。以下分别介绍在整个架构中各个方面对这三点的应用无状态服务 说无状态服务我们首先要想到无状态对象,无状态对象简单的可以理解为没有Field的对象,比如model/entity对象就不属于无状态对象,因为他含有Field,比如典型MVC场景的**Controller,**Service就是无状态的,他们只含有method。有的也是有状态的,比如Structs2框架的Action,所以Structs2现在用得比较少了。有了无状态对象,我们才有可能构建无状态服务,因为请求链路中不包含有状态对象,所以我们每一次请求都是独立的,这样的架构有助于我们服务进行扩展。无状态服务有时候不可避免的会遇到一些有状态的对象,比如最常见的就是session。因为http请求本身是无状态的,所以必须cookie和session配合使用,才能识别多次http请求属于同一用户。一般有两种方法解决:使用cookie存储使用分布式session服务第一种就是将对象信息全部存储在cookie中,通过相应的算法等在服务端将cookie中的信息读出来。这些信息一般都会进行加密处理。第二种方法,就是将session存储在分布式数据库或者分布式缓存中,一般存在redis或者memcache中。那这种服务扩展会依赖第三方数据库或缓存的能力。淘宝有类似的组件,开源世界也有基于memcache和redis的分布式session无状态服务用到了拆分和缓存业务拆分 无状态可以使应用服务水平扩展,但是当单个应用太大太臃肿时,有必要对应用进行拆分。垂直拆分即按业务拆分,比如电商系统中,按照订单系统,积分系统等进行拆分。拆分可以方便开发,更方便扩展。系统大了以后,每个业务的访问量是不一样的,比如买家系统肯定比卖家系统访问量大得多,这时候就可以只增加买家系统的机器即可。除了按照业务的不同拆分成不同的系统以外,针对我们的应用分层也可以进行拆分,一般分为应用层、逻辑层和原子层。应用层就是各种数据、逻辑业务的组装,逻辑层含有大量可重用逻辑,原子层直接操作数据库,一些基本的数据操作包含在其中。不论以何种形式拆分,拆分以后的系统在物理层面上就分离开来,所以系统间的通信是拆分中最重要的问题所在。RPC 在RPC服务之前已经许多系统通信的方法,比如RMI、WebService,但是RPC以更方便,更高效,跨平台的方式现在成为主流的通信手段。几乎每个大公司都有自己的RPC框架:淘宝的HSF、58的SCF,也有非常多优秀的开源框架:Dubbo、GRPC、Thrift等等。国内用dubbo的大公司也很多:京东、当当都是。MQ RPC调用一般是用在耦合比较重,同步调用的场景下。而MQ作为另一种异步通信的手段也被广泛使用在各个业务中。常用的有:ActiveMQ、RabbitMQ、Kafka、RocketMQ。前两个一般作为企业级应用,主要特点是支持非常多的特性和规范。后两者是互联网级的,拥有更强力的吞吐和更高的性能,但是牺牲了很多MQ的特性。mq一般用在要求最终一直性即可的场景,比如用户注册和发积分这两个动作,可以用户注册以后直接返回前台成功,然后发送注册成功消息给mq系统,发积分动作订阅注册事件,消费mq的事件信息。MQ最大的好处就是削峰和解耦,在RPC式的同步调用场景中,如果同一个逻辑中调用A和B,那么在扩展的时候,A和B一定是需要同时扩展的,但是有了消息以后,A发送消息给B,及时B暂时处理不了,也可以等到A峰值过后B继续处理,即使B短期无法匹配A的发送消息能力也没有关系。数据库拆分 一般项目都会经历数据量从小到大的变化,所以数据库拆分也是根据不同的数据量已经不同的阶段进行相应的处理。读写分离,这是大多数应用在遇到性能瓶颈第一要干的事。大多数互联网应用都是读占道90%以上的场景。所以一主多从,一个master做写,其他slave做读即可。但是这种主从模式也存在一些问题,比如有一些数据需要及时性比较高,就是在写入以后马上需要读到。因为主从同步是通过log异步复制,所以存在数据不一致窗口,这个时候必须要通过强行读取主库来保证数据的安全,在开发的时候一定要注意。垂直分割,就是通过拆分将不同的业务放在不同的数据库中,这样就可以减少单一数据库的压力,提高整体性能。垂直分割要注意的是业务边界问题,边界问题就是有一个表,感觉放在A中和放在B库中都合适。这个就要靠经验了,不能过分的考虑,因为其实不论你在之前分得有多好,在应用的迭代中,总会出现更多的找不到明确边界的表。这个问题在业务模块划分中也是一样。水平分割,一般就是说sharding。将同一个表中的不同字段,拆分成不同的表,或者将同一张表按照hash或者业务字段分成不同的分片。这种一般需要DAL框架的支持,其中有TDDL、Cobar、Mycat等。主要就是通过框架让程序编写者对数据库的拆分不可见,就像操作一个数据库一样。不过现在的DAL框架还不能达到这样的目的,尤其是在跨库事务的场景下,一般都需要其他方式处理。跨库事务/分布式事务 跨库事务一般都是通过最终一致性来解决,即不强求ACID都能满足,容许数据不一致的时间窗口,但是总会有一个时间点数据会到最终一致的状态。解决方案非常的多,不过核心原理都是一样,不外乎都是靠补偿来完成的。缓存的使用 计算机世界有一句名言:“计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决”。缓存就是一种中间层。使用缓存的场景非常非常的多,几乎到了你能想到的所有地方。这里我们讲通常的数据库数据缓存缓存一般有两种,local和remote,一般来说使用一种缓存即可,因为缓存虽好,但是维护缓存的更新和删除却是一件非常麻烦得事。一般缓存可分为读缓存(大多数场景)和写缓存(一般针对数据安全性比较低的场景)。比如将数据库中的数据读出时同时写入缓存中,下一次读数据的时候就可以直接读取缓存中的数据,从而大大减小数据库的压力,说起来很简单,其实这也存在很多种的架构,每种架构都有利弊,大家可以详细去了解。写缓存,就是先将数据写入缓存中,然后一段时间再持久化,这样同样会提高效率,这种方案的问题在于如果这时候宕机,部分数据将会丢失,所以适用于数据安全性较低的场景。缓存虽然速度快,除了维护更新较为麻烦的是,内存也是较为昂贵的硬件,所以除了将热点数据存储在缓存中,一般缓存中维护数据的索引或者主要字段用于列表显示,真正的大而全的数据还需要其他方法解决。静态化 对于大多数场景,我们的数据在一定时间都是不会变化的,或者说即使变化,也只是页面的一小部分会发生变化,可以将不变化的部分单独拿出来做静态化。比如京东商城的页面就是静态化的,静态化以后,数据不用每次都从缓存或者数据库中取得,然后再封装成页面,而是直接请求返回静态页面,性能无疑提升了非常大。除了以上常用的方法外,还要非常多的重要的方法:CDN加速DNS缓存页面缓存使用分布式存储使用多线程编写程序

    • 建站经验
    • 293阅读
    • 2022-04-28

站三界导航
本站声明:本站严格遵守国家相关法律规定,非正规网站一概不予收录。本站所有资料取之于互联网,任何公司或个人参考使用本资料请自辨真伪、后果自负,站三界导航不承担任何责任。在此特别感谢您对站三界导航的支持与厚爱。