鍩轰簬 Dojo toolkit 瀹炵幇 web2.0 鐨?MVC 妯″紡

鍓嶈█

MVC 妯″紡鏄璁℃ā寮忎腑鐨勭粡鍏告ā寮忥紝瀹冨彲浠ユ湁鏁堢殑鍒嗙鏁版嵁灞傦紝灞曠ず灞傦紝鍜屼笟鍔¢€昏緫灞傘€俉eb2.0 鎶€鏈敱浜庡叾鑹ソ鐨勭敤鎴蜂綋楠岃骞挎硾搴旂敤浜?WEB 搴旂敤鐨勫睍绀哄眰銆備絾鏄湪浼犵粺鐨?web 寮€鍙戜腑锛屽睍绀哄眰鐨勫拰涓氬姟閫昏緫灞備唬鐮佸ぇ閲忚€﹀悎锛屼娇寰楀簲鐢ㄧ殑鍙墿灞曟€т弗閲嶉檷浣庯紝鍚屾椂椤甸潰灞備唬鐮佺殑鍙鐢ㄦ€т篃寰堜綆銆傛湰鏂囩敤瀹炰緥浠嬬粛锛屽浣曚娇鐢?dojo toolkit 鎵╁睍 dojo 鐨勯〉闈㈡帶浠跺苟瀹炵幇 MVC 妯″紡锛屾湁鏁堢殑鍒嗙浜嗗睍绀哄眰涓庝笟鍔¢€昏緫灞傜殑浠g爜锛屽悓鏃朵娇寰楀睍绀哄眰浠g爜鍙鐢ㄦ€уぇ澶ф彁楂樸€?/p> 绗竴閮ㄥ垎锛欴ojo 鏋勯€?MVC 涓庝紶缁?MVC 妯″紡鐨勫尯鍒?/h2> 浼犵粺鐨?MVC 妯″紡

MVC 妯″紡鏄?Model-View-Controller"鐨勭缉鍐欙紝涓枃缈昏瘧涓?妯″紡 - 瑙嗗浘 - 鎺у埗鍣?銆?鍩轰簬 MVC 妯″紡鐨勭▼寮忎竴鑸兘鏄敱 Controller, View, Model 杩欎笁涓儴鍒嗙粍鎴愩€侰ontroller 鍦ㄥ簲鐢ㄧ▼寮忎腑涓昏鎺ュ彈鐢ㄦ埛瑙﹀彂鐨勪簨浠?(Event)锛岀劧鍚?Controller 鏍规嵁浜嬪厛瀹氫箟濂界殑涓氬姟閫昏緫鍘绘洿鏂?Model. 鍦?Model 鏇存柊涔嬪悗锛孧odel 浼氶€氱煡 (notify) 宸叉敞鍐屽埌璇ユā鍨嬬殑瑙嗗浘锛坴iew锛夎繘琛屽埛鏂?(refresh) 鎿嶄綔锛屾渶鍚庣▼寮忓皢鍒锋柊鍚庣殑瑙嗗浘灞曠ず缁欑敤鎴枫€?/p> Model 鐨勫樊鍒細

浼犵粺鐨?MVC 妯″紡鐨?model 鏄竴涓?javabean锛屽娓呭崟涓夈€傝€屽湪 DOJO 鏋勯€犵殑 MVC 褰撲腑锛宮odel 鏄竴涓?json 鐨勬暟鎹粨鏋勶紝灏佽瀹岋紝杩斿洖鐨勬暟鎹粨鏋勫舰寮忓涓嬶細

