文档库 最新最全的文档下载
当前位置:文档库 › nopCommerce的源代码结构和架构说明

nopCommerce的源代码结构和架构说明

nopCommerce的源代码结构和架构说明
nopCommerce的源代码结构和架构说明

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项目,如果你还从没用过https://www.wendangku.net/doc/95237041.html, 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是一个类库,包含其它测试项目中要用的一共有类和辅助方法,此项目不包含任何测试用例

扩展现有实体-添加新的属性

Updating an existing entity.How to add a new property.

扩展现有实体:如何添加一个新的属性?

This tutorial covers how to add a property to the Affiliate entity that ships with the nopCommerce source code.

本教程将为代理商实体Affiliate entity添加一个属性,附带nopCom源码。

The data model数据模型

Entities will have two classes that are used to map records to a table. The first class defines the properties, fields, and methods consumed by the web application.

实体将有两个类用于映射记录表:第一个类定义affiliate的属性、字段和方法。

File System Location文件位置: [Project Root]\Libraries\Nop.Core\Domain\Affiliates\Affiliate.cs Assembly程序集: Nop.Core

Solution Location解决方案中的位置: Nop.Core.Domain.Affiliates.Affilate.cs

The second class is used to map the properties defined in the class above to their respective SQL columns. The mapping class is also responsible for mapping relationships between different SQL tables.

第二个类是将各属性分别映射到对应的SQL列,以及映射不同的SQL表之间的关系。

File System Location: [Project Root]\Libraries\Nop.Data\Mapping\Affiliates\AffiliateMap.cs Assembly: Nop.Data

Solution Location: Nop.Data.Mapping.Affiliates.AffiliateMap.cs

Add the following property to the Affiliate class.

○1为Affiliate添加一个属性:

// Instance members must be virtual on data table objects like Affiliate.cs // Virtual is required by data access frameworks so that these frameworks // can implement more complex features like lazy loading.

public virtual string AffiliateWebSite { get; set; }

Add the following code to the constructor of the AffiliateMap class.

○2为AffiliateMap添加一个构造函数:

// This code maps a column in the database to the new property we created above // This creates a nullablenvarchar with a length of 255 characters in the // Affiliate SQL table

this.Property(m

=>m.AffiliateWebSite).HasMaxLength(255).IsOptional();

Because I’m all about results, at this point I would run the code, re-install the database, and verify that the column was created appropriately.

○3修改数据库,为Affiliate表添加列:AffiliateWebSite,允许为空,navrchar(255)。

○4重新编译程序

The presentation model视图模型

The presentation model is used to transport information from a controller to the view (read more at https://www.wendangku.net/doc/95237041.html,/mvc). Models have another purpose; defining requirements.

表示模型用于传输控制器的信息视图(参考https://www.wendangku.net/doc/95237041.html,/mvc)。模型的另一个目的,定义需求。

We configured our database to only store 255 characters for the AffiliateWebSite. If we try and save an AffiliateWebSite with 300 characters the application will break (or truncate the text). We want the application to protect users from failures the best we can, and our view models help enforce requirements like string length.

我们在数据库中设定AffiliateWebSite长度为255个字符,如果尝试保存300个字符的,程序将中断(或截断文本)。因此需要通过程序强制用户输入不超过255个字符,尽可能地降低出错。

File System Location: [Project

Root]\Presentation\Nop.Web\Administration\Models\Affiliates\AffiliateModel.cs

Assembly: Nop.Admin

Solution Location: Nop.Admin.Models.Affiliates.AffiliateModel.cs

The validator class is used to validate the data stored inside of the model class (e.g. required fields, max length, and required ranges).

验证输入格式

File System Location: [Project

Root]\Presentation\Nop.Web\Administration\Validators\Affiliates\AffiliateValidator.cs

Assembly: Nop.Admin

Solution Location: Nop.Admin.Validators.Affiliates.AffiliateValidator.cs

Add the property to our view model.

○5添加视图模型需要的属性:

// The NopResourceDisplayName provides the "key" used during localization // Keep an eye out for more about localization in future blogs [NopResourceDisplayName("Admin.Affiliates.Fields.AffiliateWebSite")] public string AffiliateWebSite { get; set; }

The requirements code will be added in the constructor of the validator.

//I think this code can speak for itself

RuleFor(m =>m.AffiliateWebSite).Length(0, 255);

The view

File System Location: [Project Root]\Presentation\Nop.Web\Administration\Views\Affiliates\

_CreateOrUpdate.cshtml

Assembly: Nop.Admin

Solution Location: Nop.Admin.Views.Affiliates._CreateOrUpdate.cshtml

Views contain the html for displaying model data. Place this html under the "active" section.

○6在视图中添加一行:

@Html.NopLabelFor(model =>model.AffiliateWebSite):

< /td>

@Html.EditorFor(model =>model.AffiliateWebSite)

@Html.ValidationMessageFor(model =>model.Active)

< /td>

The controller

In this case the controller is responsible for mapping the domain data model to our view model and vice versa. The reason I choose the affiliate model to update is because of the simplicity. I want this to be an introduction to the nopCommerce platform and I would like to keep it as simple as possible.

在这种情况下,控制器负责域数据模型映射到视图模型,反之亦然。这里之所以选择“代理商”模型来更新是因为他比较简单。以便尽可能简单地为大家介绍如何扩展现有实体属性。

File System Location: [Project

Root]\Presentation\Nop.Web\Administration\Controllerss\AffiliateController.cs

Assembly: Nop.Admin

Solution Location: Nop.Admin.Controllers.AffiliateController.cs

We're going to make three updates to the AffiliateController class.

?Data Model -> View Model

?Create View Model -> Data Model

?Edit View Model -> Data Model

Normally I would write tests for the following code and verify that model mapping is working correctly, but I'll skip unit testing to keep it simple.

我们将要进行三次更新AffiliateController类。

数据模型- 视图模型

创建视图模型- >数据模型

编辑视图模型- >数据模型

通常情况下,我会写下面的代码测试和验证模型的映射正常工作,但我会跳过单元测试,以保持它的简单。

In the method PrepareAffiliateModel add the following code below the model.Active = affiliate.Active:

○7找到Private void PrepareAffiliateModel方法,在model.Active = affiliate.Active后中添加代码:

// Data Model ->Ceate/Edit View Model

model.AffiliateWebSite = affiliate.AffiliateWebSite;

In the public ActionResultCreate(AffiliateModel model, boolcontinueEditing) method add the following code below affiliate.Active = model.Active:

○8找到public ActionResult Create(AffiliateModel model, boolcontinueEditing)方法,在affiliate.Active = model.Active后添加代码:

// Create View Model -> Data Model

affiliate.AffiliateWebSite = model.AffiliateWebSite;

A similar change is required in public ActionResultEdit(AffiliateModel model, boolcontinueEditing):

○9最后,在public ActionResult Edit(AffiliateModel model, boolcontinueEditing)方法中添加以下代码:// Edit View Model -> Data Model

affiliate.AffiliateWebSite = model.AffiliateWebSite; Troubleshooting

?Recreate the database. Either your own custom SQL script or use the nopCommerce installer.

?Stop the development web server between schema changes.

?Post a detailed comment on our forums.

如何编写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”),那么https://www.wendangku.net/doc/95237041.html,的支付插件就会有这样的名字:

Nop.Plugin.Payments.AuthorizeNet。

2.一旦建立了插件项目,把输入路径改为”..\..\Presentation\Nop.Web\Plugins\{Group}.{Name}\”,比如https://www.wendangku.net/doc/95237041.html, 支付插件就会有这样的输入路径:

“..\..\Presentation\Nop.Web\Plugins\Payments.AuthorizeNet\”。搞定以后,对应的插件DLL就会被拷贝到\Presentation\Nop.Web\Plugins\ 文件夹,nopCommerce内核会搜索此文件夹。

a.在项目菜单,点击属性

b.选择生成选项卡

c.点击输入路径旁边的浏览按钮选择一个输入目录

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

3.下一步你就要为你的每一个插件建立一个Description.txt,此文件包含描述插件的信息。你可以从其它插件目录中拷出来。比如https://www.wendangku.net/doc/95237041.html,支付插件的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控制器负责响应对一个https://www.wendangku.net/doc/95237041.html, MVC网站的请求。每个浏览器请求被映射到一个特定的控

制器。

2.一个视图包含被发送到浏览器的HTML标记和内容。视图是相当于一个https://www.wendangku.net/doc/95237041.html, 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,即那个嵌入视图。比如你在https://www.wendangku.net/doc/95237041.html,支付插件中的PaymentAuthorizeNetController实现你就会比较清楚。

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

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

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

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

比如https://www.wendangku.net/doc/95237041.html,插件的项目结构会如下图:

路由

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

1. 新建如下文件:RouteProvider.cs,它会向nopcommerce告知关于插件路由信息。比如下边的RouteProvider添加了一个新的路由,可以通过浏览器路径

https://www.wendangku.net/doc/95237041.html,/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" }

);

}

