±à¼ÍƼö: |
±¾ÆªÖ÷Òª½éÉÜÈý¿é֪ʶµã£º
node.js ,vue.js,webpackǰ¶Ë¹¤³Ì»¯ £¬Ï£Íû¶ÔÄúÄÜÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚcsdn,ÓÉ»ðÁú¹ûÈí¼þAlice±à¼ÍƼö¡£ |
|
node.js»ù±¾ÈëÃÅ
node.js½éÉÜ
node.js¿ÉÒÔÈÃjavascript³ÌÐòÔÚºó¶ËÔËÐÐÆðÀ´¡£ÎÒÃÇ֮ǰËùÊìÖªµÄjavascript¶¼ÊÇÔËÐÐÔÚǰ¶Ëä¯ÀÀÆ÷£¬ÎÒÃDZàдºÃÁËjavascript´úÂëºó£¬ÓÉä¯ÀÀÆ÷½âÊÍÖ´ÐС£¶ønode.js£¬¿ÉÒÔÈÃÎÒÃDZàдjavascript£¬È»ºóÔÚºó¶ËÔËÐÐÆðÀ´¡£ÏÖÔÚµÄjavascriptºÍjava¡¢pythonÒ»Ñù£¬¿ÉÒÔ²Ù×÷I/O¡¢²Ù×÷Êý¾Ý¿â¡¢»òÕ߯äËû¸÷Àà²Ù×÷ϵͳ×ÊÔ´¡£

ÉÏÃæÕâÕÅͼ£¬ºÍÏÂÃæµÄÕâÕÅͼºÜÏñ¡£¿ÉÒÔÈÏΪ£¬node.jsÊÇjavascriptµÄÒ»ÖÖ¿çÆ½Ì¨ÔËÐÐÔÚÖ÷»úµÄʵÏÖ¡£

