! . . Album Hình . . !

Tìm kiếm Những Gì Bạn Thích !

5 tháng 9, 2025

Git cherry pick PR to another branch

 In main branch

We already merged PR 2677 into the releases/Sprint-50 branch, We want to cherry pick this PR to the main branch.

Follows steps:

Open CMD(PowerShell) and parse the commands belows

$mergeCommit = git log origin/releases/Sprint-50 --merges --oneline | Select-String "#2677" | ForEach-Object { ($_ -split ' ')[0] }

git checkout -b pr-2677-to-main

git cherry-pick -m 1 $mergeCommit

git add.

git commit -m "cherry pick PR 2677 into main branch"

git push origin pr-2677-to-main

Open git and create new PR from pr-2677-to-main to main

26 tháng 8, 2025

How to write unit test for EF.Functions.ILike

 public async Task<List<CategoryMapping>> SearchAdvantage(GetCategoryMappingRequest request)

{

    using var uow = GetUow();

    var repo = GetRepository(uow);

    var query = repo.GetQueryable();

    if (!string.IsNullOrEmpty(request.Keyword))

    {

        var keyword = $"%{request.Keyword}%";


        query = query.Where(c =>

           EF.Functions.ILike(c.Title, keyword) ||

            (c.Parent != null && EF.Functions.ILike(c.Parent.Title, keyword))

        );

    }


    query = query.OrderBy(d => d.Title);

    return await query.ToListAsync();

}


1. Add the NuGet packages

dotnet add package Testcontainers.PostgreSql

dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL

dotnet add package Microsoft.EntityFrameworkCore

dotnet add package Microsoft.EntityFrameworkCore.Design

dotnet add package xunit

dotnet add package Moq



2. Setup the test class

using Xunit;

using Microsoft.EntityFrameworkCore;

using Testcontainers.PostgreSql;

using System;

using System.Threading.Tasks;

using System.Collections.Generic;

using System.Linq;

public class CategoryMappingServiceAdvantageTests : IAsyncLifetime

{

    private PostgreSqlContainer _postgresContainer;

    private AdminPortalDBContext _context;

    private CategoryMappingService _service;


    public async Task InitializeAsync()

    {

        // Start a PostgreSQL test container

        _postgresContainer = new PostgreSqlBuilder()

            .WithDatabase("testdb")

            .WithUsername("postgres")

            .WithPassword("postgres")

            .Build();


        await _postgresContainer.StartAsync();


        // Setup DbContext with Npgsql

        var options = new DbContextOptionsBuilder<AdminPortalDBContext>()

            .UseNpgsql(_postgresContainer.GetConnectionString())

            .Options;


        _context = new AdminPortalDBContext(options);

        await _context.Database.EnsureCreatedAsync();


        // Seed test data

        var parent = new CategoryMapping { Id = Guid.NewGuid(), Title = "Electronics" };

        var child = new CategoryMapping { Id = Guid.NewGuid(), Title = "Phone", Parent = parent };


        _context.CategoryMappings.AddRange(parent, child);

        await _context.SaveChangesAsync();


        // Setup service with factory/delegate

        Func<IUnitOfWorkServiceFactory, IUnitOfWorkService> uowResolver =

            factory => factory.GetAdminPortalUowService();


        var uowFactoryMock = new Moq.Mock<IUnitOfWorkServiceFactory>();

        uowFactoryMock.Setup(f => f.GetAdminPortalUowService())

                      .Returns(new UnitOfWorkService(_context));


        _service = new CategoryMappingService(uowFactoryMock.Object, uowResolver);

    }


    public async Task DisposeAsync()

    {

        await _postgresContainer.StopAsync();

        _context.Dispose();

    }


    [Fact]

    public async Task SearchAdvantage_ShouldReturnResult_WhenKeywordMatchesParentTitle()

    {

        // Arrange

        var request = new GetCategoryMappingRequest { Keyword = "Electronics" };


        // Act

        var results = await _service.SearchAdvantage(request);


        // Assert

        Assert.True(results.Count >= 2);

        Assert.Contains(results, d => d.Title == "Phone");

    }


    [Fact]

    public async Task SearchAdvantage_ShouldReturnResult_WhenKeywordMatchesTitle()

