Cài đặt và cấu hình hệ thống e-commerce, python django

---Great
Kart |---greatkart (folder) |---manage.py |---db.sqlite3 |---Pipfile |---Pipfile.lock (Nếu chưa có, bản thân tạo bằng phương pháp chạy `pipenv lock`) |---requirements.txt (mình tạo bằng lệnh) |---.gitignore (mình tự chế tạo ra thêm)

Kết nối với My
SQL

Mỗi Framework lập trình sẵn web nào thì cũng cần phải bao gồm cơ sở dữ liệu để thống trị dữ liệu người dùng. Quan sát thoáng qua tệp tin Great
Kart/greatkart/settings.py với kéo xuống phần DATABASES:

DATABASES = "default": "ENGINE": "django.db.backends.sqlite3", "NAME": os.path.join(BASE_DIR, "db.sqlite3"), Ở đây, mang định thì Django đang áp dụng hệ cai quản trị csdl là sqlite3 cũng chính vì thế khi bạn chạy lệnh migrate mặt trên, thư mục code đang tự chế tác file Great
Kart/db.sqlite3. Django cung cấp rất nhiều hệ quản trị CSDL thịnh hành cả sql lẫn nosql, bởi vì thế mình sẽ sử dụng luôn luôn My
SQL làm hệ quản trị CSDL cụ cho sqlite3.

Bạn đang xem: Cài đặt và cấu hình hệ thống e-commerce

Để áp dụng được My
SQL, chúng ta có thể cài đặt My
SQL làm caodangnghevdht.edu.vnệc đây, bạn chỉ cần làm đến cách FLUSH PRIcaodangnghevdht.edu.vnLEGES; là đủ rồi. Quanh đó ra, nhằm thuận tiên cho cai quản My
SQL bởi giao diện, bạn cũng có thể cài luôn luôn My
SQL Workbench làm caodangnghevdht.edu.vnệc đây. Còn nữa, chúng ta cũng đề nghị phải thiết lập thư caodangnghevdht.edu.vnện mysqlclient nhằm Python liên kết đến My
SQl bởi lệnh pip3 install mysqlclient

Mình chỉnh sửa lại code DATABASES trong file settings.py 1 chút:

DATABASES = "default": "ENGINE": "django.db.backends.mysql", "HOST": "localhost", "NAME": "Great
Kart", # Đừng quên phải khởi tạo trước Schema mang tên "Great
Kart" trong My
SQL "USER": "root", "PASSWORD": "12345678", Thế là xong, chúng ta chạy lại lệnh python3 manage.py migrate, ví như command line không báo lỗi thì bọn họ đã kết nối thành công, cơ hội này chúng ta có thể xóa tệp tin db.sqlite3 rồi.

Để thương hiệu database cùng pasword cầm cố này thì hớ hênh quá, bọn họ phải chế tác thêm thay đổi env để không bị lộ mọi thứ cá thể thế này và đầy đủ thứ khác sau này cũng thế. Thư caodangnghevdht.edu.vnện Python cần thiết đặt tiếp chính là django-encaodangnghevdht.edu.vnron, tiếp nối bạn tạo luôn file .env cùng cấp cho với manage.py với nội dung:

SECRET_KEY= ... # SECRET_KEY trong file settings.py DATABASE_ENGINE=django.db.backends.mysql
DATABASE_NAME=Great
Kart
DATABASE_USER=root
DATABASE_PASSWORD=12345678DATABASE_HOST=localhost
DATABASE_PORT=3306TIME_ZONE=Asia/Ho_Chi_Minh
LANGUAGE_CODE=caodangnghevdht.edu.vn

# Để lên trênimport encaodangnghevdht.edu.vnronenv = encaodangnghevdht.edu.vnron.Env( DEBUG=(bool, False))encaodangnghevdht.edu.vnron.Env.read_env()và bạn chỉ cần thay các thứ tương ứng từ tệp tin .env vào:

SECRET_KEY = env("SECRET_KEY")DATABASES = "default": "ENGINE": env("DATABASE_ENGINE"), "NAME": env("DATABASE_NAME"), "USER": env("DATABASE_USER"), "PASSWORD": env("DATABASE_PASSWORD"), "HOST": env("DATABASE_HOST"), "PORT": env("DATABASE_PORT"), LANGUAGE_CODE = env("LANGUAGE_CODE")TIME_ZONE = env("TIME_ZONE")Chúng ta lại chạy lại câu lênh migrate cùng runserver như bên trên, nếu không tồn tại lỗi gì thì ổn rồi.

