nopcommerce中文网

nopcommerce是国外asp.net领域一个高质量的b2c开源项目,基于EntityFramework和MVC开发,QQ群1:75272942(2000人超级群,已满) QQ群2:640322459

导航 - 搜索

教你一招 - 如何使用nopcommerce主题(v2.5)

 从网上下载了主题包如何使用,看下面的步骤:

1、把下载的模板主题zip文件解压到网站“\Presentation\Nop.Web\Themes”文件夹下。下载模板

2、进入管理后台,打开配置 - 设置 - 综合设置,如图所示:

 nopchina - 教你一招系列

3、在上面的中选择对应的模板名称,然后点击保存。

4、刷新前台看看效果吧:

nopchina - 教你一招系列

分享是一种美。版权所有,转载请注明出处 http://www.nopchina.net/

教你一招 - 如何使用中文包

 下载了中文包不会用怎么办,看下面的步骤:

1、下载语言包,解压得到xml文件,如果没有的话点击这里下载 中文包

2、进入管理中心,打开Configuration - Languages页面,点击Add new,如图所示:

nopchina - 教你一招系列

3、输入上面内容后,点击

4、进入语言编辑页面,点击Import resources,如图所示:

nopchina - 教你一招系列

5、选择刚才下载的语言包,然后点击Import resources即可导入。

6、然后在右上角语言选择中选择中文即可看到效果,如图所示:

nopchina - 教你一招系列

7、最后来张效果图:

nopchina - 教你一招系列

分享是一种美。版权所有,转载请注明出处 http://www.nopchina.net/

如何在nopCommerce使用主题模板(2.0以下版本)