publicint Priority

{

get

{

return 0;

}

}

}

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

public void GetConfigurationRoute(out string actionName,

out string controllerName,

out RouteValueDictionaryrouteValues)

{

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(),https://www.wendangku.net/doc/95237041.html,的install方法如下:

public override void Install()

{

var settings = new AuthorizeNetPaymentSettings()

{

UseSandbox = true,

TransactMode = TransactMode.Authorize,

TransactionKey = “123″,

Lo ginId = “456″

};

_settingService.SaveSetting(settings);

base.Install();

}

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

升级nopCommerce可能会让插件挂掉

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

小结

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

nopCommerce常见开发问题汇总

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

文章说明:文章来源自我的博客,于原文之理解而翻译,并非出版社那种按字词翻译风格。欢迎各位提出意见,也欢迎各位转载不过务必注明本文原址。更多nopcommerce的文章请关注https://www.wendangku.net/doc/95237041.html,/?tag=nopcommerce,或者加入我们的QQ群101675096 有哪些要求?

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, ITypeFindertypeFinder)

{

builder.Register(c

=>c.Resolve().Request) .As() .InstancePerHttpRequest();

builder.Register(c

=>c.Resolve().Response) .As() .InstancePerHttpRequest() ;

你想创建多少依赖注册类都可以。每一个类实现了IDependencyRegistrar接口的类都有一个Order属性,可以用它来替换一个现有的依赖。要覆盖nopcommerce的依赖,设置order 属性为大于0。Nopcommerce会对依赖排序,并按顺序运行,数字越大你的对象越迟被注册。我如何注册新的路由(路由?我觉得还是用routes比较好呢?)

https://www.wendangku.net/doc/95237041.html,路由主要用于接受进来的浏览器请求并把它映射到具体的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(ILocalizationServicelocalizationService) { RuleFor

=>x.FirstName) .NotEmpty() .WithMessage(localizationSer vice.GetResource(“Address.Fields.FirstName.Required”)) .When(x => !x.FirstNameDisabled);

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

[Validator(typeof(AddressValidator))]

public class AddressModel : BaseNopEntityModel

