#博學(xué)谷IT學(xué)習(xí)技術(shù)支持#
個人筆記后續(xù)會進(jìn)行內(nèi)容改進(jìn)
stringutils.isEmpty(code) 如果code為空
流程:
客戶端發(fā)送請求給服務(wù)端
服務(wù)端內(nèi)部采用dubbo模式在微服務(wù)之前相互調(diào)用
第三方插件短信驗證碼
iwt用戶鑒權(quán)
獲取登錄驗證碼客戶端輸入手機(jī)號發(fā)送短信,短信寫死。redis存取,在跟數(shù)據(jù)庫信息進(jìn)行比較驗證碼
應(yīng)用場景
input stream ?輸出流
output stream 輸入流
bufferedoutputstream 字節(jié)緩沖輸出流
bufferedinputstream 字節(jié)緩沖輸入流
圖片上傳文件存儲。阿里云的oss:
阿里云oss抽取為自動裝配的組件
一、appsevicer配置文件編寫內(nèi)容
二、autoconfig類編寫properties
寫template模板類 template需要properties中的屬性。構(gòu)造出來
編寫bean
百度人臉識別別
第三方插件的使用步驟
1、開通服務(wù)
2、找到api實例代碼
3、抽取
代碼編寫
(數(shù)據(jù)層提供者,負(fù)責(zé)跟數(shù)據(jù)庫打交道
實體類model
mapper數(shù)據(jù)層接口 db
接口。api interface層 ?保存修改
接口實現(xiàn)db
(表現(xiàn)層 消費者 直接跟app對接
controller ?注入service
service ?service調(diào)取api的方法
修改頭像
使用multipartfile獲取頭,后邊是token
判斷token可用性
設(shè)置uesid,是用api更新userinfo
vo處理實體類之間的數(shù)據(jù)類型不一致
取消項目啟動時候的日志和banner
編寫logback.xml 配置<configuration></configuration>標(biāo)簽即可
處理用戶鑒權(quán)、統(tǒng)一處理token
一、編寫token攔截器 在進(jìn)入控制器之前先分辨好token的可靠性
二、編寫mvc控制器類來指定哪些請求需要被攔截
三、編寫threadloacl線程工具,把后續(xù)用到的userid和userphone存儲到線程中
四、在token攔截器編寫控制器執(zhí)行完之后的要刪除線程的方法
黑名單維護(hù)
一、黑名單列表page pageSize
二、findlist方法service端 返回PageResilu
三、serice端DubboReference Blackapi
獲取id 根據(jù)id和page pageSize 返回pageResult
四、api
五、api實現(xiàn)類 ?DubboService
引入userinfomapper 查詢數(shù)據(jù)庫
六、編寫select查詢語句
今日佳人
一、引入依賴,寫配置
二、配置項目架子不用配置mapper 使用mongodb數(shù)據(jù)庫,引入MongodbTemplate
三、api統(tǒng)一存放interface
四、在mongo中編寫api實現(xiàn)類?。。。?!
推薦:
代碼實現(xiàn):
controller:調(diào)用tanhuaapi查詢返回值是pageresult 參數(shù)是dto
service:
一、獲取用戶id
二、根據(jù)recommendapi新建查詢方法。返回值是pagereslit 參數(shù)是 psge psgesize userid
三、沖pr中獲取iitem數(shù)據(jù)
四、item數(shù)據(jù)就是us而info數(shù)據(jù)
五、判斷userinfo數(shù)據(jù)是否為null null就直接返回,不null就循環(huán)獲取userid,查詢出userinfo的數(shù)據(jù) ?循環(huán)的時候可以對數(shù)據(jù)進(jìn)行判斷
如果輸入的信息跟userinfo的數(shù)據(jù)不一致直接continue
六、根據(jù)recommmeduser和userinfo數(shù)據(jù)可以封裝成Todaybest數(shù)據(jù)
七、吧todaybest轉(zhuǎn)換成pagerealut ?創(chuàng)建 todaybest集合。吧循環(huán)的數(shù)據(jù)add到todaybest集合,然后再重新set到pr中
八、返回pr
api;
根據(jù)第二步的新建方法編寫方法
apiimpl:
構(gòu)建mongodb的criteria和query
查詢總數(shù)
查詢集合
返回pagereslut數(shù)據(jù),參數(shù)是攜帶的page,pagesize,查詢出來的總數(shù)count和集合list
優(yōu)化userinfoapi批量查詢用戶
useriinfoapi:
源代碼需要根據(jù)id查詢userinfo,吧id封裝為list 返回值為map,《Long,Userinfo》 方法返回值List(Long),Userinfo userinfo
實現(xiàn)接口:
構(gòu)建warrper
查詢出id
判斷userinfo(條件是否存在)
進(jìn)行相應(yīng)的判斷
調(diào)用mapper返回list
最后根據(jù)collutile。filedvaluemap返回map集合。這個工具類第一個參數(shù)是返會的內(nèi)容,放第二個是根據(jù)什么進(jìn)行返回
優(yōu)化的內(nèi)容是collutil.filedvaliemap(list,"id") 有返回map的也有返回list的
mongodb集群
副本集群:
顧名思義。一個數(shù)同時存在多個mongodb服務(wù)器上。可以有效解決單點故障
執(zhí)行流程:
副本集群內(nèi)不存在主節(jié)點和從節(jié)點,主節(jié)點只有一個,從節(jié)點可以有多個。主要是依賴主節(jié)點的讀寫與客戶端交互。內(nèi)部朱重建會有心跳來判斷
服務(wù)器是否正常。如果主節(jié)點宕機(jī),剩下的從節(jié)點會選舉出一個新的主節(jié)點對外提供服務(wù)
讀寫分離
分片集群:
可以解決單點故障和海量數(shù)據(jù)
包括分片服務(wù),配置服務(wù)、路由服務(wù)
客戶端訪問的時候,配置服務(wù)已經(jīng)存取了分片服務(wù)的所有ip,端口。而后路由服務(wù)讀取配置服務(wù),并依據(jù)規(guī)則選取恰當(dāng)?shù)姆制?wù)
進(jìn)行存取
企業(yè)是相結(jié)合的方式
分片集群負(fù)責(zé)處理海量數(shù)據(jù),非本機(jī)群負(fù)責(zé)保障分片服務(wù)的正常運行
分片策略:
路由服務(wù)器配置策略
范圍制定分片策略
數(shù)值hash策略:目前這種是最常用的策略
圈子基本功能:
發(fā)布
瀏覽
評論點贊
表結(jié)構(gòu)設(shè)計:
一基礎(chǔ)、兩張表。一張自己的動態(tài)表,一張好友表
二改進(jìn)、在原有的動態(tài)表添加可見人集合字段,根據(jù)用戶來查詢
三常用、在兩張表的基礎(chǔ)上添加一個冗余的數(shù)據(jù)庫,來中和關(guān)系表和動態(tài)表的關(guān)系
mongodb實現(xiàn)主鍵自增
發(fā)布動態(tài):
參數(shù):文本、地址、經(jīng)緯度、圖片
返回值:無
controller:
調(diào)用movementservice
service:
判斷文本是否為空,統(tǒng)一返回異常
獲取用戶id,用于后面保存動態(tài)數(shù)據(jù) ????movement需要封裝userid和圖片信息,其他都會自動封裝
把圖片信息上傳到oss,使用MultipartFile封裝圖片數(shù)據(jù)。調(diào)用osstemplate工具類上傳
api:
保存movement數(shù)據(jù)
設(shè)置pid,自動增長。之前編寫過增漲的service工具
設(shè)置當(dāng)前時間
保存movement數(shù)據(jù)
構(gòu)建mongo獨有的查詢,根據(jù)userid查詢friends對象 ??friend對象自定義?
循環(huán)friend對象,封裝時間線數(shù)據(jù)最后保存 ??時間線數(shù)據(jù)需要阿封裝movementid,userid friendid
查詢個人動態(tài):
封裝響應(yīng)的vo實體類
參數(shù)page,pagesize,userid
返回值pageresult
controller:
調(diào)取service方法
service:
查詢出個人動態(tài),根據(jù)傳遞的參數(shù),返回值是pagereslut
獲取pagereslut的item,其實是movement動態(tài)數(shù)據(jù)
判斷iter是否為空
不為空遍歷item封裝vo對象 然后轉(zhuǎn)換成pagereslut
返回pagereslut
api:
mongo的查詢架構(gòu)
查詢動態(tài):
提取id列表用的是
Collutil.getfiledvalues
查詢好友動態(tài):////////////////////////////////////////////////////////////
redis 拼接rediskey ??redisttemplate.opsforvalue().get(k)獲取值
pid
字符串切割split(“條件”)
流轉(zhuǎn)成數(shù)組使用. colliect(Conllecters.tostring)
aggregte
第一次解析得到數(shù)據(jù)庫表
第二次將結(jié)果設(shè)置到對象中
collection.empty_list
當(dāng)分頁的起始頁碼小于數(shù)組的長度才允許分頁
推薦系統(tǒng)存入redis 存的是pid
先查redis
會存在兩種情況
1、有
有的化需要進(jìn)行判斷:由于redis存的字符串有逗號,需要split切割一下。如果查詢的起始值小于總長度才能返回,
在api端直接根據(jù)pid查詢返回
2、沒有
沒有就構(gòu)建一群數(shù)據(jù)隨機(jī)返回
隨機(jī)有講究。需要用到mongotemplate的統(tǒng)計方法
發(fā)布評論:
service引入
service層主要圍繞,對象封裝對象轉(zhuǎn)化,少量業(yè)務(wù)
主要還是api層處理業(yè)務(wù)
封裝comment對象,基礎(chǔ)的comment值。publishUserId被評論的用戶id方法哦api層進(jìn)行處理
service層需要返回動態(tài)的操作數(shù)據(jù)
api層:
調(diào)用mogo根據(jù)動態(tài)id查詢動態(tài)用戶id
設(shè)置到comment,并進(jìn)行更新
//!!?。。。。?!
調(diào)用mogo的findandmodify方法,四個參數(shù)
根據(jù)傳遞的評論動態(tài)id封裝query
update。inc。根據(jù)字段進(jìn)行+1
option。returnnew(ture)
點贊流程:
要有返回的數(shù)字:
路徑id:
service層 :
根據(jù)動態(tài)id更新comment并存入redis緩存中,快捷查詢
熟悉comment表,根據(jù)動態(tài)id和互動類型,當(dāng)前操作用戶id查詢comment表是否有數(shù)據(jù),有數(shù)據(jù)返回已經(jīng)點贊
沒有數(shù)據(jù)進(jìn)行封裝comment,調(diào)用commentapi保存會有返回數(shù)字
存入rredis選取存儲的類型,采用hash
構(gòu)建字符串。調(diào)用redistemple進(jìn)行put
api層:
根據(jù)service的三個字段構(gòu)建query查詢對象,直接調(diào)用mongotemplate的exises方法判斷boolear值
取消點贊流程:
與點贊流程相反,dis
service層:
判斷三個條件是否為真
不為真應(yīng)該點贊
為真在進(jìn)行刪除
構(gòu)建comment對象
delete
構(gòu)建redis
delete
api層:
先刪除comment表的數(shù)據(jù)
再刪除movenmt的對應(yīng)字段-1,調(diào)用mongotemplate的findandmodify方法構(gòu)建四個條件,query,update,option和最后的實體類的字節(jié)碼
環(huán)信即時通信
直接調(diào)用環(huán)信的api
抽取成模板類
一app端編寫yml:配置服務(wù)的每個賬號
二末班短編寫properties,每個字段
三編寫tempalte
四構(gòu)建bean到application中
1、創(chuàng)建用戶的是好構(gòu)建環(huán)信賬號,并與環(huán)信服務(wù)器配上體系關(guān)系
2、根據(jù)環(huán)信的usernameid查詢userinfo數(shù)據(jù)
3、查詢陌生人問題 ??diaoyongquestionapi即可
4、回復(fù)陌生人問題
添加好友1.0:
傳遞的結(jié)果是對方的userid和申請的txt字符串
?。?/p>
map.get("value") 返回的是obdject對象
使用.tostring 返回的是string字符串
更改obdject類型為string為什么不行
??!
注意點:前端相應(yīng)的userid是integer需要轉(zhuǎn)換成long
是用tostring轉(zhuǎn)化成字符串,字符串再調(diào)用Long。valueof(string字符串)即可轉(zhuǎn)化成long
service中map封裝的數(shù)據(jù)需要注意操作的用戶id和發(fā)送的用戶idalong代表要添加的好友的id。reply中的id為當(dāng)前操作用戶的信息
5、添加好友2.0
參數(shù)是用戶id 請求的用戶id
messagecontroller中
涉及的表friendapi 環(huán)信公共類
6、查詢好友列表:
首先是需要分頁查詢pagereslut
其次調(diào)用的api 需要查詢friend表 返回值含有userinfo需要userinfo的api
進(jìn)行判斷
構(gòu)造vo對象
探花卡片集合展示:
兩張表userlike recommenduser 喜歡表和推薦表
userlike 用戶和喜歡的用戶id
展示是要展示推薦表的數(shù)據(jù)根據(jù)當(dāng)前用戶id獲取對方用戶,在調(diào)取userinfoapi查詢userinfo數(shù)據(jù),最后轉(zhuǎn)換成todaybest集合
mongotemplate.aggregate
探花喜歡功能:
參數(shù)是喜歡的userid
不喜歡
地理位置查詢:
索引:2sspere
geojsonpoint ??繪制圓點 ??diatance 距離(半徑 ??cricle 圓
withspere ??查詢第一步圓覆蓋的所有點
nearquery ?query的升級版
geonear ??調(diào)用上面的升級版query查詢距離
上述四個新的東西
了解,崩了
訪客記錄:
推薦好友點進(jìn)去的時候就把瀏覽記錄記錄到visitors
查看訪問記錄:
封裝一個vo
根據(jù)當(dāng)前用戶的id和時間查詢訪問表,返回的是訪問表數(shù)據(jù)
如果不存在返回一個空集合
如果存在就構(gòu)建返回數(shù)據(jù)vo
存redis
hash
set
視頻發(fā)布:
vo aip 繼承
參數(shù)封面視頻地址String
視頻調(diào)用fastcollction fdfsweb
colction。upload(輸入流,文件個數(shù),后綴,備注
后綴根據(jù)orga獲取,submit截取
最后調(diào)用getallpath返回視頻地址
web獲取網(wǎng)絡(luò)地址
oss,之前調(diào)用的ypload方法。參數(shù)直接打點獲取
封裝video對象,掉api保存
判斷是否保存成功根據(jù)objectid判斷
api。
完善video數(shù)據(jù)pid根據(jù)idwork生成
創(chuàng)建時間
返回video的objectid
視頻集合:
pagereslut 分頁數(shù)據(jù)
page和pagesize
service層:
先判斷redis中是否有數(shù)據(jù) 可以根據(jù)字符串拼接的方法
如果有數(shù)據(jù)就先拿redis中的數(shù)據(jù)進(jìn)行分頁查詢
分頁查詢需要先把數(shù)據(jù)處理一下split根據(jù)逗號分割
獲取出的集合,放入stream流轉(zhuǎn)換
Arrays。Stream(value).skip(jfwjkf).limit(pagesize).map(e->Long.valueof(e)).collect(collection.tolist)獲取vid集合
調(diào)用videoapi查詢出來數(shù)據(jù)
如果沒有數(shù)據(jù)就查詢mongo
page??? page可以需要進(jìn)行計算 上面的redis查詢踹的數(shù)據(jù)+mongo的數(shù)據(jù)進(jìn)行拼接。
處理這種情況(如果redis中的數(shù)據(jù)只夠包含第一頁的五條數(shù)據(jù),后面的五條數(shù)據(jù)需要根據(jù)mongo查詢,但是mongo的page需要是1
??!如何讓mongo的page變1
在redis查詢后給page賦值,pageutil.totalpage(第一個參數(shù)是:redis的值的長度,第二個參數(shù)是查詢的數(shù)量就是pagesize)
后面在查詢mongo的時候知己額調(diào)用page-redis查詢后賦值的值即可
pagesize
下面就正常封裝vo對象即可
工具類獲取userid,查詢map 設(shè)置vo集合,循環(huán)video封裝vo
api:
兩個方法,根據(jù)pid列表查詢redis中歐諾個戶的cideo視頻
根據(jù)page和pagesize查詢數(shù)據(jù),沒參數(shù)直接Query quer=new Query
cacheable :先查詢緩存是否偶數(shù)據(jù),沒有數(shù)據(jù)會查數(shù)據(jù)庫,查到后吧數(shù)據(jù)存入redis,后續(xù)再來查詢的時候就直接查詢redis的數(shù)據(jù)
參數(shù):
value:可以理解為組名
key:可以調(diào)用springel表達(dá)式#id映射
cacheput :只查詢數(shù)據(jù)庫,查完把數(shù)據(jù)存入redis,但是只存不取
cachevit :清空指定緩存,一般更新的時候會用到。不然會造成數(shù)據(jù)不一致。操作完成才會清空
caching : 可以包含多個查詢,put或者evit集合
工具類:
hutu工具類
Collutil.GETVALUEFORLIST ?//根據(jù)list集合和集合中的字段和字段字節(jié)碼返回對應(yīng)的數(shù)據(jù)
Page.totalpage //分頁查詢
StringUtils.isEmpty //判斷字符穿是否為空
CollUtil.isEmpty //判斷集合是否為空
nacos配置遠(yuǎn)程調(diào)用:
一、開啟config的坐標(biāo)
二、編寫配置文件bootsrapt文件 四項內(nèi)容決定選取得nacos配置
三、編寫nacos網(wǎng)頁端數(shù)據(jù)即可
后臺登錄:
獲取驗證碼數(shù)據(jù)
解析token獲取數(shù)據(jù)
登出:
獲取用戶列表數(shù)據(jù):
延續(xù)controller service api執(zhí)行順序
調(diào)用的是db的數(shù)據(jù)庫,db數(shù)據(jù)庫返回的分頁是Ipage 查詢page數(shù)據(jù)用到的是selectpage
獲取用戶列表中用戶的基本信息:
ai之前寫過,直接在service調(diào)用即可
獲取用戶的視頻發(fā)布信息:
返回的是video數(shù)據(jù)
mongotemplate的分頁查詢
參數(shù),page,pagesie,count,list
用戶動態(tài)數(shù)據(jù)查詢:
闡述是用戶id 用戶狀態(tài) page,pagesize
返回的數(shù)據(jù)是movementvo集合
movenment包含movement數(shù)據(jù)和userinfo數(shù)據(jù)
結(jié)果是movementvo,但是沒有vo表,(忘記了細(xì)節(jié))要查詢movement數(shù)據(jù)表
query.addquery(Criteria.where******
斷頭往后
凍結(jié)功能:
time:
1、3天
2、7天
3、永久
range:范圍
1、凍結(jié)登錄
2、凍結(jié)發(fā)言
3、凍結(jié)發(fā)布動態(tài)
一凍結(jié)
拼接rediskey
設(shè)置凍結(jié)時間
如果凍結(jié)時間大于0就進(jìn)行時間限制的redis存儲
其他的就直接存儲
返回值是一個message,封裝成map
二解凍
封裝rediskey。直接刪除
三優(yōu)化之前的用戶信息
1、正常
2、凍結(jié)
封裝rediskey,判斷redis中是否有當(dāng)前key,有的話就更新數(shù)據(jù)庫中的的字段
數(shù)據(jù)統(tǒng)計:
1、調(diào)用rabbitmq存儲數(shù)據(jù)
調(diào)用listen進(jìn)行獲取
2、定時任務(wù)
開啟定時任務(wù)
cron 秒 分時 日 月 周 年
mysql查詢