Xây dựng mô hình dữ liệu và thiết kế CSDL

Một phần của tài liệu Phát Triển Hệ Thống Thương Mại Điện Tử: Giới thiệu hệ thống BOEC (Trang 35)

36

PHẦN 4.LẬP TRÌNH 4.1 Chạy chương trình

➢ Giao diện và các chức năng tương ứng sau khi chạy chương trình

37

38

Đăng nhập / đăng ký

39 Tìm kiếm

40

Quản lý sản phẩm

41

4.2 Mã nguồn

❖ Trong thư mục models.py

from django.db import models from django.utils import timezone import datetime

class User(models.Model):

username = models.CharField(max_length=255, blank=False, null=False) password = models.CharField(max_length=255, blank=False, null=False) iskhachhang = models.BooleanField(default=False)

is_nhanvienkho = models.BooleanField(default=False) is_nhanvienbanhang = models.BooleanField(default=False) is_admin = models.BooleanField(default=False)

class Meta:

db_table = 'User'

class Category(models.Model):

nameCategory = models.CharField(max_length=255, blank=False, null=False)

class Meta:

db_table = 'Category' def __str__(self):

return self.nameCategory class Product(models.Model):

nameProduct = models.CharField(max_length=255,blank=False, null=False) count = models.IntegerField(null=True) # số lượng tồn kho

price = models.FloatField(null=True) # giá bán của 1 sản phẩm

Category = models.ForeignKey(Category, on_delete=models.CASCADE) img = models.FileField( null=True)

class Meta:

db_table = 'Product'

order_with_respect_to = 'Category'

class InforShip(models.Model): # moi

address = models.CharField(max_length=255, blank=False, null=False) email = models.CharField(max_length=255, blank=False, null=False) phone = models.CharField(max_length=255, blank=False, null=False) name = models.CharField(max_length=140, null=False)

class Meta:

db_table = 'InforShip'