{

当一个视图模型被提交到控制器,https://www.wendangku.net/doc/95237041.html,会执行相应的校验。

计划任务

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

1.定义一个有ITask接口的类,它只有一个无参数的方法:Execute。在任务要执行的

时候,这个方法会被调用,你懂的。

2.为了设定一个计划任务,程序员必须在数据库相应的表中添加一个ScheduleTask记

录。你可以使用IScheduleTaskService来添加记录

事件暴露和处理

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

1.程序员为了发布一个事件,必须先取得一个IEventPublisher实例再使用相应的数

据一起调用Publish方法。

2.程序员要监听一个事件,他必须实现一个新的IConsumer泛型接口,一旦有人使用

这个事件,nopCommerce会用反射来寻找并注册这个事件的实现。

设置API

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

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

/* 小结:本文是按老丁于原文之理解而翻译,并非出版社那种按字词翻译风格。欢迎各位提出意见,也欢迎各位转载不过务必注明本文原址。更多nopcommerce的文章请关注

https://www.wendangku.net/doc/95237041.html,/?tag=nopcommerce,或者加入我们的QQ群101675096讨论。

public class MediaSettings :ISettings

{

publicintAvatarPictureSize { get; set; } publicintProductThumbPictureSize { get; set; } publicintProductDetailsPictureSize { get; set; } publicintProductThumbPictureSizeOnProductDetailsPage { get; set; } publicintProductVariantPictureSize { get; set; } publicintCategoryThumbPictureSize { get; set; } publicintManufacturerThumbPictureSize { get; set; } publicintCartThumbPictureSize { get; set; }

publicboolDefaultPictureZoomEnabled { get; set; }

publicintMaximumImageSize { get; set; }

}

详细设计文档 (含系统说明书,源代码说明书)

东北师范大学 外语培训机构数据库详细设计文档 雷蕾张丽云丁鼎孔祥楠 2009-11-1

目录 第一章引言 (1) 1.1项目说明 (1) 1.2文档目的 (1) 1.3参考资料 (1) 第二章设计流程图 (3) 2.1注册功能流程图 (3) 2.2用户登录功能流程图 (4) 2.3搜索课程功能流程图 (5) 2.3前台用户下载资料或留言功能流程图 (5) 2.3后台管理员功能流程图 (6) 第三章类规格说明 (7) 2.1模块类图 (7) 3.2 jsp页面说明 (8) 3.3类说明 (10) 第四章程序设计说明 (15)

第一章引言 1.1项目说明 1、在互联网络高速发展的今天,网站是企业在因特网上全面介绍公司信息的一个发布平台:可以把任何想让人们知道的东西放入网站,如公司简介、公司的厂房、生产设施、研究机构、产品的外观、功能及其使用方法等,都可以展示于网上。 2、网站树立培训机构形象,让别人看到自己,展示培训机构的实力。培训机构就能够在国内和世界"亮相",无疑是一种宣传机构、产品和服务的机会。从广告意义上看,培训机构网站事关机构形象建设,没有网站也谈不上机构形象。 3、主动抢占先机,培训机构建设自己的网站,这是时代发展的必然,任何一家培训机构要想跟上时代发展的潮流,必须要有展示自己的一个信息平台。为了不被竞争对手建立网站抢占先机,为了不落后于时代潮流,应该考虑建站的必要性。 4、可以扩大业务范围,可以与潜在客户建立商业联系:这是该网址最重要的功能之一,也是为什么那么多的国外企业非常重视网站建设的根本原因。现在,世界各国大的采购商主要都是利用互联网络来寻找新的产品和新的供应商,因为这样做费用最低,效率最高。原则上,全世界任何地方的人,只要知道了公司的网址,就可以看到公司的产品。因此,关键在于如何将公司网址推介出去。一种非常实用而有效的方法是将公司的网址登记在全球著名的搜索引擎(如Google,百度,雅虎等)上,并选择与公司的产品及服务有关的关键字,则可以使潜在的客户能够容易地找到公司和产品。这正是国际商业上通行的做法,而且被实践证明是十分有效的。 5、给广大热爱外语,渴望了解外语信息的群体提供一个方便快捷的平台。 1.2文档目的 该文档的阅读群体是该项目组的全部成员,为了让所有成员能对本网站的数据库构成,数据流向有个深刻的了解,方便在以后的编程中合理运用。 1.3参考资料 数据库原理及应用教程2版 北京人民邮电出版社 著者:陈志泊王春玲 数据库原理与应用 北京清华大学出版社 著者:狄文辉宋真君白劲波

PCI内核源代码说明

PCI从设备代码说明: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity pcislave is port( //PCI接口说明 //CLK:33M PCI 时钟; //RST : PCI 复位,低有效; // IDSEL : PCI 配置空间选择,高有效; // FRAME :PCI 祯周期开始,低有效; // IRDY : PCI主设备准备好,低有效; clk,rst,idsel,frame,irdy : in std_logic; // TRDY : PCI目标设备准备好,低有效; // DEVSEL :PCI目标设备选择,低有效; // STOP : PCI目标设备停止,低有效; trdy,devsel,stop : inout std_logic; // PCI 效验输出使能,高有效; paren1 : out std_logic; // DATA RD OUT :局部总线读输出信号,高有效; // DATA WR :局部总线写输出信号,高有效; // DMASEL :DMA允许,高有效; data_rd_out,data_wr,dmasel : out std_logic; // IOSEL : IO空间选择输出,高有效; // MEMSEL :内存空间选择输出,高有效; iosel,memsel : buffer std_logic; // EXT ADD :局部总线地址译码输出,IO空间只用(7 到0) ext_add : out std_logic_vector(21 downto 0); // CBE :PCI命令及字节输入 cbe : in std_logic_vector(3 downto 0); // AD : PCI地址及数据复用信号 ad : inout std_logic_vector(31 downto 0)); end pcislave; architecture beha of pcislave is // 目标读状态机 type slaverdst is (idle1,dev_st1,rdst1,rdst2,rdst3,rdst4,rdstopst,ctst1); //目标写状态机 type slavewrst is (idle2,dev_st2,wrst1,wrst2,wrst3,wrst4,wrstopst,ctst2); signal pre_state1,nxt_state1 : slaverdst; signal pre_state2,nxt_state2 : slavewrst; // PCI配置空间定义: // PCI ID号定义 constant id : std_logic_vector(31 downto 0) :="01000010010110000001000100000000"; // PCI 设备类型定义 constant clss : std_logic_vector(31 downto 0) :="00000100000000000000000000000000";

代码说明书

系统编码规范 1.目的 为了统一开发过程中关于代码编写时的编写规范和具体开发工作时的编程规范,保证代码的一致性,便于交流和维护,特制定此规范。 2.适用范围 本规范适用于开发组全体人员,为详细设计,代码编写和代码审核提供参考和依据。 3.代码格式 在编写代码过程中,建议遵循以下规则。 (1)缩进规则:使用四个空格作为每层次代码的缩进值。 (2)在括号对对齐的位置垂直对齐左右括号,如: For(i=0;i++) { …. } (3)沿逻辑结构行缩进代码,如:

If…then If…then … Else … End if Else … End if (4)为了防止在阅读代码时左右滚动代码编辑器,每行代码或注释不得超过一个显示屏。 (5)当一行分别为几行时,通过将串联运算符放在每行的末尾而不是开头,清楚地表示没有后面的行是不完整的。 (6)Case 规则:default case 总应该存在,如果不允许到达,则应该保证:若到达了就会触发一个错误。Case的选择条件最好使用int或string类型。 (7)对齐规则:变数的申明和初始化都应对齐。

4.注释规范 4.1. 块注释 //用户名非空 验证+长度验证 +合法性验证 function checkUserName(){ var name = document.myform1.txtUser; if(name.value==""){ alert("请输入用户名"); name.focus(); return false; }else if(name.value.length<4||name.value.length>16){// 用户名长度验证 alert("用户名输入的长度4-16个字符"); name.select(); return false; } 4.2. 行注释 用户名非 空验证+长 度验证+合 法性验证 function checkUserName(){ var name = document.myform1.txtUser; if(name.value==""){ alert("请输入用户名"); name.focus(); return false; }else if(name.value.length<4||name.value.length>16){//用户名 长度验证 alert("用户名输入的长度4-16个字符"); name.select(); return false;

JToolpad代码生成工具使用说明文档

JToolpad代码生成工具使用说明文档 本文档是使大家能正确使用JToolpad工具,从而缩短开发时间,简化开发流程,生成规范且正确的代码。 1.打开JToolpad 如果本机有此工具则在开始菜单->所有程序中打开即可,若本机没有此程序,则可在局域网内找到,http://192.168.60.21/jtoolpad/ 点击链接即可打开工具。主界面如下:

打开已经编译好的pdm文件,即可导入数据结构

3配置属性 选择菜单中的模型选项,打开属性即可弹出如下对话框 1.应用代码:暂时无具体意义 2.Sysframework基本包名:是工具包的存放路径,随项目变化会相应的发生变化 3.应用基准包名:是具体的应用包的名称,比如上面的这个包platfrom下就会是具体的dto, web,service等 4.Java源代码目录:是具体的Java代码存放位置,此相必须指向component文件夹,在 component文件夹下就是相应的应用基准包名目录,如:component\com\ chinainsurance\application\platform\..... 5.Web应用根目录:是具体的web发布页面的存放位置,此项必须指向webapps文件夹, 在此文件夹下是具体的web发布路径。 配置好以上路径后确定即可。 注意:此项路径必须指向实际开发路径不能指向临时文件夹或备份文件夹。应为部分代码的生成是基于某些已经存在的文件而生成的,这点切记! 4生成代码方法 生成代码有两种方式: 第一种就是选择所需要的一个或多个表生成部分文件:方法是打开Tables的下来菜单,选中需要的一个或多个,在选中的这些表上点击右键,选择要生成的部分即可。

程序源代码注释规范

程序注释规范说明 程序注释规范应包括以下三方面: 一、文件头部注释 在代码文件的头部进行注释,这样做的好处在于,我们能对代码文件做变更跟踪。在代码头部分标注出创始人、创始时间、修改人、修改时间、代码的功能,这在团队开发中必不可少,它们可以使后来维护/修改的同伴在遇到问题时,在第一时间知道他应该向谁去寻求帮助,并且知道这个文件经历了多少次迭代、经历了多少个程序员的开发和修改。 样本: /***************************************************** ** 作者:Liuchao ** 创始时间:2007-11-12 ** 修改人:Liuchao ** 修改时间:2007-11-12 ** 修改人:Liaochao ** 修改时间:2007-11-12 ** 描述: ** 主要用于产品信息的资料录入,… *****************************************************/ 二、函数、属性、类等注释 请使用///三斜线注释,这种注释是基于XML的,不仅能导出XML制作帮助文档,而且在各个函数、属性、类等的使用中,编辑环境会自动带出注释,方便你的开发。以protected,protected Internal,public声明的定义注释都建议以这样命名方法。 例如: ///

/// 用于从ERP系统中捞出产品信息的类 ///

class ProductTypeCollector { … } 三、逻辑点注释 在我们认为逻辑性较强的地方加入注释,说明这段程序的逻辑是怎样的,以方便我们自己后来的理解以及其他人的理解,并且这样还可以在一定程度上排除BUG。在注释中写明我们的逻辑思想,对照程序,判断程序是否符合我们的初衷,如果不是,则我们应该仔细思考耀修改的是注释还是程序了… 四、变量注释 我们在认为重要的变量后加以注释,说明变量的含义,以方便我们自己后来的理解以及其他人的理解,并且这样还可以在一定程度上排除BUG.我们常用///三斜线注释。 /// 用于从ERP系统中捞出产品信息的类 class ProductTypeCollector { int STData;/// … }

源代码是什么

源代码是什么 源代码(也称源程序),是指一系列人类可读的计算机语言指令。在现代程序语言中,源代码可以是以书籍或者磁带的形式出现,但最为常用的格式是文本文件,这种典型格式的目的是为了编译出计算机程序。计算机源代码的最终目的是将人类可读的文本翻译成为计算机可以执行的二进制指令,这种过程叫做编译,通过编译器完成。 代码组合 源代码作为软件的特殊部分,可能被包含在一个或多个文件中。一个程序不必用同一种格式的源代码书写。例如,一个程序如果有C语言库的支持,那么就可以用C语言;而另一部分为了达到比较高的运行效率,则可以用汇编语言编写。较为复杂的软件,一般需要数十种甚至上百种的源代码的参与。为了降低种复杂度,必须引入一种可以描述各个源代码之间联系,并且如何正确编译的系统。在这样的背景下,修订控制系统(RCS)诞生了,并成为研发者对代码修订的必备工具之一。还有另外一种组合:源代码的编写和编译分别在不同的平台上实现,专业术语叫做软件移植。 质量 对于计算机而言,并不存在真正意义上的“好”的源代码;然而作为一个人,好的书写习惯将决定源代码的好坏。源代码是否具有可读性,成为好坏的重要标准。软件文档则是表明可读性的关键。 作用 源代码主要功用有如下2种作用: 生成目标代码,即计算机可以识别的代码。 对软件进行说明,即对软件的编写进行说明。为数不少的初学者,甚至少数有经验的程序员都忽视软件说明的编写,因为这部分虽然不会在生成的程序中直接显示,也不参与编译。但是说明对软件的学习、分享、维护和软件复用都有巨大的好处。因此,书写软件说明在业界被认为是能创造优秀程序的良好习惯,一些公司也硬性规定必须书写。

HTML网页编辑代码大全详细使用方法

html网页编辑代码大全详细使用方法 添加音乐 注册会员登录首页开通窝窝QQ-交流群站内娱乐颜色代码搜索帖子《声色具全》Summer°啦啦之乖乖宝贝啦啦&毛毛《简粉粉色》莫晓晓《简约蓝色》莫晓晓rose.《简约灰色》莫晓晓圣诞女孩【星期⒏音乐论坛】用心聆听,这里有你想要的声音。?【资源共享】?【论坛HTML帖子常用代码】-发现代码贴好看,不懂的,有兴趣的可以研究下。 网页搜索站内搜索搜索 返回列表回复发帖 发新话题发布投票发布悬赏发布辩论发布活动发布视频发布商品沵旳"唯1。发短消息 加为好友 沵旳"唯1。(只能a1自己。)当前离线 那些所谓d2情〃 UID21618帖子866精华42积分9318威望976金钱3587贡献1450阅读权限150性别女来自寂’在线时间248小时注册时间2009-11-29最后登录2010-3-1 ?星期⒏管理版主? UID21618帖子866精华42积分9318威望976金钱3587贡献1450阅读权限150性别女来自寂’在线时间248小时注册时间2009-11-29最后登录2010-3-1 【楼主】 打印字体大小:tT发表于2010-1-2114:53|只看该作者踩窝 窝送礼物问候Ta【论坛HTML帖子常用代码】-发现代码贴好看,不懂的,有兴趣的可以研究下。 关于“html图片移动...”的内容 本站搜索更多关于“html图片移动代码”的内容 本帖最后由沵旳"唯1。于2010-1-2114:54编辑 一、文字标记 基本代码如下:

QM算法源代码及说明(优选.)

最新文件---------------- 仅供参考--------------------已改成-----------word文本 --------------------- 方便更改 QM算法说明 一、需求分析 本算法要求输入一最小项和无关项的待化简表达式,通过程序处理输出化简后的结果。 二、算法流程 程序首先要求用户输入待化简表达式的变量数,然后要求用户逐个输入值为1的项,以2表示输入结束,再要求用户逐个输入无关项同样以2结束。程序将用户输入的所有数据储存在一个数据容器vector中,并将相关项单独存在另一个vector中。 然后程序通过循环遍历所有相关项,将相邻的项合并成蕴涵项存入新建的vector中,无法再合并的项显然为本源蕴涵项,存入专门的容器。之后再对新建的vector中的蕴涵项重复上述操作,直到找到所有的本源蕴涵项。由于变量最多为10个,故合并最多进行10次,故所有合并可在一个10元vector数组内完成。 当之前的工作完成时,此时显然已找到所有的本源蕴涵项,此时遍历之前存储的相关项,统计被覆盖的次数并输出只被覆盖一次的项所属的本源蕴涵项(皆为本质本源蕴涵项)。之后再从vector尾部开始输出其他本源蕴涵项直到所有的相关项都被覆盖为止。 三、运行结果 测试数据采用《现代逻辑设计》(第二版)P86的样例,F=Σm(4,5,6,8,9,10,13)+d(0,7,15); 结果并非最优的,是因为最后没有寻找最小覆盖导致的。

附:C++源代码 #include #include #include #include //#include using namespace std; //ofstream out("c://a.log"); bool comp(int n, char* a, char* b) { for(int i=0; i

源代码例子以及页面设置说明

chdgdfgeclid.a 1 2 #ifnfdgdfdef __CHEDGDFGCLID_A_ 3 #dedfgdffine __CHEGDFGCLID_A_ 4 5 /************************************************************************/ 6 /* 定义*/ 7 /************************************************************************/ 8 #defgdfgdfine FLADGDFGSH_SEDGDFGION 9 #defidgdne EDFGDFNS_ ADDGDFDESS_TEST 10 11 #defidgdfne EDGDFGNS_ ADDEDGDGSS_TEST_3 12 13 #defdgdfine NDGDFGEED _CHECK 6 14 15 typdfgdfedef enum 16 { CA_ONEISDGDFGEMPTY, 17 18 CA_TWOISEDGDFGMPTY, 19 CA_TWOISFFDGDFGULL 20 }chedgdfckusdfdfm; 21 typedsfsdfef ssfsdftruct 22 23 { TX_U8 desfdfsKey[9]; 24 25 TX_U8 desfsdfdsresult[9]; 26 TX_U64 crc64; }DedgdfgsDatsfsdfdsa_f; 27 28 29 /************************************************************************/ 30 /* 函数声明*/ 31 /************************************************************************/ 32 TX_ ChesfsfckValid(checkenum checkcase); 33 TX_ ResfsdfadFlash(void); 34 TX_ ReadRanFromPanel(void); 35 TX_ ResfsdfadSerial(void); TX_ ResfsdfadIPanel(void); 36 37 vdgdfgoid Plasdfsdfsfsdfsdar_To_Linear(TX_U8,TX_U9 N); 38 TX_BOOL BufferIsEmsfsdfdsfty(TX_U9 buffer[],int bufsdfdsffer_len); 39 40 TX_BOOL TX_BoxValid(void); 41 TX_U64 GetBxNo(void); 42 usfsdfdsfed char *GetPFSDlSerial(void); 43 #endgdfdif 44 3 sr_burGDFGnflash.h 45 /* 46 sr_busdgdfffsgdfsdsh.a - hdfsdfer file for sr_bfdfsdflash.D 47 48 */ 49 50 #ifndgdfgdef _SR_BURFSDFNFLASH_A_

代码编写规范说明书

代码编写规范说明书(c#.net与https://www.wendangku.net/doc/95237041.html,)目录 1 目的 2 范围 3 注释规范 3.1 概述 3.2 自建代码文件注释 3.3 模块(类)注释 3.4 类属性注释 3.5 方法注释 3.6 代码间注释 4 命名总体规则 5 命名规范 5.1 变量(Variable)命名 5.2 常量命名 5.3 类(Class)命名 5.4 接口(Interface)命名 5.5 方法(Method)命名 5.6 名称空间Namespace)命名 6 编码规则 6.1 错误检查规则 6.2 大括号规则 6.3 缩进规则 6.4 小括号规则 6.5 If Then Else规则 6.6 比较规则 6.7 Case规则 6.8 对齐规则 6.9 单语句规则 6.10 单一功能规则 6.11 简单功能规则 6.12 明确条件规则 6.13 选用FALSE规则 6.14 独立赋值规则 6.15 定义常量规则 6.16 模块化规则 6.17 交流规则 7 编程准则 7.1 变量使用 7.2 数据库操作 7.3 对象使用 7.4 模块设计原则 7.5 结构化要求 7.6 函数返回值原则 8 代码包规范 8.1 代码包的版本号

8.2 代码包的标识 9 代码的控制 9.1 代码库/目录的建立 9.2 代码归档 10 输入控制校验规则 10.1 登陆控制 10.2 数据录入控制 附件1:数据类型缩写表 附件2:服务器控件名缩写表 1 目的 一.为了统一公司软件开发设计过程的编程规范 二.使网站开发人员能很方便的理解每个目录,变量,控件,类,方法的意义 三.为了保证编写出的程序都符合相同的规范,保证一致性、统一性而建立的程序编码规范。 四.编码规范和约定必须能明显改善代码可读性,并有助于代码管理、分类范围适用于企业所有基于.NET平台的软件开发工作 2 范围 本规范适用于开发组全体人员,作用于软件项目开发的代码编写阶段和后期维护阶段。 3 注释规范 3.1 概述 a) 注释要求英文及英文的标点符号。 b) 注释中,应标明对象的完整的名称及其用途,但应避免对代码过于详细的描述。 c) 每行注释的最大长度为100个字符。 d) 将注释与注释分隔符用一个空格分开。 e) 不允许给注释加外框。 f) 编码的同时书写注释。 g) 重要变量必须有注释。 h) 变量注释和变量在同一行,所有注释必须对齐,与变量分开至少四个“空格”键。 如:int m_iLevel,m_iCount; // m_iLevel ....tree level // m_iCount ....count of tree items string m_strSql; //SQL i) 典型算法必须有注释。 j) 在循环和逻辑分支地方的上行必须就近书写注释。 k) 程序段或语句的注释在程序段或语句的上一行 l) 在代码交付之前,必须删掉临时的或无关的注释。 m) 为便于阅读代码,每行代码的长度应少于100个字符。 3.2 自建代码文件注释 对于自己创建的代码文件(如函数、脚本),在文件开头,一般编写如下注释: /****************************************************** FileName: Copyright (c) 2004-xxxx *********公司技术开发部 Writer: create Date: Rewriter:

html源代码解释

常用HTML代码解释 一、文字 1.标题文字.......... #=1~6;h1为最大字,h6为最小字 2.字体变化.......... 【1】字体大小.......... #=1~7;数字愈大字也愈大【2】指定字型.......... 【3】文字颜色.......... rr:表红色(red)色码 gg:表绿色(green)色码 bb:表蓝色(blue)色码 rrggbb也可用6位颜色代码数字 3.显示小字体.......... 4.显示大字体.......... 5.粗体字.......... 6.斜体字.......... 7.打字机字体.......... 8.底线.......... 9.删除线.......... 10.下标字.......... 11.上标字.......... 12.文字闪烁效果.......... 13.换行(也称回车)
14.分段

15.文字的对齐方向

#号可为left:表向左对齐(预设值)center:表向中对齐right:表向右对齐P.S.

之后的文字都会以所设的对齐方式显示,直到出现另一个

改变其对齐方向,遇到


标签时会自动设回预设的向左对齐。 16.分隔线
【1】分隔线的粗细
【2】分隔线的宽度
【3】分隔线对齐方向
#号可为left:表向左对齐(预设值)center:表向中对齐right:表向右对齐 【4】分隔线的颜色
【5】实心分隔线
17.居中对齐
..........
18.依原始样式显示
..........
19.指令的属性 【1】背景颜色-- bgcolor 【2】背景图案-- background 【3】设定背景图案不会卷动-- bgproperties 【4】文件内容文字的颜色-- text 【5】超连结文字颜色-- link 【6】正被选取的超连结文字颜色-- vlink 【7】已连结过的超连结文字颜色-- alink 20.文字移动指令.......... 移动速度指令是:scrollAmount=# #最小为1,速度为最慢;数字越大移动的越快。 移动方向指令是:direction=# up向上、down向下、left向左、right向右。 指令举例:.......... 二、图片 1.插入图片 2.设定图框-- border 3.设定图形大小-- width、height