»·¾³´î½¨
ÏÂÔØnode.js £¨ÔËÐл·¾³£©
https://nodejs.org/en/
ÏÂÔØVisual Studio Code£¨¿ª·¢»·¾³£©
https://code.visualstudio.com/
npm½éÉÜ
д¹ýJavaµÄͬѧӦ¸Ã¶¼ÖªµÀ£¬ÎÒÃÇÒª±àд³ÌÐòÍùÍù¶¼ÐèÒªµ¼ÈëºÜ¶àÆäËû¶îÍâµÄJAR°ü£¨¹Ù·½µÄJavaSE°üĬÈÏÌṩÁË£©¡£ÔçÆÚÔÚMaven³öÏÖ֮ǰ£¬ÎÒÃǶ¼ÊÇÐèÒªÊÖ¶¯È¥ÏÂÔØ¸÷ÖÖ¿ò¼ÜµÄJAR°ü¡£×Ô´ÓÓÐÁËMavenÖ®ºó£¬ÎÒÃDz»ÔÙÐèÒªÊÖ¶¯ÏÂÔØÁË£¬Ö±½ÓÔÚÒ»¸öPOM.XMLÎļþÖÐÒýÈëÐèÒªµÄÒÀÀµ¼´¿É¡£ÔÚnodeÖУ¬ÔËÐÐÒ»¸önode³ÌÐòÒ²»áÒÀÀµÓÚÆäËûµÄһЩģ¿é¡£µ±È»nodeÒ²»á×Ô´øÒ»Ð©»ù±¾Ä£¿é¡£Äǵ±ÎÒÃÇÐèҪʹÓÃÕâЩģ¿éµÄʱºò£¬ÎÒÃÇÐèÒª´ÓÍøÂçÉÏÏÂÔØ¡£Õâ¸öÈ¥ÍøÉÏÏÂÔØ·Ç³£Âé·³¡£node¹Ù·½ÌṩÁËÒ»¸ö¹ÜÀí¹¤¾ßnpm£¬Õâ¸ö¹¤¾ß¿ÉÒÔ¸ù¾ÝÐèÒª×Ô¶¯´Ó·þÎñÆ÷ÏÂÔØ¸÷ÖÖ°ü¡£Õâ¾ÍʡȥÁË£¬ÎÒÃÇ×Ô¼ºÈ¥ÍøÉÏÏÂÔØ°üµÄ¹ý³Ì¡£
npmÌÔ±¦¾µÏñ
¹Ù·½µÄnpmÔÚ¹úÄÚËÙ¶ÈÊDZȽÏÂýµÄ£¬¿ÉÒÔʹÓÃÌÔ±¦µÄ¾µÏñ
npm install
-g cnpm --registry=https://registry.npm.taobao.org |
°²×°Íê³Éºó£¬¾Í¿ÉÒÔʹÓÃcnpm´ÓÌÔ±¦¾µÏñÀ´ÏÂÔØ¡¢°²×°node°ü
ʹÓÃcnpm°²×°°ü
cnpm install <°üµÄÃû³Æ>
°üµÄÃû³Æ¿ÉÒÔÈ¥https://npm.taobao.org/ÉÏËÑË÷
node.jsÄ£¿é»¯³ÌÐò½á¹¹
ÿһ¸öjsÎļþ¾ÍÊÇÒ»¸öÄ£¿é£¨jsonµÈÆäʵҲ¿ÉÒÔ×÷Ϊһ¸öÄ£¿é£©£¬¶ÔÓ¦µÄ¾ÍÊÇÒ»¸ömodule¶ÔÏó¡£ÏÂÃæÕâÒ»¶Î³ÌÐò£¬±íʾ´ÓÍⲿÒýÈëÒ»¸öÄ£¿é£¬È»ºóÖ´ÐÐÄ£¿éÖеĺ¯Êý¡£
var fs = require("fs");
// ÒýÈëfsÄ£¿é
var data = fs.readFileSync('input.txt'); //
µ÷ÓÃfsÄ£¿éÖеÄreadFileSync·½·¨
console.log(data.toString()); |
µÚÒ»ÐеÄ, required±íʾÒýÈëÒ»¸ö°ü£¬·µ»ØµÄ¾ÍÊÇmodule¶ÔÏó¡£Õâ¸öfs°ü£¬ÊÇnode×Ô´øµÄ°ü£¬ÒýÈëÒ»¸ö°üºó¾Í¿ÉÒÔµ÷ÓÃÕâ¸ö°üÏµķ½·¨¡£µ«ÊǰüÖеķ½·¨²»ÊǶ¼¿ÉÒÔ±»µ÷Óõģ¬Ö»ÓÐÀàËÆ£º
exports.world
= function() {
console.log('Hello World');
} |
ÕâÑùµÄ´úÂ룬²ÅÄܱ»µ÷Ó᣸ü¼òµ¥À´Ëµ£¬ÔÚ°üÖж¨ÒåµÄº¯Êý¶¼ÊǶÔÍâ²»¿É¼ûµÄ£¬ÒªÏë±»Íⲿµ÷Óã¬ÐèҪʹÓÃexportsÀ´¶¨Ò庯Êý¡£

Õâ¸örequireº¯ÊýÓеãÀàËÆÓÚCÓïÑÔÖеÄ#include¡£ËüÊ×ÏÈ»á´ÓÎļþcache»º´æÖвéÕÒ´«ÈëµÄÄ£¿éÃû£¬Èç¹ûûÓÐÕÒµ½ÔÙ²éÕÒÔÉúÄ£¿é£¬×îºó²éÕÒÎļþÖмÓÔØ¡£
node.jsÖØÒªÄ£¿é(API)½éÉÜ
node.jsÈ«¾Ö¶ÔÏó

node.jsÔÉúÄ£¿é