1
2
{鈥渂ooks鈥?[{鈥渂ookName:The art of programming鈥?鈥漰rice:90鈥潁,
{鈥渂ookName:MVC introduction鈥?鈥漰rice:90鈥潁]}



鏁版嵁娴佸悜鐨勪笉鍚岋細

鍦ㄤ紶缁熺殑 MVC 妯″紡涓紝鏁版嵁鐨勮幏寰楄繃绋嬪涓嬶細

JSP 鈥?Servlet 鈥?Service 鈥?DAO 鈥?JavaBean 鈥? 鏁版嵁搴?/p>

鎴栬€?/p>

JSP 鈥?Servlet 鈥? DAO 鈥?JavaBean 鈥? 鏁版嵁搴?/p>

鑰屽湪 web2.0 鐨?MVC 妯″紡涓紝鏁版嵁鐨勪紶杈撻€斿緞濡備笅锛?/p>

JSP 鈥?Javascript 鈥?Servlet 鈥?Service 鈥?DAO 鈥?JavaBean 鈥? 鏁版嵁搴?/p>

鎴栬€?/p>

JSP 鈥?Javascript 鈥?Servlet 鈥? DAO 鈥?JavaBean 鈥? 鏁版嵁搴?/p>

姣斿鍦?DOJO 涓紝鐢ㄦ埛鍦?JSP 椤甸潰鍙戝嚭鏁版嵁璇锋眰鍚庯紝浼氬厛鎻愪氦缁?DOJO 鐨?Widget 鐨?Javascript 鍑芥暟鍋氬鐞嗭紝杩欎釜 widget 璋冪敤鐩稿簲鐨?servlet锛岀敱 servlet 灏嗗彇鍒扮殑鏁版嵁杞崲鎴?javascript 鑳藉璇嗗埆鐨?Json 鏁版嵁缁撴瀯锛岀劧鍚庤繖涓?widget 鏍规嵁鑷繁鐨勫埛鏂拌鍒欙紝灏嗘暟鎹~鍏?widget 鐨?html template 涓紝鏄剧ず缁欑敤鎴枫€?/p> Servlet 鎺у埗灞傜殑宸埆

姝f槸鍥犱负鏁版嵁娴佸悜鐨勫尯鍒紝瀵艰嚧浜嗕紶缁熺殑 MVC 鐨勬帶鍒跺眰涓?web2.0 鐨勬帶鍒跺眰鏈変簡寰堝ぇ鍖哄埆锛屽鏋滆浼犵粺 MVC 鐨勬帶鍒跺眰鏄?servlet 鐨勮瘽锛岄偅涔堝湪 web2.0 涓紝杩欎釜鎺у埗鐨勮鑹插凡缁忓紑濮嬬敱 servlet 杞Щ鍒颁簡 javascript 涓€?/p>

鍦ㄤ紶缁熺殑 MVC 妯″紡涓紝servlet 璐熻矗鍙栨暟鎹拰灏佽鏁版嵁锛屾湁鏃跺€欎篃浼氬寘鎷竴浜涘埛鏂伴〉闈㈡暟鎹殑浠g爜娈碉紝鑰?jsp 璐熻矗瑙f瀽鏁版嵁锛屽~鍏呮暟鎹拰鏄剧ず鏁版嵁銆傝€冭檻鍒?JSP 浠庡箍涔変笂鏉ヨ涔熸槸涓€涓?servlet锛屾墍浠?servlet 灏卞寘鍚簡浠庡彇鏁版嵁銆佸皝瑁呮暟鎹€佽В鏋愭暟鎹€佸~鍏呮暟鎹拰鏄剧ず鏁版嵁鐨勪竴鏉¢緳鏈嶅姟銆?/p>

鑰屽湪 web2.0 涓紝servlet 浠嶇劧璐熻矗鍙栨暟鎹拰灏佽鏁版嵁锛屼絾鏄В鏋愭暟鎹€佸~鍏呮暟鎹拰鏄剧ず鏁版嵁宸茬粡涓嶅啀鐢?JSP 鏉ュ畬鎴愶紝瑙f瀽鏁版嵁鍜屽~鍏呮暟鎹兘鏄湪 javascript 涓畬鎴愩€傚湪 dojo 涓礋璐hВ鏋愭暟鎹拰濉厖鏁版嵁鐨勫氨鏄?widget銆傞偅涔堜粈涔堟槸 dojo 鐨?widget 鍛紵

浠€涔堟槸 dojo 鐨?widget 锛?/p>

Dojo 鐨?widget 鐢变笁閮ㄥ垎鏋勬垚锛屽嵆锛?/p>

鏁版嵁鎺у埗灞傦紝涓€鑸槸 javascript 缂栧啓鐨勪竴涓璞★紝瀹冩槸 dojo widget 鐨勬牳蹇冿紝瑙f瀽鏁版嵁鍜屽~鍏呮暟鎹兘鏄湪杩欓噷闈㈠畬鎴愶紝鍚屾椂杩樺彲浠ュ寘鍚笌杩欎釜 widget 鐩稿叧鐨勪竴浜涘姛鑳藉嚱鏁帮紝姣斿闅愯棌杩欎釜 widget锛屽垹闄よ繖涓?widget 绛夌瓑銆?/p>

鏁版嵁鏄剧ず灞傦紝涓€鑸槸鐢?HTML 缂栧啓鐨勬ā鏉挎枃浠讹紝瀹冩彁渚涘熀鏈殑 Widget HTML 瑙嗗浘銆?/p>

Css 鏍峰紡鏂囦欢锛屽畾涔夋爣绛剧殑鏍峰紡锛屽湪 js 浠g爜鎴栬€?HTML 妯℃澘鏂囦欢涓娇鐢ㄣ€?/p> View 鏄剧ず灞傜殑宸埆

浠庝笂闈㈢殑 dojo widget 鐨勫畾涔夊彲浠ョ湅鍑猴紝浼犵粺鐨?MVC 涓?web2.0 涔熸槸鏈夊緢澶у尯鍒殑锛屾瘮濡傚湪 dojo 涓紝view 涓嶅湪鏄竴涓?jsp 椤甸潰锛岃€屾槸鐢?dojo widget 瀹氫箟鐨?template锛屾棦鐢?html 浠g爜缂栧啓鐨勭壒娈婃ā鏉裤€?/p>

Dojo 鐨?widget 鐢变笁閮ㄥ垎鏋勬垚锛屽嵆锛?/p>

鏁版嵁鎺у埗灞傦紝涓€涓槸 javascript 缂栧啓鐨勪竴涓璞★紝瀹冩槸 dojo widget 鐨勬牳蹇冿紝瑙f瀽鏁版嵁鍜屽~鍏呮暟鎹兘鏄湪杩欓噷闈㈠畬鎴愶紝鍚屾椂杩樺彲浠ュ寘鍚笌杩欎釜 widget 鐩稿叧鐨勪竴浜涘姛鑳藉嚱鏁帮紝姣斿闅愯棌杩欎釜 widget锛屽垹闄よ繖涓?widget 绛夌瓑銆?/p>

椤甸潰鏄剧ず灞傦紙template锛夛紝鏄敱 HTML 缂栧啓鐨勬ā鏉挎枃浠讹紝瀹冩彁渚涘熀鏈殑 Widget HTML 瑙嗗浘銆?/p>

CSS 鏍峰紡鏂囦欢锛屽畾涔夋爣绛剧殑鏍峰紡锛屽湪 js 浠g爜鎴栬€?HTML 妯℃澘鏂囦欢涓娇鐢ㄣ€?/p> 绗簩閮ㄥ垎 鎶借薄 dojo widget 鐨勫叡鎬э紝瀹炵幇鍙鐢ㄧ殑 MVC

鍦ㄤ笂涓€绔犱腑锛屾垜浠垪涓句簡涓€涓?dojo 鐨?widget 鐗规€э紝閭d箞鎴戜滑鏄惁鍙互瀵?widget 鍦ㄨ繘涓€姝ョ殑鎻愬彇鍑哄叡鎬э紝鎻愰珮 widget 鐨勫彲澶嶇敤鎬э紝绛旀鏄偗瀹氱殑銆?/p> 鍥?1. dojo 瀹炵幇 mvc


浣跨敤 dojo 瀹炵幇 mvc

浣跨敤 widget 浣滀负灞曠ず灞傜殑锛屽彲浠ュ緢濂界殑灏嗛〉闈㈠厓绱犲緢濂界殑灏佽鍜岄噸鐢ㄣ€備絾鏄湪 web 搴旂敤寮€鍙戜腑椤甸潰灞曠ず灞傚線寰€闇€瑕佸拰鏈嶅姟鍣ㄧ鐨勬暟鎹繘琛屼氦浜掞紝鍦?web2.0 鎶€鏈殑鏀彺涓嬶紝鎴戜滑鍙互浣跨敤 ajax 灏嗛〉闈㈠厓绱犵殑鏀瑰彉鍙嶅簲鐨勬湇鍔″櫒绔繘琛屽鐞嗭紝鐒跺悗灏嗚繑鍥炵粨鏋滈€氳繃鍦ㄩ〉闈腑棰勫厛瀹氫箟鐨勫洖璋冨嚱鏁拌繘琛屾€у睍绀恒€傜劧鍚庡ぇ閲忕殑鍥炶皟鍑芥暟灏嗕細鐮村潖灞曠ず灞傜殑鑹ソ鐨勫皝瑁呫€備娇寰椾唬鐮佹櫐娑╅毦鎳傘€傚洜姝ゆ垜浠渶瑕佸湪 web2.0 搴旂敤涓疄鐜?MVC 妯″紡锛屽皢妯″瀷鏀瑰彉锛屼互鍙婅鍥剧殑鑷姩鍒锋柊杩涜灏佽锛屽凡鍙栧緱鏇村ソ鐨勫鐢ㄦ€с€?/p> 娓呭崟 11. VIEW.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if (!dojo._hasResource["taas._base.View"]) {
dojo._hasResource["taas._base.View"] = true;
dojo.require("dijit._Widget");
dojo.require("dijit._Templated");
dojo.provide("taas._base.View");
dojo.declare("taas._base.View",null,{
_model:null,
_taasSrcPath:dojo.moduleUrl("taas",""),
responseObject:null,
refresh:function(object){
this.responseObject = object;
if(this.updateView!=undefinedtypeof this.updateView=="function"){
this.updateView(this.responseObject);
}
},
_bindModel:function(dataModel){
this._model = dataModel;
}
});
}



娓呭崟涓殑绋嬪簭 瀹氫箟浜嗘娊璞$殑 view. 鍏朵腑 _model 涓轰负鎶借薄 view 鎵€鍏宠仈鐨勬暟鎹ā鍨嬨€?/p>

bindModel 鏂规硶灏嗚鍥句笌鏁版嵁妯″瀷杩涜鍏宠仈銆俁efresh 鏂规硶鎻愪緵褰撴ā鍨嬫敼鍙樻椂锛屾ā鍨嬪彲浠ヨ皟鐢ㄧ殑鐢ㄤ簬鍒锋柊瑙嗗浘鐨勬柟娉曘€傚湪 Refresh 鍑芥暟涓垽鏂槸鍚﹀瓨鍦?updateView 鍑芥暟濡傛灉瀛樺湪灏辫皟鐢ㄨ鍑芥暟銆倁pdateView 鍑芥暟鐢ㄤ簬鐢ㄤ簬鑷畾涔夌殑瑙嗗浘濡備綍杩涜鍒锋柊銆?/p> 娓呭崟 12. MODEL.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
if (!dojo._hasResource["taas._base.DataModel"]) {
dojo._hasResource["taas._base.DataModel"] = true;
dojo.provide("taas._base.DataModel");
dojo.declare("taas._base.DataModel",null,{
_views:null,
uri:null,
constructor : function(uri){
this._views = new Array();
this.uri = uri;
},
registerView:function(view){
view.bindModel(this);
this._views.push(view);
},
unRegisterView : function (view){
var i = this._views.indexOf(view);
if(i 0)
this._views.slice(i,1);
},
notifyViews : function (json){
for(var i = 0; i this._views.len >h; i++)
{
this._views[i].refresh(json);
}
}
});
}



娓呭崟涓唬鐮佷负鎶借薄鐨?model. 瀹冧娇鐢ㄤ簡 registerView,unRegisterView notifyViews 鏉ヨ繘琛屼笌瑙嗗浘鐨勯€氫俊銆俽egisterView 鍑芥暟鍙互璁?model 缁戝畾涓€涓鍥撅紝unRegisterView 鍑芥暟鍙互璁?model 瑙g粦瀹氫竴涓鍥撅紝notifyViews 鍑芥暟锛岀敤浜庨€氱煡璇ユā鍨嬫墍缁戝畾鐨勬墍鏈夎鍥捐繘琛屽埛鏂般€?/p> 娓呭崟 13. Controller.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
if (!dojo._hasResource["taas._base.Controller2"]) {
dojo._hasResource["taas._base.Controller2"] = true;
dojo.provide("taas._base.Controller2");
dojo.declare("taas._base.Controller2",null,{
});
taas._base.Controller2.remoteUpdate = function (dataModelUri,topic,formId){
dojo.info("taas._base.Controller2 deprecated, use taas._base.Controller instead, 1.0")
_topic = topic;
_dataModelUri = dataModelUri;
_formId = formId;
_form = dojo.byId(_formId);
var doResponse = function (responseText){
dojo.publish(_topic,[responseText]);
};
dojo.xhrGet({
url: _dataModelUri,
preventCache: true,
form:_form,
handleAs: "text",
method:"get",
load: doResponse
});
}
}



娓呭崟涓殑浠g爜涓?Controller 绫伙紝涓昏璐熻矗涓庢湇鍔″櫒绔殑 servlet 閫氫俊銆傝幏鍙栨湇鍔″櫒绔殑鏁版嵁鏇存柊锛屽苟灏嗘洿鏂板悗鐨勬暟鎹€氱煡鍒伴〉闈㈡ā鍨嬪眰銆?/p>

浣?widget 缁ф壙 view. 寰堢畝鍗曪紝鍙渶瑕佸湪 declare 涓敵鏄庤 widget 缁ф壙涓?view 灏卞彲浠ヤ簡銆?/p> 娓呭崟 15. updateView.

1
2
3
taas.layout.LinkPane.prototype.updateView = function(json) {
alert(鈥渢his view has been updated鈥?;
}



娓呭崟涓殑浠g爜瀹炵幇浜嗚嚜瀹氫箟鐨勮鍥惧埛鏂拌鍒?updateView锛岃鍑芥暟琚姩鎬佺粦瀹氬埌 LinkPane widget 瀵硅薄涓€?/p> 娓呭崟 16. ProjectList 妯″瀷 .

1
2
3
4
5
function ProjectList(uri) {
this.uri = uri;
}
ProjectList.prototype = new taas._base.DataModel(this.uri);
Var projectListModel = new ProjectList(鈥渉ttp://localhost:8080/servlet/ProjectManagement鈥?



娓呭崟涓殑浠g爜浠?DataModel 鎶借薄瀵硅薄涓淳鐢熷嚭 ProjectList 瀵硅薄妯″瀷浠ヤ緵 LinkPane 浣跨敤銆?/p> 娓呭崟 17. 妯″瀷涓庤鍥剧粦瀹?.

1
2
var myLinkPane = new taas.layout.LinkPane({},鈥漧inkpane01鈥?.
projectListModel.registerView(myLinkPane);



娓呭崟 18. controller 涓庤繙绋?servlet 閫氫俊 .
1
2
3
4
input type="button"
onclick="taas._base.Controller.remoteUpdate(ProjectListModel,
{ 鈥榓ction鈥?: 鈥榣istall鈥?})"
/input



娓呭崟涓唬鐮佸亣璁炬垜浠湪椤甸潰涓娇鐢ㄤ簡涓€涓?button锛宐utton 鐨?onclick 浜嬩欢璋冪敤 controller 鐨?remoteUpdate 鏂规硶涓?Model 涓搴旂殑 servlet 閫氳銆?/p>

鍥?2 绋嬪簭鎵ц杩囩▼銆係equence 鍥俱€?/p> 绗笁閮ㄥ垎 浣跨敤 dojo 鐨?subscribe 鍜?publish 鏂瑰紡绠€鍖栦唬鐮?/h3>

鐢变簬 dojo1.2 鐗堟湰宸茬粡鎻愪緵 subscribe/publish 娑堟伅閫氱煡鏈哄埗锛屾墍浠ュ彲浠ュ皢 model 涓?view 鐨勫叧绯讳娇鐢?subscribe/publish 鏈哄埗鏉ョ畝鍖栥€傜畝鍖栧悗 model 琚?subscribe/publish 鏈哄埗涓殑 topic 浠f浛 .

涓嬮潰涓虹畝鍖栧悗鐨勪唬鐮併€?/p> 娓呭崟 19. 淇敼鍚庣殑 VIEW.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
if (!dojo._hasResource["taas._base.View"]) {
dojo._hasResource["taas._base.View"] = true;
dojo.require("dijit._Widget");
dojo.require("dijit._Templated");
dojo.provide("taas._base.View");
dojo.declare("taas._base.View",null,{
_model:null,
topic:"",
_taasSrcPath:dojo.moduleUrl("taas",""),
responseObject:null,
refresh:function(object){
this.responseObject = object;
if(this.updateView!=undefinedtypeof this.updateView=="function"){
this.updateView(this.responseObject);
}
},
bindModel:function(dataModel){
this._model = dataModel;
},
_bindTopic:function(){
if(this.topic!=undefinedthis.topic!=""){
dojo.subscribe(this.topic,this,"refresh");
}
}
});
}



娓呭崟 21. 淇敼鍚庣殑 Controller.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
if (!dojo._hasResource["taas._base.Controller"]) {
dojo._hasResource["taas._base.Controller"] = true;
dojo.provide("taas._base.Controller");
dojo.declare("taas._base.Controller",null,{
});
taas._base.Controller.remoteUpdate = function (dataModelUri,topic,requestContent){
_topic = topic;
_dataModelUri = dataModelUri;
_requestContent = requestContent;
console.debug(_requestContent);
var doResponse = function (responseText){
dojo.forEach(_topic,function(item){
var jsonObj = dojo.fromJson(responseText)[item];
//console.debug(dojo.toJson(jsonObj));
dojo.publish(item,[dojo.toJson(jsonObj)]);
});
};
var getFormJson = function() {
dojo.xhrGet({
url: _dataModelUri,
preventCache: true,
content:_requestContent,
handleAs: "text",
method:"get",
load: doResponse
});
};
var getFromForm = function() {
dojo.xhrGet({
url: _dataModelUri,
preventCache: true,
form:_requestContent,
handleAs: "text",
method:"get",
load: doResponse
});
};
var doRequest = function () {
if(dojo.isObject(_requestContent)) {
getFormJson();
}
else if(dojo.isString(_requestContent)){
getFromForm();
}
};
doRequest();
}
}



濡備綍浣跨敤
1
2
3
4
5
input type="button"
onclick=鈥榯aas._base.Controller.remoteUpdate (
鈥榟ttp://localhost:8080/servlet/ProjectManagement 鈥?, ["projects"], {
鈥榓ction鈥?: 鈥榪uerybyuserid鈥?/code>
});鈥?/code>



娓呭崟涓唬鐮佷腑 onclick 灞炴€ц皟鐢ㄤ簡 Controller 鐨?remoteUpdate 鏂规硶锛岃鏂规硶灏嗚皟鐢ㄨ繙绋?servlet 鐨?doGet/doPost 鏂规硶锛屽苟灏嗙浉搴旂殑璇锋眰鍙傛暟鍙戠粰杩滅▼ servlet銆傝繙绋?servlet 鏀跺埌璇锋眰鍚庤繘琛岀浉搴旂殑涓氬姟閫昏緫澶勭悊锛屾渶鍚庡皢澶勭悊缁撴灉杩斿洖鍒?controller 鐨勫洖璋冨嚱鏁版墽琛屼粠鑰屽埛鏂拌鍥俱€?/p> 缁撴潫璇?/h2>

浣跨敤 web2.0 鐨?MVC 妯″紡锛屼娇鎴戜滑鑳芥洿鍔犲叧浜庝笌涓氬姟閫昏緫鐨勫疄鐜帮紝鑰屼笉鐢ㄧ籂缂犱笌鏈嶅姟鍣ㄧ鏁版嵁妯″瀷涓?web 椤甸潰鐨勫睍绀哄浣曞悓姝ャ€?/p>
鐩稿叧涓婚

鍩轰簬 Dojo toolkit 瀹炵幇 web2.0 鐨?MVC 妯″紡

鏍囩锛?a href='http://www.mamicode.com/so/1/dex' title='dex'>dex鎵╁睍涔熶細webpadtcoane鏂瑰紡eve

鍘熸枃鍦板潃锛歨ttp://www.cnblogs.com/chenyanlong/p/7285073.html


最新回复(0)
/jishusHc56_2B3DEE0b3BILLvcTMM311hovNU7zRdAXdg_3D_3D4719165
8 简首页