版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
目錄
1資產(chǎn)管理模塊JavaBean..................................2
2Mq生產(chǎn)者和消費(fèi)者........................................4
2.1自定義發(fā)送類................................................................4
2.2send類(producer)........................................................................................................................5
2.3監(jiān)聽類(consumer)........................................................................................................................6
3Mq的配置文件詳解........................................7
3.1連接配置...................................................................7
3.2重試策略和消息轉(zhuǎn)換器.......................................................8
3.3定義queue和交換機(jī).........................................................8
3.4監(jiān)聽器注冊(cè)和隊(duì)列配對(duì).......................................................9
4初始化開發(fā)環(huán)境(內(nèi)網(wǎng))....................................9
4.1Git拉取遠(yuǎn)程倉庫項(xiàng)目........................................................9
4.2如何修改項(xiàng)目名............................................................10
4.3Maven倉庫的修改..........................................................12
4.4注意事項(xiàng)..................................................................12
1資產(chǎn)管理模塊JavaBean
熟悉hap開發(fā)或者ssm開發(fā)的,會(huì)很熟悉,根據(jù)模塊來建包,例如資產(chǎn)管理模塊ast,其
中dto、service%mapper、controllers是典型的mvc開發(fā)模式,方便后期維護(hù)。
▼?java
▼EScom.hand.his
ito根據(jù)Mybatis對(duì)象關(guān)系映射的規(guī)則編寫dto類
▼Blast
Elcontrollersmapper一般維承Mapper〈DTO>即可
▼Eldto
QPurContractStoreHeadservice業(yè)務(wù)接口由于繼承工BaseService故可以使
QPurContractStoreLlne用框架自帶的增刪改查也行
▼EHmapper
OPurContractStoreHeadMapper
?PurContractStoreLineMapper
▼Diservice
▼aimp!
?PurContractStoreHeadServicelmpI
0PurContractStoreLineServicelmpI
?IPurContractStoreHeadService
?IPurContractStoreLineService
2發(fā)送原理:
MQ的發(fā)送消息的方式這里主要介紹topic模式
Q1
P代表消息發(fā)送者,x代表交換機(jī),Q1和Q2代表隊(duì)列,C1和C2代表消息的接收者。
消息的發(fā)送經(jīng)歷三個(gè)步驟:
第一步是發(fā)送消息時(shí)指定接收消息的交換機(jī)exchange;
2
JSONObj?ctj*on-MVJS0N0bj?ctO:
j?<?.put("data*,si):_
JSOCLput("isXeedResponse*.true)]
json.put(*reque*tldv,1001):
String*3-json.toJSGKStrincO;
Sytte*.out.println(r<..................1111;
Systra.out.println(13):
SrstM.out...............■—》.);
〃?碼〔
aASE64Encod?rba??MEncod?r-neBASEMEncoderO;
Stringencode-ba??MEncod?r.?0(0<1?(*3.getBytesCcharwtNamr
?end?r<o?pofMnta.stndMess?<?(EXCHANGE,ROUTER,encod*);
catch(Exceptione)(
假設(shè)圖中的encode就是我們要發(fā)送的消息,需要傳入的前兩個(gè)參數(shù)分別是交換機(jī)名和
routingkey,而它調(diào)用的sendMessage方法可如下圖:
■port?rt.sprintfreaevork.MQP.core.AaQpTrapHte:
or,.eprincfraBmrk.b??nt.factory,annotation.Autovired;
rtorg.?prin?frMWvor*i.ttereotyp*.Co?pon?nt;
cUttM*a>M?S?nd?rCoapon?nt?(
privateAaqpT?apl?t<??qpTtipUtt;
publicvoi4??odtttiMfe(Stringexchann.Stringrwittr,Stri?g?????)(
■Mu>T?w)let?.convertAnd$?nd(?xchann<rout”,■????<?>;
于此同時(shí)隊(duì)列已經(jīng)和交換機(jī)綁定了對(duì)應(yīng)的routingkey,于是第二步就是交換機(jī)通過
routingkey找到接收消息的queue,也就是找到隊(duì)列,從而向其發(fā)送消息;
第三部是接收者收消息,要收消息接收者只要指定監(jiān)聽的哪一個(gè)隊(duì)列,就可以從哪一個(gè)隊(duì)
列中獲取消息。
2.1Topic模式
在rabbit:bindings標(biāo)簽里pattern代表routingkey,在這里也可以用通配符*和#,*
代表一個(gè),而#號(hào)則可以代表多個(gè),例如pattern="*.test”表示可以匹配交換機(jī)名為
“1.test”和"2.test”,“3.test”等等的,而pattern="也test”則可以匹配如"1.test”,
3
“21.lesl”,“1322.lesl”等等之類的。只要在這里綁定了之后發(fā)數(shù)據(jù)其實(shí)就是
直接調(diào)用.AmqpTemplate類下的convertAndSend(exchange,router,message)方法而己,
這里的變量,前兩個(gè)要指定為配置文件里的routingkey和隊(duì)列名,后面的就是要發(fā)送的消
息。
3Mq生產(chǎn)者和消費(fèi)者
Mq發(fā)送方即producer,接收方?(監(jiān)聽方)即consumer,可以按照功能模塊進(jìn)行分模塊處理,
也可以,下面有三個(gè)包,分別為components、controllers、listnser,即消息的發(fā)送模版類、
發(fā)送、接收,可以自定義包名,一般發(fā)送和接收要分開來寫,符合開發(fā)規(guī)范。
■1java
▼KBcom.hand.hl$
components自定義message的發(fā)送工具類
?Blast
▼DirabbitMq
controllers發(fā)i]Json信息是producer
▼Bicomponents
QMessageSenderComponents
listener進(jìn)行持久化處理、異常處理
▼Bicontrollers
QMessageSenderController
▼Ellistener
QContractLineLstener
QContractListener
0MessageConfrmCallBackListener
?MessageRetuinCallBackListener
3.1自定義發(fā)送類
利用AmqpTemplate的重載方法convertAndSendO方法,進(jìn)行mq的發(fā)送,這個(gè)方法里有
三個(gè)參數(shù),分別是exchange、router>message,即交換機(jī)、routing-key^json數(shù)據(jù)串。
在不同的功能里,有需要響應(yīng)或者發(fā)送的就可以在無應(yīng)的producer類里注入該類,然后
調(diào)用sendMessageO方法即可。
4
eM-g-omp?!?j--
packagecom.hand.his.rabbitMq.components;
Himportorg.springframevork.amqp.core.AmQpTemplate:
importorg.springframework.beans,factory,annotation.Autowired;
Zimportorg.springframework,stereotype.Component;
QComponent
publicclassMessageSenderComponents{
?Autovired
privateAmqpTempla:eamQpTemplate;
publicvoidsendMessage(Stringexchange.Stringrouter.Stringmessage){
amqpTemplate.convertAndSend(exchange,router,message):
AUKRDy、JOUIIJ1
3.2send類(producer)
以下面的發(fā)送為例。
首先定義兩個(gè)常量EXCHANGE、ROUTER,即交換機(jī),routing-key。(注意:要在mq的配置
文件里配置)見下圖。
V!一交換機(jī)一>
<!~
交次機(jī):一個(gè)交換機(jī)可以娟定多個(gè)隊(duì)列,一個(gè)隊(duì)列也可以娜定到3個(gè)交決機(jī)±
如果沒有隊(duì)列蜴定到交換機(jī)上.R1發(fā)送到諼交換機(jī)上的信息則會(huì)丟失
direct模式:消息與一個(gè)特定的躋由叁完全匹配,才會(huì)晴發(fā)
topic模式:技段則轉(zhuǎn)發(fā)消息?靈活
—>
<rabblt:topic-exchangeid="ftXnaao?exchange?test"na?e=MRXngan.exchange.test**durable=Mtrue*'auto-delete='f:>
<rabbit:bindings>
<rabbit:bindingpattern^"sed*'queue,'fijjHifljj-queue_test,,/>
</rabbit:bindings>
7?ebbiI;lu/11y具
<rabbit:bindingpattern=Msod"qucuc="pinganqueuetestw/>
這個(gè)是為交換機(jī)綁定routing-key,一個(gè)交換機(jī)可以綁定多個(gè)routing-key,其中pattern屬
性就是routing-key,queue屬性就是queue。
5
package*coo.hand.his.rabbitMq.ccotroll^rs;
isport...
?Controller
Publicclass■飆出Sen如敘1以公班(
privatefinalStringEXCHVXE**pmiAn.exchange.test將exchange和router定義為?!鲆允瓜率揭?/p>
privatefinalStringROC7ER**sed>:
privateLoggerlogger?LogierFactory.r^r^wHgetClassO):
privateMtssageSenderCcapoTMntssend*rCooponents;IEA**11定義的發(fā)達(dá)關(guān)公在下用,。n-$3£。()
privateIPurContractStoreHetdServiceheadS*rvic?;一汴入業(yè)務(wù)類▼面“加長衰戍的增副改介的方法用門^override的方法
?RequestMappingCrabbitns(.send*)
requestMapplng可以方便前端Utff]或自己兩試
^ResponseBody
publicStringf9ndO(
Li$t<PurContractStoreH^id>purContractStoreHeads-headServic^.0;
fo|(inti?0;i<pur€ontractStor^<cads.siz?();j44)(
//Stringsiss?JSONCbject.toJSOSStringCpurContractStoreHeads.get(i)):
Z/JSONObJectJson0b.eet■JSOKObject.perseObJectfJSONObject.toJS(^<purContrACtStoreHeads.get(i)).toStringO):
//Strings=JsonObject.toStringO;
Stringsi-JSCAObjcct.ro/SttUpurContractStoreHeads.get(i>).toStrirgO:
s9nderCoopon?nts.serdMessag?(EXCHV?CE.ROUTER.3D;send方法體計(jì)對(duì)不同的業(yè)務(wù)需求“的
logger,info(sl):
j做是將從數(shù)據(jù)用出家的J?Q復(fù)合忖犢或Json對(duì)世法A;發(fā)送金之內(nèi)
機(jī).由到印wu。
return*HelloRabbitMq!*:
3.3監(jiān)聽類(consumer)
監(jiān)聽類要在mq配置文件里注冊(cè),監(jiān)聽類與queue有關(guān),因?yàn)楸O(jiān)聽收到的json數(shù)據(jù),會(huì)以
message的方式傳到監(jiān)聽類里,然后對(duì)其進(jìn)行處理。
<!一定義queue—>
49el-
sedurable是否持久化
51exclusive僅創(chuàng)建者可以使鹿的私有隊(duì)列,斷開后自動(dòng)■除
52auto-delete當(dāng)所有消弱建連接新開后,是苦自動(dòng)■!除隊(duì)列
53->
<rabbit:queueideMDinqaaQueuetestid"na?e=,,DloqaDqueuetest"durable:"true"auto-delete=a,falseMexclusive^"4alse,7>
注意;這里的queue和發(fā)送方定義的queue是一樣的。
一般收到j(luò)son數(shù)據(jù)以后,如果發(fā)送方對(duì)json數(shù)據(jù)進(jìn)行了加密或者編碼,則在收到j(luò)son
數(shù)據(jù)以后,要先對(duì)json數(shù)據(jù)進(jìn)行解密或者解碼,然后在對(duì)■其進(jìn)行json數(shù)據(jù)轉(zhuǎn)換。
6
?publicvoidonMessdge(MessageDtssage,Channelchannel)th-Exception(
JSONObjectj£QQffiu£Cl-null;
try(
oessage.getMessas^ocvrti?s().s?tCcntentTyp?(*appHcationjson*);將技校跑伯息更中&置為J?on:2
lotB*r.info(*c?tah7dBtssage:*?Dossag??*fr?channtl:**channel:;
Objectobj-Dassas^Ccnv9rtor.frosM?5?>£e(xws$a£Q);■將轉(zhuǎn)換或Java財(cái)象
jsonObject?JSOX.roJSttV$rrw(obj));格J―川我轉(zhuǎn)換成J/on咐效
//getdataandtransfertoJavaObject
PuiContracxSxoreHeadMad-JSOX.toJavaObJecz(JsonObject.PurConxractStoreHead.class):將Jan"W.
//reoo^'eidfieldincaseduplicateerror
bead.setPurchas?<ontr8CtHead!d(null):■&Kxd為null¥-AAH91Mlsequence
〃savetodatabaseandg6tanewid
PuKontractStoreHead{urContractStoreHead■h?adServ£ce.insertSelective:iRcqucst:null,head):a|*
lofger.debug(aReceiveaDessageparsetojson:{|*.puxContractStoreHead)
Icatch(Exceptionc)?
loftsor.Qrror(*Sca?error:*.?);
//errorSrvico.?tvoError<**.?):如果存ft鼻常信息9日定義一個(gè)“rvis
String—Body?*xx>*?>.setUessag^O:
//■aiIS*rvic*.s^ndMaiKa?ssateBody.*r^c^iv9r*?*proj*ct*.*cc*):
If(jsonObjecx!■null){
nessageSenderCoapawnTs.sendMessage(exchange:-wxchan?。",router*ropic*.JaonObJect.toJSONStrlnf()):
〃必須手動(dòng)ack才能將潸息從仄列中W抻
channel.basicAck(Dessage.o?tMessageProperties().getDeliveryTMO*&false):f動(dòng)KIMIIl
I
4Mq的配置文件詳解
4.1連接配置
這是mq配置文件的最基本和重要的配置,其中包括host:mq服務(wù)器的ip,userrame:
用戶,password:密碼,virtual-host:虛擬機(jī)。
消息確認(rèn)監(jiān)聽器;是發(fā)送方用來監(jiān)聽json數(shù)據(jù)是否發(fā)送到交換機(jī)。見下圖。
publicclassMessageConfirmCallBackListenerimplementsRabbitTemplate.ConfirmCallback{
privateLoggerlogger=LoggerFactory.getLogger(getClass());
11
(aOverride
publicvoidconfirm(CorrelationDatacorrelationData,booleanb,Strings){
if(b){
15//只確認(rèn)生產(chǎn)者消息發(fā)送成功,消費(fèi)者是否處理成功不做保證
logger.deoug("發(fā)送消息到exchange手工回應(yīng);
}else{
18//只確認(rèn)生產(chǎn)者消息發(fā)送成功,消費(fèi)者是否處理成功不做保證
logger,debug(“消息未發(fā)送到交換機(jī)”);
20)
21i>
22)
消息退回監(jiān)聽器:是發(fā)送方用來監(jiān)聽json數(shù)據(jù)是否從oxchango路由到queue。見下圖。
publicclassMessageReturnCallBackListenerimplementsRabbitTemplate.Returncallback{
privateLoggerlogger=LoggerFactory.getlogger(getClass());
11
?Override
publicvoidreturnedMessage(Messagemessage,inti,Strings,Stringsi,Strings2){
logger,debug("exchange到queue不成功,回調(diào)return..;
15,}
16
7
<context:property-placeholderlocation-"classpath:config.propertit$*/>
。一連接配置一〉
<!一消息確認(rèn)監(jiān)聽器一〉
<beanid-*confirtoCallBackListener*classec<mhand.his.rabbitMq.1.stener.MessageConfirtoCal!BackListenerV>
<:一消息退回監(jiān)聽器一》
<b^anid-rtturnCalIBackListtntr*classcom.hand.his.rabbitMQ.listtntr.MossdgeReturnCallBackListtntr*/^
<!一rabbit連接配置一〉
<rabbit:connection-factoryid-*connectionFactory*
publisher-confirms='true*
publisher-returns-*true*
host^^localhost*_RabbitMq股務(wù)器ip
username-Mfinance*
virtual-host="pa*J虛擬機(jī)叫用戶最細(xì)粒度的權(quán)限
password_*finance.001*
port**5672*/>
4.2重試策略和消息轉(zhuǎn)換器
消息轉(zhuǎn)換器,要在mq配置文件里定義,這里用的是spring整合mq的消息轉(zhuǎn)換器。
<1一■試策略一)
<b?anid**r?tryTesplat?*class**org.sprintfraserork.rttry.supp<
<properxy"beckOffPolicy*>
<be?nclass''?rg.spuntfranrrork.retry,backoff.Exp:
<propertynoi>?-'initialIntan-al-valur--5O0*/>
《propertynaue*iuitipner*value-iu.uV?
<propertynane-*a*xlnt?rval*value-*10000a/>
</bw>
</property>
</boan>
<!―消息婢展器.白格式一
<beanidJacksonSJsonMessAgcCon.crtcrclass
。一通il指定下面的adzin信息.當(dāng)拿produc.r中的“chant?粒會(huì)在rabbitnqfi務(wù)b上自動(dòng)生或
<r?bbit:ediinCCOMCXlon*factarp*co?MCti?Nctory*A
4.3定義queue和交換機(jī)
不管是發(fā)送方還是接收方,都要配置queue,發(fā)送方要配置exchange、routing-key,接
收方要配置queue,因?yàn)榘l(fā)送方和接收方配置了相同的連接配置.(見3.1),所以,mq服務(wù)器會(huì)
跟據(jù)配置文件,把發(fā)送方數(shù)據(jù)>exchange>routing-key>queue>監(jiān)聽類。
48<!―^xQueue—>
49<!-
5?durable是否持久化
51exclusive僅創(chuàng)建臺(tái)可以使用的私府隊(duì)列,斷開后自就副球
52auto-delete當(dāng)所有加重端連發(fā)新開后,是苦自動(dòng)■!除隊(duì)列
口一>
<rabbit:queueid?*DlttQan_Queue_testid"naa^^fiinoao-Queue-testMdurablerwauto-dele—“exclusive?wfalseM/>
<!一交渙機(jī)
57<!一
58交推機(jī):一個(gè)交投機(jī)可以解定S個(gè)隊(duì)列,一個(gè)隊(duì)則也可以墀定到多個(gè)交接機(jī)上
59如果沒有隊(duì)列■定到交帙機(jī)上.照發(fā)送到該交換機(jī)上的信息JN會(huì)長笑
6e
61direct模式:簿息與一個(gè)特定陲由b究至匹髭,才會(huì)找發(fā)
62topic般式:接雙則耨發(fā)消息,■艮送
63—>
<rabblt:topic-exchangeid11oAnaan.exchange,testHna?e=Holnflao.exchange.test"durable^:ueauto-delete=Mfalse">
<rabbit:bindings>
<rabbit:bindingpattern?,,sedMqueueMpAfiqafi_Queue_test,,/>
</rabbit:bindings>
</rabbit:topic-exchange〉
8
4.4監(jiān)聽器注冊(cè)和隊(duì)列配對(duì)
監(jiān)聽類,即寫在listener包里的,要在配置文件里注冊(cè),然后在設(shè)置監(jiān)聽類與隊(duì)列配對(duì)。
〈beanxdclass
〈beanidclass-
<rabbit:listener-container
connection-factory-
iwssate-converter'
acknowledte,nanual
<rabbit:listener
queues-rplnaaD-Q1
ref-*contractHea.
<rabbit:listener
queues-*pingan_qi
ref->contractLin-
</rabbit:Hsten?r-cootain?r>
5初始化開發(fā)環(huán)境(內(nèi)網(wǎng))
由于平安是內(nèi)網(wǎng)環(huán)境,很多事情沒有操作的權(quán)限,例如鏈接遠(yuǎn)程倉庫下載Jar包依賴,對(duì)
于這種情況,需要由有經(jīng)驗(yàn)的開發(fā)人員先確定好將來開發(fā)過程會(huì)使用到的依賴,避免在開發(fā)過
程中多次更新項(xiàng)目結(jié)構(gòu),減緩項(xiàng)目的實(shí)施進(jìn)度。
5.1Git拉取遠(yuǎn)程倉庫項(xiàng)目
BefdctorguildRunloohVCSlWindowHelp
springappli<otionC1nrMHktnry?Tomcat0.5.11▼A€
/VCSOperationsPopup...Alt*'
JCommit...CtrUK
/UpdateProject...CtrUT
-a-Pfo/ci...
RefreshFileStatus
手ShowLocalChangesasUMLCtrl*Alt-Shlft*D
Rt,
3CreatePatek.\+AddCtrHAIt*A
ApplyPatch...\八…、1?
ApplyPatchfiomClipboard...ShowCurrentRevision
己ShelveChanges...:Comparewithth6SameRepositoryVersion
ChectoutfromVersionControl?^omporewith...
ImportintoVersionControl?ComparewithBranch…
BrowseVCSRepository?Q)ShowHbtOfY
^ynr?與Revert...CtrkAtt?Z
ResolveConflicts...
GotoFileCtrl+Sh
PBranches-CtrkShift*'
RecentFilesCtrl+ETag...
匕MergeCharges...
NavigationBarAltStashChanges...
UnSushChanges...
Dropfilesheretoc5ResetHEAD..
Remotes.^
/ML.
ZPush...Ctrl?$hift*K
Rebme...
9
SearchEverywhereDoubleShift
Droptilesheretoopen
iicloneH
5.2如何修改項(xiàng)目名
共需5步
①在idea里右擊項(xiàng)目名選擇Refactor—>Rename
②修改項(xiàng)目pom.xml的兩處,見下圖
<?xmlversion-^*1.0*encoding--ITF-8*?>
<projectxmlns^-http:naven.apache.org/POM/4.0.0
xalns:xsia*http://www.w3.org/2001/XMLSch<
xsi:schemaLocation-*http:/xaven.apache.(
<?odelVersion>4.0.0</modelVersion>
<groupld>com.hand.hls</groupld>
<artifactId>pazg<.artifactld>
<version>l.0.O-RELE.ASE</version>
<packaging>war</packaging>
<build>
<finalName>pazg</final\ame>
〈plugins)
plugin
<groupld>org.apache,maven.plugins</groupld>
<artifactld>maven-war-plugin</ar:ifactld>
<configuration>
③重新生成war
10
nProjectStructure
4-+
Name:pazg:war
6pazg:war
ProjectSettings
pazg:warexploded
Project
Outputdirectory:D:\Projects\pazg\t.
Modules
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 特許經(jīng)營2025年審計(jì)合同協(xié)議
- 供應(yīng)商退貨入庫協(xié)議
- 跨境電商平臺(tái)物流配送合同協(xié)議
- 新疆部分學(xué)校2026屆高三上學(xué)期12月大聯(lián)考考后強(qiáng)化卷生物試卷(含答案)
- 2025年裝箱崗位面試題及答案
- 重慶基金考試攻略及答案
- 日照市二模考試題及答案
- 全崗競聘考試試卷及答案
- 醫(yī)學(xué)教育題庫考試題及答案
- 掛資質(zhì)內(nèi)部協(xié)議書
- (2025年)危重病人的觀察與護(hù)理試題及答案
- 膝關(guān)節(jié)韌帶損傷康復(fù)課件
- 船員上船前安全培訓(xùn)課件
- 高考作文標(biāo)準(zhǔn)方格紙-A4-可直接打印
- 應(yīng)急救援器材培訓(xùn)課件
- 小學(xué)美術(shù)四年級(jí)上冊(cè) 3. 周末日記 公開課比賽一等獎(jiǎng)
- 塑料制品行業(yè)財(cái)務(wù)工作年度績效報(bào)告
- 皮膚科護(hù)理中的振動(dòng)按摩在皮膚病管理中的應(yīng)用
- 20以內(nèi)進(jìn)位加法100題(精心整理6套-可打印A4)
- 腸內(nèi)營養(yǎng)考評(píng)標(biāo)準(zhǔn)終
- 項(xiàng)目全周期現(xiàn)金流管理培訓(xùn)
評(píng)論
0/150
提交評(píng)論