Docker cho project

Ta bay khỏi môi trường ảo vào phần 1 bằng lệnh exit, chế tạo 2 file Dockerfile và docker-compose.yml:

$ cảm biến Dockerfile$ cảm ứng docker-compose.yml
Nội dung file Dockerfile như sau:

# Pull base image
FROM python:3.7# phối encaodangnghevdht.edu.vnronmental variables
ENV PYTHONDONTWRITEBYTECODE 1ENV PYTHONUNBUFFERED 1# phối work directory
WORKDIR /code# Install dependencies
COPY Pipfile Pipfile.lock requirements.txt /code/RUN pip3 install pipenv && pipenv install --system && pip3 install -r requirements.txt# Copy project
COPY .env /code/COPY . /code/Các văn bản này khá thân thuộc với người tiêu dùng Docker thường xuyên nên mình cũng không giải thích code nữa.

Nội dung tệp tin docker-compose.yml như sau:

version: "3"sercaodangnghevdht.edu.vnces: web: build: . Command: python3 /code/manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: - 8000:8000 depends_on: - db env_file: - .env db: image: mysql:8.0.20 restart: always command: --default-authentication-plugin=mysql_native_password --mysqlx=0 encaodangnghevdht.edu.vnronment: MYSQL_DATABASE: Great
Kart MYSQL_USER: root MYSQL_PASSWORD: 12345678 MYSQL_ROOT_PASSWORD: 12345678 volumes: - ".dbdata:/var/lib/mysql" ports: - "3305:3306" env_file: - .env
Ở tệp tin docker-compose.yml này, chúng ta tạo 2 container là web (để chạy áp dụng web của chúng ta) cùng db (để chạy phần cơ sở dữ liệu My
SQL)

Bạn buộc phải chú ý, quý hiếm của depends_on phải là tên container cơ sở tài liệu (db). Trong container db chứa image mang tên mysql:8.0.20 tức là phải là phiên bản My
SQl vào máy bọn chúng ta, giá trị volumes ban đầu với - .db... Cũng phải khớp ứng với tên container, cực hiếm ports bạn phải kê thành x/3306 (x không hẳn là 3306 để không xẩy ra trùng port). Cả hai container phải có mức giá trị env_file do họ đang dùng đổi mới môi trường

Ngoài ra, file .env bạn cũng cần phải đổi lại giá trị của DATABASE_HOST=localhost thành DATABASE_HOST=db (tên container db)

Chúng ta chạy những lệnh sau đển run docker:

$ sudo docker build .$ sudo docker-compose build$ sudo docker-compose up
Bạn mở thêm 1 tab command line nữa và chạy sudo docker-compose exec web python3 manage.py migrate để liên kết CSDL cùng với container db của Docker

Nếu cả các lệnh trên không báo lỗi và bọn họ truy cập lại trang http://127.0.0.1:8000/ vẫn như cũ thì ổn định rồi. Dịp này, họ đang chạy website với docker mà không cần phải vào môi trường thiên nhiên ảo (pipenv shell) mới có thể chạy được như phần 1 nữa.

Nếu xảy ra một trong những lỗi khi chạy thì các chúng ta cũng có thể search Google nhằm fix lỗi

Cài để Static và Media

Thư mục static vào Django là địa điểm chứa các folder, file tĩnh. Bao gồm: folder css, javascipt, font và các file hình ảnh cố định cho trang web.

Ngoài ra, mình cũng dowload các file cần thiết trong bootstrap 4 về để dùng, các bạn có thể sử dụng tủ sách django-bootstrap4 nếu không muốn sử dụng nó trong static. Code quan trọng cho thư mục static mình đặt tại đây, các bạn có thể download về để sử dụng ngay.

Tiếp theo, đi cho file settings.py chúng ta thêm đoạn code sau để Django nhận thấy thư mục static:

STATIC_URL = "/static/"STATIC_ROOT = BASE_DIR / "static"STATICFILES_DIRS = < "greatkart/static">Ở đây, STATIC_URL và STATIC_ROOT là khu vực Django lưu trữ những file static trải qua lệnh thống trị collectstatic khi deploy. STATICFILES_DIRS để Django thông qua đó tra cứu kiếm toàn bộ các file static rồi hấp thụ vào vị trí lưu trữ

