Nâng cấp nopCommerce lên phiên bản mới như thế nào

Bài viết này mình sẽ từng bước hướng dẫn cách nâng cấp (upgrade) nopCommerce lên phiên bản mới nhất, hiện tại là phiên bản 3.8.

1. Đầu tiên tải về bản nopCommerce mới nhất từ trang: http://www.nopcommerce.com/downloads.aspx
Tải bản source hoặc no-source tùy nhu cầu của bạn

2. Backup lại toàn bộ folder chứa trang web, backup database

3. Việc nâng cấp nopCommerce phải thực hiện đi từng phiên bản. Ví dụ để nâng cấp nopCommerce 3.5 lên 3.8 cần thực hiện nâng cấp lên 3.6, rồi đến 3.7, sau đó mới nâng cấp lên 3.8.
Để nâng cấp cần phải download file upgrade script tương ứng (upgrade.sql) tại với từng phiên bản cần nâng cấp

4. Ở đây mình chỉ nâng cấp từ 3.7 lên 3.8, nên tải về 1 file upgrade script tại đây.
Xem dữ liệu tất cả phiên bản có thể được tải về tại đây

5. Chạy file script upgrade.sql trong database trang web (nopCommerce phiên bản cần nâng cấp) của bạn, bằng cách tạo 1 New QueryExecute trong tool SSMS

 

6. Xóa folder trang web nopCommerce phiên bản cũ và sau đó copy các file nopCommerce mới tải về vào

7. Copy 2 file Settings.txtInstalledPlugins.txt đã backup từ trước vào folder App_Data. Điều này đảm bảo thông tin cấu hình về database và plugin đã cài trên trang web đúng.

8. Đã nâng cấp xong, kiểm tra chắc chắn lại mọi thứ đã OK!

Chú ý:
- Không chép đè 2 file Settings.txtInstalledPlugins.txt
- Nếu hình ảnh được lưu trên file system, cần backup \Content\Images\ và copy lại sau khi nâng cấp
- Nếu muốn nâng cấp từ phiên bản 1.90 lên bản mới nhất, bạn phải cài đặt bản 2.0 trước (trên database cũ), sau đó chạy upgrade script 1.90 lên 2.0, và sau đó nâng cấp lên 2.10, 2.20, 2.30, ...

Microsoft Visual Studio 2015 Team Foundation Server Serial

Visual Studio được  phát triển bởi Microsoft, là một phần mềm hoàn chỉnh giúp việc lập trình (ứng dụng,web,..) một cách đơn giản, nó hỗ trợ rất nhiều ngôn ngữ như: html, js, java, asp.net, aspx.net, php…..Visual Studio có rất nhiều phiên bản với các chức năng khác nhau. Ở bài viết này mình chỉ nói qua về Visual Studio Team Foundation Server (TFS) thôi ^^

Visual Studio Team Foundation Server (TFS) phù hợp với:

– Các nhóm lập trình viên sử dụng Visual Studio để phát triển ứng dụng.

– Các bạn sinh viên đã/ đang/ sẽ làm các đồ án nhóm về lập trình.

– Các nhóm Freelancer đang tìm kiếm công cụ làm việc.

Team Foundation Server (TFS) là một chương trình server được sử dụng để quản lý mã nguồn của các lập trình viên trong các dự án chung.

Với các tính năng nổi bật như:

– Lưu trữ mã nguồn online.

-Tự động tổng hợp và đưa ra so sánh về mã nguồn từ các phiên bản được upload.

– Lưu trữ các phiên bản của mã nguồn và cho phép tải lại khi cần.

– Quản lý thay đổi trong project.

 

Link tải

Download Team Foundation Server 2015

License

PTBNK-HVGCM-HB2GW-MXWMH-T3BJQ

Tính khoản cách giữa 2 điểm bằng sql server và C#

sql server 

 --[dbo].[sp_DuAnGetKhoangCach] 10.7756587, 106.70042379999995, 0.5

CREATE PROCEDURE [dbo].[sp_DuAnGetKhoangCach]

    @ZipLatitude float, 
    @ZipLongitude float,
    @Radius  float