    {

        // Arrange

        var request = new GetCategoryMappingRequest { Keyword = "Phone" };


        // Act

        var results = await _service.SearchAdvantage(request);


        // Assert

        Assert.Single(results);

        Assert.Equal("Phone", results.First().Title);

    }

}


20 tháng 1, 2025

Regex group name

input: -155'-10 5/16"

Regex pattern

--------------------------

(-?\d+)'(?:-(\d+)(?:\s(\d+)\/(\d+))?")?

Match match = Regex.Match(input, pattern);

match.Groups[0].Value

Regex pattern with group name (synctax ?<groupName>)


--------------------------

(?<feet>-?\d+)'(?:-(?<inches>\d+)(?:\s(?<fraction>\d+)\/(?<denominator>\d+))?")?

Match match = Regex.Match(input, pattern);

match.Groups["feet"].Value


11 tháng 5, 2023

Javascript hàm quay vòng may mắn chuẩn

let timeOfTempRun = 0,

minimizeRun = 1,

winResult = null;

// gọi chạy khi click

run(function () {

runSlowToStop(winResult);

});

// Hàm chạy đệ quy khi nào có result sẽ dừng  

function run(callback) {

runWheel360(function () {

  timeOfTempRun++;

  if (winResult != null && timeOfTempRun >= minimizeRun) callback();

  else run(callback);

});

}   

// chạy theo 1 vòng 360

function runWheel360(callback) {

angle += 3600;

g.animate(

  {

transform: "r" + angle + "," + cx + "," + cy,

  },

  (3600 * 1000) / 360,

  mina.linear,

  function () {

if (angle % 360 == 0) {

  console.log(`Vòng thứ ${timeOfTempRun + 1}`);

  callback();

} else {

  runWheel360(callback);

}

  }

);

}

// Quay tới kết quả của vòng

function runSlowToStop(winResult) {

const productId = _.get(winResult, "id");

// log spin data

$.ajax({

  url: `${baseURL}/api/services/app/externals/spinData`,

  type: "POST",

  data: JSON.stringify(products),

  contentType: "application/json-patch+json",

  dataType: "json",

  headers: defaultHeader,

  async: true,

  success: function (sp) {},

  error: function (httpRequest, textStatus, errorThrown) {},

});


var winProductIndex = _.findIndex(products, (item) => {

  return item.id == productId;

});

if (winProductIndex < 0) {

  showMessage(

"Kết quả quay thưởng không phù hợp!",

"success",

"result-prize"

  );

  pauseAudio();

  return;

}

var angleOfWinProduct =

  winProductIndex * actual_angle + 270 + actual_angle / 2;

var newAngle = angleOfWinProduct + angle;


g.animate(

  {

transform: "r" + newAngle + "," + cx + "," + cy,

  },

  2000,

  mina.linear,

  function () {

let textStop = _.get(winResult, "contentName");

let thumbnailRewardUrl = _.get(

  winResult,

  "thumbnailRewardUrl",

  "opened.png"

);

let isGoodLuck = _.get(winResult, "isGoodLuck", true);

$("#messageModal .modal-body").css({

  background: `url("${thumbnailRewardUrl}") center center no-repeat`,

  backgroundSize: "cover",

});


$("#customerName").text(dataFromApp["customerName"]);

$("#customerPhone").text(dataFromApp["customerPhone"]);

const prizeName =

  isGoodLuck == true

? `Chúc mừng bạn đã trúng ${textStop}`

: `Chúc mừng bạn đã trúng sản phẩm ${textStop}`;

showMessage(prizeName, "success", "result-prize win");

g.stop();

pauseAudio();

  }

);

}

24 tháng 12, 2020

Javascript disable windows keys F1...F12, Ctrl, Alt,...

 if (window.document.addEventListener) {

window.document.addEventListener("keydown", avoidInvalidKeyStorkes, false);
} else {
window.document.attachEvent("onkeydown", avoidInvalidKeyStorkes);
document.captureEvents(Event.KEYDOWN);
}