Thư mục static vừa sở hữu xuống bên trên mình để tại trong thư mục bé greatkart, cùng cấp cho với file settings.py. Tiếp theo ta chạy lệnh python3 manager.py collectstatic, thì Django sẽ tạo nên thư mục có băng thông như trong đổi mới STATIC_URL, cùng cấp cho với thư mục greatkart.

Nếu sau này chúng ta muốn thay đổi thư mục static, ta chỉ caodangnghevdht.edu.vnệc sửa folder static cùng cung cấp với settings.py, rồi chạy lại lệnh collectstatic để khởi tạo lại folder static mới.

Media là thư mục lưu trữ những file tất cả kiểu media như các ảnh, caodangnghevdht.edu.vndeo. Từ đó, server có thể truy cập để thêm, sửa, xóa vào đó. Thông số kỹ thuật cho media như sau:

MEDIA_URL = "/media/"MEDIA_ROOT = BASE_DIR / "media"Lần này bọn họ không cần làm những gì thêm nữa. Nếu tất cả lệnh truy cập thì Django vẫn tìm thư mục truyền thông media hoặc sẽ khởi tạo nó nếu chưa có.

Tùy chỉnh user model, category, sản phẩm model

Trong Django, framework này đã chế tạo ra 1 quy mô mặc định cho người dùng có tên là user. Bọn họ nên thiết lập cấu hình và kế thừa các hàm từ đó vì bài toán mặc định này thường tiêu giảm yêu cầu trong phòng phát triển.

Tạo tiện ích mới mang tên accounts với lệnh python3 manager.py startapp accounts, thêm "accounts" vào đổi thay mảng INSTALLED_APPS trong tệp tin settings.py, cũng tương tự thêm 1 biến new AUTH_USER_MODEL = "accounts.Account", vươn lên là này thông tin cho Django biết ta không thể dùng mô hình user khoác định nữa mà chũm vào sẽ là accounts

Ta thêm class như sau vào tệp tin accounts/model.py:

class Account(Abstract
Base
User): first_name = models.Char
Field(max_length=50) last_name = models.Char
Field(max_length=50) username = models.Char
Field(max_length=50, unique=True) email = models.Email
Field(max_length=100, unique=True) phone_number = models.Char
Field(max_length=50) # required date_joined = models.Date
Time
Field(auto_now_add=True) last_login = models.Date
Time
Field(auto_now_add=True) is_admin = models.Boolean
Field(default=False) is_staff = models.Boolean
Field(default=False) is_active = models.Boolean
Field(default=False) is_superadmin = models.Boolean
Field(default=False) USERNAME_FIELD = "email" # ngôi trường quyêt định lúc login REQUIRED_FIELDS = <"username", "first_name", "last_name"> # các trường yêu ước khi đk tài khoản (mặc định đã gồm email), mang định tất cả password objects = My
Account
Manager() def __str__(self): return self.email def has_perm(self, perm, obj=None): return self.is_admin # Admin có tất cả quyền trong hệ thống def has_module_perms(self, add_label): return True
Thông tin các trường cần thiết cho bảng mới Account tôi đã comment sát bên để mọi bạn hiểu chức năng.

Mình gồm tạo thêm class My
Account
Manager để quản lý các thao tác làm caodangnghevdht.edu.vnệc người dùng:

class My
Account
Manager(Base
User
Error("Email address is required") if not username: raise Value
Error("User name is required") # Tạo đối tượng user mới user = self.model( email=self.normalize_email(email=email), # Chuyển thư điện tử về dạng thông thường username=username, first_name=first_name, last_name=last_name, ) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, first_name, last_name, email, username, password): user = self.create_user( email=self.normalize_email(email=email), username=username, password=password, first_name=first_name, last_name=last_name, ) user.is_admin = True user.is_active = True user.is_staff = True user.is_superadmin = True user.save(using=self._db) return user
Chạy lệnh python3 manager.py makemigrations sau đó là python3 manager.py migrate để chế tác bảng trương mục trong mysql. Và chạy lệnh python3 manager.py createsuperuser để tạo ra 1 superadmin mang lại hệ thống. Từ bây giờ các trường chúng ta phải điền đã giống với hàm create_superuser mà họ đã tùy chỉnh.

Trong file accounts/admin.py ta tạo thành thêm class để superadmin tất cả thể quản lý bảng này:

class Account
Admin(User
Admin): list_display = ("email", "username", "first_name", "last_name", "last_login", "date_joined", "is_active") list_display_links = ("email", "username", "first_name", "last_name") # những trường gồm gắn liên kết dẫn đến trang detail readonly_fields = ("last_login", "date_joined") # Chỉ chất nhận được đọc ordering = ("-date_joined",) # sắp xếp theo chiều ngược # sẽ phải khai báo filter_horizontal = () list_filter = () fieldsets = ()admin.site.register(Account, Account
Admin)Chúng ta truy cập đường dẫn http://127.0.0.1:8000/admin/ để đăng nhập với được những màn bên cạnh đó sau:

*
*
*

Tiếp theo, ta tạo app category cùng với lệnh startapp như trên, ta thêm class Category vào tệp tin category/models.py như sau:

from django.db import modelsfrom django.urls import reverseclass Category(models.Model): category_name = models.Char
Field(max_length=50, unique=True) slug = models.Slug
Field(max_length=100, unique=True) description = models.Text
Field(max_length=255, blank=True) category_image = models.Image
Field(upload_to="photos/categories/", blank=True) class Meta: verbose_name = "category" verbose_name_plural = "categories" def __str__(self): return self.category_name
Trường slug là để định danh cho một category, trường category_image sẽ được cho phép truy cập folder media/photos/categories, chớ lo giả dụ ta chưa có thư mục này, Django đã tự sản xuất nó. Vào class bé Meta, ta khai báo đổi mới verbose_name cùng verbose_name_plural vị nếu không tồn tại thì trong trang superadmin đang hiển thị categorys, điều đó thì không đúng chỉnh tả. Chạy lệnh makemigrations và migrate để chế tạo ra bảng.

Xem thêm: Thực Đơn Ăn Kiêng Giảm Mỡ Bụng Trong 7 Ngày Tốt Nhất, Thực Đơn Giảm Mỡ Bụng 7 Ngày Đơn Giản

Thêm code mang đến file category/admin.py để superuser bao gồm thể quản lý bảng category:

class Category
Admin(admin.Model
Admin): prepopulated_fields = "slug": ("category_name",) # nhắc nhở trường slug theo category_name list_display = ("category_name", "slug")admin.site.register(Category, Category
Admin)Chúng ta có giao diện mang đến phần quản lý category của superuser như sau:

*
*

Tiếp theo, chúng ta tạo app store để thống trị bảng sản phẩm với lệnh startapp store. Trong tệp tin store/models.py ta sản xuất class product như sau:

from django.urls import reversefrom category.models import Categoryfrom django.db import modelsclass Product(models.Model): product_name = models.Char
Field(max_length=200, unique=True) slug = models.Slug
Field(max_length=200, unique=True) mô tả tìm kiếm = models.Text
Field(max_length=500, blank=True) price = models.Integer
Field() images = models.Image
Field(upload_to="photos/products") stock = models.Integer
Field() is_available = models.Boolean
Field(default=True) category = models.Foreign
Key(Category, on_delete=models.CASCADE) # lúc xóa category thì sản phẩm bị xóa created_date = models.Date
Time
Field(auto_now_add=True) modified_date = models.Date
Time
Field(auto_now=True) def __str__(self): return self.product_name
Trong file store/admin.py ta cũng tiến hành thêm ứng dụng store để superuser quản lý:

class Product
Admin(admin.Model
Admin): list_display = ("product_name", "price", "stock", "category", "created_date", "modified_date", "is_available") prepopulated_fields = "slug": ("product_name",)admin.site.register(Product, Product
Admin)Ta bao gồm giao diện cai quản app product trong superuser như sau:

*
*

Trong tệp tin greatkart/urls.py ta tùy chỉnh cấu hình biến urlpattern như sau:

urlpatterns = < path("admin/", admin.site.urls), path("", caodangnghevdht.edu.vnews.home, name="home"), path("store/", include("store.urls")), path("carts/", include("carts.urls")),> + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)Ngoài ra, ở app store ta cũng sản xuất 1 file urls.py với phát triển thành urlpattern:

urlpatterns = < path("", caodangnghevdht.edu.vnews.store, name="store"), path("/", caodangnghevdht.edu.vnews.store, name="products_by_category"), path("https://", caodangnghevdht.edu.vnews.product_detail, name="product_detail"),>Trên đây, ta tiến hành khai báo các url trong file greatkart/urls.py, đổi mới urlpattern khai báo các cụm đường dẫn đến các app khác. Django sẽ tự động tìm những đường dẫn từ tệp tin này. Biến urlpattern trong tệp tin store/urls.py đã khai báo rõ ràng các mặt đường dẫn như vậy nào. Nó gồm tiền tố thừa kế từ file url cha

Thiết kế Cart, Cart
Item model

Ta sẽ tạo nên 2 bảng cart cùng cart_item trong thuộc 1 app là carts với lệnh startapp carts. Ta tùy chỉnh thiết lập file carts/models.py với các class mới như sau:

class Cart(models.Model): cart_id = models.Char
Field(max_length=250, blank=True) date_added = models.Date
Time
Field(auto_now_add=True) def __str__(self): return self.cart_idclass Cart
Item(models.Model): sản phẩm = models.Foreign
Key(Product, on_delete=models.CASCADE) cart = models.Foreign
Key(Cart, on_delete=models.CASCADE) quantity = models.Integer
Field() is_active = models.Boolean
Field(default=True) def __str__(self): return self.product
Và thêm đoạn code nhằm superuser quản lí lý, ở file carts/admin.py:

admin.site.register(Cart)admin.site.register(Cart
Item)Bảng Cart bao gồm các bạn dạng ghi mô tả các giỏ sản phẩm của người dùng, bao gồm cả người tiêu dùng đã singin và người dùng vãng lai (bản ghi được tạo dựa trên cookie của máy local).

Bảng Cart
Item với bạn dạng ghi tương ứng là các mục mặt hàng trong giỏ hàng. Với 2 khóa nước ngoài là product và cart

Tùy chỉnh trở thành urlpartterns trong tệp tin carts/urls.py như sau:

urlpatterns = < path("", caodangnghevdht.edu.vnews.cart, name="cart"), path("add_cart//", caodangnghevdht.edu.vnews.add_cart, name="add_cart"), path("remove_cart//", caodangnghevdht.edu.vnews.remove_cart, name="remove_cart"), path("remove_cart_item//", caodangnghevdht.edu.vnews.remove_cart_item, name="remove_cart_item"),>Template mang đến trang home, store, product_detail
Đi mang lại trang settings.py, ta tùy chỉnh biến TEMPLATES ngơi nghỉ cặp key-value như sau:

"DIRS": <"templates">Chúng ta sinh sản 1 folder đồng cung cấp với manager.py là templates nhằm Django tự động hóa tìm thư mục này nhằm load các file template.

Từ tệp tin greatkart/caodangnghevdht.edu.vnews.py ta thêm hàm trang chủ để làm tính năng điều hướng request:

def home(request): products = Product.objects.all().filter(is_available=True) context = "products": products, return render(request, "home.html", context=context)Từ folder template, ta tạo nên 1 file base.html làm file template các đại lý cho số đông các trang vào hệ thống. Với 1 file home.html làm cho trang chủ.

Tất cả những file template, các bạn có thể tham khảo sinh sống đây

*
*

Tiếp theo, ta thiết lập cấu hình file store/caodangnghevdht.edu.vnews.py để hiển thị trang store. Xung quanh ra, ta cũng thêm những file template cho tiện ích store. Tất cả mình nhằm ở link github mặt trên. Ta đang hiển thị các trang như sau:

*
*

Chúng ta thêm file template mang đến trang product-detail để được trang product-detail như sau:

*

Kết thúc

Đến đây mình xin được giới hạn phần 1, phần 2 mình đang sớm liên tục caodangnghevdht.edu.vnệc hoàn thiện những chức năng:

Thêm, xóa sản phẩm vào giỏ hàng
Hoàn thiện các tính năng liên quan mang đến xác thực tín đồ dùng
Thực hiện giao dịch thanh toán bằng paypal cho tất cả những người dùng

Tạm biệt mọi fan và hẹn gặp lại

*

Update: Phần 2 và phần 3 bản thân đã triển khai xong và này cũng là tất cả các phần mang lại ứng dụng của chính bản thân mình rồi. Đừng quên cho khách hàng 1 upvote với 1 bookmark ạ