AS  
SELECT * FROM DuAn

WHERE dbo.TinhKhoanCach2Diem(lat, lng, @ZipLatitude, @ZipLongitude) < @Radius



CREATE FUNCTION TinhKhoanCach2Diem(
    @Latitude1 float,
    @Longitude1 float,
    @Latitude2 float,
    @Longitude2 float
)
RETURNS float 
AS  
    BEGIN 
    -- CONSTANTS
    DECLARE @EarthRadiusInMiles float;
    SET @EarthRadiusInMiles = 6371 -- 3959 for miles, 6371 for KM

    DECLARE @PI  float;
    SET @PI = PI();
    -- RADIANS conversion
    DECLARE @lat1Radians float;
    DECLARE @long1Radians float;
    DECLARE @lat2Radians float;
    DECLARE @long2Radians float;
    SET @lat1Radians = @Latitude1 * @PI / 180;
    SET @long1Radians = @Longitude1 * @PI / 180;
    SET @lat2Radians = @Latitude2 * @PI / 180;
    SET @long2Radians = @Longitude2 * @PI / 180;
    RETURN Acos(
    Cos(@lat1Radians) * Cos(@long1Radians) * Cos(@lat2Radians) * Cos(@long2Radians) + 
    Cos(@lat1Radians) * Sin(@long1Radians) * Cos(@lat2Radians) * Sin(@long2Radians) + 
    Sin(@lat1Radians) * Sin(@lat2Radians)
    ) * @EarthRadiusInMiles;
END

C#

/// <summary>
/// Specifies a Latitude / Longitude point.
/// </summary>
public class LatLng
{
    public double Latitude { get; set; }
    public double Longitude { get; set; }

    public LatLng(){
    }

    public LatLng(double lat, double lng)
    {
        this.Latitude = lat;
        this.Longitude = lng;
    }
}

/// <summary>
/// Returns the distance in miles or kilometers of any two
/// latitude / longitude points.
/// </summary>
/// <param name="pos1">Location 1</param>
/// <param name="pos2">Location 2</param>
/// <param name="unit">Miles or Kilometers</param>
/// <returns>Distance in the requested unit</returns>
public double HaversineDistance(LatLng pos1, LatLng pos2, DistanceUnit unit)
{
    double R = (unit == DistanceUnit.Miles) ? 3960 : 6371;
    var lat = (pos2.Latitude - pos1.Latitude).ToRadians();
    var lng = (pos2.Longitude - pos1.Longitude).ToRadians();
    var h1 = Math.Sin(lat / 2) * Math.Sin(lat / 2) +
                  Math.Cos(pos1.Latitude.ToRadians()) * Math.Cos(pos2.Latitude.ToRadians()) *
                  Math.Sin(lng / 2) * Math.Sin(lng / 2);
    var h2 = 2 * Math.Asin(Math.Min(1, Math.Sqrt(h1)));
    return R * h2;
}

public enum DistanceUnit { Miles, Kilometers };

var Offices = GetMyOfficeList();
for(int i = 0; i< Offices.Count; i++)
{
    Offices[i].Distance = HaversineDistance(
                            coord,
                            new LatLng(Offices[i].Lat, Offices[i].Lng),
                            DistanceUnit.Miles);
}

var closestOffice = Offices.OrderBy(x => x.Distance).Take(1).Single();

 

 

ASP.NET MVC: Cơ bản về Validation

Validation (chứng thực) là một tính năng quan trọng trong ASP.NET MVC và được phát triển trong một thời gian dài. Validation vắng mặt trong phiên bản đầu tiên của asp.net mvc và thật khó để tích hợp 1 framework validation của một bên thứ 3 vì không có khả năng mở rộng. ASP.NET MVC2 đã hỗ trợ framework validation do Microsoft phát triển, tên là Data Annotations. Và trong phiên bản 3, framework validation đã hỗ trợ tốt hơn việc xác thực phía máy khách, và đây là một xu hướng của việc phát triển ứng dụng web ngày nay.

Tầm quan trọng của Validation