程序员代码编写标准指南汇总

Delphi 6 程序员代码编写标准指南 一、序言 二、通用源代码格式规则 2.1 缩格 2.2 页边空格 2.3 Begin…End 配对 2.4 代码文件中通用符号含义 三、Object Pascal 3.1 括号 3.2 保留字和关键字 3.3 过程和函数(例程) 3.3.1 命名/格式化 3.3.2 形式参数 3.3.2.1 格式化 3.3.2.2 命名 3.3.2.3 参数的排序 3.3.2.4 常量参数 3.3.2.5 名称的冲突 3.4 变量 3.4.1 变量的命名和格式 3.4.2 局部变量 3.4.3 全局变量的使用 3.5 类型 3.5.1 大写约定 3.5.1.1 浮点指针类型 3.5.1.2 枚举类型 3.5.1.3 变数和ole变数类型 3.5.2 结构类型 3.5.2.1 数组类型 3.5.2.2 记录类型 3.6 语句 3.6.1 if 语句 3.6.2 case 语句 3.6.2.1 一般性话题 3.6.2.2 格式 3.6.3 while 语句 3.6.4 for 语句 3.6.5 repeat 语句

3.6.6 with 语句 3.6.6.1 一般话题 3.6.6.2 格式 3.7 结构异常处理 3.7.1 一般话题 3.7.2 try…finally的使用 3.7.3 try…except的使用 3.7.4 try…except…else的使用 3.8 类类型 3.8.1 命名和格式 3.8.2 域 3.8.2.1 命名/格式 3.8.2.2 可视化 3.8.3 方法 3.8.3.1 命名/格式 3.8.3.2 使用静态的方法 3.8.3.3 使用虚拟/动态的方法 3.8.3.4 使用抽象的方法 3.8.3.5 属性存取方法 3.8.4 属性 3.8. 4.1 命名/格式 3.8. 4.2 使用存取的方法 四、文件 4.1 工程文件 4.1.1 命名 4.2 窗体文件 4.2.1 命名 4.3 数据模板文件 4.3.1 命名 4.4 远端数据模板文件 4.4.1 命名 4.5 Unit文件 4.5.1 通用Unit结构 4.5.1.1 unit的名字 4.5.1.2 uses子句 4.5.1.3 interface部分 4.5.1.4 implementation部分 4.5.1.5 initialization部分 4.5.1.6 finalization部分 4.5.2 窗体单元