ʵÏÖÒ»¸öÓû§¹ÜÀíÄ£¿é
´´½¨ÏîÄ¿
½¨Á¢Ò»¸ö¿ÕµÄÎļþ¼ÐÓÃÓÚ±£´æ¸ÃÏîÄ¿
½øÈëÃüÁîÌáʾ·û£¬Ê¹ÓÃnpm init³õʼ»¯ÏîÄ¿£¬½áÊøºó»á×Ô¶¯Éú³ÉÒ»¸öpackage.jsonÎļþ£¬Õâ¸öÎļþÖаüº¬ÁËÏîÄ¿µÄËùÓÐÒÀÀµ°ü£¬¿ÉÒÔ°ÑÕâ¸öpackage.jsonÎļþÀí½âΪÏîÄ¿Îļþ
´´½¨¿Í»§ServiceÄ£¿é
/**
* ¿Í»§Service
*/
exports.CustomerService = function() {
this.customers = [];
// Ìí¼Ó¿Í»§
this.add = function(cstm) {
this.customers.push(cstm);
}
// ¸ù¾Ý¿Í»§Ãû×ÖÒÆ³ý
this.remove = function(name) {
for(var i = 0; i < this.customers.length;
++i) {
if(this.customers[i].name === name) {
this.customers.splice(i, 1);
break;
}
}
}
// »ñÈ¡ËùÓпͻ§
this.findAll = function() {
return this.customers;
}
}
|
´´½¨Èë¿ÚÄ£¿éindex.js
var customerService
= require('./customerService');
var cm = new customerService.CustomerService();
cm.add({name: 'СÇÇ', age: 20, sex: 'Å®'});
cm.add({name: '¶þÇÇ', age: 21, sex: 'Å®'});
cm.add({name: '´óÇÇ', age: 22, sex: 'Å®'});
// ²éѯËùÓпͻ§
var cstms = cm.findAll();
console.log("---");
console.log(cstms);
// ɾ³ý¿Í»§
cm.remove("СÇÇ");
console.log("---");
console.log(cm.findAll()) |
Ö´ÐÐnode index.js
PS H:\code\nodejs\02>
node .\index.js
---
[ { name: 'СÇÇ', age: 20, sex: 'Å®' },
{ name: '¶þÇÇ', age: 21, sex: 'Å®' },
{ name: '´óÇÇ', age: 22, sex: 'Å®' } ]
---
[ { name: '¶þÇÇ', age: 21, sex: 'Å®' },
{ name: '´óÇÇ', age: 22, sex: 'Å®' } ] |
vue.js»ù±¾ÈëÃÅ
½éÉÜ
VueÊÇÒ»Ì×ǰ¶Ë¿ò¼Ü¡£ËüʵÏÖÁËǰ¶ËÒ³ÃæÊÓͼ£¨HTML/CSS£©ºÍÄ£ÐÍÊý¾ÝµÄ·ÖÀ룬¶øÇÒËüÌṩÁË¿ìËÙ¼òµ¥¹¹½¨×é¼þµÄ·½Ê½¡£ÈÃÎÒÃÇÒÔÒ»ÖÖȫеķ½Ê½À´¿ª·¢Ç°¶Ë¡£

»ù±¾±à³ÌÄ£ÐÍ£¨Ä£°å + Ä£ÐÍ£©
ʹÓÃVueÖ¸ÁÒåÄ£°å
<div id="app">
<span>
{{name}} </span>
</div> |
ʹÓÃVue¶¨ÒåÊý¾ÝÄ£ÐÍ
var app2 = new
Vue({
el: '#app',
data: { // ¶¨ÒåÄ£ÐÍÊý¾Ý
name: 'Hello, Tom!'
},
method: { // ¶¨Òå°ó¶¨Êý¾Ý·½·¨
sayHello: function() {
alert('hello!');
}
}
}) |
³£ÓÃÖ¸Áî½éÉÜ