Giả sử nếu bạn làm một website và không kiểm tra việc nhập dữ liệu của user, chuyện gì xảy ra nếu một đoạn mã độc được gởi lên server.
Kiểm tra dữ liệu luôn là 1 thách thức đối với một lập trình viên. Bạn không chỉ kiểm tra dữ liệu ở trình duyệt mà còn phải kiểm tra dữ liệu (bao gồm cả phần logic) trên server. Việc kiểm tra ở phía client sẽ mang lại những thông tin cần thiết khi người dùng nhập dữ liệu trên form và việc kiểm tra trên server là 1 điều hết sức cần thiết, vì đây là nơi nhận bất kỳ thông tin từ 1 mạng nào đó.

ServerSide Validation

Việc kiểm tra thông tin trên server nên hoàn thành dù có kiểm tra dữ liệu ở client hay không. Người dùng có thể vô hiệu hóa Javascript hoặc làm 1 cách nào đó để vượt qua sự kiểm tra dữ liệu ở client, và server là nơi phòng vệ cuối cùng trước những dữ liệu không mong muốn. Một vài quy tắc kiểm tra đòi hỏi chỉ được thực hiện ở server, vì đây là nơi tiếp cận nguồn dữ liệu an toàn hơn so với việc tiếp cận từ trình duyệt.

Validation với Data Annotations

Data Annotations được giới thiệu trong phiên bản .NET 3.5, là 1 bộ tập hợp các thuộc tính và các class được định nghĩa trong System.ComponentModel.DataAnnotations, dùng để bổ sung thông tin cho class với metadata. MetaData gồm 1 bộ các quy tắc được dùng để chỉ ra đối tượng nào cần được kiểm tra.
Ngoài ra, các thuộc tính trong Data Annotations còn dùng để điều khiển việc hiển thị dữ liệu (ví dụ như DisplayName, DataType…)
Các attribute dùng để Validation:

  • CompareAttribute: So sánh 2 giá trị của 2 thuộc tính trong Model. Nếu bằng nhau, trả về true.
  • RemoteAttribute: Dựa trên JQuery Validation, dùng để gọi hàm trên Server thực hiện việc kiểm tra
  • RequiredAttribute: Dữ liệu không được phép rỗng.
  • RangeAttribute: Dữ liệu là số, được nhập vào thuộc phạm vi được chỉ ra
  • RegularExpressionAttribute: Dữ liệu được nhập vào được so sánh hợp lệ với biểu thức được chỉ ra.
  • StringLengthAttribute: Chỉ ra số ký tự được phép nhập vào.

Client Side Validation

Để việc kiểm tra dữ liệu thực hiện phía client, bạn cần thiết lập thuộc tính true cho 2 thuộc tính:

<add key="ClientValidationEnabled" value="true">
<add key="UnobtrusiveJavaScriptEnabled" value="true">

Ngoài ra bạn phải nhúng thêm thư viện JQuery:

<script src="@Url.Content("~/Scripts/jquery.min.js")" type="text/javascript"></script>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

Ví dụ Thiết kế Model: Ngoài việc mô tả các thuộc tính (properties), bạn phải thêm vào các attribute để thực hiện việc kiểm tra dữ liệu.

public class Person
{
    [Required]
    [StringLength(160)]
    public string FirstName { get; set; }

    [Required(ErrorMessage="Your lastname is required")]
    public string LastName {get; set; }

    [Range(1, 150)]
    public string Age { get; set; }

    [RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}")]
    public string Email { get; set; }

    [Compare("Email")]
    public string EmailConfirm { get; set; }

    [Remote("CheckUserName", "Account")]
    public string UserName { get; set; }
}

Attribute Compare: Bạn chỉ ra tên property cần so sánh giá trị.
Attribute Remote: chỉ ra tên Controller và Action thực hiện việc kiểm tra dữ liệu bằng Ajax.

public class AccountController : Controller
{
    //
    // GET: /Account/        

    public JsonResult CheckUserName(string username)
    {
        if (username == "anbinhtrong")
            return Json(false, JsonRequestBehavior.AllowGet);
        return Json(true, JsonRequestBehavior.AllowGet);
    }
}