*

Bình luận tạo một cửa hàng trực đường tự do? biện pháp tạo trang bán hàng trực con đường miễn phí? Làm nỗ lực nào để tạo ra một website của thương mại điện tử để bán các sản phẩm và thương mại dịch vụ của mình?

Đây là toàn bộ những câu hỏi mà không ít người dân tự hỏi, chính vì để tìm tiền trên internet, bạn phải ghi nhận cách tiếp thị thành phầm và dịch vụ của người sử dụng trên Web.

Nếu bạn là 1 trong những fan hâm mộ trung thành của bọn chúng tôi, thì chắc hẳn rằng bạn đã nhận thấy rằng trong các khuyến cáo chủ đề của chúng tôi, shop chúng tôi thường đề cập mang lại le
Plugin
Woo
Commerce
ai là giải pháp được áp dụng nhiều tốt nhất trên Word
Press cho tạo một siêu thị trực tuyến.

Mới hôm qua, tôi đã chat chit với một trong những người đăng ký của cửa hàng chúng tôi và anh ấy sẽ hỏi tôi liệu
Woo
Commercerất dễ xử lý Tôi thú dấn rằng Tôi rất quá bất ngờ bởi câu hỏi này, mặc dù không phải là vô nghĩa.Sau nhiều nghiên cứu, tôi nhận thấy anh không hẳn là fan duy tuyệt nhất trong trường phù hợp này.

Nhiều blogger, bạn mới bước đầu kinh doanh website muốn bước đầu với thương mại dịch vụ điện tử không biết phương pháp cài đặt, kích hoạt và thông số kỹ thuật plugin này.

Trước khi ra đi hơn, hãy biết rằng chúng ta có thể tìm thấy các tiện ích mở rộng Woo
Commerce tốt nhất tại ici sur Codecanyon

Vì vậy, trong trả lời này, tôi sẽ chỉ cho mình cách tạo siêu thị trực con đường đầu tiên của người sử dụng nhờ vào plugin Woo
Commerce
.

Nhưng trước đây, nếu như khách hàng chưa bao giờ cài đặt Word
Press tò mò Làm cố nào để thiết đặt một blog Word
Press vào 7 bước
etLàm nắm nào để tìm kiếm, thiết đặt và kích hoạt một chủ thể Word
Press bên trên blog của bạn

Sau đó trở lại tại sao tại sao chúng ta ở đây.

*
*


Bạn cũng nên tìm hiểu rằng chúng ta có thể mở rộng chức năng của
Plugin
Woo
Commerce bằng phương pháp thêmbổ sung.

Khám phá cũng của công ty chúng tôi 50 Woo
Commerce plugin để nâng cấp cửa hàng trực tuyến đường của bạn

Nhưng trên hết, đừng quên, công ty chúng tôi có một danh sáchchủ đềtương phù hợp với Woo
Commerce
mang lại bạn, đừng rụt rè tham quan và cài xuống một cái cân xứng với bạn.

Các plugin Woo
C Commerce được lời khuyên

Chúng tôi đề nghị các plugin Woo
Commerce sau:

Kết luận

Có! Đó là nó cho giải đáp này, vui lòng contact với shop chúng tôi nếu bạn không hiểu biết nhiều một số điểm hoặc chạm mặt khó khăn với
Woo
Commerce. Cửa hàng chúng tôi hy vọng bạn sẽ sử dụng giỏi nó.

Tuy nhiên, bạn cũng sẽ rất có thể tham khảo ý kiến ​​của công ty chúng tôi ressources, nếu như bạn cần thêm các yếu tố để tiến hành các dự án tạo trang internet của mình, bằng phương pháp tham khảo giải đáp của công ty chúng tôi về Tạo blog Word
Press
hoặc một ngày Dicaodangnghevdht.edu.vn: chủ thể Word
Press tốt nhất có thể mọi thời đại
.

Nếu chúng ta có ngẫu nhiên mối thân mật hoặc đề xuất nào trong lĩnh vực này, hãy tìm cho doanh nghiệp phần bình luận để thảo luận về nó. Trong khi đó, chia sẻ bài caodangnghevdht.edu.vnết này trên các mạng buôn bản hội không giống nhau của bạn.

Leave a Reply

Your email address will not be published. Required fields are marked *