摘要:前言開發(fā)項(xiàng)目和出沒社區(qū)有一段時(shí)間了,會(huì)遇上一些比較有印象業(yè)務(wù)需求。因?yàn)檫@些業(yè)務(wù)邏輯可以當(dāng)做練習(xí)題一樣,可以給大家練手。測(cè)試學(xué)院獲獎(jiǎng)統(tǒng)計(jì)學(xué)生申請(qǐng)優(yōu)秀畢業(yè)生,并且符合條件的成績(jī)優(yōu)秀,拿過獎(jiǎng)學(xué)金,獲得過三好學(xué)生。
1.前言
開發(fā)項(xiàng)目和出沒社區(qū)有一段時(shí)間了,會(huì)遇上一些比較有印象業(yè)務(wù)需求。這些業(yè)務(wù)需求,可能是自己開發(fā)項(xiàng)目遇上的,可能是在社區(qū)看到的業(yè)務(wù)需求,或者其他情況接觸到的需求,但是這些業(yè)務(wù)需求的實(shí)現(xiàn)邏輯都值得一寫。因?yàn)檫@些業(yè)務(wù)邏輯可以當(dāng)做練習(xí)題一樣,可以給大家練手。也希望大家從這些需求實(shí)現(xiàn)的邏輯里面可以能到j(luò)avascript的相關(guān)知識(shí),當(dāng)然如果大家覺得代碼需要怎樣優(yōu)化,或者有什么建議,更好的實(shí)現(xiàn)方案,覺得我哪里寫錯(cuò)了,或者有覺得可以分享的需求,可以在評(píng)論提下!
2.月份坐標(biāo)軸這個(gè)需求是,看下圖就懂了
實(shí)現(xiàn)方式其實(shí)很簡(jiǎn)單,我在代碼打上注釋,大家就懂了!
var _date=[],dateData=["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"]; //準(zhǔn)備一個(gè)月份反轉(zhuǎn)的數(shù)組 var dateDataRet=Object.assign([],dateData).reverse(); //獲取當(dāng)前年份 var yearText=new Date().getFullYear(); //獲取當(dāng)前月份 調(diào)試的時(shí)候,大家可以通過調(diào)整now調(diào)試 3月-now=2,12月now=11... var now=new Date().getMonth(); for(let i=0;i<6;i++){ if(now-i<0){ //如果now-i<0,從dateDataRet里面拿數(shù)據(jù),下標(biāo)=|now-i|-1。 _date.push(yearText-1+"年"+dateDataRet[Math.abs(now-i)-1]); } else{ //從dateData里面拿數(shù)據(jù),下標(biāo)=now-i _date.push(yearText+"年"+dateData[now-i]); } } _date.reverse();
可能大家看著會(huì)懵,直接看下面的循環(huán)圖就懂了
3.數(shù)值區(qū)間如下圖,就是幾個(gè)數(shù)值區(qū)間,而且會(huì)有一個(gè)最小值和最大值
var _min=5,_max=50; function checkArr(arr,min,max){ //排序 arr.sort(function(n1,n2){return n1.min-n2.min}) //遍歷 for(var i=0;i=arr[i].max){ console.log("區(qū)間的最小值不能大于等于區(qū)間最大值"); return; } //區(qū)間的最小值不能小于默認(rèn)最小值 if(arr[i].min max){ console.log("區(qū)間的最大值不能大于默認(rèn)最大值"); return; } //元素對(duì)比,從第二個(gè)元素開始 if(i>0){ //minInclude,maxInclude,為false就是不包含,為true就是包含 //{min:10,max:20,minInclude:false,maxInclude:false} //等同于(10,20) //{min:20,max:30,minInclude:true,maxInclude:false} //等同于[20,30); //如果前一個(gè)的最大值和當(dāng)前的最小值都是包含情況,那么當(dāng)前區(qū)間的最小值一定要比前一個(gè)區(qū)間的最大值大1 if(arr[i].minInclude&&arr[i-1].maxInclude&&arr[i].min-arr[i-1].max!==1){ console.log("取值范圍錯(cuò)誤-當(dāng)前區(qū)間的最小值和前一個(gè)區(qū)間的最大值都是包含情況,當(dāng)前區(qū)間的最小值一定要比前一個(gè)區(qū)間的最大值大1"); return; } //如果前一個(gè)的最大值和當(dāng)前的最小值。一個(gè)是包含,一個(gè)是不包含,那么當(dāng)前區(qū)間的的最小值一定要等于上一個(gè)區(qū)間的最大值 else if(arr[i].minInclude!==arr[i-1].maxInclude&&arr[i].min!==arr[i-1].max){ console.log("取值范圍錯(cuò)誤-當(dāng)前區(qū)間的最小值和前一個(gè)區(qū)間的最大值其中一個(gè)是包含,一個(gè)是不包含情況,當(dāng)前區(qū)間的最小值一定要等于前一個(gè)區(qū)間的最大值"); return; } //如果前一個(gè)的最大值和當(dāng)前的最小值都是不包含,肯定不滿足 else if((!arr[i].minInclude)&&(!arr[i-1].maxInclude)){ console.log("取值范圍錯(cuò)誤-前一個(gè)的最大值和當(dāng)前的最小值都是不包含情況,不滿足收尾相連"); return; } } } }
測(cè)試用例
var arr1=[{min:10,max:20,minInclude:false,maxInclude:true},{min:21,max:30,minInclude:true,maxInclude:true}], arr2=[{min:10,max:20,minInclude:false,maxInclude:true},{min:20,max:30,minInclude:true,maxInclude:false}], arr3=[{min:10,max:20,minInclude:false,maxInclude:true},{min:20,max:30,minInclude:false,maxInclude:false}], arr4=[{min:10,max:20,minInclude:false,maxInclude:false},{min:20,max:30,minInclude:true,maxInclude:false}], arr5=[{min:10,max:20,minInclude:false,maxInclude:false},{min:21,max:30,minInclude:true,maxInclude:false}], arr6=[{min:10,max:20,minInclude:false,maxInclude:false},{min:15,max:30,minInclude:false,maxInclude:false}], arr7=[{min:10,max:20,minInclude:false,maxInclude:false},{min:20,max:30,minInclude:false,maxInclude:false}], arr8=[{min:1,max:20,minInclude:false,maxInclude:false},{min:20,max:30,minInclude:false,maxInclude:false}], arr9=[{min:20,max:20,minInclude:false,maxInclude:false},{min:20,max:30,minInclude:false,maxInclude:false}], arr10=[{min:20,max:30,minInclude:false,maxInclude:false},{min:20,max:70,minInclude:false,maxInclude:false}];
運(yùn)行結(jié)果
4.數(shù)組對(duì)比這個(gè)基于我回答過的一個(gè)問題,現(xiàn)在化用,改寫一下
JavaScript如何對(duì)比兩個(gè)數(shù)組?數(shù)組B根據(jù)數(shù)組A來做出增刪? (不用jquery,原生js)
具體問題是這樣的:
arryA
var arrayA = ["a","b","c"];
arryB
var arrayB = [{ key:"a", num1:"1", num2:"2", num3:"3", tot:"6" },{ key:"b", num1:"11", num2:"22", num3:"33", tot:"66" },{ key: "c", num1: "111", num2: "222", num3: "333", tot:666 }];
1、如果arryA中有a,arryB中沒有,那么在arryB中增加一個(gè)key值為a的boj,且其他屬性值可均為"0";如下: {key:"a",num1:"0",num2:"0",num3:"0",tot":0"}
2、如果arryA中有a,arryB中也有key值為a的obj,那么arryB則不改變,并且該obj里的其他屬性和屬性值均不變;
3、如果在arryA中刪除了a,那么arryB中key值為a的obj整個(gè)刪掉。
//準(zhǔn)備臨時(shí)數(shù)組 function compareArr(arr1,arr2){ var result=[],arr; //遍歷 for(var i=0;i測(cè)試
var arrayA = ["b","c"]; var arrayB = [{ key:"a", num1:"1", num2:"2", num3:"3", tot:"6" },{ key:"b", num1:"11", num2:"22", num3:"33", tot:"66" },{ key: "c", num1: "111", num2: "222", num3: "333", tot:666 }]; compareArr(arrayA,arrayB);5.學(xué)院獲獎(jiǎng)統(tǒng)計(jì)學(xué)生申請(qǐng)優(yōu)秀畢業(yè)生,并且符合條件的(成績(jī)優(yōu)秀,拿過獎(jiǎng)學(xué)金,獲得過三好學(xué)生)。前提是要申請(qǐng)
大概的流程圖就是像下面這樣!
我在代碼上寫上注釋,相信不難理解了
//學(xué)生列表 //isApply:是否有申請(qǐng)優(yōu)秀畢業(yè)生 let studentList = [ { name: "aa", isApply: false, id: 1 }, { name: "bb", isApply: true, id: 2 }, { name: "cc", isApply: true, id: 3 } ]; //申請(qǐng)優(yōu)秀畢業(yè)生的學(xué)生 isApply:true let _student = studentList.filter(function (item) { return item.isApply; }); //isExcellent:優(yōu)秀學(xué)生的id列表 //isScholarship:獲得過獎(jiǎng)學(xué)金的學(xué)生的id列表 //isThreeGood:獲得過三好學(xué)生的學(xué)生的id列表 //accord:集合 let isExcellent = [1, 2, 3, 4, 5], isScholarship = [4, 2, 5, 6, 2, 1, 2], isThreeGood = [2, 1, 4, 52, 36], accord = []; //數(shù)組去重函數(shù) function removeRepeatArr(arr) { return arr.filter(function (item, index, self) { return self.indexOf(item) === index; }); } //統(tǒng)計(jì)數(shù)組中,一個(gè)遇上元素的出現(xiàn)次數(shù) function getEleCount(obj, ele) { let num = 0; for (let i = 0, len = obj.length; i < len; i++) { if (ele === obj[i]) { num++; } } return num; } //添加學(xué)生記錄,把獲得成績(jī)優(yōu)秀的學(xué)生的id,獲得過獎(jiǎng)學(xué)金的學(xué)生的id,獲得過三好學(xué)生的id添加進(jìn)去。 //但是添加之前,要對(duì)獲得成績(jī)優(yōu)秀的學(xué)生的id,獲得過獎(jiǎng)學(xué)金的學(xué)生的id,獲得過三好學(xué)生的id。這個(gè)三個(gè)數(shù)組進(jìn)行去重再添加進(jìn)accord,因?yàn)橐粋€(gè)學(xué)生可能不止一次成績(jī)優(yōu)秀,不止一次獲得過獎(jiǎng)學(xué)金,不止一次獲得過三好學(xué)生 //這樣就方便下面的判斷,只要學(xué)生的id在accord里面出現(xiàn)兩次及以上就符合條件 accord.push.apply(accord, removeRepeatArr(isExcellent)); accord.push.apply(accord, removeRepeatArr(isScholarship)); accord.push.apply(accord, removeRepeatArr(isThreeGood)); console.log(accord); //符合條件的學(xué)生列表 let accordStudent = []; for (let i = 0; i < _student.length; i++) { //只要學(xué)生的id在accord里面出現(xiàn)兩次及以上 if (getEleCount(accord, _student[i].id) >= 2) { //記錄哪些學(xué)生符合條件 accordStudent.push(_student[i]); } } console.log(accordStudent);6.數(shù)組連續(xù)的最大長(zhǎng)度這個(gè)也是出于我回答過的問題:如下
//假如有一個(gè)數(shù)組,下面這個(gè)數(shù)組最大的連續(xù)長(zhǎng)度就是4——————8,9,10,11 var arr=[1,2,4,5,6,8,9,10,11]; //代碼實(shí)現(xiàn) function countLen(arr){ //如果參數(shù)不是數(shù)組或者長(zhǎng)度為0,直接返回0 if(arr.constructor!==Array||arr.length===0){return 0;} //首先進(jìn)入當(dāng)前連續(xù)長(zhǎng)度nowLen設(shè)初始化為1,最大連續(xù)長(zhǎng)度maxLen初始化為0 var nowLen=1,maxLen=0; for(var i=1,len=arr.length;i7.答題連對(duì)數(shù) 這個(gè)和上面的代碼基本一樣,只是判斷條件毫厘之差,直接貼,大家看就好
function countTrue(arr){debugger; //如果參數(shù)不是數(shù)組或者長(zhǎng)度為0,直接返回0 if(arr.constructor!==Array||arr.length===0){return 0;} //首先初始化連續(xù)答對(duì)長(zhǎng)度nowLen為0,最大連續(xù)答對(duì)長(zhǎng)度maxLen為0 var nowLen=0,maxLen=0; for(var i=0,len=arr.length;i8.命名方式轉(zhuǎn)換 比如駝峰命名方式轉(zhuǎn)"-"命名方式。
var str = "shouHou"; //$1-第一個(gè)括號(hào)匹配的內(nèi)容 //這個(gè)實(shí)例,$1="H" str = str.replace(/([A-Z])/g,"-$1").toLowerCase();比如"-"命名方式轉(zhuǎn)駝峰命名方式
var str="shou-hou"; //$0-匹配的結(jié)果 $1-第一個(gè)括號(hào)匹配的內(nèi)容 //這個(gè)實(shí)例$0="-h" $1="h" str=str.replace(/-(w)/g,function($0,$1){ return $1.toUpperCase(); });9.格式化字符這個(gè)最常見的就是在金額方面的顯示需求上,比如后臺(tái)返回10000。前端要顯示成10,000或者其他格式等!
//str //size-每隔幾個(gè)字符進(jìn)行分割 默認(rèn)3 //delimiter-分割符 默認(rèn)"," function formatText(str,size,delimiter){ var _str=str.toString(); var _size=size||3,_delimiter=delimiter||","; /* 如果_size是3 "d{1,3}(?=(d{3})+$)" */ var regText="d{1,"+_size+"}(?=(d{"+_size+"})+$)"; /* /d{1,3}(?=(d{3})+$)/g 這個(gè)正則的意思:匹配連續(xù)的三個(gè)數(shù)字,但是這些三個(gè)數(shù)字不能是字符串的開頭1-3個(gè)字符 */ var reg=new RegExp(regText,"g"); /* (-?) 匹配前面的-號(hào) (d+)匹配中間的數(shù)字 ((.d+)?)匹配小數(shù)點(diǎn)后面的數(shù)字 //$0-匹配結(jié)果,$1-第一個(gè)括號(hào)返回的內(nèi)容----(-?) $2,$3如此類推 */ return _str.replace(/^(-?)(d+)((.d+)?)$/, function ($0, $1, $2, $3) { return $1 + $2.replace(reg, "$&,") + $3; }) }10.對(duì)象合并,并且記錄異常數(shù)據(jù)這個(gè)需求,可能大家有點(diǎn)懵。下面實(shí)例分析
比如有兩個(gè)都地方記錄了我的信息let info1={ name:"守候", sex:"男", age:24, job:"web前端" },info2={ name:"守候!", country:"china", interest:"basketball", phone:"12345678910", job:"web前端" }現(xiàn)在要合并我的信息,并且記錄可能有異常的信息。比如上面的name屬性,在兩個(gè)對(duì)象都有,而且兩個(gè)對(duì)象的值不一樣,那么就不知道到底是info1中的name屬性是正確的,還是info2中的name屬性是正確的。所以,就得把name這個(gè)屬性記錄起來,方便以后核對(duì)name這個(gè)屬性。
如下圖
下面,一步一步來,先不管3721,直接合并屬性
let objAll={}; function assignObj(objArr) { let _obj={}; for(let i=0;i然后先準(zhǔn)備一個(gè)字段,記錄哪些異常信息
objAll.warnInfo=[];最后檢查對(duì)象,判斷哪些信息有異常
function checkObj(_objAll,objList) { //獲取所有屬性 let _keys=Object.keys(_objAll); for(let i=0;i11.篩選標(biāo)簽 如下圖,在下面渲染這個(gè)標(biāo)簽
大家可能第一可能覺得壓根沒難度
就是一個(gè)對(duì)象數(shù)組:比如var searchTag=[ {label:"產(chǎn)品編碼",value:"100072236-8"}, {label:"產(chǎn)品名稱",value:"甘油"} ]但是這樣的數(shù)據(jù),顯然是要經(jīng)過處理生成的
因?yàn)椴豢赡苓@樣發(fā)送請(qǐng)求
http://example.com?產(chǎn)品編碼=100072236-8發(fā)送過去的參數(shù)應(yīng)該是這樣的
http://example.com?proId=100072236-8 var searchParam={proId:"100072236-8",proName:"甘油"}怎么進(jìn)行數(shù)據(jù)的處理呢,其實(shí)很簡(jiǎn)單,代碼不打注釋,我想都看得懂
var searchTag=[]; var searchText={proId:"產(chǎn)品編碼",proName:"產(chǎn)品名稱"}; var searchParam={proId:"100072236-8",proName:"甘油"}; Object.keys(searchParam).forEach(function (item) { searchTag.push({ label:searchText[item], key:item, value:searchParam[item] }) }) console.log(searchTag)有了這些數(shù)據(jù),渲染到頁面這個(gè)就簡(jiǎn)單了!
12.導(dǎo)入excel內(nèi)容就是excel上這樣的內(nèi)容
轉(zhuǎn)成下面的數(shù)據(jù)
目錄如下
下面開始寫代碼,我們利用node.js來寫
let path = require("path"); //使用ejsexcel讀取excel文件 npm install ejsexcel --save let ejsExcel=require("ejsexcel"); let fs=require("fs"); //讀取excel let exBuf=fs.readFileSync(__dirname+"/resource/userList.xlsx"); let _data=[]; //獲取成功后 ejsExcel.getExcelArr(exBuf).then(exlJson=>{ //獲取excel數(shù)據(jù) let workBook=exlJson; //獲取excel第一張表 sheet1 let workSheets=workBook[0]; //導(dǎo)出js的路徑 let newfilepath=path.join(__dirname,"/resource/test.js"); //遍歷第一張表的的每一行數(shù)據(jù) workSheets.forEach((item,index)=>{ //從第二行開始插入,避免連表頭也插入_data里面 if(index>0){ //往_data插入單元格個(gè)值,item[0]相當(dāng)于excel中的姓名,item[1]就是excel中的聯(lián)系電話 _data.push({ name:item[0], phone:item[1] }) } }); //寫入js文件 fs.writeFileSync(newfilepath, "let _data="+JSON.stringify(_data)+";export {_data}"); }).catch(error=>{ //打印獲取失敗信息 console.log("讀取錯(cuò)誤!"); console.log(error); });然后命令行執(zhí)行該js
$ node importFile.js然后就發(fā)現(xiàn)多了一個(gè)test.js文件
excel的數(shù)據(jù)就這樣導(dǎo)入成js的一個(gè)數(shù)組了,只要引入這個(gè)數(shù)組,就可以正常的使用了!
13.隨機(jī)循環(huán)當(dāng)時(shí)接到的業(yè)務(wù)是實(shí)際顯示客戶的信息,感覺有點(diǎn)像音樂播放器的隨機(jī)循環(huán)。
要求有兩個(gè):
1.一個(gè)提示列表里面,提示的信息每隔500ms隨機(jī)展示。
2.同一輪循環(huán)里面,一個(gè)提示信息只能展示一次。
3.列表的提示信息全部展示完了,進(jìn)行下一輪展示。
這個(gè)邏輯沒什么,直接在代碼打上注釋,我想大家就明白了!var tipList=["提示1","提示2","提示3","提示4","提示5","提示6","提示7","提示8","提示9"]; var tipListShow=[]; tipListShow=Object.assign([],tipList); var i=0,timer=null; function play() { //隨機(jī)顯示一個(gè),顯示了之后,把這個(gè)項(xiàng)從tipListShow中刪除掉,防止在同一輪重復(fù)出現(xiàn)! console.log(tipListShow.splice(Math.floor(Math.random() * tipListShow.length),1)[0]); //當(dāng)循環(huán)完了之后,tipListShow的長(zhǎng)度就會(huì)是0,然后就重新賦值,準(zhǔn)備進(jìn)行下一輪的隨機(jī)循環(huán) if(tipListShow.length===0){ tipListShow=Object.assign([],tipList); i=0; } //如果需要暫?;蛘咄V沟?,清除這個(gè)定時(shí)器即可,下次執(zhí)行就重新這樣創(chuàng)建定時(shí)器,執(zhí)行play();! timer=setTimeout(function () { play(); },500); } play();14.小結(jié)好了,關(guān)于我收集到的一些業(yè)務(wù)需求邏輯,以及實(shí)現(xiàn)的方式,就說到這里了!接觸到的業(yè)務(wù)需求邏輯很多,但是值得寫的,可以當(dāng)做練習(xí)題的,就記錄到這里了。我上面代碼實(shí)現(xiàn)可能會(huì)有點(diǎn)粗糙,大家有更好的實(shí)現(xiàn)方案,歡迎建議一下。如果大家有什么可以當(dāng)做練習(xí)題的需求,可以提下。讓大家有多些練習(xí)題可以嘗試下,學(xué)習(xí)下!
-------------------------華麗的分割線--------------------
想了解更多,關(guān)注關(guān)注我的微信公眾號(hào):守候書閣
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/92273.html
摘要:我是一個(gè)知乎輕微重度用戶,之前寫了一只爬蟲幫我爬取并分析它的數(shù)據(jù),我感覺這個(gè)過程還是挺有意思,因?yàn)檫@是一個(gè)不斷給自己創(chuàng)造問題又去解決問題的過程。所以這只爬蟲還有登陸知乎搜索題目的功能。 我一直覺得,爬蟲是許多web開發(fā)人員難以回避的點(diǎn)。我們也應(yīng)該或多或少的去接觸這方面,因?yàn)榭梢詮呐老x中學(xué)習(xí)到web開發(fā)中應(yīng)當(dāng)掌握的一些基本知識(shí)。而且,它還很有趣。 我是一個(gè)知乎輕微重度用戶,之前寫了一只爬...
摘要:任務(wù)名稱響應(yīng)式砸蛋頁面任務(wù)背景前輩方方啊最近項(xiàng)目也沒什么事情你看這個(gè)砸蛋頁面不是很好看要不你做一個(gè)響應(yīng)式砸蛋頁面吧系統(tǒng)鄭方方接下前輩的任務(wù)鄭方方自動(dòng)解析任務(wù)步驟任務(wù)響應(yīng)式砸蛋頁面與入門閱讀秘籍響應(yīng)式布局制作層搭配搭配控制器完成任務(wù)人物背 任務(wù)名稱:響應(yīng)式砸蛋頁面 任務(wù)背景 前輩:方方啊,最近項(xiàng)目也沒什么事情,你看這個(gè)砸蛋頁面不是很好看,要不你做一個(gè)響應(yīng)式砸蛋頁面吧? 系統(tǒng):鄭方方接下前...
摘要:任務(wù)名稱響應(yīng)式砸蛋頁面任務(wù)背景前輩方方啊最近項(xiàng)目也沒什么事情你看這個(gè)砸蛋頁面不是很好看要不你做一個(gè)響應(yīng)式砸蛋頁面吧系統(tǒng)鄭方方接下前輩的任務(wù)鄭方方自動(dòng)解析任務(wù)步驟任務(wù)響應(yīng)式砸蛋頁面與入門閱讀秘籍響應(yīng)式布局制作層搭配搭配控制器完成任務(wù)人物背 任務(wù)名稱:響應(yīng)式砸蛋頁面 任務(wù)背景 前輩:方方啊,最近項(xiàng)目也沒什么事情,你看這個(gè)砸蛋頁面不是很好看,要不你做一個(gè)響應(yīng)式砸蛋頁面吧? 系統(tǒng):鄭方方接下前...
摘要:任務(wù)名稱響應(yīng)式砸蛋頁面任務(wù)背景前輩方方啊最近項(xiàng)目也沒什么事情你看這個(gè)砸蛋頁面不是很好看要不你做一個(gè)響應(yīng)式砸蛋頁面吧系統(tǒng)鄭方方接下前輩的任務(wù)鄭方方自動(dòng)解析任務(wù)步驟任務(wù)響應(yīng)式砸蛋頁面與入門閱讀秘籍響應(yīng)式布局制作層搭配搭配控制器完成任務(wù)人物背 任務(wù)名稱:響應(yīng)式砸蛋頁面 任務(wù)背景 前輩:方方啊,最近項(xiàng)目也沒什么事情,你看這個(gè)砸蛋頁面不是很好看,要不你做一個(gè)響應(yīng)式砸蛋頁面吧? 系統(tǒng):鄭方方接下前...
閱讀 964·2023-04-25 23:50
閱讀 1994·2021-11-19 09:40
閱讀 608·2019-08-30 13:50
閱讀 2736·2019-08-29 17:11
閱讀 1051·2019-08-29 16:37
閱讀 2996·2019-08-29 12:54
閱讀 2803·2019-08-28 18:17
閱讀 2647·2019-08-26 16:55