×é¼þ»¯¿ª·¢
ÔÚǰ¶Ë¿ª·¢ÖÐÒýÈë×é¼þ»¯ÊÇÒ»¸ö´óµÄ½ø²½¡£Æäʵ£¬Èç¹ûÎÒÃÇÓùýһЩUI¿ò¼Ü¾Í»áÖªµÀ£¬´ó¶àÊýµÄUI¿ò¼Ü¶¼¶¨ÒåÁ˺ܶàµÄ×é¼þ£¬ÀýÈ磺button°´Å¥¡¢datagrid±í¸ñ×é¼þ¡¢treeÊ÷ÐÎ×é¼þ¡¢dialog¶Ô»°¿ò×é¼þµÈµÈ¡£µ«ÊÇ£¬Ö®Ç°ÎÒÃǶ¼ÊÇʹÓñðÈ˸øÎÒÃÇ¿ª·¢ºÃµÄ¿ò¼Ü¡£ÎÒÃǽñÌìҪѧϰÈçºÎʹÓÃVueÀ´¿ª·¢Ò»¸ö×Ô¼ºµÄ×é¼þ¡£½«À´£¬ÎÒÃÇ¿ÉÒÔ×Ô¼º¿ª·¢Ò»Ì××Ô¼ºµÄ×é¼þ¿â£¬È»ºóʹÓÃÕâЩ×é¼þ¿âÀ´¹¹½¨ÎÒÃǵÄǰ¶ËÓ¦ÓóÌÐò¡£
×é¼þ½á¹¹
¿ÉÒÔ°Ñ×é¼þÀí½âΪ¾ÍÊÇÒ»¸öСµÄÒ³ÃæÊÓͼ¡£Ê¹ÓÃVue¿ª·¢µÄ×é¼þÒ²·ÖΪÁ½¸ö²¿·Ö£º
ÊÓͼģ°å
ÊôÐÔ£¨Ä£ÐÍÊý¾Ý£©
ÊÓͼģ°åÒÀ¾ÉÊÇʹÓÃHTML/CSS+VueÖ¸Áµ«ÊÇÄ£ÐÍÊý¾ÝÏÖÔÚ¸ú֮ǰ²»Ì«Ò»Ñù£¬Ä£ÐÍÊý¾ÝÓ¦¸ÃÊÇʹÓÃ×é¼þµÄʱºò£¬¶¯Ì¬´«Èë½øÀ´µÄ¡£ËùÒÔ£¬Ä£ÐÍÊý¾ÝÐèÒªÏȶ¨Òå³öÀ´¡£

ʵÏÖÒ»¸ö¹ºÎï³µ³ÌÐò
<!DOCTYPE
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,
initial-scale=1.0">
<meta http-equiv="X-UA-Compatible"
content="ie=edge">
<title>¹ºÎï³µ</title>
<link rel="stylesheet" href="./bootstrap/css/bootstrap.css">
</head>
<body>
<div id="app" class="container">
<h1>¹ºÎï³µ</h1>
<hr>
<btn-grp :buttons="buttons"></btn-grp>
<btn-grp :buttons="buttons_test"></btn-grp>
<btn-grp :buttons="buttons"></btn-grp>
<btn-grp :buttons="buttons_test"></btn-grp>
<br>
<br>
<table class="table table-bordered
table-striped table-hover">
<tr>
<th>ID</th>
<th>ÉÌÆ·Ãû³Æ</th>
<th>ÉÌÆ·¼Û¸ñ</th>
<th>ÉÌÆ·ÊýÁ¿</th>
<th>ÉÌÆ·×ܼÛ</th>
</tr>
<tr v-for="(prod, index) in products">
<td>{{index+1}}</td>
<td>{{prod.name}}</td>
<td>{{prod.price}}</td>
<td>
<button @click="changeCount(prod, -1)">-</button>
<input type="text" v-model="prod.count">
<button @click="changeCount(prod, 1)">+</button>
</td>
<td>{{prod.price * prod.count}}</td>
</tr>
<tr>
<td colspan="4"
class="text-right">×ܼÛ:</td>
<td class="text-primary">{{getTotalMoney()}}</td>
</tr>
</table>
</div>
<script src="./vue.js"></script>
<script>
// ×Ô¶¨Òå×é¼þ£¬ÕâÀïʵÏÖÁËÒ»¸ö°´Å¥×é×é¼þ
Vue.component('btn-grp', {
props: ['buttons'],
template:
'<div class="btn-group"
role="group">'
+ '<button type="button" @click="btn.handler"
v-for="btn in buttons" :class="\'btn
\' + (btn.class == null || btn.class == \'\'
? \'btn-default\':btn.class)">'
+ '{{btn.title}}'
+ '</button>'
+ '</div>'
});
var app = new Vue({
el: '#app',
data: {
// °´Å¥×é¼þ²âÊÔ
buttons_test: [
{title: '²âÊÔ1', class: 'btn-danger'},{title:
'²âÊÔ2'},{title: '²âÊÔ3'},{title: '²âÊÔ4'},
],
buttons: [{
title: 'Ìí¼Ó',
class: 'btn-primary',
handler: function() {
alert('µã»÷Ìí¼Ó°´Å¥');
}
}, {
title: 'ÐÞ¸Ä',
class: 'btn-default',
handler: function() {
alert('µã»÷Ð޸İ´Å¥');
}
}, {
title: 'ɾ³ý',
class: 'btn-default',
handler: function() {
alert('µã»÷ɾ³ý°´Å¥');
}
}, ],
products: [
{
name: 'СÃ×6S',
price: 3999,
count: 1,
},
{
name: '´¸×Ó2',
price: 4999,
count: 1,
},
{
name: '»ªÎªP20',
price: 3599,
count: 1,
},
{
name: 'OPPO R15',
price: 2999,
count: 1,
},
{
name: 'OPPO R11',
price: 1999,
count: 1,
},
],
},
methods: {
// Óû§µã»÷¼Ó¼õÊýÁ¿Ê±µ÷ÓÃ
changeCount: function(prod, num)
{
if(num < 0) {
if(prod.count > 0)
{
prod.count += num;
}
}
else {
prod.count += num;
}
},
// »ñÈ¡×ܽð¶î
getTotalMoney: function() {
var totalMoney = 0.0;
for(var i = 0; i < this.products.length;
++i) {
totalMoney += parseFloat(this.products[i].price
* this.products[i].count);
}
return totalMoney;
}
}
});
</script>
</body>
</html> |
Ч¹ûͼ