function avoidInvalidKeyStorkes(evtArg){
var evt = ( document.all ? window.event : evtArg) ;
var isIE = ( document.all ? true : false) ;
var KEYCODE=( document.all ? window.event.keyCode : evtArg.which) ;
var CTRL = ( document.all ? window.event.ctrlKey : evtArg.ctrlKey );
var ALT = ( document.all ? window.event.altKey : evtArg.altKey );
var element = ( document.all ? window.event.srcElement : evtArg.target );
var msg="We have disabled this key[New]" ;
if( KEYCODE == 8 ){ //Backspace pressed
if ( element.type=="text" || element.type=="textarea" || element.type=="password" || element.type=="file"){
return true;
}else{
if ( isIE ){
evt.keyCode = 0;
evt.returnValue = false;
window.status = msg;
}else{
evt.preventDefault();
evt.stopPropagation();
//alert(msg);
}
return false;
}
}
if (CTRL) { // Enable Copy Paste
if( KEYCODE == 67 || KEYCODE == 99 || // Ctrl+C Enabling Copy
KEYCODE == 86 || KEYCODE == 118 || // Ctrl+V Enabling Paste

KEYCODE == 88 || KEYCODE == 120 ){ // Ctrl+X Enabling Cut
return true;
}else{
if ( isIE){
evt.returnValue = false;
evt.keyCode = 0;
window.status = msg;
}else{
evt.preventDefault();
evt.stopPropagation();
alert(msg);
}
return false;
}
}
if (ALT) {
if ( isIE) {
evt.returnValue = false;
evt.keyCode = 0;
window.status = msg;
}else{
evt.preventDefault();
evt.stopPropagation();
alert( msg);
}
}
switch(KEYCODE){
case 112 : //F1
case 113 : //F2
case 114 : //F3
case 115 : //F4
case 116 : //F5
case 117 : //F6
case 118 : //F7
case 119 : //F8
case 120 : //F9
case 121 : //F10
case 122 : //F11
case 123 : //F12
case 27 : //ESCAPE
if ( isIE) {
evt.returnValue = false;
evt.keyCode = 0;
window.status = msg;
}else{
evt.preventDefault();
evt.stopPropagation();
alert(msg);
}
break;
default:
window.status = "Done";
}
}

11 tháng 8, 2020

Tạo phiên bản sản phẩm tự động dựa vào thuộc tính và value

 let f = (a, b) => [].concat(...a.map(a => b.map(b => [].concat(a, b))));

let cartesian = (a, b, ...c) => b ? cartesian(f(a, b), ...c) : a;

let output =  cartesian(['Xanh','Cam'],['M','L'],['Vãi','Cotton','Nhựa']);

console.log(output);


Link Jsfiddle: https://jsfiddle.net/5am7rz0u/

Kết quả:

[["Xanh","M","Vãi"],["Xanh","M","Cotton"],["Xanh","M","Nhựa"],["Xanh","L","Vãi"],["Xanh","L","Cotton"],["Xanh","L","Nhựa"],["Cam","M","Vãi"],["Cam","M","Cotton"],["Cam","M","Nhựa"],["Cam","L","Vãi"],["Cam","L","Cotton"],["Cam","L","Nhựa"]]

23 tháng 6, 2020

Angular: warning can't bind to 'ngForOf' since it isn't a known property of 'li'

Angular lazy loading module: warning can't bind to 'ngForOf' since it isn't a known property of 'li' => the li was be not render

Solutions: Add Component to Module

5 tháng 8, 2019

net core handle file upload from angular

HTML
<button style="margin-bottom:10px;" mat-raised-button color="accent" (click)="fileUpload.click()">
  {{ 'BUYER.UPLOAD_BUTTON' | translate }}
</button>
<input hidden type="file" id="fileToUpload" #fileUpload multiple (change)="handleFileInput($event)"
  accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" />