Thực hiện đoạn code hiển thị dữ liệu ở View:

@using(Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <fieldset>
        <div class="editor-label">@Html.LabelFor(m => m.UserName):</div>
        <div class="editor-field">
            @Html.TextBoxFor(m => m.UserName)
            @Html.ValidationMessageFor(m => m.UserName)
        </div>  
        <div class="editor-label">@Html.LabelFor(m => m.FirstName):</div>
        <div class="editor-field">
            @Html.TextBoxFor(m => m.FirstName)
            @Html.ValidationMessageFor(m => m.FirstName)
        </div>        
        <div class="editor-label">@Html.LabelFor(m => m.LastName):</div>
        <div class="editor-field">
            @Html.TextBoxFor(m => m.LastName)
            @Html.ValidationMessageFor(m => m.LastName)
        </div>  
        <div class="editor-label">@Html.LabelFor(m => m.Age):</div>
        <div class="editor-field">
            @Html.TextBoxFor(m => m.Age)
            @Html.ValidationMessageFor(m => m.Age)
        </div>   
        <div class="editor-label">@Html.LabelFor(m => m.Email):</div>
        <div class="editor-field">
            @Html.TextBoxFor(m => m.Email)
            @Html.ValidationMessageFor(m => m.Email)
        </div>   
        <div class="editor-label">@Html.LabelFor(m => m.EmailConfirm):</div>
        <div class="editor-field">
            @Html.TextBoxFor(m => m.EmailConfirm)
            @Html.ValidationMessageFor(m => m.EmailConfirm)
        </div>             
        <input type="submit" value="Ok"/>
        <input type="reset" value="Làm lại"/>
    </fieldset>  
}

ValidationMessageFor: Hiển thị thông báo khi dữ liệu bị lỗi ở ô tương ứng. Kiểm tra dữ liệu phía Server:

[HttpPost]
public ActionResult Index(Person person,FormCollection form)
{            
    if (ModelState.IsValid)
    {
        //Do something
    }
    return View("Index");
}

ModelState.IsValid: mang giá trị false khi 1 thuộc tính nào đó mang giá trị không hợp lệ.

Kết luận 

Việc kiểm tra dữ liệu tương đối được đơn giản hóa nhờ sự hỗ trợ của thư viện Data Annotations. Nhưng đôi khi chúng ta gặp phải những tình huống phức tạp, vượt ra ngoài khả năng hỗ trợ của asp.net mvc, lúc đó chúng ta cần quay lại tìm hiểu jquery validation và tự viết riêng cho phần kiểm tra đó.

Download ví dụ: MediaFire 

ModelValidation.rar (2,16 mb)

 

 

 

AutoMapper

AutoMapper là gì?

AutoMapper là một thư viện dùng để mapping object tới object (object-to-object mapper). Nó cho phép bạn mapping các thuộc tính trong cùng một object tới các thuộc tính của một object kiểu khác. Ví dụ, bạn có thể mapping một heavy enity (một entity có nhiều thuộc tính) Customer tới một đối tượng thuộc lớp CustomerDTO hoàn toàn tự động bằng cách sử dụng AutoMapper.

Vấn đề

Đã bao giờ bạn viết đoạn code như này chưa:

Customer customer = GetCustomerFromDB();

CustomerViewItem customerViewItem = new CustomerViewItem()
                           {
                               FirstName = customer.FirstName,
                               LastName = customer.LastName,
                               DateOfBirth = customer.DateOfBirth,
                               NumberOfOrders = customer.NumberOfOrders
                           };

ShowCustomerInDataGrid(customerViewItem);

Chúng ta có entity Customer, và chúng ta sắp bind các đối tượng Customers lên DataGrid, nhưng như chúng ta đã biết, entity Customer quá nặng, và có quá nhiều thuộc tính không cần thiết, chúng ta cần một object nhẹ cân và duyên dáng hơn, do đó chúng ta sẽ ưu tiên bind object CustomerViewItem lên grid.Khác...