ʹÓÃwebpack¹¹½¨Ç°¶Ë¹¤³Ì»¯
webpack½éÉÜ
webpackÊÇÒ»¸öǰ¶ËÏîÄ¿¹¹½¨¹¤¾ß¡£Ê¹ÓÃwebpack¿ÉÒÔ°Ñǰ¶Ëµ±³ÉÒ»¸ö¹¤³ÌÀ´¿ª·¢¡£¶øÇÒÄܹ»ºÜºÃµØ°Ñǰ¶ËµÄ¸÷Àà×ÊԴͳһ¹ÜÀí¡¢±àÒë¡¢´ò°ü¡£
ËüÊÇÒ»¸ö¡°±àÒëÆ÷¡±£¬¿ÉÒÔͨ¹ý¸÷ÖÖ²å¼þ½«»ùÓÚnode.js¡¢sass¡¢less±àд´úÂë±àÒë³ÉÄܹ»ÔËÐÐÔÚǰ¶Ëä¯ÀÀÆ÷µÄjavascript¡¢ºÍcss
ËüÊÇÒ»¸ö´ò°ü¹¤¾ß£¬¿ÉÒÔ½«ËùÓÐǰ¶ËµÄ×ÊÔ´´ò°üµ½Ò»¸öbundle.jsÖÐ
ÓÐÁËwebpack£¬ÎÒÃÇ¿ÉÒÔÏñ¿ª·¢ºó¶ËÓ¦ÓÃÒ»Ñù¿ª·¢Ç°¶Ë¡£
×ÜÌå½á¹¹Í¼

webpackÊÇ»ùÓÚnode.js¿ª·¢µÄÒ»¿îÓ¦Óã¬Æäʵwebpack¾ÍÊÇÒ»¸önode.jsµÄÄ£¿é¡£

°²×°webpack
´´½¨Ò»¸ö¿ÕµÄÎļþ¼Ð
ʹÓÃnpm init´´½¨package.json
°²×°cnpmÌÔ±¦¾µÏñ
ʹÓÃcnpm install vue-cli -gÈ«¾Ö°²×°vue-cliÄ£¿é
ʹÓÃvue init webpack cart´´½¨»ùÓÚwebpack¹ºÎï³µÏîÄ¿
ʹÓÃcnpm install bootstrap --save°²×°bootstrapÄ£¿é
¾ßÌå²½ÖèÇë²Î¿¼£ºhttps://www.webpackjs.com/guides/installation/
ʹÓÃwebpackÖØ¹¹¹ºÎï³µ³ÌÐò
ʹÓÃvue-cliÉú³ÉÏîÄ¿½ÅÊÖ¼ÜÈçÏÂͼ£º

