Tôi đang gặp sự cố khi lọc dữ liệu từ API dựa trên thông thường của họ. Vì vậy, lỗi tôi đang gặp phải là một cách ngu ngốc. Đó là
import React, { useContext } from 'react'
import { BookContext } from '../../context/books'
const Filters = [] => {
const {filters:{regularPrice, updateFilters}}= useContext[BookContext]
return [
Regular Price
all
$0 - $10
$10 - $20
Over $20
]
}
export default Filters
0 Lỗi đang hiển thị trên dòng mà tôi đang chuyển các giá trị cho bối cảnh. Tôi có thể bị mù. Tôi thực sự sẽ đánh giá cao một số trợ giúp. Cảm ơn rất nhiều.Bối cảnh sách
import React, {useState, useEffect} from 'react'
import URL from '../utilis/URL';
const BookContext = React.createContext[];
export default function BooksProvider[{ children }] {
const [data, setData] = useState[[]]
const [filters, setFilters]= useState[{
regularPrice:"",
length:""
}]
/*fetching data */
const fetchData = async [] => {
const response = await fetch[URL];
const result = await response.json[];
console.log[result]
setData[result];
};
useEffect[[]=>{
fetchData[];
},[]]
const updateFilters = e => {
const type = e.target.type;
const filter = e.target.name;
const value = e.target.value;
let filterValue;
if [type === "checkbox"] {
filterValue = e.target.checked;
} else if [type === "radio"] {
value === "all" ? [filterValue = value] : [filterValue = parseInt[value]];
} else {
filterValue = value;
}
setFilters[{ ...filters, [filter]: filterValue }];
};
/* filtering price books */
React.useLayoutEffect[[] => {
let newBooks = [...data].sort[[a, b] => a.regularPrice - b.regularPrice];
const { regularPrice } = filters;
if [regularPrice !== "all"] {
newBooks = newBooks.filter[item => {
if [regularPrice === 0] {
return item.regularPrice 10 && item.regularPrice < 20;
} else {
return item.regularPrice > 20;
}
}];
}
}, [filters, data]];
return [
{children}
];
}
export {BookContext, BooksProvider}
Bộ lọc
import React, { useContext } from 'react'
import { BookContext } from '../../context/books'
const Filters = [] => {
const {filters:{regularPrice, updateFilters}}= useContext[BookContext]
return [
Regular Price
all
$0 - $10
$10 - $20
Over $20
]
}
export default Filters
Lọc phản hồi API với các bộ lọc đầu ra cho SDK JavaScript
Temboo có thể giúp bạn giảm sự phức tạp của các phản hồi API. Chỉ cần chỉ định một hoặc nhiều bộ lọc đầu ra khi bạn gọi là CHOREO.Output Filters when you call a Choreo.
Bộ lọc đầu ra là gì?
Nó có một bộ lọc chỉ trả về dữ liệu mà bạn quan tâm!
Nhiều API trả về rất nhiều dữ liệu JSON hoặc XML phức tạp có thể khó phân tích. Chúng ta hãy xem cách chúng ta có thể sử dụng các bộ lọc đầu ra với SDK JavaScript để làm cho phản hồi API dễ làm việc hơn.
Trước khi bắt đầu
Đảm bảo rằng bạn đã trải qua hướng dẫn bắt đầu của JavaScript, sử dụng Google> Geocode> GeocodeByeAddress Choreo. Trong các bước sau, chúng tôi sẽ xây dựng theo hướng dẫn đó bằng cách thêm các bộ lọc đầu ra.
Lọc phản hồi API
1 start bằng cách chạy lại hướng dẫn bắt đầu một lần nữa, và sau đó xem bảng điều khiển. Xem phản hồi XML? Có rất nhiều dữ liệu!Start by running the Getting Started tutorial again, and then take a look at the console. See the XML response? There's a lot of data!
2 Điều gì nếu thông tin duy nhất chúng ta cần cho ứng dụng của mình là Regular Price Regular Price Regular Price
1 và một bộ sưu tập cá nhân import React, { useContext } from 'react'
import { BookContext } from '../../context/books'
const Filters = [] => {
const {filters:{regularPrice, updateFilters}}= useContext[BookContext]
return [
2 tạo nên địa chỉ đó? Giới thiệu các bộ lọc đầu ra sẽ cho phép chúng tôi chỉ trích xuất các yếu tố dữ liệu đó bằng cách chỉ thêm hai dòng mã. Thêm khối mã bên dưới trước dòng mã này: import React, { useContext } from 'react'
import { BookContext } from '../../context/books'
const Filters = [] => {
const {filters:{regularPrice, updateFilters}}= useContext[BookContext]
return [
3 Phương thức:What if the only information we need for our application is the import React, { useContext } from 'react'
import { BookContext } from '../../context/books'
const Filters = [] => {
const {filters:{regularPrice, updateFilters}}= useContext[BookContext]
return [
import React, { useContext } from 'react'
import { BookContext } from '../../context/books'
const Filters = [] => {
const {filters:{regularPrice, updateFilters}}= useContext[BookContext]
return [
Regular Price
all
$0 - $10
$10 - $20
Over $20
]
}
export default Filters
1, and a collection of individual import React, { useContext } from 'react'
import { BookContext } from '../../context/books'
const Filters = [] => {
const {filters:{regularPrice, updateFilters}}= useContext[BookContext]
return [
Regular Price
all
$0 - $10
$10 - $20
Over $20
]
}
export default Filters
2 that make up that address? Introducing Output Filters will allow us to extract only those data elements by adding just two lines of code. Add the code block below before this line of code: import React, { useContext } from 'react'
import { BookContext } from '../../context/books'
const Filters = [] => {
const {filters:{regularPrice, updateFilters}}= useContext[BookContext]
return [
Regular Price
all
$0 - $10
$10 - $20
Over $20
]
}
export default Filters
3
method:// Add an output filter to extract the full address geocodeByAddressChoreo.addOutputFilter['address', '/GeocodeResponse/result/formatted_address', 'Response']; // Add an output filter to extract the collection of address long_name components geocodeByAddressChoreo.addOutputFilter['components', '/GeocodeResponse/result/address_component/long_name', 'Response'];
Đừng cố gắng chạy mã của bạn, chúng tôi sẽ giải thích chính xác những dòng mã đó có ý nghĩa gì trước.
Chúng tôi đã làm nó như thế nào?
Trước khi hiển thị một số thủ thuật gọn gàng để truy cập các yếu tố riêng lẻ trong dữ liệu, chúng ta hãy xem cách tạo bộ lọc. Như chúng ta đã thấy ở trên, mỗi bộ lọc đầu ra được xây dựng với ba tham số, ở định dạng:
import React, { useContext } from 'react'
import { BookContext } from '../../context/books'
const Filters = [] => {
const {filters:{regularPrice, updateFilters}}= useContext[BookContext]
return [
Regular Price
all
$0 - $10
$10 - $20
Over $20
]
}
export default Filters
4Lúc đầu, nó có vẻ khó hiểu, nhưng hãy để bước qua việc tái tạo hai bộ lọc đầu ra từ đầu để hiểu những gì đang xảy ra.
Đối tượng 1A Regular Price Regular Price
5 được sử dụng để chỉ định các đầu vào sẽ được truyền cho choreo. Các bộ lọc đầu ra cũng là một loại đầu vào choreo, vì vậy chúng tôi sẽ thêm đầu vào của chúng tôi vào đối tượng import React, { useContext } from 'react'
import { BookContext } from '../../context/books'
const Filters = [] => {
const {filters:{regularPrice, updateFilters}}= useContext[BookContext]
return [
5. Để tìm tập hợp đầu vào mà chúng tôi đã sử dụng để thêm các bộ lọc đầu ra định vị địa lý, chỉ cần nhìn lại dòng sau trong mã của bạn:A import React, { useContext } from 'react'
import { BookContext } from '../../context/books'
const Filters = [] => {
const {filters:{regularPrice, updateFilters}}= useContext[BookContext]
return [
import React, { useContext } from 'react'
import { BookContext } from '../../context/books'
const Filters = [] => {
const {filters:{regularPrice, updateFilters}}= useContext[BookContext]
return [
Regular Price
all
$0 - $10
$10 - $20
Over $20
]
}
export default Filters
5 object is used to specify the inputs that will be passed to the Choreo. Output Filters are also a type of Choreo input, so we'll add our inputs to the import React, { useContext } from 'react'
import { BookContext } from '../../context/books'
const Filters = [] => {
const {filters:{regularPrice, updateFilters}}= useContext[BookContext]
return [
Regular Price
all
$0 - $10
$10 - $20
Over $20
]
}
export default Filters
5 object. To find the input set that we used to add the Geocoding Output Filters, just look back at the following line in your code:// Whitelist the geocodeByAddress Choreo var geocodeByAddressChoreo = temboo.addChoreo['jsGeocodeByAddress'];
Sau khi xác định đầu vào mà chúng tôi muốn lọc, hãy thêm
import React, { useContext } from 'react'
import { BookContext } from '../../context/books'
const Filters = [] => {
const {filters:{regularPrice, updateFilters}}= useContext[BookContext]
return [
Regular Price
all
$0 - $10
$10 - $20
Over $20
]
}
export default Filters
7 như được hiển thị bên dưới.import React, { useContext } from 'react'
import { BookContext } from '../../context/books'
const Filters = [] => {
const {filters:{regularPrice, updateFilters}}= useContext[BookContext]
return [
Regular Price
all
$0 - $10
$10 - $20
Over $20
]
}
export default Filters
82A Regular Price Regular Price
9 là bất cứ điều gì chúng ta muốn nó! Nó có thể là import React, { useContext } from 'react'
import { BookContext } from '../../context/books'
const Filters = [] => {
const {filters:{regularPrice, updateFilters}}= useContext[BookContext]
return [
// Add an output filter to extract the full address
geocodeByAddressChoreo.addOutputFilter['address', '/GeocodeResponse/result/formatted_address', 'Response'];
// Add an output filter to extract the collection of address long_name components
geocodeByAddressChoreo.addOutputFilter['components', '/GeocodeResponse/result/address_component/long_name', 'Response'];
0 hoặc // Add an output filter to extract the full address
geocodeByAddressChoreo.addOutputFilter['address', '/GeocodeResponse/result/formatted_address', 'Response'];
// Add an output filter to extract the collection of address long_name components
geocodeByAddressChoreo.addOutputFilter['components', '/GeocodeResponse/result/address_component/long_name', 'Response'];
1 hoặc // Add an output filter to extract the full address
geocodeByAddressChoreo.addOutputFilter['address', '/GeocodeResponse/result/formatted_address', 'Response'];
// Add an output filter to extract the collection of address long_name components
geocodeByAddressChoreo.addOutputFilter['components', '/GeocodeResponse/result/address_component/long_name', 'Response'];
2, miễn là mỗi bộ lọc đầu ra có một
9 số lượng hoặc chữ cái duy nhất. Đây là cách chúng tôi nói với Temboo để dán nhãn một phần thông tin kết quả khi được trả về. Trong ví dụ của chúng tôi, chúng tôi đã gọi bộ sưu tập các yếu tố địa chỉ của chúng tôi import React, { useContext } from 'react'
import { BookContext } from '../../context/books'
const Filters = [] => {
const {filters:{regularPrice, updateFilters}}= useContext[BookContext]
return [
// Add an output filter to extract the full address
geocodeByAddressChoreo.addOutputFilter['address', '/GeocodeResponse/result/formatted_address', 'Response'];
// Add an output filter to extract the collection of address long_name components
geocodeByAddressChoreo.addOutputFilter['components', '/GeocodeResponse/result/address_component/long_name', 'Response'];
4. Chúng tôi đã gọi địa chỉ đầy đủ // Add an output filter to extract the full address
geocodeByAddressChoreo.addOutputFilter['address', '/GeocodeResponse/result/formatted_address', 'Response'];
// Add an output filter to extract the collection of address long_name components
geocodeByAddressChoreo.addOutputFilter['components', '/GeocodeResponse/result/address_component/long_name', 'Response'];
5.A
import React, { useContext } from 'react'
import { BookContext } from '../../context/books'
const Filters = [] => {
const {filters:{regularPrice, updateFilters}}= useContext[BookContext]
return [
Regular Price
all
$0 - $10
$10 - $20
Over $20
]
}
export default Filters
9 is anything we
want it to be! It can be // Add an output filter to extract the full address geocodeByAddressChoreo.addOutputFilter['address', '/GeocodeResponse/result/formatted_address', 'Response']; // Add an output filter to extract the collection of address long_name components geocodeByAddressChoreo.addOutputFilter['components', '/GeocodeResponse/result/address_component/long_name', 'Response'];0 or
// Add an output filter to extract the full address geocodeByAddressChoreo.addOutputFilter['address', '/GeocodeResponse/result/formatted_address', 'Response']; // Add an output filter to extract the collection of address long_name components geocodeByAddressChoreo.addOutputFilter['components', '/GeocodeResponse/result/address_component/long_name', 'Response'];1 or
// Add an output filter to extract the full address geocodeByAddressChoreo.addOutputFilter['address', '/GeocodeResponse/result/formatted_address', 'Response']; // Add an output filter to extract the collection of address long_name components geocodeByAddressChoreo.addOutputFilter['components', '/GeocodeResponse/result/address_component/long_name', 'Response'];2, as long as each output filter has a unique
import React, { useContext } from 'react'
import { BookContext } from '../../context/books'
const Filters = [] => {
const {filters:{regularPrice, updateFilters}}= useContext[BookContext]
return [
Regular Price
all
$0 - $10
$10 - $20
Over $20
]
}
export default Filters
9 of numbers or letters. This is how we tell Temboo to label a piece of result information when it is returned. In our example, we called our collection of address elements // Add an output filter to extract the full address geocodeByAddressChoreo.addOutputFilter['address', '/GeocodeResponse/result/formatted_address', 'Response']; // Add an output filter to extract the collection of address long_name components geocodeByAddressChoreo.addOutputFilter['components', '/GeocodeResponse/result/address_component/long_name', 'Response'];4. We called the full address
// Add an output filter to extract the full address geocodeByAddressChoreo.addOutputFilter['address', '/GeocodeResponse/result/formatted_address', 'Response']; // Add an output filter to extract the collection of address long_name components geocodeByAddressChoreo.addOutputFilter['components', '/GeocodeResponse/result/address_component/long_name', 'Response'];5.
3 // Add an output filter to extract the full address
geocodeByAddressChoreo.addOutputFilter['address', '/GeocodeResponse/result/formatted_address', 'Response'];
// Add an output filter to extract the collection of address long_name components
geocodeByAddressChoreo.addOutputFilter['components', '/GeocodeResponse/result/address_component/long_name', 'Response'];
6 được sử dụng để xác định, thông qua đường dẫn XPath hoặc JSON, vị trí của [các] mục cụ thể mà bạn muốn bộ lọc đầu ra của mình quay lại. Để biết thêm giải thích sâu sắc về đường dẫn dữ liệu và kiểu dữ liệu, hãy xem hướng dẫn của chúng tôi về JSON & XML để biết các bộ lọc đầu ra. Dưới đây là các đường dẫn mà chúng tôi đã sử dụng khi chỉ định các bộ lọc đầu ra của chúng tôi trước đó.The
// Add an output filter to extract the full address geocodeByAddressChoreo.addOutputFilter['address', '/GeocodeResponse/result/formatted_address', 'Response']; // Add an output filter to extract the collection of address long_name components geocodeByAddressChoreo.addOutputFilter['components', '/GeocodeResponse/result/address_component/long_name', 'Response'];6 is used to identify, via XPath or a JSON path, the location of the particular item[s] that you want your Output Filter to return. For a more in depth explanation of data paths and data types, check out our guide on JSON & XML for Output Filters. Here are the paths that we used when specifying our Output Filters earlier.
/GeocodeResponse/result/address_component/long_name /GeocodeResponse/result/formatted_address
4the // Add an output filter to extract the full address
geocodeByAddressChoreo.addOutputFilter['address', '/GeocodeResponse/result/formatted_address', 'Response'];
// Add an output filter to extract the collection of address long_name components
geocodeByAddressChoreo.addOutputFilter['components', '/GeocodeResponse/result/address_component/long_name', 'Response'];
7 là tên của dữ liệu đầu ra choreo mà chúng tôi đang áp dụng bộ lọc đầu ra của mình. Những tên này có thể được tìm thấy trong mỗi phần đầu ra của Choreo trên trang web của chúng tôi. Trong hầu hết các trường hợp, tên đầu ra choreo có liên quan sẽ là phản hồi, như trong ảnh chụp màn hình dưới đây. Tuy nhiên, như bạn có thể thấy, chúng ta cũng có thể lấy lại vĩ độ và kinh độ trong dàn hợp xướng đặc biệt này.The
// Add an output filter to extract the full address geocodeByAddressChoreo.addOutputFilter['address', '/GeocodeResponse/result/formatted_address', 'Response']; // Add an output filter to extract the collection of address long_name components geocodeByAddressChoreo.addOutputFilter['components', '/GeocodeResponse/result/address_component/long_name', 'Response'];7 is the name of the Choreo output data that we're applying our output filter to. These names can be found in each Choreo's output section on our website. In most cases, the relevant Choreo output name will be Response, like in the screenshot below. However, as you can see we can also retrieve Latitude and Longitude in this particular Choreo.
5 Khi chúng tôi kết hợp tất cả các thông tin này, chúng tôi có hai bộ lọc đầu ra. Người ta chỉ trả về địa chỉ được định dạng đầy đủ dưới dạng chuỗi và một loại khác trả về một bộ sưu tập các phần tử tạo nên địa chỉ dưới dạng danh sách.When we combine all of this information, we have two Output Filters. One returns only the full formatted address as a string, and another returns a collection of elements that make up the address as a list.
// Add an output filter to extract the full address geocodeByAddressChoreo.addOutputFilter['address', '/GeocodeResponse/result/formatted_address', 'Response']; // Add an output filter to extract the collection of address long_name components geocodeByAddressChoreo.addOutputFilter['components', '/GeocodeResponse/result/address_component/long_name', 'Response'];
Sử dụng dữ liệu
Trước đây, chúng tôi đã in tất cả các đầu ra được lọc lại với nhau. Tuy nhiên, nó có thể thậm chí còn hữu ích hơn để truy cập từng yếu tố riêng lẻ.
Chúng tôi đã lưu ý trước đây rằng dữ liệu
// Add an output filter to extract the full address geocodeByAddressChoreo.addOutputFilter['address', '/GeocodeResponse/result/formatted_address', 'Response']; // Add an output filter to extract the collection of address long_name components geocodeByAddressChoreo.addOutputFilter['components', '/GeocodeResponse/result/address_component/long_name', 'Response'];8 là một tập hợp các yếu tố riêng lẻ tạo nên địa chỉ. Để truy cập các yếu tố đó, chúng tôi sẽ lặp lại một danh sách các yếu tố được lấy từ đối tượng
// Add an output filter to extract the full address geocodeByAddressChoreo.addOutputFilter['address', '/GeocodeResponse/result/formatted_address', 'Response']; // Add an output filter to extract the collection of address long_name components geocodeByAddressChoreo.addOutputFilter['components', '/GeocodeResponse/result/address_component/long_name', 'Response'];9 và in từng phần trên một dòng mới. Thử một lần đi:
1 Xây dựng nội dung của cuộc gọi lại // Whitelist the geocodeByAddress Choreo
var geocodeByAddressChoreo = temboo.addChoreo['jsGeocodeByAddress'];
0 với mã bên dưới:Replace the contents of the
// Whitelist the geocodeByAddress Choreo var geocodeByAddressChoreo = temboo.addChoreo['jsGeocodeByAddress'];0 callback with the code below:
for[var item in outputs['components']] console.log[outputs['components'][item]];
2Since Chỉ có một phần dữ liệu có trong bộ lọc // Add an output filter to extract the full address
geocodeByAddressChoreo.addOutputFilter['address', '/GeocodeResponse/result/formatted_address', 'Response'];
// Add an output filter to extract the collection of address long_name components
geocodeByAddressChoreo.addOutputFilter['components', '/GeocodeResponse/result/address_component/long_name', 'Response'];
5, chúng ta chỉ có thể in dữ liệu bằng phương pháp // Whitelist the geocodeByAddress Choreo
var geocodeByAddressChoreo = temboo.addChoreo['jsGeocodeByAddress'];
2. Thêm dòng sau, bên dưới vòng lặp // Whitelist the geocodeByAddress Choreo
var geocodeByAddressChoreo = temboo.addChoreo['jsGeocodeByAddress'];
3 bạn đã tạo trong bước cuối cùng:Since there is only one piece of data contained in the filter
// Add an output filter to extract the full address geocodeByAddressChoreo.addOutputFilter['address', '/GeocodeResponse/result/formatted_address', 'Response']; // Add an output filter to extract the collection of address long_name components geocodeByAddressChoreo.addOutputFilter['components', '/GeocodeResponse/result/address_component/long_name', 'Response'];5, we can simply print the data using the
// Whitelist the geocodeByAddress Choreo var geocodeByAddressChoreo = temboo.addChoreo['jsGeocodeByAddress'];2 method. Add the following line, beneath the
// Whitelist the geocodeByAddress Choreo var geocodeByAddressChoreo = temboo.addChoreo['jsGeocodeByAddress'];3 loop you created in the last step:
console.log[outputs['address']];
3 nếu bạn chạy mã và nhìn vào bảng điều khiển, bạn sẽ thấy từng phần tử riêng lẻ từ địa chỉ của chúng tôi cũng như địa chỉ được định dạng đầy đủ:If you run the code and look at the console, you'll see each of the individual elements from our address as well as the full formatted address:
Đây là mã đầy đủ
Mã hoàn chỉnh tận dụng hai bộ lọc đầu ra. Nó sẽ giống như thế này:
Mã JavaScript:
// Instantiate the client proxy with the URI of your server proxy var temboo = new TembooProxy['proxy-server.php']; // Add the geocodeByAddress Choreo var geocodeByAddressChoreo = temboo.addChoreo['jsGeocodeByAddress']; // Add inputs geocodeByAddressChoreo.setInput['Address', '104 Franklin St, New York, NY']; // Add an output filter to extract the full address geocodeByAddressChoreo.addOutputFilter['address', '/GeocodeResponse/result/formatted_address', 'Response']; // Add an output filter to extract the collection of address long_name components geocodeByAddressChoreo.addOutputFilter['components', '/GeocodeResponse/result/address_component/long_name', 'Response']; // Success callback var showResult = function[outputs, outputFilters] { // Display filtered output for[var item in outputs['components']] console.log[outputs['components'][item]]; console.log[outputs['address']]; }; // Error callback var showError = function[error] { if[error.type === 'DisallowedInput'] { alert[error.type + ' error: ' + error.inputName]; } else { alert[error.type + ' error: ' + error.message]; } console.log["Error: ", error]; }; // Run the Choreo, specifying success and error callback handlers geocodeByAddressChoreo.execute[showResult, showError];
Mã proxy:
Bây giờ bạn sẽ thấy các đầu ra riêng lẻ cho từng địa chỉ
// Add an output filter to extract the full address geocodeByAddressChoreo.addOutputFilter['address', '/GeocodeResponse/result/formatted_address', 'Response']; // Add an output filter to extract the collection of address long_name components geocodeByAddressChoreo.addOutputFilter['components', '/GeocodeResponse/result/address_component/long_name', 'Response'];8 dưới dạng danh sách và toàn bộ
// Add an output filter to extract the full address geocodeByAddressChoreo.addOutputFilter['address', '/GeocodeResponse/result/formatted_address', 'Response']; // Add an output filter to extract the collection of address long_name components geocodeByAddressChoreo.addOutputFilter['components', '/GeocodeResponse/result/address_component/long_name', 'Response'];5 dưới dạng một chuỗi được in vào bảng điều khiển.
Tiếp theo là gì?
Chúng tôi đã lọc một số dữ liệu! Bạn có thể chỉ định nhiều bộ lọc đầu ra như bạn cần cho mỗi choreo, vậy tại sao không thử thêm bộ lọc đầu ra thứ ba của riêng bạn vào ví dụ này? Nếu bạn muốn thử một cái gì đó khác biệt, bạn có thể thử lọc đầu ra từ bất kỳ choreos nào trong số hơn 2000 của chúng tôi.
Bạn muốn thử ví dụ này bằng một ngôn ngữ khác? Kiểm tra hướng dẫn này để làm việc với các ngôn ngữ proxy không phải Php.
Khi bạn đã có mã của mình và chạy, bạn đã sẵn sàng để tiếp tục và làm nhiều hơn nữa. Từ việc theo dõi các ứng dụng đang chạy của bạn, đến việc chuyển mã temo được tạo của bạn đến môi trường phát triển ưa thích của bạn và chia sẻ nó với các đồng nghiệp, cộng tác viên và bạn bè - chúng tôi đã bảo vệ bạn.
Cần giúp đỡ?
Chúng tôi luôn sẵn lòng giúp đỡ. Chỉ cần gửi email cho chúng tôi tại, và chúng tôi sẽ trả lời câu hỏi của bạn.
Mặt sau