如何看懂源代码--(分析源代码方法)

如何看懂源代码--(分析源代码方法) 4 推 荐 由于今日计划着要看Struts 开源框架的源代码 昨天看了一个小时稍微有点头绪,可是这个速度本人表示非常不满意,先去找了下资 料, 觉得不错... 摘自(繁体中文 Traditional Chinese):http://203.208.39.132/translate_c?hl=zh-CN&sl=en&tl=zh-CN&u=http://ww https://www.wendangku.net/doc/95237041.html,/itadm/article.php%3Fc%3D47717&prev=hp&rurl=https://www.wendangku.net/doc/95237041.html,&usg=AL kJrhh4NPO-l6S3OZZlc5hOcEQGQ0nwKA 下文为经过Google翻译过的简体中文版: 我们在写程式时,有不少时间都是在看别人的代码。 例如看小组的代码,看小组整合的守则,若一开始没规划怎么看,就会“噜看噜苦(台语)”不管是参考也好,从开源抓下来研究也好,为了了解箇中含意,在有限的时间下,不免会对庞大的源代码解读感到压力。网路上有一篇关于分析看代码的方法,做为程式设计师的您,不妨参考看看,换个角度来分析。也能更有效率的解读你想要的程式码片段。 六个章节: ( 1 )读懂程式码,使心法皆为我所用。( 2 )摸清架构,便可轻松掌握全貌。( 3 )优质工具在手,读懂程式非难事。( 4 )望文生义,进而推敲组件的作用。( 5 )找到程式入口,再由上而下抽丝剥茧。( 6 )阅读的乐趣,透过程式码认识作者。 程式码是别人写的,只有原作者才真的了解程式码的用途及涵义。许多程式人心里都有一种不自觉的恐惧感,深怕被迫去碰触其他人所写的程式码。但是,与其抗拒接收别人的程式码,不如彻底了解相关的语言和惯例,当成是培养自我实力的基石。 对大多数的程式人来说,撰写程式码或许是令人开心的一件事情,但我相信,有更多人视阅读他人所写成的程式码为畏途。许多人宁可自己重新写过一遍程式码,也不愿意接收别人的程式码,进而修正错误,维护它们,甚至加强功能。 这其中的关键究竟在何处呢?若是一语道破,其实也很简单,程式码是别人写的,只有原作者才真的了解程式码的用途及涵义。许多程式人心里都有一种不自觉的恐惧感,深怕被迫去碰触其他人所写的程式码。这是来自于人类内心深处对于陌生事物的原始恐惧。 读懂别人写的程式码,让你收获满满 不过,基于许多现实的原因,程式人时常受迫要去接收别人的程式码。例如,同事离职了,必须接手他遗留下来的工作,也有可能你是刚进部门的菜鸟,而同事经验值够了,升级了,风水轮流转,一代菜鸟换菜鸟。甚至,你的公司所承接的专案,必须接手或是整合客户前一个厂商所遗留下来的系统,你们手上只有那套系统的原始码(运气好时,还有数量不等的文件)。 诸如此类的故事,其实时常在程式人身边或身上持续上演着。许多程式人都将接手他人的程式码,当做一件悲惨的事情。每个人都不想接手别人所撰写的程式码,因为不想花时间去探索,宁可将生产力花在产生新的程式码,而不是耗费在了解这些程式码上。