½«ÔÀ´±àдµÄbtn-grp×é¼þµ¥¶À±àдµ½BtnGrp.vueÎļþÖÐ
¿ÉÒÔ¿´µ½ÏÖÔÚ´úÂëÇåÎúÁ˺ܶ࣬template±êÇ©²¿·Ö±àдģ°å£¬script±êÇ©²¿·Ö±àд×é¼þµÄ½»»¥´úÂ룬±àд·½Ê½ºÍÔÏÈдÔÚHTMLµÄ´úÂëÒ»ÖÂ
ÏÖÔÚÕû¸öǰ¶ËÓ¦Óö¼ÊÇ»ùÓÚ×é¼þ»¯µÄ£¬´úÂë±äµÃ¸ü¼ÓÇåÎúÁË
<template>
<div class="btn-group" role="group">
<button :key="btn.title"
type="button" @click="btn.handler"
v-for="btn in buttons"
:class="'btn ' + (btn.class == null
|| btn.class == '' ? 'btn-outline-secondary':btn.class)">
{{btn.title}}
</button>
</div>
</template>
<script>
export default {
props: ['buttons']
}
</script>
<!-- Add "scoped" attribute to
limit CSS to this component only -->
<style scoped>
</style> |
½«ÔÀ´Ð´ÔÚHTMLÖеĴúÂëÖØ¹¹µ½App.vueÖÐ
´Ë´¦ÒòΪÐèÒªÓõ½BtnGrp×é¼þ£¬ËùÒÔÐèÒªÏÈimport ×é¼þ£¬È»ºóÔÚcomponentsÖÐÒýÓøÃ×é¼þ
<template>
<div id="app" class="container">
<h1>WEBPACK + VUE ʵÏÖ¹ºÎï³µ</h1>
<BtnGrp :buttons="buttons"></BtnGrp>
<br/>
<br/>
<table class="table table-bordered
table-striped table-hover">
<tr>
<th>ID</th>
<th>ÉÌÆ·Ãû³Æ</th>
<th>ÉÌÆ·¼Û¸ñ</th>
<th>ÉÌÆ·ÊýÁ¿</th>
<th>ÉÌÆ·×ܼÛ</th>
</tr>
<tr :key="index+1" v-for="(prod,
index) in products">
<td>{{index+1}}</td>
<td>{{prod.name}}</td>
<td>{{prod.price}}</td>
<td>
<button class="btn btn-outline-info
btn-sm" @click="changeCount(prod,
-1)">-</button>
<input style="width:50px" type="text"
v-model="prod.count">
button class="btn btn-outline-info btn-sm"
@click="changeCount(prod, 1)">+</button>
</td>
<td>{{prod.price * prod.count}}</td>
</tr>
<tr>
<td colspan="4"
class="text-right">×ܼÛ:</td>
<td class="text-primary">{{getTotalMoney()}}</td>
</tr>
</table>
</div>
</template>
<script>
/* eslint-disable no-new */
import 'bootstrap/dist/css/bootstrap.min.css'
import BtnGrp from './components/BtnGrp'
export default {
name: 'App',
components: {BtnGrp},
data () {
return {
products: [
{
name: 'СÃ×6S',
price: 3999,
count: 1,
},
{
name: '´¸×Ó2',
price: 4999,
count: 1,
},
{
name: '»ªÎªP20',
price: 3599,
count: 1,
},
{
name: 'OPPO R15',
price: 2999,
count: 1,
},
{
name: 'OPPO R11',
price: 1999,
count: 1,
},
],
buttons: [{
title: 'Ìí¼Ó',
class: 'btn-outline-primary',
handler: function() {
alert('µã»÷Ìí¼Ó°´Å¥');
}
}, {
title: 'ÐÞ¸Ä',
class: 'btn-outline-primary',
handler: function() {
alert('µã»÷Ð޸İ´Å¥');
}
}, {
title: 'ɾ³ý',
class: 'btn-outline-danger',
handler: function() {
alert('µã»÷ɾ³ý°´Å¥');
}
}, ],
changeCount: function(prod, num) {
if(num < 0) {
if(prod.count > 0) {
prod.count += num;
}
}
else {
prod.count += num;
}
},
getTotalMoney: function() {
var totalMoney = 0.0;
for(var i = 0; i < this.products.length;
++i) {
totalMoney += parseFloat(this.products[i].price
* this.products[i].count);
}
?
return totalMoney;
}
}
}
}
</script>
<style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style> |
ÒòΪnpm°²×°µÄbootstrapÊÇbootstrap4£¬ËùÒÔÉÔ΢¶ÔÔÏȵÄÑùʽµ÷ÕûÁËÏ¡£×îÖÕµÄЧ¹ûͼÈçÏ£º

|