vue中常用60余种工具类

1.邮箱

exportconstisEmail=(s)=>{return/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(s)}

2.手机号码

exportconstisMobile=(s)=>{return/^1[0-9]{10}$/.test(s)}

3.电话号码

exportconstisPhone=(s)=>{return/^([0-9]{3,4}-)?[0-9]{7,8}$/.test(s)}

4.是否url地址

exportconstisURL=(s)=>{return/^http[s]?:\/\/.*/.test(s)}

5.是否字符串

exportconstisString=(o)=>{returnObject.prototype.toString.call(o).slice(8,-1)==='String'}

6.是否数字

exportconstisNumber=(o)=>{returnObject.prototype.toString.call(o).slice(8,-1)==='Number'}

7.是否boolean

exportconstisBoolean=(o)=>{returnObject.prototype.toString.call(o).slice(8,-1)==='Boolean'}

8.是否函数

exportconstisFunction=(o)=>{returnObject.prototype.toString.call(o).slice(8,-1)==='Function'}

9.是否为null

exportconstisNull=(o)=>{returnObject.prototype.toString.call(o).slice(8,-1)==='Null'}

10.是否undefined

exportconstisUndefined=(o)=>{returnObject.prototype.toString.call(o).slice(8,-1)==='Undefined'}

11.是否对象

exportconstisObj=(o)=>{returnObject.prototype.toString.call(o).slice(8,-1)==='Object'}

12.是否数组

exportconstisArray=(o)=>{returnObject.prototype.toString.call(o).slice(8,-1)==='Array'}

13.是否时间

exportconstisDate=(o)=>{returnObject.prototype.toString.call(o).slice(8,-1)==='Date'}

14.是否正则

exportconstisRegExp=(o)=>{returnObject.prototype.toString.call(o).slice(8,-1)==='RegExp'}

15.是否错误对象

exportconstisError=(o)=>{returnObject.prototype.toString.call(o).slice(8,-1)==='Error'}

16.是否Symbol函数

exportconstisSymbol=(o)=>{returnObject.prototype.toString.call(o).slice(8,-1)==='Symbol'}

17.是否Promise对象

exportconstisPromise=(o)=>{returnObject.prototype.toString.call(o).slice(8,-1)==='Promise'}

18.是否Set对象

exportconstisSet=(o)=>{returnObject.prototype.toString.call(o).slice(8,-1)==='Set'}exportconstua=navigator.userAgent.toLowerCase();

19.是否是微信浏览器

exportconstisWeiXin=()=>{returnua.match(/microMessenger/i)=='micromessenger'}

20.是否是移动端

exportconstisDeviceMobile=()=>{return/android|webos|iphone|ipod|balckberry/i.test(ua)}

21.是否是QQ浏览器

exportconstisQQBrowser=()=>{return!!ua.match(/mqqbrowser|qzone|qqbrowser|qbwebviewtype/i)}

22.是否是爬虫

export const isSpider=()=>{return/adsbot|googlebot|bingbot|msnbot|yandexbot|baidubot|robot|careerbot|seznambot|bot|baiduspider|jikespider|symantecspider|scannerlwebcrawler|crawler|360spider|sosospider|sogou web sprider|sogou orion spider/.test(ua)}

23.是否ios