TS
  handleFileInput(event) {
    swal({
      title: "Are you Sure",
      type: "warning",
      text: "You want to Upload?",
      confirmButtonText: "Yes, upload it!?",
      showCancelButton: true
    }).then(result => {
      if (result.value) {
        this.loaderService.display(true);
        if (event.target.files && event.target.files.length > 0) {
          this.fileToUpload = <Array<File>>event.target.files;
          debugger;
          const fileToUploadForm = new FormData();

          if (this.fileToUpload) {
            Array.from(this.fileToUpload).forEach(e => {
              fileToUploadForm.append("files", e);
            });

            this.service.uploadToDatabase(fileToUploadForm).subscribe(
              data => {
                this.loaderService.display(false);
                swal({
                  title: "File Upload with the result as follows:",
                  type: "success",
                  html:
                    '<table cellspacing="15" cellpadding="6" style="display:block;margin-left:auto;margin-right:auto; width:60%">' +
                    '<tr><td style="background-color:#5ab857"><span style="color:white;">' +
                    data[0] +
                    " SUCCESSFULLY INSERTED</span></td></tr>" +
                    '<tr><td style="background-color:#dcb455"><span style="color:white;">' +
                    data[1] +
                    " DUPLICATE RECORD</span></td></tr>" +
                    '<tr><td style="background-color:#ED1C24"><span style="color:white;">' +
                    data[2] +
                    " ERROR IN INSERTING</span><td></tr></table>",
                  confirmButtonText: "OK"
                }).then(result2 => {
                  if (result2.value) {
                    setTimeout(_ => this.applyFilter(), 0);
                  }
                });
              },
              error => {
                this.loaderService.display(false);
                swal(
                  "Error",
                  "Invalid file Format or System Error!<br/> " + error,
                  "error"
                );
                setTimeout(_ => this.applyFilter(), 0);
              }
            );
          }
        }
      }
    });
  }

CS
public async Task<IActionResult> HandleUpload(List<IFormFile> files)
{
foreach (var formFile in files)
{
var filePath = System.IO.Path.Combine(Directory.GetCurrentDirectory(), "Files_Upload", formFile.FileName);
if (formFile.Length > 0)
{
using (var stream = new FileStream(filePath, FileMode.Create))
{
await formFile.CopyToAsync(stream);
}
}
}
return Ok(new { count = files.Count });         
}

13 tháng 4, 2019

C# send mail with image attachment and embeded inline

private MailMessage makeupDataForSendMail(string htmlBody, MailMessage mail)
        {
            string regexImgSrc = @"]*?src\s*=\s*[""']?([^'"" >]+?)[ '""][^>]*?>";
            MatchCollection matchesImgSrc = Regex.Matches(htmlBody, regexImgSrc, RegexOptions.IgnoreCase | RegexOptions.Singleline);
            foreach (Match m in matchesImgSrc)
            {
                string src_url = m.Groups[1].Value;
                string pathOfFile = System.Web.HttpContext.Current.Server.MapPath(HttpUtility.UrlDecode(src_url));
                var splitPaths = pathOfFile.Split('.');
                string extention_file = splitPaths[splitPaths.Length - 1].ToLower();
                LinkedResource inline = null;
                switch (extention_file)
                {
                    case "gif":
                        {
                            inline = new LinkedResource(pathOfFile, MediaTypeNames.Image.Gif);
                            break;
                        }
                    case "png":
                        {
                            inline = new LinkedResource(pathOfFile, "image/png");
                            break;
                        }
                    default:
                        inline = new LinkedResource(pathOfFile, MediaTypeNames.Image.Jpeg);
                        break;
                }
                inline.ContentId = Guid.NewGuid().ToString();
                htmlBody = htmlBody.Replace(src_url, "cid:" + inline.ContentId);
                AlternateView avHtml = AlternateView.CreateAlternateViewFromString
               (htmlBody, null, MediaTypeNames.Text.Html);
                avHtml.LinkedResources.Add(inline);
                mail.AlternateViews.Add(avHtml);

                Attachment att = new Attachment(pathOfFile);
                att.ContentDisposition.Inline = true;
                mail.Attachments.Add(att);
            }

            return mail;
        }

        public void sendMail(string htmlBody, string toMail)
        {
            SmtpClient client = new SmtpClient();
            client.Port = int.Parse(this.GetValue("SmtpPort", listVariables));
            client.DeliveryMethod = SmtpDeliveryMethod.Network;
            client.UseDefaultCredentials = false;
            client.EnableSsl = true;
            client.Credentials = new System.Net.NetworkCredential("username", "passwrd");
            client.Host = this.GetValue("SmtpServer", listVariables);

            MailMessage mail = new MailMessage();
            mail.From = new MailAddress("frommail");
            mail.To.Add(toMail);
            mail.Subject = "subject title";
            mail.IsBodyHtml = true;
            mail = makeupDataForSendMail(htmlBody, mail);
            client.Send(mail);
        }

Now you can call: sendMail(, "tomail@com" )

27 tháng 9, 2018