什么叫源代码(多种说法)

百度知道版: 请参阅Baidu百科的回答: source code 源程序是指未编译的文本代码。 验证码主要是为防止暴利破解,所以需要防止图片识别。所以验证码一般情况下为书写不正规,且有随机的背景杂点,或杂线 源代码(也称源程序),是指一系列人类可读的计算机语言指令。 在现代程序语言中,源代码可以是以书籍或者磁带的形式出现,但最为常用的格式是文本文件,这种典型格式的目的是为了编译出计算机程序。计算机源代码的最终目的是将人类可读的文本翻译成为计算机可以执行的二进制指令,这种过程叫做编译,通过编译器完成。 作用: 源代码主要功用有如下2种作用: 生成目标代码,即计算机可以识别的代码。 对软件进行说明,即对软件的编写进行说明。为数不少的初学者,甚至少数有经验的程序员都忽视软件说明的编写,因为这部分虽然不会在生成的程序中直接显示,也不参与编译。但是说明对软件的学习、分享、维护和软件复用都有巨大的好处。因此,书写软件说明在业界被认为是能创造优秀程序的良好习惯,一些公司也硬性规定必须书写。 需要指出的是,源代码的修改不能改变已经生成的目标代码。如果需要目标代码做出相应的修改,必须重新编译。 代码组合:

源代码作为软件的特殊部分,可能被包含在一个或多个文件中。一个程序不必用同一种格式的源代码书写。例如,一个程序如果有C语言库的支持,那么就可以用C语言;而另一部分为了达到比较高的运行效率,则可以用汇编语言编写。 较为复杂的软件,一般需要数十种甚至上百种的源代码的参与。为了降低种复杂度,必须引入一种可以描述各个源代码之间联系,并且如何正确编译的系统。在这样的背景下,修订控制系统(RCS)诞生了,并成为研发者对代码修订的必备工具之一。 还有另外一种组合:源代码的编写和编译分别在不同的平台上实现,专业术语叫做软件移植。 版权: 如果按照源代码类型区分软件,通常被分为两类:自由软件和非自由软件。自由软件一般是不仅可以免费得到,而且公开源代码;相对应地,非自由软件则是不公开源代码。所有一切通过非正常手段获得非自由软件源代码的行为都将被视为非法。 质量: 对于计算机而言,并不存在真正意义上的“好”的源代码;然而作为一个人,好的书写习惯将决定源代码的好坏。源代码是否具有可读性,成为好坏的重要标准。软件文档则是表明可读性的关键。 效率: 虽然我们可以通过不同的语言来实现计算机的 同一功能,但在执行效率上则存在不同。普遍规律是:越高级的语言,其执行效率越低。这也是为什么汇编语言生成的文件比用VB语言生成文件普遍要小的原因。 源代码”在汉英词典中的解释(来源:百度词典): 1. [Computer] source code (human-readable program statements, written in a high-level

源代码管理办法的拟草说明

关于拟草源代码归档、保密、使用管理办法的说明 根据公司产品的开发情况,在开发过程中经常会存在一个项目会有多个开发人员共同开发,每个人在各自的机器上有整个软件的拷贝,并对之实施编码,分别完成各自任务之后,再通过文本比对工具将各自机器上的不同版本的软件整合到一台机器上。 在开发中会存在如下版本控制管理的问题: 1 软件代码的一致性 软件的开发、维护和升级,往往是多个人共同协作的过程。不同人对同一个软件的不同部分同时做着修改,这种行为有时会出现彼此交叉的情况。为了始终保证代码的一致性,一种解决办法是,要求修改者每次修改后都通过某种方式告知同组其他人员,或者随时对软件做整合。但是这样,一方面会增加开发人员的负担,另一方面也降低了软件的开发效率。 2 软件内容的冗余问题 软件在各自开发人员的机器上都有拷贝,并且同一个开发人员在不同时期也会在本机保留当时的软件版本,也就是说,一台机器上还可能不止一个版本。对于不同版本而言,其差别有时可能并不很大。随着时间的推移,开发人员可能对自己机器上的不同版本间具体差异的了解变得模糊不情,甚至忘记了当时为什么区分这些版本的原因,这会给整合带来麻烦。 3 软件过程的“事务性” 对于软件的某个版本,如果开发人员想要为其增添新的功能,或改善原有功能,而又担心会搅乱原来运行良好的软件。一种常用的办法,就是保留现有版本,另复制一个新的拷贝,并在新的副本上进行修改。这类似于一种事务处理,当将一系列操作做为一个事务时,如

果中间某个操作出现偏差,则希望恢复到执行事务之前的状况。而当完成修改之后,开发人员该如何处理这两个副本呢? 4 软件开发的“并发性” 由于是多人共同开发一个软件,期间出现多人修改软件的同一部分,尤其是同时修改,有时是不可避免的。对于前者,具有良好编程习惯的人员的一种通常做法是,对他人的源程序进行修改时添加必要的注释,写明修改人,修改原因,修改日期等。这种做法增加了开发人员的负担:他需要在考虑代码逻辑的同时,兼顾如何写注释,而且,不论是否是同时修改,都需要考虑提到的一致性问题,需要及时进行人工的差异比较和整合以便形成一个统一的新版本。 5 源代码的安全性 公司项目开发的成果即为源代码,如何记录编写源代码的全过程,如何保证源代码的正确性和安全性是关乎公司生存和发展的头等大事。 为了解决上述存在的问题,记录开发项目的全过程,使开发过程可追塑、可修改、可完善,确保公司研发的源代码和技术文档的正确性,经公司领导人员讨论一致认为必须将公司的研发过程和研发成果管理好,确保源代码的安全性,因此着手拟草源代码归档、保密、使用管理办法。

源代码结构

操作系统课程设计-10 NachOS-3.4系统的 Makefiles结构说明

make命令与Makefiles结构make是一种控制编译或重复编译软件的工具软件,make可以自动管理软件的编译内容、 编译方式和编译时机。使用make 需要你为你所编写的软件的开发过程和组织结构编写一个Makefile文件。make将根据MAkefile中的说明去自动管理你的软件的开发过程。Makefile是一个文本形式的数据库文件。

make包含以下目标软件的生 成规则: ?目标体(target),即make要建立的目标文件。 ?目标的依赖体(dependency)列表,通常为要编译的源文件或要连接的浮动目标代码文件。?从目标依赖体创建目标体的命令(command)列表,通常为编译或连接命令。

以上叙述在Makefile中用以下 规则形式表示 target:dependency[…] command1 command2 […]

例如我们编写了一个C程序存放在hello.c和一个hello.h文件中,为了使用make自动管理这个C程序的开发,可以编写以下Makefile文件:hell.o: hello.c hello.h gcc -c hello.c hello.h hello:hello.o gcc hello.o –o hello clean: rm –f *.o

这样我们就可以使用make按我们说明在Makefile中的编译规则编译我们的程序了:$make 生成可执行文件hello $make hello.o 生成浮动模块文件hello.o $make clean 清除所有.o文件

学生信息管理系统 设计说明书(含源代码)

******************* 实践教学 ******************* 兰州理工大学 计算机与通信学院 2013年秋季学期 面向对象课程设计 题目:学生信息管理系统 专业班级:计算机科学与技术二班 姓名:刘俊锋 学号:12240224 指导教师:庞淑侠 成绩:

前言 学生信息管理系统,是针对学校人事处的大量业务处理工作而开发的管理软件,是典型的管理信息系统。 它是一个教育单位不可缺少的部分,它的内容对于学校管理者来说是至关重要的,能有效的帮助学校和老师掌握学生的情况。在传统模式下利用人工进行学生信息管理,存在着较多的缺点,如:效率底,保密性差,时间一长将产生大量的文件和数据,更不便于查找,更新,维护等。诸如这些情况,令学校管理者对学生的信息管理带来了很大困难,严重影响了教育工作者的工作效率。随着科学技术的不断提高,使用日趋成熟的计算机技术来代替传统的人工模式,来实现学生信息的现代化管理,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。作为计算机应用的一部分,使用计算机对学生信息进行管理,具有着手工管理所无法比拟的优点。例如:检索迅速、查找方便、易修改、可靠性高、存储量大、数据处理快捷、保密性好、寿命长、成本低等。这些优点能够极大地提高学生信息管理的效率,也是学校实现科学化、正规化管理的重要条件。因此,开发这样一套管理软件成为很有必要的事情。

目录 摘要 (4) 第一章系统总体设计 (5) 1.1系统功能模块图 (5) 1.2类与函数的关系 (5) 第二章详细设计 (7) 2.1 初始录入功能 (7) 2.2 添加函数 (7) 2.3 删除函数 (7) 2.4 修改函数 (7) 2.5 查询函数 (8) 2.5.1 按姓名查询 (8) 2.5.2 按学号查询 (8) 2.6 显示函数 (8) 2.7 退出系统 (8) 第三章系统测试 (9) 3.1测试方法 (9) 3.2测试用例 (9) 3.3测试结果 (9) 第四章软件使用说明书 (13) 总结 (14) 参考文献 (15) 致谢 (16) 附录:程序代码 (17)

相关文档