exportconstisIos=()=>{varu=navigator.userAgent;if(u.indexOf('Android')>-1||u.indexOf('Linux')>-1){//安卓手机returnfalse}elseif(u.indexOf('iPhone')>-1){//苹果手机returntrue}elseif(u.indexOf('iPad')>-1){//iPadreturnfalse}elseif(u.indexOf('Windows Phone')>-1){//winphone手机returnfalse}else{returnfalse}}

24.是否为PC端

exportconstisPC=()=>{varuserAgentInfo=navigator.userAgent;varAgents=["Android","iPhone","SymbianOS","Windows Phone","iPad","iPod"];varflag=true;for(varv=0;v<Agents.length;v++){if(userAgentInfo.indexOf(Agents[v])>0){flag=false;break;}}returnflag;}

25.去除html标签

exportconstremoveHtmltag=(str)=>{returnstr.replace(/<[^>]+>/g,'')}

26.获取url参数

exportconstgetQueryString=(name)=>{constreg=newRegExp('(^|&)'+name+'=([^&]*)(&|$)','i');constsearch=window.location.search.split('?')[1]||'';constr=search.match(reg)||[];returnr[2];}

27.动态引入js

exportconstinjectScript=(src)=>{consts=document.createElement('script');s.type='text/javascript';s.async=true;s.src=src;constt=document.getElementsByTagName('script')[0];t.parentNode.insertBefore(s,t);}

28.根据url地址下载

exportconstdownload=(url)=>{varisChrome=navigator.userAgent.toLowerCase().indexOf('chrome')>-1;varisSafari=navigator.userAgent.toLowerCase().indexOf('safari')>-1;if(isChrome||isSafari){varlink=document.createElement('a');link.href=url;if(link.download!==undefined){varfileName=url.substring(url.lastIndexOf('/')+1,url.length);link.download=fileName;}if(document.createEvent){vare=document.createEvent('MouseEvents');e.initEvent('click',true,true);link.dispatchEvent(e);returntrue;}}if(url.indexOf('?')===-1){url+='?download';}window.open(url,'_self');returntrue;}

29.el是否包含某个class

export const hasClass = (el, className) => {

let reg = new RegExp('(^|\s)' + className + '(\s|$)')

return reg.test(el.className)

}

30.el添加某个class

exportconstaddClass=(el,className)=>{if(hasClass(el,className)){return}letnewClass=el.className.split(' ')newClass.push(className)el.className=newClass.join(' ')}

31.el去除某个class

exportconstremoveClass=(el,className)=>{if(!hasClass(el,className)){return}letreg=newRegExp('(^|\\s)'+className+'(\\s|$)','g')el.className=el.className.replace(reg,' ')}

32.获取滚动的坐标

exportconstgetScrollPosition=(el=window)=>({x:el.pageXOffset!==undefined?el.pageXOffset:el.scrollLeft,y:el.pageYOffset!==undefined?el.pageYOffset:el.scrollTop});

33.滚动到顶部

exportconstscrollToTop=()=>{constc=document.documentElement.scrollTop||document.body.scrollTop;if(c>0){window.requestAnimationFrame(scrollToTop);window.scrollTo(0,c-c/8);}}

34.el是否在视口范围内

export const elementIsVisibleInViewport=(el,partiallyVisible=false)=>{const{top,left,bottom,right}=el.getBoundingClientRect();const{innerHeight,innerWidth}=window;returnpartiallyVisible?((top>0&&top<innerHeight)||(bottom>0&&bottom<innerHeight))&&((left>0&&left<innerWidth)||(right>0&&right<innerWidth)):top>=0&&left>=0&&bottom<=innerHeight&&right<=innerWidth;}

35.洗牌算法随机

exportconstshuffle=(arr)=>{varresult=[],random;while(arr.length>0){random=Math.floor(Math.random()*arr.length);result.push(arr[random])arr.splice(random,1)}returnresult;}

36.拦截粘贴板

exportconstcopyTextToClipboard=(value)=>{vartextArea=document.createElement("textarea");textArea.style.background='transparent';textArea.value=value;document.body.appendChild(textArea);textArea.select();try{varsuccessful=document.execCommand('copy');}catch(err){console.log('Oops, unable to copy');}document.body.removeChild(textArea);}

37.判断类型集合

exportconstcheckStr=(str,type)=>{switch(type){case'phone'://手机号码return/^1[3|4|5|6|7|8|9][0-9]{9}$/.test(str);case'tel'://座机return/^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str);case'card'://身份证return/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(str);case'pwd'://密码以字母开头,长度在6~18之间,只能包含字母、数字和下划线return/^[a-zA-Z]\w{5,17}$/.test(str)case'postal'://邮政编码return/[1-9]\d{5}(?!\d)/.test(str);case'QQ'://QQ号return/^[1-9][0-9]{4,9}$/.test(str);case'email'://邮箱return/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str);case'money'://金额(小数点2位)return/^\d*(?:\.\d{0,2})?$/.test(str);case'URL'://网址return/(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/.test(str)case'IP'://IPreturn/((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/.test(str);case'date'://日期时间return/^(\d{4})\-(\d{2})\-(\d{2})(\d{2})(?:\:\d{2}|:(\d{2}):(\d{2}))$/.test(str)||/^(\d{4})\-(\d{2})\-(\d{2})$/.test(str)case'number'://数字return/^[0-9]$/.test(str);case'english'://英文return/^[a-zA-Z]+$/.test(str);case'chinese'://中文return/^[\\u4E00-\\u9FA5]+$/.test(str);case'lower'://小写return/^[a-z]+$/.test(str);case'upper'://大写return/^[A-Z]+$/.test(str);case'HTML'://HTML标记return/<("[^"]*"|'[^']*'|[^'">])*>/.test(str);default:returntrue;}}

38.严格的身份证校验

exportconstisCardID=(sId)=>{if(!/(^\d{15}$)|(^\d{17}(\d|X|x)$)/.test(sId)){console.log('你输入的身份证长度或格式错误')returnfalse}//身份证城市varaCity={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"};if(!aCity[parseInt(sId.substr(0,2))]){console.log('你的身份证地区非法')returnfalse}// 出生日期验证varsBirthday=(sId.substr(6,4)+"-"+Number(sId.substr(10,2))+"-"+Number(sId.substr(12,2))).replace(/-/g,"/"),d=newDate(sBirthday)if(sBirthday!=(d.getFullYear()+"/"+(d.getMonth()+1)+"/"+d.getDate())){console.log('身份证上的出生日期非法')returnfalse}// 身份证号码校验varsum=0,weights=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2],codes="10X98765432"for(vari=0;i<sId.length-1;i++){sum+=sId[i]*weights[i];}varlast=codes[sum%11];//计算出来的最后一位身份证号码if(sId[sId.length-1]!=last){console.log('你输入的身份证号非法')returnfalse}returntrue}

39.随机数范围

exportconstrandom=(min,max)=>{if(arguments.length===2){returnMath.floor(min+Math.random()*((max+1)-min))}else{returnnull;}}

40.将阿拉伯数字翻译成中文的大写数字

exportconstnumberToChinese=(num)=>{varAA=newArray("零","一","二","三","四","五","六","七","八","九","十");varBB=newArray("","十","百","仟","萬","億","点","");vara=(""+num).replace(/(^0*)/g,"").split("."),k=0,re="";for(vari=a[0].length-1;i>=0;i--){switch(k){case0:re=BB[7]+re;break;case4:if(!newRegExp("0{4}//d{"+(a[0].length-i-1)+"}$").test(a[0]))re=BB[4]+re;break;case8:re=BB[5]+re;BB[7]=BB[5];k=0;break;}if(k%4==2&&a[0].charAt(i+2)!=0&&a[0].charAt(i+1)==0)re=AA[0]+re;if(a[0].charAt(i)!=0)re=AA[a[0].charAt(i)]+BB[k%4]+re;k++;}if(a.length>1)// 加上小数部分(如果有小数部分){re+=BB[6];for(vari=0;i<a[1].length;i++)re+=AA[a[1].charAt(i)];}if(re=='一十')re="十";if(re.match(/^一/)&&re.length==3)re=re.replace("一","");returnre;}

41.将数字转换为大写金额

exportconstchangeToChinese=(Num)=>{//判断如果传递进来的不是字符的话转换为字符if(typeof Num=="number"){Num=newString(Num);};Num=Num.replace(/,/g,"")//替换tomoney()中的“,”Num=Num.replace(//g,"")//替换tomoney()中的空格Num=Num.replace(/¥/g,"")//替换掉可能出现的¥字符if(isNaN(Num)){//验证输入的字符是否为数字//alert("请检查小写金额是否正确");return"";};//字符处理完毕后开始转换,采用前后两部分分别转换varpart=String(Num).split(".");varnewchar="";//小数点前进行转化for(vari=part[0].length-1;i>=0;i--){if(part[0].length>10){return"";//若数量超过拾亿单位,提示}vartmpnewchar=""varperchar=part[0].charAt(i);switch(perchar){case"0":tmpnewchar="零"+tmpnewchar;break;case"1":tmpnewchar="壹"+tmpnewchar;break;case"2":tmpnewchar="贰"+tmpnewchar;break;case"3":tmpnewchar="叁"+tmpnewchar;break;case"4":tmpnewchar="肆"+tmpnewchar;break;case"5":tmpnewchar="伍"+tmpnewchar;break;case"6":tmpnewchar="陆"+tmpnewchar;break;case"7":tmpnewchar="柒"+tmpnewchar;break;case"8":tmpnewchar="捌"+tmpnewchar;break;case"9":tmpnewchar="玖"+tmpnewchar;break;}switch(part[0].length-i-1){case0:tmpnewchar=tmpnewchar+"元";break;case1:if(perchar!=0)tmpnewchar=tmpnewchar+"拾";break;case2:if(perchar!=0)tmpnewchar=tmpnewchar+"佰";break;case3:if(perchar!=0)tmpnewchar=tmpnewchar+"仟";break;case4:tmpnewchar=tmpnewchar+"万";break;case5:if(perchar!=0)tmpnewchar=tmpnewchar+"拾";break;case6:if(perchar!=0)tmpnewchar=tmpnewchar+"佰";break;case7:if(perchar!=0)tmpnewchar=tmpnewchar+"仟";break;case8:tmpnewchar=tmpnewchar+"亿";break;case9:tmpnewchar=tmpnewchar+"拾";break;}varnewchar=tmpnewchar+newchar;}//小数点之后进行转化if(Num.indexOf(".")!=-1){if(part[1].length>2){// alert("小数点之后只能保留两位,系统将自动截断");part[1]=part[1].substr(0,2)}for(i=0;i<part[1].length;i++){tmpnewchar=""perchar=part[1].charAt(i)switch(perchar){case"0":tmpnewchar="零"+tmpnewchar;break;case"1":tmpnewchar="壹"+tmpnewchar;break;case"2":tmpnewchar="贰"+tmpnewchar;break;case"3":tmpnewchar="叁"+tmpnewchar;break;case"4":tmpnewchar="肆"+tmpnewchar;break;case"5":tmpnewchar="伍"+tmpnewchar;break;case"6":tmpnewchar="陆"+tmpnewchar;break;case"7":tmpnewchar="柒"+tmpnewchar;break;case"8":tmpnewchar="捌"+tmpnewchar;break;case"9":tmpnewchar="玖"+tmpnewchar;break;}if(i==0)tmpnewchar=tmpnewchar+"角";if(i==1)tmpnewchar=tmpnewchar+"分";newchar=newchar+tmpnewchar;}}//替换所有无用汉字while(newchar.search("零零")!=-1)newchar=newchar.replace("零零","零");newchar=newchar.replace("零亿","亿");newchar=newchar.replace("亿万","亿");newchar=newchar.replace("零万","万");newchar=newchar.replace("零元","元");newchar=newchar.replace("零角","");newchar=newchar.replace("零分","");if(newchar.charAt(newchar.length-1)=="元"){newchar=newchar+"整"}returnnewchar;}

42.判断一个元素是否在数组中

exportconstcontains=(arr,val)=>{returnarr.indexOf(val)!=-1?true:false;}

43.数组排序,{type} 1:从小到大 2:从大到小 3:随机

exportconstsort=(arr,type=1)=>{returnarr.sort((a,b)=>{switch(type){case1:returna-b;case2:returnb-a;case3:returnMath.random()-0.5;default:returnarr;}})}

44.去重

exportconstunique=(arr)=>{if(Array.hasOwnProperty('from')){returnArray.from(newSet(arr));}else{varn={},r=[];for(vari=0;i<arr.length;i++){if(!n[arr[i]]){n[arr[i]]=true;r.push(arr[i]);}}returnr;}}

45.求两个集合的并集

exportconstunion=(a,b)=>{varnewArr=a.concat(b);returnthis.unique(newArr);}

46.求两个集合的交集

exportconstintersect=(a,b)=>{var_this=this;a=this.unique(a);returnthis.map(a,function(o){return_this.contains(b,o)?o:null;});}

47.删除其中一个元素

exportconstremove=(arr,ele)=>{varindex=arr.indexOf(ele);if(index>-1){arr.splice(index,1);}returnarr;}

48.将类数组转换为数组

``

export const formArray = (ary) => {

var arr = [];

if (Array.isArray(ary)) {

arr = ary;

} else {

arr = Array.prototype.slice.call(ary);

};

return arr;

}

49.最大值

export const max = (arr) => {

return Math.max.apply(null, arr);

}

50.最小值

export const min = (arr) => {

return Math.min.apply(null, arr);

}

51.求和

export const sum = (arr) => {

return arr.reduce((pre, cur) => {

return pre + cur

})

}

52.平均值

export const average = (arr) => {

return this.sum(arr) / arr.length

}

53.去除空格,type: 1-所有空格 2-前后空格 3-前空格 4-后空格

export const trim = (str, type) => {

type = type || 1

switch (type) {

case 1:

return str.replace(/\s+/g, "");

case 2:

return str.replace(/(^\s)|(\s

)/g, "");

default:

return str;

}

}

54.字符转换,type: 1:首字母大写 2:首字母小写 3:大小写转换 4:全部大写 5:全部小写

export const changeCase = (str, type) => {

type = type || 4

switch (type) {

case 1:

return str.replace(/\b\w+\b/g, function (word) {

return word.substring(0, 1).toUpperCase() + word.substring(1).toLowerCase();

});case2:returnstr.replace(/\b\w+\b/g,function(word){returnword.substring(0,1).toLowerCase()+word.substring(1).toUpperCase();});case3:returnstr.split('').map(function(word){if(/[a-z]/.test(word)){returnword.toUpperCase();}else{returnword.toLowerCase()}}).join('')case4:returnstr.toUpperCase();case5:returnstr.toLowerCase();default:returnstr;}

}

55.检测密码强度

export const checkPwd = (str) => {

var Lv = 0;

if (str.length < 6) {

return Lv

}

if (/[0-9]/.test(str)) {

Lv++

}

if (/[a-z]/.test(str)) {

Lv++

}

if (/[A-Z]/.test(str)) {

Lv++

}

if (/[.|-|_]/.test(str)) {

Lv++

}

return Lv;

}

56.函数节流器

export const debouncer = (fn, time, interval = 200) => {

if (time - (window.debounceTimestamp || 0) > interval) {

fn && fn();

window.debounceTimestamp = time;

}

}

57.在字符串中插入新字符串

export const insertStr = (soure, index, newStr) => {

var str = soure.slice(0, index) + newStr + soure.slice(index);

return str;

}

58.判断两个对象是否键值相同

export const isObjectEqual = (a, b) => {

var aProps = Object.getOwnPropertyNames(a);

var bProps = Object.getOwnPropertyNames(b);

if(aProps.length!==bProps.length){returnfalse;}for(vari=0;i<aProps.length;i++){varpropName=aProps[i];if(a[propName]!==b[propName]){returnfalse;}}returntrue;

}

59.16进制颜色转RGBRGBA字符串

export const colorToRGB = (val, opa) => {

varpattern=/^(#?)[a-fA-F0-9]{6}$/;//16进制颜色值校验规则varisOpa=typeofopa=='number';//判断是否有设置不透明度if(!pattern.test(val)){//如果值不符合规则返回空字符return'';}varv=val.replace(/#/,'');//如果有#号先去除#号varrgbArr=[];varrgbStr='';for(vari=0;i<3;i++){varitem=v.substring(i*2,i*2+2);varnum=parseInt(item,16);rgbArr.push(num);}rgbStr=rgbArr.join();rgbStr='rgb'+(isOpa?'a':'')+'('+rgbStr+(isOpa?','+opa:'')+')';returnrgbStr;

}

60.追加url参数

export const appendQuery = (url, key, value) => {

var options = key;

if (typeof options == 'string') {

options = {};

options[key] = value;

}

options = $.param(options);

if (url.includes('?')) {

url += '&' + options

} else {

url += '?' + options

}

return url;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容