第1步
把模板主题zip文件(如nop_tem_1.9.zip)解压到网站“App_Theme”文件夹下。



 
第2步
登录到您的nopCommerce网站后台管理。(如http://www.yoursite.com/administration)



 
第3步
转到后台“配置”,  全局设置。



 
第4步
进入“搜索引擎优化/显示”链接,然后选择新创建的主题名称(nop_tem_1.9)从“主题”下拉列表然后然后点击“保存”按钮。



 
第5步
刷新网站前台即可。

为nopcommerce自定义用户积分功能(2)

积分功能第二部,不了解情况的可以先看看第一部

nopcommerce的总体架构我们就不多说了,从WEB到逻辑再到数据库访问都有地方要修改,本文主要演示逻辑和数据库访问的修改,Web界面上的后边会提到如何调用。

首 先我们有一个新的reward point provider,那么在web.config的sectionGroup里要加上:<section name=”RewardProvider” type=”NopSolutions.NopCommerce.DataAccess.DBProviderSection, Nop.DataAccess” requirePermission=”false”/>

在nopDataProviders的最后也要加上:

<RewardProvider defaultProvider=”SQLRewardProvider”>
<providers>
<add name=”SQLRewardProvider” type=”NopSolutions.NopCommerce.DataAccess.Promo.SQLRewardProvider, Nop.DataAccess.SqlServer” connectionStringName=”NopSqlConnection”/>
</providers>
</RewardProvider>

NopContext里也要加个字段用来保存当前session下的积分值:

public decimal RewardPoint
{
get {
if (HttpContext.Current.Session["RewardPoint"] == null)
return decimal.Zero;

decimal ret = decimal.Zero;
if (decimal.TryParse(HttpContext.Current.Session["RewardPoint"].ToString(), out ret))
return ret;
else
return decimal.Zero;
}
set
{
HttpContext.Current.Session["RewardPoint"] = value;
}
}

现在再来看数据库抽象接口的代码,各个方法什么意思想必大家一看就懂:

namespace NopSolutions.NopCommerce.DataAccess.Promo
{
[DBProviderSectionName("nopDataProviders/RewardProvider")]
public abstract partial class DBRewardProvider : BaseDBProvider
{
public abstract bool RewardCalculation(decimal point, int customerID, int orderid, string details);
public abstract DBCustomerCollection CustomerRewardList();
public abstract DBRewardAuditCollection GetAllAuditList(DateTime from, DateTime to);
public abstract DBRewardAuditCollection GetAuditByOrderID(DateTime from, DateTime to, int OrderID);
public abstract bool RewardPointSetTo(decimal point, int customerID, string details);
}
}

DBRewardAudit的定义:

namespace NopSolutions.NopCommerce.DataAccess.Promo
{
public partial class DBRewardAudit : BaseDBEntity
{
public int RewardID { get; set; }
public int OrderID { get; set; }
public DateTime RewardTime { get; set; }
public string Status { get; set; }
public decimal Amount { get; set; }
public string RewardDetails { get; set; }
}
}

按照标配来说还得要个DBRewardAuditCollection,我形式上加了这个文件,但没实质内容,如果管理员要求在登录网店后看到历史记录,可以用这个。

数据层的DBCustomer还要加上个RewardPoint属性:

namespace NopSolutions.NopCommerce.DataAccess.CustomerManagement
{
public partial class DBCustomer : BaseDBEntity
{
public decimal RewardPoint { get; set; }
}
}

数 据库层的UpdateCustomer方法的参数要修改,把reward point属性传进去,SQL里update的时候也能更新积分,在这儿就省略了。DBOrder也要加同样的public decimal RewardPoint { get; set; }属性。InsertOrder方法也要把RewardPoint包含进来。

具体的数据访问层,我这儿有个SQLRewardProvider.cs供参考。SQLRewardProvider

然后再看看业务逻辑层的RewardManager.cs,RewardManager,简单的代码,就不用再描述了。

OK到这儿大部分接口已经实现了,只等客户端代码调用了,所有的逻辑层,web层的代码都可以称为客户端代码,那么我们来试试下订单后消耗积分的情况。OrderManager.cs 中的PlaceOrder,

….

Order order = InsertOrder(OrderGuid, //这儿注意,用刚才修改过的方法,把积分传进去。

….

等有了OrderID = order.OrderID;这句,订单也生成了,那么就要扣掉相应的积分了,直接在这句后边加上:

//reward function
if (NopContext.Current.RewardPoint > customer.RewardPoint)//reward point cannot greater than customer’s point.
NopContext.Current.RewardPoint = customer.RewardPoint;

if (OrderID >= 0 && NopContext.Current.RewardPoint > decimal.Zero)//success, deduct reward points
RewardManager.RewardCalculation(decimal.Zero – NopContext.Current.RewardPoint, customer.CustomerID, OrderID,”Order placed with ” + RewardManager.RewardName + NopContext.Current.RewardPoint.ToString());

然后再接着往下走找到SendOrderPlacedStoreOwnerNotification和SendOrderPlacedCustomerNotification,里边的方法改改,让email可以支持reward point的消息:

首先要定义这些消息的token是什么,在GetListOfAllowedTokens里添加:

//added comments and reward points – by dingsea:
allowedTokens.Add(“%Order.RewardPointApplied%”);
allowedTokens.Add(“%Customer.CurrentRewardPoint%”);
allowedTokens.Add(“%Customer.WinRewardPoint%”);
allowedTokens.Add(“%Settings.RewardName%”);
//ends here.

ReplaceMessageTemplateTokens里加上如下字段以方便在正则替换的时候找到对应的文字:

//added: dingsea
tokens.Add(“Order.RewardPointApplied”, HttpUtility.HtmlEncode(order.RewardPoint.ToString(“N2″)));
tokens.Add(“Customer.WinRewardPoint”,HttpUtility.HtmlEncode((order.OrderTotal * RewardManager.RewardPercentage).ToString(“N2″)));
tokens.Add(“Customer.CurrentRewardPoint”,HttpUtility.HtmlEncode(NopContext.Current.User.RewardPoint.ToString(“N2″)));
tokens.Add(“Settings.RewardName”,HttpUtility.HtmlEncode(RewardManager.RewardName));

既然都到这里了,那也把nopcommerce的一个小BUG也补上:

ProductListToHtmlTable方法中没有打折信息(在order details页面也有同样问题,同学们自行加上吧),所以我把打折和积分信息一起加上了:

//fixed by dingsea – discount is missing
string CusDiscount = string.Empty;
string CusRewardPoint = string.Empty;

……

//fixed by dingsea – discount and reward point
CusDiscount = order.OrderDiscount == decimal.Zero ? string.Empty : PriceHelper.FormatPrice(order.OrderDiscount, true, order.CustomerCurrencyCode, language, false);
CusRewardPoint = order.RewardPoint.ToString(“N2″);

…….

//fixed by dingsea – discount and reward point
if(CusDiscount!=string.Empty)
sb.AppendLine(“<tr><td style=\”text-align:right;\” colspan=\”3\”><strong>” + LocalizationManager.GetLocaleResourceString(“ShoppingCart.Sub-TotalDiscount”, LanguageID) + “</strong></td> <td style=\”text-align:right;\”><strong>” + CusDiscount + “</strong></td></tr>”);
sb.AppendLine(“<tr><td style=\”text-align:right;\” colspan=\”3\”><strong>” + LocalizationManager.GetLocaleResourceString(“Promotion.RewardPointName”, LanguageID) + “</strong></td> <td style=\”text-align:right;\”><strong>” + CusRewardPoint + “</strong></td></tr>”);
//fix ends

于是呼,在你的template->message template里订单生成时向用户和店主发的email里就可以支持积分的token了。

至于在web如何调用,那就比较容易了,在你想要的页面加上一个textbox,确保用户输入的是decimal,那就够了,这个数字会存到session里直到用户下单。而且在管理界面,利用rewardmanager的方法可以直接操作积分,方便快捷。

为nopcommerce自定义用户积分功能(1)

nopcommerce本身不带用户���分功能,至少1.4还没有。基本目前的用户需求,等不到官方发布这个功能了。我们来自己实现一个简单的用户积分,积分历史记录暂时通过SQL查询

先 来看看基本需求和大概流程。首先这个积分不像凡客那种买个东西就几千上万分,我们所定义的积分就是一种虚拟货币,而且和网店主要货币的汇率为1,我们的 目的很简单,用户在每次购物以后可以给用户的帐户里添加X元的货币,这个货币的名字用户可以自定义,比如这个网店我想取名叫A$,那个网店我想叫 Z$,或者直接叫RMB也行。为了简单起见我们规定在每次购物以后用户可以得到1%的货币(为了更好的区分,以下用“积分”代替),而且积分是扣掉打折以 后再开始计算的。例如用户购买了200元的东西,打折10%即20元,这样用户需要支付180元,所得积分为180*1%=1.8元。当然这个百分比是可 以随时更改的。

要注意的是用户下单后不是马上得到积分而是在网店收到钱以后,由管理员在更新状态时同时给用户添加积分。管理员也可以选 择不给此人增加积分,或者给此人增 加另一个数额的积分,而且在用户管理页面管理员也可以直接对用户的积分进行修改。为了把积分概念深入人心,用户下单以后也要加到邮件通知里。

综上所述我们要的流程如下:

1.用户下单,结帐,email通知用户下单成功并能获得X元的积分,此积分下一次可以在购物时使用。
2.用户付款以后管理员给用户添加积分
3.用户获得积分,下次可以使用。

我们先来进行必要的设置,包括本地化、全局设置以及修改数据库。

configuration->all settings->add new,添加两项设置“RewardPercent”和“RewardPoint”,分别为获得积分的百分比和积分的货币符号。

content management->localization->add new,添加两项“Promotion.RewardMessageForGuest”和“Promotion.RewardPointName”分别为 guest user在结帐时的提示信息和本地化以后的货币符号,其实这个可以用上边的积分符号代替。

然后,我们在数据库里添加一个新的表
CREATE TABLE [dbo].[Nop_RewardAudit](
[RewardID] [int] IDENTITY(1,1) NOT NULL,
[OrderID] [int] NOT NULL,
[RewardTime] [datetime] NOT NULL,
[Status] [nchar](10) NOT NULL,
[Amount] [money] NOT NULL,
[RewardDetails] [nvarchar](2000) NULL,
CONSTRAINT [PK_Nop_RewardAudit] PRIMARY KEY CLUSTERED
(
[RewardID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]
这个表用来做audit,目前还没有把audit的界面做出来,不过功能倒是设计出来了,有空加上。然后分别再向customer表和order表加一个money字段:

ALTER TABLE dbo.Nop_Customer SET (LOCK_ESCALATION = TABLE)

order表的类似,我把代码搞没了,大家自己加上应该没问题。接下来老丁我还得改几个存储过程,不过强烈建议放到后边改,是更新用户和插入订单的。

CREATE PROCEDURE dbo.Nop_CustomerRewardPointCalculation
@cID int,
@orderID int,
@points money,
@details nvarchar(2000)
AS
update nop_customer
set rewardPoint = rewardPoint + @points
where CustomerID = @cID

insert into Nop_RewardAudit
(OrderID,RewardTime,Status,Amount,RewardDetails)
values
(@orderID,getdate(),””,@points,@details)

还有:
CREATE PROCEDURE dbo.Nop_CustomerSetRewardPoint
@cID int,
@orderID int,
@points money,
@details nvarchar(2000)
AS
update nop_customer
set rewardPoint = @points
where CustomerID = @cID

insert into Nop_RewardAudit
(OrderID,RewardTime,Status,Amount,RewardDetails)
values
(0,getdate(),””,@points,@details)
RETURN

更新用户信息:

CREATE PROCEDURE [dbo].[Nop_CustomerUpdate]
(
@CustomerId int,
@CustomerGUID uniqueidentifier,
@Email nvarchar(255),
@PasswordHash nvarchar(255),
@SaltKey nvarchar(255),
@AffiliateID int,
@BillingAddressID int,
@ShippingAddressID int,
@LastPaymentMethodID int,
@LastAppliedCouponCode nvarchar(100),
@LanguageID int,
@CurrencyID int,
@TaxDisplayTypeID int,
@IsTaxExempt bit,
@IsAdmin bit,
@IsGuest bit,
@IsForumModerator bit,
@TotalForumPosts int,
@Signature nvarchar(300),
@AdminComment nvarchar(4000),
@Active bit,
@Deleted bit,
@RegistrationDate datetime,
@TimeZoneID nvarchar(200),
@Username nvarchar(100),
@AvatarID int,
@RewardPoint money
)
AS
BEGIN

UPDATE [Nop_Customer]
SET
CustomerGUID=@CustomerGUID,
Email=@Email,
PasswordHash=@PasswordHash,
SaltKey=@SaltKey,
AffiliateID=@AffiliateID,
BillingAddressID=@BillingAddressID,
ShippingAddressID=@ShippingAddressID,
LastPaymentMethodID=@LastPaymentMethodID,
LastAppliedCouponCode=@LastAppliedCouponCode,
LanguageID=@LanguageID,
CurrencyID=@CurrencyID,
TaxDisplayTypeID=@TaxDisplayTypeID,
IsTaxExempt=@IsTaxExempt,
IsAdmin=@IsAdmin,
IsGuest=@IsGuest,
IsForumModerator=@IsForumModerator,
TotalForumPosts=@TotalForumPosts,
[Signature]=@Signature,
AdminComment=@AdminComment,
Active=@Active,
Deleted=@Deleted,
RegistrationDate=@RegistrationDate,
TimeZoneID=@TimeZoneID,
Username=@Username,
AvatarID=@AvatarID,
RewardPoint = @RewardPoint
WHERE
[CustomerId] = @CustomerId

END

Nop_OrderInsert的就不用我再放上来了吧,按上边这个SP来改问题不大。

今天先发到这儿。明天继续发CS代码部分。

nopCommerce常见问题汇总

以下列出的是程序猿攻城湿在开发nopCommerce的时候经常提出的问题。它们也表现出nopCommerce团队对一些架构的选择。

有哪些要求?

NopCommerce的技术和系统要求可以在这儿找到(英文)

程序猿如何向nopCommerce项目贡献代码?

NopCommerce代码托管在codeplex Mercurial代码库,用户点此访问。借此公共代码库,用户可找到将要发布的修改和以前的设计决策。如果想知道codeplex Mercurial对版本树的支持请在这儿这儿找更多信息。程序猿可以很容易地在我们的扩展页面上传插件和语言包并分享给他人。要上传扩展,请在浏览器中访问我的帐号,选择“Your contributions and extensions”选项卡,然后点击“Upload a new extension”按钮。

我如何报告一个缺陷?

nopCommerce使用Codeplex作为官方缺陷跟踪系统,如果发现一个缺陷,可通过在Codeplex创建一个任务来报告给nopCommerce团队。程序猿或用户也可以在我们的Bug Reports论坛版块发帖子来告知新发现的缺陷。如果你的缺陷已经被记录当然最好,正因为此,验证那些没有被记录的缺陷更为重要(比较拗口)。报告重复的缺陷会分心而且让我们在新的开发和改缺陷上时间更少。

nopCommerce的数据访问层

Nop.Data 项目包含一系列的类和函数来读取和写入数据库或是其它数据存储介质。Nop.Data项目有助于将数据访问的逻辑从你的业务对象中 分离出来。NopCommerce使用Entity Framework (EF) Code-First,Code-First允许程序员在源代码中定义实体(所有核心实体都在Nop.Core项目中定义),然后使用EF来生成基于C# 类的数据库,这就是为何被称为Code-First。你可以用LINQ来查询你的对象,它会悄悄地把代码转化为SQL语句并在数据库执行。 Nopcommerce有流利的API用于完全定制化的持久映射。如果想了解更多Code-First请访问这儿这儿

控制反转和依赖注入

控制反转和依赖注入是两个密不可分的方法用来分离你应用程序中的依赖性。控制反转Inversion of Control (IoC) 意味着一个对象不会新创建一个对象并依赖着它来完成工作。相反,它们从外部获取它们想要的对象。依赖注入Dependency Injection (DI) 意味着在没有对象的干预下,一般通过能传入构造参数和一系列属性的框架组件完成。马丁虎老二(Martin Fowler)写过一篇关于依赖注入和控制反转的牛B文章,我就不要再抄到这儿了,你可以在这儿找到。NopCommerce使用Autofac类库作为IOC容器。只要你写了一个服务和此服务已实现的适当接口,你应该在任何实现了IDependencyRegistrar接口(Nop.Core.Infrastructure.DependencyManagement 命名空间).的类里注册它。比如所有nopCommerce的核心服务都在Nop.Web.Framework类库的DependencyRegistrar类中已注册。

public class DependencyRegistrar : IDependencyRegistrar

{

public virtual void Register(ContainerBuilder builder, ITypeFinder typeFinder)

{

builder.Register(c => c.Resolve().Request) .As() .InstancePerHttpRequest(); builder.Register(c => c.Resolve().Response) .As() .InstancePerHttpRequest();

你想创建多少依赖注册类都可以。每一个类实现了IDependencyRegistrar接口的类都有一个Order属性,可以用它来替换一个现有的依赖。要覆盖nopcommerce的依赖,设置order属性为大于0。Nopcommerce会对依赖排序,并按顺序运行,数字越大你的对象越迟被注册。

我如何注册新的路由(路由?我觉得还是用routes比较好呢?)

ASP.NET路由主要用于接受进来的浏览器请求并把它映射到具体的MVC控制器action上。在此有更多信息。Nopcommerce有一个叫IRouteProvider的接口,用于在应用程序开始时注册路由。所有的核心路由都在Nop.Web项目中的RouteProvider注册。

public partial class RouteProvider : IRouteProvider

{

public void RegisterRoutes(RouteCollection routes)

{

//home page

routes.MapLocalizedRoute(“HomePage”,

“”,

new { controller = “Home”, action = “Index”},

new[] { “Nop.Web.Controllers” });

你想创建多少RouteProvider都可以。比如,如果你的插件有定制路由,需要注册,于是你可以创建一个实现IRouteProvider接口的新类,再根据插件具体注册路由。

数据校验

数据校验是一个用以保证程序操作干净,正确和有用数据的流程。很多.NET程序猿使用Data Annotation Validators,不过nopCommerce用的是Fluent Validation, 一个有着文艺青年般的接口和lambda表达式构成的.NET的小型验证库,用以生成符合你业务需求的校验规则 。在nopCommerce中你必须要通过2步来添加一个校验到一些模型中:1.创建一个继承自AbstractValidator的类并把所有必须的验 证逻辑都放入其中,看下边这些应该有所启发:

public class AddressValidator : AbstractValidator { public AddressValidator(ILocalizationService localizationService) { RuleFor(x => x.FirstName) .NotEmpty() .WithMessage(localizationService.GetResource(“Address.Fields.FirstName.Required”)) .When(x => !x.FirstNameDisabled);

2.给你的模型类加上ValidatorAttribute属性,比如下边代码:

[Validator(typeof(AddressValidator))]

public class AddressModel : BaseNopEntityModel

{
当一个视图模型被提交到控制器,ASP.NET会执行相应的校验。

计划任务

有了计划任务,你可以安排一个任务在指定的时期里,在后台运行。比如nopCommerce会定时地发送队列中的email。任务是在ASP.NET线程池中由单独的线程执行。创建一个新的任务有如下基本步骤:

  1. 定义一个有ITask接口的类,它只有一个无参数的方法:Execute。在任务要执行的时候,这个方法会被调用,你懂的。
  2. 为了设定一个计划任务,程序员必须在数据库相应的表中添加一个ScheduleTask记录。你可以使用IScheduleTaskService来添加记录

事件暴露和处理

事件是把消息广播给感兴趣的部分。事件是由数据驱动的如添加,更新和删除数据。NopCommerce允许程序员“监听”他们感兴趣的事件。程序员要想玩转事件基本上有如下两条路走,一个程序员要么发布某个事件让其它人来用,要么用别的程序员编好并发布的事件。

  1. 程序员为了发布一个事件,必须先取得一个IEventPublisher实例再使用相应的数据一起调用Publish方法。
  2. 程序员要监听一个事件,他必须实现一个新的IConsumer泛型接口,一旦有人使用这个事件,nopCommerce会用反射来寻找并注册这个事件的实现。

 

设置API

正如其它网站平台,nopCommerce也有例如“网店名称”或“启用单页购买”这类设置,在nopCommerce中有两种办法来管理设置。

你可以用实现ISettingService接口的方法SetSettingGetSettingByKey来加载和保存单个设置。而在nopCommerce中最牛B的处理设置的办法是创建一个ISettingService接口的新实现。每个设置将变为C#属性,程序员在需要时应该使用setting类构建函数注入设置。以下是setting类的示例代码。

/* 小结:本文是按老丁于原文之理解而翻译,并非出版社那种按字词翻译风格。欢迎各位提出意见,也欢迎各位转载不过务必注明本文原址。更多 nopcommerce的文章请关注http://www.dingsea.com/?tag=nopcommerce,或者加入我们的QQ群 101675096讨论。
*/
public class MediaSettings : ISettings

{

public int AvatarPictureSize { get; set; }

public int ProductThumbPictureSize { get; set; }

public int ProductDetailsPictureSize { get; set; }

public int ProductThumbPictureSizeOnProductDetailsPage { get; set; }

public int ProductVariantPictureSize { get; set; }

public int CategoryThumbPictureSize { get; set; }

public int ManufacturerThumbPictureSize { get; set; }

public int CartThumbPictureSize { get; set; }

 

public bool DefaultPictureZoomEnabled { get; set; }

 

public int MaximumImageSize { get; set; }

}

nopCommerce的源代码结构和架构分析

编写本文档是为了向程序员说明nopcommerce的解决方案结构,亦是程序员开发nopcommerce的居家必备良书。首先 nopcommerce的源代码很容易拿到,它是开源的,所以你可以直接到网上下载。 在你打开VS以后项目和文件夹都会完整列出来,我们建议你在看此文档的同时也打开你的VS来浏览项目和文件。

绝大多数的项目,目录和文件都顾名思义,你可以从名字就大概知道是做什么的。比如Nop.Plugin.Payments.PayPalStandard这个我都不用看项目代码就能猜到做什么的。
\Libraries\Nop.Core
Nop.Core项目包含nopcommerce的一系列核心类如缓存,事件,辅助类和业务对象(如订单和客户实体类)
\Libraries\Nop.Data
Nop.Data 项目包含一系列的数据访问类和方法以从数据库或其他数据媒介读取和保存数据。它也有助于把数据访问逻辑和你的业务对象分离。 nopcommerce使用Entity Framework (EF) Code-First方法,允许你在nopcommerce代码中定义实体 (所有的核心实体类都在Nop.Core中定义),再让EF生成数据库,这就是为什么会叫Code-First。你接下来可以用LINQ来查询对象,它自 己会把查询转换为SQL语句并在数据库里执行。nopcommerce拥有牛B的API让你完全定制持久映射,你可以在这儿和这儿找到Code- First的资料。
\Libraries\Nop.Services
此项目包含一系列的核心服务,业务逻辑,验证,如果有数据的话还有数据的计算方法,也就是传说中的业务访问层(BAL)

\Plugins\ 文件夹中的那些项目

Plugins 是VS的解决方案文件夹,硬盘中它是在你解决方案的根目录下。由于项目在编译时的输入路径是”..\..\Presentation \Nop.Web\Plugins\{Group}.{Name}\”,这样插件的DLL会自动地放到 \Presentation\Nop.Web\Plugins\文件夹中,用来放置已部署插件。这样也能让插件包含静态文件比如CSS或JS,就不用在项 目之间拷贝这些文件了。

\Presentation\Nop.Admin

Nop.Admin是一MVC项目,如果你还从没用过ASP.NET MVC,请猛击这儿有更多信息。可能你已经猜到这是表示层中的管理后台,你可以在 \Presentation\Nop.Web\Administration文件夹中找到它,此项目不能运行。

\Presentation\Nop.Web

Nop.Web也是一MVC项目,前台网店的表示层,这个才是你真正要跑起来的项目,它也是整个应用程序的起始项目。

\Presentation\Nop.Web.Framework

Nop.Web.Framework是一个表示层的类库项目,包括可以让后台和前台使用的一些共用的展示功能。

\Test\Nop.Core.Tests

Nop.Core.Tests是Nop.Core的测试项目

\Test\Nop.Data.Tests

Nop.Data.Tests是Nop.Data的测试项目

\Test\Nop.Services.Tests

Nop.Services.Tests是 Nop.Services的测试项目

\Test\Nop.Tests

Nop.Tests是一个类库,包含其它测试项目中要用的一共有类和辅助方法,此项目不包含任何测试用例

如何编写nopCommerce插件

插件(Plug-in,又叫addin、add-in、addon或add-on)是一种电脑程序,通过和应用程序的互动,用来替应用程序增加一些所需要的特定的功能。(Wikipedia)

插 件用来扩展nopCommerce的功能,nopcommcer有多种类型的插件。比如支付方式中的paypal,税率供应商,配送计算方式 (UPS,USP,Fedex),小部件(live chat功能)等等。nopCommerce本身也自带了很多不同的插件。你可以在官网上搜索是否已经有人上传了满足你需要的插件。如果没有,哥这就手把 手带你编写一个出来。

插件结构,所用文件,所在位置

1. 你第一件事就是要在解决方案中新建一个“类库”项目。最好的办法是把插件都放在解决方案根目录(不过小心不要和Nop.Web下边的 plugins目录搞混了,那儿是放已布置插件的),而且最好把插件也都放在解决方案目录的plugin目录中(关于更多解决方案文件夹的信息,请猛击此处

最 好以这种方法来命名:”Nop.Plugin.{Group}.{Name}”。{Group}是你插件的分类(比如支付),{Name}是你的 插件名(比如”AuthorizeNet”),那么Authorize.NET的支付插件就会有这样的名 字:Nop.Plugin.Payments.AuthorizeNet。

2.一旦建立了插件项目,把输入路径改为”..\.. \Presentation\Nop.Web\Plugins\{Group}.{Name} \”,比如 Authorize.NET 支付插件就会有这样的输入路径: “..\..\Presentation\Nop.Web\Plugins\Payments.AuthorizeNet\”。搞定以后,对应的插件 DLL就会被拷贝到 \Presentation\Nop.Web\Plugins\ 文件夹,nopCommerce内核会搜索此文件夹。

a.在项目菜单,点击属性
b.选择生成选项卡
c.点击输入路径旁边的浏览按钮选择一个输入目录

你要在debug和release模式下都要做此步骤。

3.下一步你就要为你的每一个插件建立一个Description.txt,此文件包含描述插件的信息。你可以从其它插件目录中拷出来。比如Authorize.NET支付插件的Description.txt就有如下内容:

Group: Payment methods FriendlyName: Credit Card SystemName: Payments.AuthorizeNet Version: 1.00 SupportedVersions: 2.30 Author: nopCommerce team DisplayOrder: 1 FileName: Nop.Plugin.Payments.AuthorizeNet.dll  其实所有的信息你都能看懂,不过有一些注意事项。SystemName必须唯一。Version字段是你插件的版本号,你可以将它设置为你喜欢的任何值。SupportedVersions可以包含一个由逗号分隔的(确保nopCommerce当前版本包含在此列表中,否则此插件没戏)支持版本清单。FileName是用这个格式:Nop.Plugin.{Group}.{Name}.dll(是你插件的assembly文件名)。要确保此文件的“拷贝到输入目录”属性是“Copy if newer”


4. 所需的最后一个步骤是创建一个类实现IPlugin接口(Nop.Core.Plugins命名空间)。nopCommerce有 BasePlugin类已经实现了一些IPlugin方法,这样你就不用苦逼地再写一遍。nopCommerce还提供一些从IPlugin派生特定的接 口。例如,俺们有“IPaymentMethod”接口,用于创建新的付款插件,它包含了一些特定的用于付款的方法如ProcessPayment()或 GetAdditionalHandlingFee()。nopCommerce目前有以下特定的插件接口:
IExternalAuthenticationMethod. 用来建立外部认证方法如 Facebook, Twitter, OpenID, etc.
IWidgetPlugin. 让你可以创建小部件,小部件在你网站的某些地方出现,如左边的Live chat框
IExchangeRateProvider. 用于获得货币汇率.
IDiscountRequirementRule. 允许你创建新的折扣规则比如”帐单寄到的国家必须是……“
ISMSProvider. 短信提供商,让你可以在下单时收到短信通知。
IPaymentMethod. 用于处理支付流程的插件。
IPromotionFeed. 这些插件用于向Froogle或PriceGrabber提供产品信息
IShippingRateComputationMethod..这些插件是用于获取可用的配送方法和正确的运费。例如,UPS,UPS,FEDEX等。
ITaxProvider. 税率提供商用于获取税率。

处理请求。控制器,模型和视图。

现 在你可以在Admin area > Configuration > Plugins看到我们的插件了,不过正如你所想,这个杯具的插件啥都不能做,甚至连个配置的界面都没有。现在让我们来创建一个配置页面。我们现在需要做 的是创建一个控制器,模型和视图。

  1. MVC控制器负责响应对一个ASP.NET MVC网站的请求。每个浏览器请求被映射到一个特定的控制器。
  2. 一个视图包含被发送到浏览器的HTML标记和内容。视图是相当于一个ASP.NET MVC应用程序的页面。
  3. 一个MVC模型包含视图或控制器以外的所有应用程序逻辑。

关于MVC模式在这里你可以找到更多的信息。

那么,我们可以开工了:

创建模型。新插件中加入一个Models文件夹,然后按你需要新加入一个模型类。
创建视图。在插件项目中新加一个Views文件夹,再在里边添加一个{Name}文件夹,此处{Name}是指你的插件名。然后再添加一个Configure.cshtml文件。很重要的一点:此视图应该要注明是嵌入资源。
创 建控制器。在插件项目中新加一个controller文件夹,再新加一个控制器类。最好的命名办法是像{Group} {Name}Controller.cs这样如PaymentAuthorizeNetController。再好好地命名一个action方法用于配 置。哥叫它“Configure”。准备一个模型类并将其传给这个视图:Nop.Plugin.{Group}.{Name}.Views. {Group}{Name}.Configure,即那个嵌入视图。比如你在Authorize.NET支付插件中的 PaymentAuthorizeNetController实现你就会比较清楚。

提示一:从其它插件项目中拷贝web.config到你项目里来,这样在做视图的时候有智能感知(老丁:啊?真的么?这和拷文件有什么关系?)。智能感知即微软的自动完成亮点。

提示二:搞定以上步骤最简单的办法是直接把其它插件项目拷贝过来,然后文件和文件夹改名。

提示三:如果你想限制后台(店主)控制器的一些action方法,只用在方法上加[AdminAuthorize]属性即可。

提示四:接下来要确保所有第三方的程序集引用的“拷贝到本地”属性设为false,这样可以减小部署包的大小。

比如Authorize.NET插件的项目结构会如下图:

路由

现在我们要为插件注册相应的路由。ASP.NET路由用于把浏览器发送的请求映射成MVC控制器相应的action方法,接下来的步骤你会读到很多详细关于路由的信息。

1. 新建如下文件:RouteProvider.cs,它会向nopcommerce告知关于插件路由信息。比如下边的RouteProvider添加了一个 新的路由,可以通过浏览器路径http://www.yourStore.com/Plugins/PaymentAuthorizeNet /Configure来访问:

public partial class RouteProvider : IRouteProvider {         public void RegisterRoutes(RouteCollection routes)         {             routes.MapRoute("Plugin.Payments.AuthorizeNet.Configure",                  "Plugins/PaymentAuthorizeNet/Configure",                  new { controller = "PaymentAuthorizeNet", action = "Configure" },                  new[] { "Nop.Plugin.Payments.AuthorizeNet.Controllers" }             );         }         public int Priority         {             get             {                 return 0;             }         } }

2. 一些特写的插件接口(像上边讲的)和“IMiscPlugin”接口有一个方法“GetConfigurationRoute”。它应该向控制器返回一个 用于插件后台配置的路由。实现你插件的“GetConfigurationRoute”方法,可以告知nopCommerce你插件的后台配置路由是什 么。如果你插件不需要后台配置,那么此方法将返回NULL,比如下边这样:

public void GetConfigurationRoute(out string actionName,
out string controllerName,
out RouteValueDictionary routeValues)
{
actionName = “Configure”;
controllerName = “PaymentAuthorizeNet”;
routeValues = new RouteValueDictionary()
{
{ “Namespaces”, “Nop.Plugin.Payments.AuthorizeNet.Controllers” },
{ “area”, null }
};
}

只要你有这个配置方法,插件安装以后你就能在Admin > Configuration > Plugins找到一个配置链接。

处理“安装”和“卸载”方法

这是可选步骤。一些插件需要有一定的安装逻辑,比如插件要添加一些本地资源数据。在你的IPlugin实现中(大多数情况下是直接从BasePlugin类继承下来),重载以下方法:

1. Install:在插件安装时会调用此方法,你可以在此初始化任何设置,添加新的本地资源数据或添加新的数据库表(如果需要的话)

2.Uninstall:在卸载插件时会调用此方法。

重要说明:如果你重载这些方法,不要隐藏基类的实现。比如重载”Install”的时候要记得调用base.Install(),Authorize.NET的install方法如下:

public override void Install()
{
var settings = new AuthorizeNetPaymentSettings()
{
UseSandbox = true,
TransactMode = TransactMode.Authorize,
TransactionKey = “123″,
LoginId = “456″
};
_settingService.SaveSetting(settings);

base.Install();
}

提示:已安装的插件列表可以在\App_Data\InstalledPlugins.txt找到,这个列表是在安装的时候创建的。

升级nopCommerce可能会让插件挂掉

一 些插件可能在新版本的nopCommerce中挂掉无法工作。如果在升级后有问题,请删除插件再到nopCommerce官网看看是否有些版本的 插件下载。大部分的插件作者都会把他们的插件升级到新的版本,不过少数插件并不会跟随着一起升级从而不再支持新版本。不过大多数情况下,你可以打开相应的 Description.txt文件并编辑SupportedVersions字段。

小结

希望此文能让你开始nopCommerce的插件之旅并搞个出类拔萃的插件。

nopcommerce是什么

简介

nopcommerce是国外的一个高质量的开源b2c网站系统,基于 EntityFramework4.0和MVC3.0,使用Razor模板引擎,有很强的插件机制,包括支付配送功能都是通过插件来实现的,基于xml的 多语言版本,非常灵活的语言切换功能,包括在后台都能同时编辑产品的中英文属性,非常适合做外贸,优秀超前的程序架构,性能也非常强大,自定义的产品名称 和分类又有很好的seo优化。综合能力远远高于国内的一些程序架构糟糕的.net商城程序,是二次开发和大型b2c架构的首选。

nopCommerce 具有的功能,帮助您启动功能强大的电子商务解决方案的能力,财富。本页面提供与它的特性和功能的快照你。我们已要求所有建立一个成功的电子商务商店的必要 工具。我们总是增加的特点nopCommerce名单,请查看我们的路线图,或与我们联系,了解在这条管道的。

其中一个nopCommerce主要特点是它的可插入模块/层状结构,允许更多的功能和演示内容将动态添加到应用程序在运行时。这可插入的模块化架构可以轻松地创建和管理网站。

综合型录功能

支持类和制造商

类别也可以完全嵌套到所需要的(分类别中的任何级别)

产品可以映射到多个类别或制造商

产品可以映射到多个类别或制造商

匿名结帐

支持套件产品,例如构建自己的电脑()

多语言支持

多币种支持

测量重量,尺寸测量

实时货币汇率(央行)

SSL支持

出口/进口(XML的时,Excel)

PDF格式秩序收据

全定制设计的100%使用模板

可配置允许的国家名单

登记

计费

航运

W3C的规定(的XHTML)

产品特点

产品属性(如颜色,大小)

每个产品支持多种图像

自动图像大小调整

产品支持下载

对产品文字选项(如要求对产品的缩写字母组合,要求客户对产品定制文本等名称)

支持简单的产品(如书籍)或变种产品

支持销售价格

产品搜索

特色产品,销售产品或新产品

库存跟踪

禁用购买特定产品的按钮

产品规格(如处理器,内存,显示卡)

比较产品功能(如果已启用)