[Iphone Lock] Hướng dẫn chặn thông báo cập nhật iOS mới bằng cấu hình của tvOS

Để chặn thông báo cập nhật iOS mới bằng cấu hình của tvOS beta, các bạn làm theo hướng dẫn bên dưới đây:
1. Truy cập vào trang web bdvietnam.com bằng trình duyệt Safari trên thiết bị iOS muốn chặn cập nhật.
2. Kéo xuống dưới và tìm phần cấu hình của tvOS 11, nhấn vào nút Tải về màu xanh.
Lưu ý
Vì cấu hình của tvOS 10 đã hết hạn, nên các bạn có thể tải cấu hình tvOS 11 thay thế cũng được nhé.
chan-cap-nhat-ios
3. Ngay lập tức bạn sẽ được chuyển sang ứng dụng Cài đặt, nhấn vào Cài đặt (Install) ở góc trên bên phải để cài cấu hình, nhập mật khẩu của máy (nếu có).
chan-cap-nhat-ios
4. Lúc này bạn sẽ được chuyển sang màn hình thông báo của Apple khi cài đặt cấu hình tvOS beta, nhấn tiếp vào Cài đặt (Install) ở góc trên bên phải và cuối cùng là nhấn vào Cài đặt (Install) một lần nữa khi popup hiện ra.
chan cap nhat ios bang cau hinh tvos

6 tháng 9, 2018

Cài đặt trung tâm tin nhắn cho Iphone

Hiện tại Trên IOS 7 trở về sau trên  dòng điện thoại iphone thì không hỗtrợ kiểm tra và thay đổi số trung tâm tin nhắn được nữa
Vì vậy để thực hiện thay đổi số trung tâm tin nhắn trên iphone bạnthực hiện như sau:
Bạn bấm *#5005*7672# rồi nhấn call để kiểm tra số trung tâmtin nhắn

Lúc này màn hình điện thoại sẽ hiện lên Thẩm vấn Cài đặt thành công Địa chỉ số Trung tâm Dịch vụ     +84980200030


nếu bạn đang sử dụng mạng Viettel thì màn hinh sẽ hiện lên  :  Thẩm vấn Cài đặt thành công Địa chỉ số Trung tâm Dịch vụ          +84980200030
nếu bạn đang sử dụng mạng Vinaphone. thì màn hinh sẽ hiện lên  :  Thẩm vấn Cài đặt thành công Địa chỉ số Trung tâm Dịch vụ  +8491020005
nếu bạn đang sử dụng mạng Mobifone thì màn hinh sẽ hiện lên  :  Thẩm vấn Cài đặt thành công Địa chỉ số Trung tâm Dịch vụ       +84900000023
Để thay đổi số trung tâm tin nhắn bạn bấm:  **5005*7672*+84980200030# 
Nếu bạn đang sử dụng là sim viettel   

Để thay đổi số trung tâm tin nhắn bạn bấm:  **5005*7672*+8491020005# 
Nếu bạn đang sử dụng là sim vinaphone
Để thay đổi số trung tâm tin nhắn bạn bấm:  **5005*7672*+84900000023# 
Nếu bạn đang sử dụng là sim mobifone

Bạn thay đổi thành công máy sẽ thông báo như hình bên dưới


Để chắc chắn bạn bấm *#5005*7672# rồi nhấn call để kiểm tra sốtrung tâm tin nhắn lại một lần nữa.

19 tháng 6, 2018

let, var, const example



https://jsfiddle.net/d7a14efg/2/

15 tháng 11, 2017

Deploy Angular2 on IIS

1. Creating Rewrite Rules for the URL Rewrite Module
   - Link: https://docs.microsoft.com/en-us/iis/extensions/url-rewrite-module/creating-rewrite-rules-for-the-url-rewrite-module
2. Build Angular2 Project
    ng build --prod --aot(option)
3. Config IIS to dist folder
- Copy dist folder to another folder (ex: deploy)
- Add new Website and pointer to this folder (ex: deploy/dist)
- Add web.config file to the root folder to re-write url (ex: deploy/dist)

<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="Angular Routes" stopProcessing="true"> <match url=".*" /> <conditions logicalGrouping="MatchAll"> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> </conditions> <action type="Rewrite" url="/" /> </rule> </rules> </rewrite> </system.webServer> </configuration>

Result on IIS