class Order(models.Model

User = models.ForeignKey(User, on_delete=models.CASCADE) # người mua

InforShip= models.ForeignKey(InforShip,on_delete=models.CASCADE

price = models.FloatField()

datetime = models.DateTimeField(auto_now=True,null=False

date = models.DateField(auto_now=True,null=True is_daduocduyet = models.BooleanField(default=False) # đang được giao hàng

is_dangduocgiao = models.BooleanField(default=False) class Meta: db_table = 'Order' order_with_respect_to = 'User' # order_with_respect_to = 'OrderDetail' order_with_respect_to = 'InforShip' class OrderDetail(models.Model):

42

count = models.IntegerField() # số lượng 1 sản phẩm mà người dùng mua

price = models.FloatField()

Order = models.ForeignKey(Order, on_delete=models.CASCADE,null=False) class Meta:

db_table = 'OrderDetail'

order_with_respect_to = 'Product' order_with_respect_to = 'Order'

❖ Trong thư mục urls.py

from django.urls import path from .import views

from .views import ( create_season, SeasonListView, ProductListView, ) app_name = "news" urlpatterns = [

# url cho trang chinh

path('',views.index, name='index'),

path('dangnhap/',views.dangnhap,name="dangnhap"), path('dangki/',views.dangki,name="dangki"),

path('dangxuat/',views.dangxuat,name="dangxuat"), path('cart/',views.cart,name="cart"),

path('updatecart/',views.updatecart,name="updatecart"),

path('deletecart/<int:idcart>',views.deletecart,name="deletecart"), path('addcart/<int:idproduct>',views.addcart, name='addcart'),

path('index/',views.index,name='index'),

path('shop_All/',views.timkiem,name="shop"),

path('shop_category/<int:idcategory>',views.shop_category,name="shop_catego ry"),

path('checkout/',views.checkout,name="checkout"), path('contact/',views.contact,name="contact"),

path('handlecheckout/',views.handlecheckout,name="handlecheckout"), path('x/',views.xoaSession,name="xoaSession"),

#url cho admin

path('dashboard/', views.dashboard, name="dashboard"),

path('create_season/', views.create_season, name='create_season'), path('season_list/', SeasonListView.as_view(), name='season_list'), path('create_product/', views.create_product, name='create_product'), path('product_list/', ProductListView.as_view(), name='product_list'), path('delete_product/<int:idproduct>',views.delete_product,

name='delete_product'),

path('update_product/<int:idproduct>',views.update_product, name='update_product'),

path('order_list/',views.order_list,name="order_list"),

path('processed_order/<int:idorder>',views.processed_order,name="processed_ order"),

43

❖ Trong thư mục forms.py

from django import forms

from .models import Season ,Product class SeasonForm(forms.ModelForm): class Meta:

model = Season

fields = ['Category','name', 'img', 'description'

widgets = {

'Category': forms.Select(attrs={'class': 'form-control', 'id':

'Category'}),

'name': forms.TextInput(attrs={'class': 'form-control', 'id':

'name'}),

'img': forms.FileInput(attrs={'class': 'form-control', 'id':

'img',}),

'description': forms.TextInput(attrs={'class': 'form-control',

'id': 'description'}) }

class ProductForm(forms.ModelForm): class Meta:

model = Product

fields = ['nameProduct','Category', 'img','price']

widgets = {

'nameProduct': forms.TextInput(attrs={'class': 'form-control',

'id': 'name'}),

'Category': forms.Select(attrs={'class': 'form-control', 'id':

'Category'}),

'img': forms.FileInput(attrs={'class': 'form-control', 'id':

'img',}),

'price': forms.TextInput(attrs={'class': 'form-control', 'id':

'price'}) }

❖ Trong thư mục views.py

from django.views.generic import ListView from django.shortcuts import render

from django.http import HttpResponse

from .models import Category, User, Product, Category, OrderDetail,InforShip,Order,Season

from django.http import HttpResponseRedirect import json

from django.core import serializers # phuc vu cho chuyen đổi đối tượng

sang json

from collections import namedtuple from json import JSONEncoder

from .forms import (

SeasonForm,

ProductForm, )

def getproductbyid(list):

all_list = [] for i in list: p = Product.objects.get(id=i)

44

db = DetailBill(count=1, Product=p, Bill=None) all_list.append(db)

return all_list def xoaSession(request):

del request.session['cartlist']

return HttpResponseRedirect('/index')

# lay danh sach san pham theo 1 danh muc

def shop_category(request, idcategory): id1 = idcategory

all_Item = Product.objects.filter(Category__id=id1) all_category = Category.objects.all()

c = {"all_Item": all_Item, "all_category": all_category} return render(request, 'news/shop.html', c)

# --- xu ly gio hang--- # them 1 san pham vao gio hang

def addcart(request, idproduct):

pr = Product.objects.get(id=idproduct)

od = OrderDetail(Product=pr, count=1, price=0)

listOrderDetail = [] # danh sach cac OrderDetail duoi sang sesio if request.session.has_key('cartlist') == False:

orderDetailJson = serializers.serialize("json", [od])

listOrderDetail.append(orderDetailJson)

request.session['cartlist'] = listOrderDetail listOrderDetail = request.session.get('cartlist')

else:

listOrderDetail = request.session.get('cartlist')

n = len(listOrderDetail) ckeck = 0

for x in range(n):

d = json.loads(json.loads(json.dumps(listOrderDetail[x]))) prId = d[0]['fields']['Product']

if prId == idproduct: # neu product đã tồn tại trong session

d[0]['fields']['count'] = d[0]['fields']['count'] + 1 listOrderDetail[x] = json.dumps(d)

ckeck = 1 break

orderDetailJson = serializers.serialize("json", [od])

if ckeck == 0:

listOrderDetail.append(orderDetailJson) request.session['cartlist'] = listOrderDetail return HttpResponseRedirect('/cart')

# xem gio hang

def cart(request):

userName = ""

if request.session.has_key('userID'):

userName = request.session.get('userName') orderDetailList = []

totalPrice = 0

if request.session.has_key('cartlist'):

cartlist = request.session.get('cartlist')

n = len(cartlist) totalPrice = 0 for x in range(n):

d = json.loads(json.loads(json.dumps(cartlist[x]))) prId = d[0]['fields']['Product']

pr = Product.objects.get(id=prId)

45

od = OrderDetail(Product=pr, count=prCount, price=pr.price * prCount)

totalPrice = totalPrice + pr.price * prCount

orderDetailList.append(od)

request.session['totalPrice'] = totalPrice

return render(request, 'news/cart.html', {"cartlist": orderDetailList,

"totalPrice": totalPrice,"userName":userName})

# cap nhat lai session khi thay doi số lượng mỗi sản phẩm cần mua def updatecart(request):

cartlist = []

if request.session.has_key('cartlist'): if request.method == "POST":

countProductList = request.POST.getlist('count')

idProductList = request.POST.getlist('idProduct')

cart = request.session.get('cartlist') listOrderDetail = []

n = len(cart) for x in range(n):

# chuyen tung phan tu ve json

d = json.loads(json.loads(json.dumps(cart[x]))) prId = d[0]['fields']['Product']

if prId == int(idProductList[x]):

d[0]['fields']['count'] = int(countProductList[x]) k = json.dumps(d) # chuyen json ve chuoi

# them vao danh sach listOrderDetail.append(k)

request.session['cartlist'] = listOrderDetail

return HttpResponseRedirect('/cart')

# xoa 1 phan tu trong cart

def deletecart(request, idcart):

print("---xoa cart ---") if request.session.has_key('cartlist'):

cart = request.session.get('cartlist') listOrderDetail = []

n = len(cart) for x in range(n):

# chuyen tung phan tu ve json

d = json.loads(json.loads(json.dumps(cart[x]))) prId = d[0]['fields']['Product']

if prId != int(idcart):

k = json.dumps(d) # chuyen json ve chuoi listOrderDetail.append(k)

request.session['cartlist'] = listOrderDetail return HttpResponseRedirect('/cart')

# tim kiem hoac shopall

def timkiem(request):

userName = ""

if request.session.has_key('userID'):

userName = request.session.get('userName') all_category = Category.objects.all() all_Item = Product.objects.all() cartlist = [] if request.method == "POST": s = request.POST['search'] if s != "":

all_Item = Product.objects.filter(nameProduct=s)

c = {"all_Item": all_Item, "all_category": all_category} return render(request, 'news/shop.html', c)

46

c = {"all_Item": all_Item, "all_category": all_category,"userName": userName}

return render(request, 'news/shop.html', c)

else:

c = {"all_Item": all_Item, "all_category": all_category,

"cartlist": cartlist,"userName": userName}

return render(request, 'news/shop.html', c)

# trang chu

def index(request):

# xoa session gio hang moi khi voa trang index userName = ""

if request.session.has_key('userID'): # lay thong tin user trong session

# userID = request.session.get('userID') userName = request.session.get('userName') all_category = Category.objects.all()

c = {"all_category": all_category, "userName" : userName} return render(request, 'news/index.html', c)

# đăng nhập / đăng ký def dangki(request): if request.method == "POST": u = request.POST['username'] p = request.POST['password'] rp = request.POST['repassword'] x = User.objects.filter(username=u) if rp == p and x.count() == 0:

a = User(username=u, password=p, iskhachhang = True) a.save()

# return HttpResponse('Dang ki thanh cong! ') return HttpResponseRedirect('/dangnhap') else:

return HttpResponse('Đã Có user này! ') else:

return render(request, 'news/RegisterForm.html') def dangnhap(request):

if request.method == "POST": u = request.POST['username'] p = request.POST['password']

x = User.objects.filter(username=u).filter(password=p) if x.exists():

b = User.objects.get(username=u) request.session['userID'] = b.id

request.session['userName'] = b.username return HttpResponseRedirect('/index') else:

return HttpResponse('Khong co user nay') else:

return render(request, 'news/LoginForm.html') def dangxuat(request):

if request.session.has_key('userID'): del request.session['userID'] del request.session['userName'] return HttpResponseRedirect('/index') def contact(request):

# hien thi thong tin nguoi dung dang nhap userName = ""

47

if request.session.has_key('userID'):

userName = request.session.get('userName') c = {"userName": userName}

return render(request, 'news/contact-us.html',c) def checkout(request):

# neu chua có cart thì ko được check out

if request.session.has_key('cartlist'):

# nếu cart trong session trống cũng ko được check out

cart = request.session.get('cartlist') if len(cart) != 0 :

# hien thi thong tin nguoi dung dang nhap userName = ""

if request.session.has_key('userID'):

userName = request.session.get('userName') c = {"userName": userName}

if request.session.has_key('userID'):

return render(request, 'news/checkout.html',c) else:

return HttpResponseRedirect('/dangnhap') else:

return HttpResponseRedirect('/cart') else :

return HttpResponseRedirect('/cart')

# xử lý sau khi người dùng nhập thông tin để giao hàng và nhấn submit def handlecheckout(request):

if request.method == "POST":

# nhan thong tin tu nguoi dung day len address = request.POST['address'] email = request.POST['email'] phone = request.POST['phone'] name = request.POST['username'] # tạo model InforShip lưu vào csdl

ifs = InforShip(address = address, email = email ,phone = phone ,

name = name )

ifs.save()

# lay id cua phan tu vua them vao idIfs = ifs.id

ifsDB = InforShip.objects.get(id=idIfs) # lấy user từ csdl về qua id

userId = request.session.get('userID') # chuoi userDB = User.objects.get(id = int(userId)) # luu order vao csdl

totalPrice = request.session.get('totalPrice')

order = Order(User = userDB, InforShip = ifsDB , price = totalPrice)

order.save()

idOrder = order.id

orderDB = Order.objects.get(id=idOrder) print("xxxxxxxxxxxxxxxxx")

print(orderDB.datetime) print(orderDB.date)

if request.session.has_key('cartlist'): cart = request.session.get('cartlist') n = len(cart)

listOrderDetail = [] for x in range(n):

# chuyen tung phan tu ve json

48

orderDetailJson = d[0]['fields'] idProduct = orderDetailJson['Product'] product = Product.objects.get(id=idProduct) count = orderDetailJson['count']

price = count * product.price

orderDetail = OrderDetail(Product = product , count = count, price = price, Order = orderDB )

orderDetail.save() # xoa session cart di

del request.session['cartlist']

return render(request, 'news/OrderSuccess.html') return render(request, 'news/index.html')

#--- Admin --- #

def dashboard(request):

order = Order.objects.all() product = Product.objects.all() context = {

'order': len(order), 'product': len(product) }

return render(request, 'store/dashboard.html',context) def create_product(request):

forms = ProductForm()

if request.method == 'POST':

forms = ProductForm(request.POST or None, request.FILES or None) print(forms)

if forms.is_valid(): forms.save()

return HttpResponseRedirect('/product_list/') #truyen vao 1 form

context = {

'form': forms }

return render(request, 'store/addProduct.html', context) class ProductListView(ListView):

model = Product

template_name = 'store/product_list.html' context_object_name = 'product'

def delete_product(request, idproduct):

Product.objects.get(pk=idproduct).delete() return HttpResponseRedirect('/product_list') def update_product(request, idproduct):

forms = ProductForm() # lay thong tin product ve

pr = Product.objects.get(id=idproduct) # update product

if request.method == 'POST':

forms = ProductForm(request.POST or None, request.FILES or None) if forms.is_valid():

#thong tin tu form gui len

pr = forms.instance # tra ve 1 object product

Product.objects.filter(pk=idproduct).update(nameProduct = pr.nameProduct ,price = pr.price ,Category = pr.Category,img = pr.img ) return HttpResponseRedirect('/product_list/')

context = { 'pr': pr, 'form': forms }

49

def order_list(request):

# xoa session gio hang moi khi voa trang index orderList = Order.objects.all()

c = {"order": orderList}

return render(request, 'store/order_list.html', c) # duyệt đơn hàng

def processed_order(request, idorder):

# cập nhật trạng thái đơn hàng đã được duyệt

Order.objects.filter(pk=idorder).update(is_daduocduyet = True ) return HttpResponseRedirect('/order_list')

# xem chi tiết đơn hàng

def detail_order(request, idorder): # lấy order về

order = Order.objects.get(id=idorder)

# lấy list order detail theo order vừa lấy về

listOrderDetail = OrderDetail.objects.filter(Order=order) c = {"order": order, "listOrderDetail": listOrderDetail} return render(request, 'store/detail_order.html', c)

50

PHẦN 5. TỐI ƯU HÓA CƠ SỞ DỮ LIỆU 5.1 Lý thuyết chương 9 cuốn sách A&D

Nội dung: Tối ưu hóa cơ sở dữ liệu

Có hai khía cạnh chính để tối ưu hóa cơ sở dữ liệu quan hệ: • Tối ưu hiệu quả lưu trữ

• Tối ưu tốc độ truy cập.

A,Tối ưu hiệu quả lưu trữ

-Là không có dữ liệu dư thừa và rất ít giá trị null.

-Trường hợp NULL cho thấy rằng không gian đang bị lãng phí, chi phí lưu trữ dữ liệu cao hơn.

-Ví dụ như bảng sau

Để thực hiện tối ưu hóa dữ liệu Edgar Codd đã đề xuất lý thuyết về 3 dạng chuẩn hóa

51 1. Dạng chuẩn 0 là chưa

chuẩn hóa.

2. Một quan hệ trong đó mỗi giá trị của thuộc tính đều ở dạng nguyên tố thì quan hệ đó đang ở dạng 1NF

3. Dạng chuẩn thứ hai (2NF) là mô hình đã ở dạng 1NF và không có thuộc tính không khóa nào phụ thuộc một phần vào thuộc tính khóa.

4. Dạng chuẩn thứ ba (3NF) là mô hình dạng 2NF và không có thuộc tính không khóa nào phụ thuộc bắc cầu vào một thuộc tính khóa.

B,Tối ưu tốc độ truy cập

-Khi dữ liệu từ nhiều bảng cần được truy cập, các bảng phải được join.

Ví dụ: Người dùng muốn in danh sách tên khách hàng được liên kết với các đơn hàng thì bảng Customer và Order cần được join dựa vào Customer ID. Khi này cả thông tin Order và Customer có thể được đưa vào đầu ra của truy vấn. Việc join có thể mất nhiều thời gian, đặc biệt nếu các bảng lớn hoặc nếu nhiều bảng có liên quan.

=> Một số kỹ thuật tăng tốc độ truy cập: Không chuẩn hóa (Denormalization), Phân cụm (Clustering) và Lập chỉ mục (Indexing).

Không chuẩn hóa (Denormalization)

- Bỏ qua các lý thuyết về 1NF,2NF,3NF, Denormalization cho phép bảng có thông tin thừa từ các bảng khác qua đó không cần truy vấn đền bảng khác để lấy thông tin thêm. -Ví dụCustomer Last Name đã được thêm lại vào bảng Order. Giờ thì hệ thống bây giờ chỉ cần truy cập vào bảng Order để lấy họ khách hàng.

52

Clustering

Nếu các bản ghi sắp xếp không theo thứ tự cụ thể thì khi truy vấn đều dẫn đến việc quét bảng.

Để giảm số lần phương tiện lưu trữ cần được truy cập, có thể tập hợp các bản ghi lại về mặt vật lý để các bản ghi tương tự được lưu trữ gần nhau như theo thứ tự, theo khóa chính. Do đó, khi truy vấn tìm kiếm các bản ghi, có thể trực tiếp đến đúng vị trí trên đĩa (hoặc phương tiện lưu trữ).

Indexing

-Chỉ mục là tập hợp các giá trị từ một hoặc nhiều cột trong bảng và vị trí của các giá trị đó.

VD: Một truy vấn tìm kiếm khách hàng sử dụng AMEX có thể sử dụng chỉ mục này để tìm vị trí của các bản ghi có American Express làm loại thanh toán mà không cần quét toàn bộ bảng Order.

54

5.2 Data model và các bước tối ưu 5.2.1 Data model tối ưu 5.2.1 Data model tối ưu

5.2.2 Tối ưu

-Nhận thấy trong data model ban đầu được sinh ra từ sơ đồ lớp thì 3 thực thể book, electronic và clothes bị gộp lại thành product, như vậy sẽ cần nhiều không gian để lưu trữ dữ liệu hơn. Vì vậy cần tách bảng product thành 3 bảng nhỏ hơn là book, electronic và clothes.

55

PHẦN 6. PHÂN TÍCH Ý KIẾN VÀ HÀNH VI KHÁCH HÀNG 6.1 Social Maketing ?

6.1.1 Giới thiệu chung

Social Maketing được hiểu là các hoạt động tiếp thị trên các trang mạng xã hội. Ví dụ như Facebook, Zalo, Instagram, Twitter, Youtube, Pinterest.

Mục đích của các hoạt động Social Marketing là nhằm thu hút sự chú ý, tương tác của người dùng về dịch vụ. Để từ đó thúc đẩy hành vi mua hàng thông qua mạng xã hội của người dùng.

6.1.2 Vì sao doanh nghiệp cần hoạt động social marketing

Nếu như đã biết Social Marketing thì chắc các bạn đã hiểu lý do cần sử dụng. Hiện nay, số lượng người dùng các trang mạng xã hội đang ngày không ngừng tăng lên. Theo một thống kê gần đây nhất, số người đăng ký dùng Facebook là hơn 3.3 tỷ người và Youtuber là khoảng 500 triệu.

Không chỉ bùng nổ về số lượng mà thời lượng người dùng sử dụng các trang mạng xã hội mỗi ngày cũng rất lớn. Ước chừng trung bình mỗi người Việt dùng khoảng 20 phút mỗi ngày để lướt Facebook, Instagram, xem Youtube,…

Sự bùng nổ của các kênh xã hội cũng như thói quen sử dụng của người dùng đã tạo nên một mảnh đất màu mỡ để các doanh nghiệp phát triển. Nếu hiểu rõ Social Marketing và biết cách tiếp cận, doanh nghiệp sẽ thật dễ dàng để bán được hàng và thu lợi nhuận.

Hoạt động Social Marketing ra đời cũng chính xuất phát từ vấn đề này. Chúng hỗ trợ doanh nghiệp tìm kiếm và tiếp cận khách hàng tiềm năng trên các trang mạng xã hội. Nếu hiểu Social Marketing và có một chiến dịch Social Marketing chất lượng sẽ đem đến cho doanh nghiệp thực sự rất nhiều điều.

6.1.3 Các loại hình Social Media Marketing

Có 6 loại phương tiện truyền thông xã hội phổ biến dưới đây:

• Social Networks (Mạng xã hội) Facebook, LinkedIn, MySpace, và Twitter. Là dịch vụ cho phép bạn kết nối với những người khác về quyền lợi và nền tảng tương tự .

• Bookmarking Sites: Delicious, Faves, StumbleUpon, BlogMarks và Diigo. Là các trang web đánh dấu trang, dịch vụ cho phép bạn lưu, tổ chức và quản lý các liên kết đến các trang web khác nhau và các nguồn lực trên internet

56

• Social News: (Tin tức xã hội) Digg, Sphinn, Newsvine: đọc tin, vote hoặc comment. Là dịch vụ cho phép mọi người gửi các tin tức khác nhau hoặc liên kết đến các bài viết bên ngoài và sau đó cho phép nó sử dụng để " bỏ phiếu " vào các mục

• Media Sharing: Flickr, Snapfish, YouTube: tạo, chia sẽ hình ảnh, video. Là các dịch vụ cho phép bạn tải lên và chia sẻ phương tiện truyền thông khác nhau như hình ảnh và video.

• Microblogging - Các dịch vụ mà tập trung vào cập nhật ngắn được đẩy ra cho bất cứ ai đăng ký để nhận được các bản cập nhật . Phổ biến nhất là Twitter .

• Comments Blog và Forum - Diễn đàn trực tuyến cho phép các thành viên tổ chức các cuộc hội thoại bằng cách gửi tin nhắn.

6.1.4 Các đặc điểm của Social Media Marketing

Social Media Marketing là cách tuyệt vời để doanh nghiệp gia tăng nhận thức về thương hiệu đến với khách hàng

Social Media Marketing có thể là 1 "cái bẫy" khổng lồ, bởi nó có thể tiêu tốn rất nhiều tiền cho việc hiển thị và kết nội cộng đồng cùng tham gia với các chiến dịch Marketing Hiệu quả của Social Media Marketing thường được tích luỹ theo thời gian, đây là những hoạt động tương tác đa chiều dựa trên các đặc điểm, nguyên tắc: Sự tham gia của cộng đồng, tính kết nối giữa các thành viên tham gia và sự tương

Nếu thiếu những kỹ năng cũng như kiến thức để xây dựng và vận hành các chiến dịch Social Media Marketing sẽ tiêu tốn những khoản tiền không nhỏ

6.1.5 Một chiến dịch Social Marketing hiệu quả sẽ có các đặc điểm sau đây:

Mục tiêu rõ ràng (Targeted): Là mục tiêu chính của bạn để nâng cao nhận thức

Một phần của tài liệu Phát Triển Hệ Thống Thương Mại Điện Tử: Giới thiệu hệ thống BOEC (Trang 35)

Tải bản đầy đủ (PDF)

(80 trang)