17 tháng 4, 2017

ReactJs Webpack Deploy F5 Not Found Router

Issue: 
- Run project with command `npm run  serve` all router working fine.
- After build with command ` npm run build` and deploy to Apache or Xamp or Wamp, only root "/" router working, other route is not found 404 when Reload page or F5 key press.
Solution:
- Create file .htaccess in the root deploy project(after run build)
- Copy all code below to .htaccess file:

RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR] 
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d 
RewriteRule ^ - [L] 
RewriteRule ^ /index.html [L]

- Restart your server, It's Ok.

1 tháng 3, 2017

Disable scroll of body when scroll to bottom of the child div

PROBLEM
Your body of the web show scroll bar and the child div of body has scroll bar. You want to prevent effect scroll of body when you scroll to the bottom of the child div by mouse wheel.

SOLUTION
Add this lib to the bottom of body: https://rawgit.com/brandonaaron/jquery-mousewheel/master/jquery.mousewheel.js
Origin lib link: https://plugins.jquery.com/mousewheel/

JAVASCRIPT
$(function() {
  $('.container-scroll').bind('mousewheel', function(e, d) {
    var height=$(e.currentTarget).height(),
    scrollHeight= e.currentTarget.scrollHeight;  
    if((this.scrollTop === (scrollHeight - height) && d < 0) || (this.scrollTop === 0 && d > 0)) {
      e.preventDefault();
    }
  });

});

22 tháng 1, 2016

12 tháng 6, 2015

IntelliJ HyperLink Xhtml to Spring Bean

Go to File -  Project Structure -  Modules - Choose which module you want Enable Ctrl + Click from view XHTML to BEAN - Add Spring - Choose Spring and Add Face 'Spring' reference to Application Context.xml - Apply

4 tháng 3, 2015

Liferay LDAP

                I.            Hướng dẫn tạo LDAP AD trong Liferay
1.       Cho phép xác thực LDAP

2.       Thêm máy chủ LDAP
-          Cấu hình các giá trị kết nối.

-          Khởi động lại hệ thống server để LDAP import các user về local
-          Mặc định là user_id thay bằng screen_name hoặc email_address tùy bạn
-          (&(objectCategory=person)(sAMAccountName=@screen_name@))
      II.            Tạo mật khẩu mặc định khi import user từ LDAP
-          ldap.import.user.password.enabled=false
-          ldap.import.user.password.autogenerated=false
ldap.import.user.password.default=test

9 tháng 2, 2015

Anh ba hát về cô ba (^_^)



Nắng vàng trôi theo con nước
Tóc ai dài tôi nhớ tôi thương
Gió về Tiền Giang thơm ngát
Nụ cười duyên đôi má hây hây
Lỡ mai này ta chung bước
Cô Ba đừng e thẹn à nghen
Lỡ mai này se tơ tóc
Cô Ba là dâu hiền nhà tôi

Nói thiệt tôi đây không dám
Tôi chỉ cười trong giấc mơ thôi
Nỗi lòng này em đâu biết
Bao ngày qua tôi đếm tương tư
Lỡ mai này không chung bước
Cô Ba về qua nhà người ta
Lỡ mai này tôi không thấy
Tôi sẽ buồn âu sầu mình ên

Đành lòng sao hỡi em
Rượu hồng hoa kết đôi
Thuyền rồng qua bến sông
Cô Ba đành quên rồi người ơi

Thầm gọi trên bến sông
Một người tan giấc mơ
Hỏi rằng con nước trong
Lỡ mai này, lỡ mai này
Người về nơi bến sông xưa

Chiều chiều tôi nhớ mong
Giọt lệ vương áo nâu
Cuộc đời bên luống rau
Cô ba về nơi nhà giàu sang

Chuyện tình tôi trái ngang
Giờ buồn trên bến sông
Dòng Tiền Giang sóng xô
Lỡ mai này, lỡ mai này
Còn gọi 2 tiếng Cô Ba...

Hướng dẫn đăng nhận xét của bạn

  • Nếu muốn đăng nhận xét của mình các bạn click vào "Xem và nhận xét ở đây" dưới mỗi bài đăng, sau đó hộp thoại xuất hiện bạn gõ vào những nhận xét của mình. thế là xong! cảm ơn các bạn đã ghé thăm blog của mình !