搜档网
当前位置:搜档网 › nopcommerce 系统开发文档

nopcommerce 系统开发文档

nopcommerce 系统开发文档
nopcommerce 系统开发文档

nopcommerce中的主题模块

利用nopcommerce中的主题模块(或者叫“皮肤”,“模板”),我们可以很方便地从管理界面选择当前主题。

今天把主题这块的知识整理一下,同时也起个抛砖引玉的作用。

1.如何使用。

主题的使用很简单,只有3步:

a 上传你的新主题到themes文件夹下

b把head.cshtml中的CSS路径换成你自己的,这个在开发主题的时候应该就搞定了

c 在后台管理面板中选择你新的主题,保存,然后你就能在前台看到了。

2.它是如何加载的?

这是本文重点。

说到加载机制就要说到主题模块用到的三个类,它们都位于Nop.Web.Framework.Themes下:ThemeableRazorViewEngine - 继承自下边一个类

ThemeableBuildManagerViewEngine - 继承自下边一个类ThemeableVirtualPathProviderViewEngine

然后是起到触发作用的Global.asax.cs

那么nopcommerce是一个MVC项目,大家都清楚视图文件都是放在view文件夹下的,为嘛nopcommerce 能直接读取theme里的视图哪?

OK先来说这三个和主题相关的类是怎么回事。

首先看ThemeableVirtualPathProviderViewEngine,它是从VirtualPathProviderViewEngine类继承的,使用此类可以改变所谓的视图的对应文件夹的实际位置,比如:

public ThemeableRazorViewEngine()

{

AreaViewLocationFormats = new[]

{

//themes

"~/Areas/{2}/Themes/{3}/Views/{1}/{0}.cshtml",

"~/Areas/{2}/Themes/{3}/Views/{1}/{0}.vbhtml",

"~/Areas/{2}/Themes/{3}/Views/Shared/{0}.cshtml",

"~/Areas/{2}/Themes/{3}/Views/Shared/{0}.vbhtml",

//default

"~/Areas/{2}/Views/{1}/{0}.cshtml",

"~/Areas/{2}/Views/{1}/{0}.vbhtml",

"~/Areas/{2}/Views/Shared/{0}.cshtml",

"~/Areas/{2}/Views/Shared/{0}.vbhtml"

};

AreaMasterLocationFormats = new[]

{

//themes

"~/Areas/{2}/Themes/{3}/Views/{1}/{0}.cshtml",

"~/Areas/{2}/Themes/{3}/Views/{1}/{0}.vbhtml",

"~/Areas/{2}/Themes/{3}/Views/Shared/{0}.cshtml",

"~/Areas/{2}/Themes/{3}/Views/Shared/{0}.vbhtml",

//default

"~/Areas/{2}/Views/{1}/{0}.cshtml",

"~/Areas/{2}/Views/{1}/{0}.vbhtml",

"~/Areas/{2}/Views/Shared/{0}.cshtml",

"~/Areas/{2}/Views/Shared/{0}.vbhtml"

};

AreaPartialViewLocationFormats = new[]

{

//themes

"~/Areas/{2}/Themes/{3}/Views/{1}/{0}.cshtml",

"~/Areas/{2}/Themes/{3}/Views/{1}/{0}.vbhtml",

"~/Areas/{2}/Themes/{3}/Views/Shared/{0}.cshtml",

"~/Areas/{2}/Themes/{3}/Views/Shared/{0}.vbhtml",

//default

"~/Areas/{2}/Views/{1}/{0}.cshtml",

"~/Areas/{2}/Views/{1}/{0}.vbhtml",

"~/Areas/{2}/Views/Shared/{0}.cshtml",

"~/Areas/{2}/Views/Shared/{0}.vbhtml"

};

ViewLocationFormats = new[]

{

//themes

"~/Themes/{2}/Views/{1}/{0}.cshtml",

"~/Themes/{2}/Views/{1}/{0}.vbhtml",

"~/Themes/{2}/Views/Shared/{0}.cshtml",

"~/Themes/{2}/Views/Shared/{0}.vbhtml",

//default

"~/Views/{1}/{0}.cshtml",

"~/Views/{1}/{0}.vbhtml",

"~/Views/Shared/{0}.cshtml",

"~/Views/Shared/{0}.vbhtml",

//Admin

"~/Administration/Views/{1}/{0}.cshtml",

"~/Administration/Views/{1}/{0}.vbhtml",

"~/Administration/Views/Shared/{0}.cshtml",

"~/Administration/Views/Shared/{0}.vbhtml",

};

MasterLocationFormats = new[]

{

//themes

"~/Themes/{2}/Views/{1}/{0}.cshtml",

"~/Themes/{2}/Views/{1}/{0}.vbhtml",

"~/Themes/{2}/Views/Shared/{0}.cshtml",

"~/Themes/{2}/Views/Shared/{0}.vbhtml",

//default

"~/Views/{1}/{0}.cshtml",

"~/Views/{1}/{0}.vbhtml",

"~/Views/Shared/{0}.cshtml",

"~/Views/Shared/{0}.vbhtml"

};

PartialViewLocationFormats = new[]

{

//themes

"~/Themes/{2}/Views/{1}/{0}.cshtml",

"~/Themes/{2}/Views/{1}/{0}.vbhtml",

"~/Themes/{2}/Views/Shared/{0}.cshtml",

"~/Themes/{2}/Views/Shared/{0}.vbhtml",

//default

"~/Views/{1}/{0}.cshtml",

"~/Views/{1}/{0}.vbhtml",

"~/Views/Shared/{0}.cshtml",

"~/Views/Shared/{0}.vbhtml",

//Admin

"~/Administration/Views/{1}/{0}.cshtml",

"~/Administration/Views/{1}/{0}.vbhtml",

"~/Administration/Views/Shared/{0}.cshtml",

"~/Administration/Views/Shared/{0}.vbhtml",

};

FileExtensions = new[] { "cshtml", "vbhtml" };

}

以上代码不难看出,除了nopcommerce的主题,还有管理界面啊之类的都定好了View是在哪个物理路径上。

很自然地,我们在global文件里,应用启动的时候调用这么一段话就可以让nopcommerce把主题定向theme文件夹:

if (databaseInstalled)

{

//remove all view engines

ViewEngines.Engines.Clear();

//except the themeable razor view engine we use

ViewEngines.Engines.Add(new ThemeableRazorViewEngine());

}

VirtualPathProviderViewEngine其实不是一个新东西,很早就有了,而且不但是MVC,就连webform 也可以用它。更多信息,*丝们可以猛击此处

3.扩展主题机制。

既然知道原理,我们就可以着手扩展,这个就是个大题目了,如何扩展在具体个人,我们来举2个例子:1默认管理路径为administration,我们可以改成自己想要的路径

2主题不定要放到Themes里,我们修改代码可以让它从其它地方读取视图文件。进一步来讲还可以把视图文件存放到数据库中。

NopCommerce里的计划任务机制

Nop.Web.Global.asax.cs

//start scheduled tasks

if (databaseInstalled)

{

TaskManager.Instance.Initialize();

TaskManager.Instance.Start();

}

做一个你自己的计划任务

1、依照下述(三、)中所列,为YourNewTask类做好路径,它应该有ITask接口;

2、YourNewTask只有一个无参数的方法:Execute。在任务要执行的时候,这个方法会被调用。

3、数据表ScheduleTask中添加一条记录。你可以手动添加,或使用IScheduleTaskService来添加记录。

现有的任务:(nop 2.50)

1 Send emails 60 Nop.Services.Messages.QueuedMessagesSendTask, Nop.Services

2 Keep alive 300 https://www.sodocs.net/doc/d16630372.html,mon.KeepAliveTask, Nop.Services

3 Delete guests 600 Nop.Services.Customers.DeleteGuestsTask, Nop.Services

4 Clear cache 600 Nop.Services.Caching.ClearCacheTask, Nop.Services

5 Update currency exchange rates 900 Nop.Services.Directory.UpdateExchangeRateTask,

Nop.Services

6 MailChimp sync 3600 Nop.Plugin.Misc.MailChimp.MailChimpSynchronizationTask,

Nop.Plugin.Misc.MailChimp

7 Froogle static file generation 3600 Nop.Plugin.Feed.Froogle.StaticFileGenerationTask,

Nop.Plugin.Feed.Froogle

nopcommerce计划任务分析

对比了一下nopcommerce和orchard的计划任务,orchard的复杂的不是一点点,如果想拆下来自己用难度很大,搜索拆了 orchard的lucene处理模块,邮件队列拆的discuznt和nopcommerce的结合,计划任务就拆nopcommerce的了,discuznt计划任务设计的没nopcommerce的好。

1.nopcommerce的tasks结构如下:

IScheduleTaskService.cs 接口,这个主要是获取数据库里的任务信息,ScheduleTaskService.cs去实现它就可以了,当然需要在容器里注入一下。

ITask 这个接口比较特别但是很重要,所有的任务处理类都要实现里面唯一的Execute方法。执行计划任务时就需要通过反射来执行这个实现。

namespace Nop.Services.Tasks

{

///

/// Interface that should be implemented by each task

///

public partial interface ITask

{

///

/// Execute task

///

void Execute();

}

}

核心类之一:Task.cs,这个主要是处理任务的执行过程及执行过程类的结果处理。

private ITask CreateTask()

{

ITask task = null;

if (this.Enabled)

{

var type2 = System.Type.GetType(this.Type);

if (type2 != null)

{

object instance;

if (!EngineContext.Current.ContainerManager.TryResolve(type2, out instance))

{

//not resolved

instance = EngineContext.Current.ContainerManager.ResolveUnregistered(type2); }

task = instance as ITask;

}

}

return task;

}

通过反射来找到编写的计划任务类。例如下面的发送邮件的任务。

using System;

using Nop.Services.Logging;

using Nop.Services.Tasks;

namespace Nop.Services.Messages

{

///

/// Represents a task for sending queued message

///

public partial class QueuedMessagesSendTask : ITask

{

private readonly IQueuedEmailService _queuedEmailService;

private readonly IEmailSender _emailSender;

private readonly ILogger _logger;

public QueuedMessagesSendTask(IQueuedEmailService queuedEmailService,

IEmailSender emailSender, ILogger logger)

{

this._queuedEmailService = queuedEmailService;

this._emailSender = emailSender;

this._logger = logger;

}

///

/// Executes a task

///

public void Execute()

{

var maxTries = 3;

var queuedEmails = _queuedEmailService.SearchEmails(null, null, null, null,

true, maxTries, false, 0, 500);

foreach (var queuedEmail in queuedEmails)

{

var bcc = String.IsNullOrWhiteSpace(queuedEmail.Bcc)

? null

: queuedEmail.Bcc.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);

var cc = String.IsNullOrWhiteSpace(https://www.sodocs.net/doc/d16630372.html,)

? null

: https://www.sodocs.net/doc/d16630372.html,.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);

try

{

_emailSender.SendEmail(queuedEmail.EmailAccount, queuedEmail.Subject, queuedEmail.Body,

queuedEmail.From, queuedEmail.FromName, queuedEmail.To, queuedEmail.ToName, bcc, cc);

queuedEmail.SentOnUtc = DateTime.UtcNow;

}

catch (Exception exc)

{

_logger.Error(string.Format("Error sending e-mail. {0}", exc.Message), exc);

}

finally

{

queuedEmail.SentTries = queuedEmail.SentTries + 1;

_queuedEmailService.UpdateQueuedEmail(queuedEmail);

}

}

}

}

}

执行完任务后需要将数据库里的任务记录状态更改,主要是时间状态变更。

核心执行方法:

///

/// Executes the task

///

public void Execute()

{

this.IsRunning = true;

var scheduleTaskService = EngineContext.Current.Resolve();

var scheduleTask = scheduleTaskService.GetTaskByType(this.Type);

try

{

var task = this.CreateTask();

if (task != null)

{

https://www.sodocs.net/doc/d16630372.html,stStartUtc = DateTime.UtcNow;

if (scheduleTask != null)

{

//update appropriate datetime properties

https://www.sodocs.net/doc/d16630372.html,stStartUtc = https://www.sodocs.net/doc/d16630372.html,stStartUtc;

scheduleTaskService.UpdateTask(scheduleTask);

}

//execute task

task.Execute();

https://www.sodocs.net/doc/d16630372.html,stEndUtc = https://www.sodocs.net/doc/d16630372.html,stSuccessUtc = DateTime.UtcNow;

}

}

catch (Exception exc)

{

this.Enabled = !this.StopOnError;

https://www.sodocs.net/doc/d16630372.html,stEndUtc = DateTime.UtcNow;

//log error

var logger = EngineContext.Current.Resolve();

logger.Error(string.Format("Error while running the '{0}' schedule task. {1}", https://www.sodocs.net/doc/d16630372.html,, exc.Message), exc);

}

if (scheduleTask != null)

{

//update appropriate datetime properties

https://www.sodocs.net/doc/d16630372.html,stEndUtc = https://www.sodocs.net/doc/d16630372.html,stEndUtc;

https://www.sodocs.net/doc/d16630372.html,stSuccessUtc = https://www.sodocs.net/doc/d16630372.html,stSuccessUtc;

scheduleTaskService.UpdateTask(scheduleTask);

}

this.IsRunning = false;

}

任务管理类:TaskManager.cs,主要负责任务的初始化,添加到线程列表,任务的开始和停止。需要在Global里初始化和开始任务,它会根据线程里的定时器自动读取任务列表执行任务。

//start scheduled tasks

if (databaseInstalled)

{

TaskManager.Instance.Initialize();

TaskManager.Instance.Start();

}

任务线程管理类:TaskThread.cs,任务线程类,TaskManager将任务都添加到此线程管理类里,此线程管理主要负责判断任务的执行状态,线程执行间隔时间及调用任务执行的主方法Execute,通过Timer 定时器实现定时自动运行。

主方法为:

private void Run()

{

if (Seconds <= 0)

return;

this.StartedUtc = DateTime.UtcNow;

this.IsRunning = true;

foreach (Task task in this._tasks.Values)

{

task.Execute();

}

this.IsRunning = false;

}

从任务列表中读取任务并执行。

在NopCommerce中新增一个Domain Model的步骤

1.在NopCommerce中新增一个Domain Model,需要以下几个步骤:

2.新建一个Entity Class (Nop/Core/Domain/Entity.cs)

3.新建一个Mapping Class (Nop/Data/Mapping/EntityMap.cs)

4.新建一个View Model (Nop/Admin/Models/EntityModel.cs 或Nop/Web/Models/EntityModel.cs)

5.新建Model Validator (Nop/Admin/Validators/EntityValidator.cs 或Nop/Web/Validators/EntityValidator.cs)

6.为AutoMapper新建映射配置,用来完成Model和Entity之间的转换

(Nop/Admin/Infrastructure/AutoMapperStartupTask.cs 或Nop/Web/Infrastructure/AutoMapperStartupTask.cs)

7.编写ToModel和ToEntity (Nop/Admin/MappingExtensions.cs 或Nop/Web/MappingExtensions.cs)

8.创建Service和Service Interface (Nop/Services/EntityService.cs 和Nop/Services/IEntityService.cs)

9.最后新建的Model创建Controller和View

PS: NopCommerce不支持database migration,需要手动更新数据库。

参考资料:https://www.sodocs.net/doc/d16630372.html,/docs/73/updating-an-existing-entity-how-to-add-a-new-property.aspx

NopCommerce MVC 插件机制分析

基本原理

插件化的应用程序一般都是先定义插件接口,然后把插件编译的dll放到固定的目录中,应用程序主程序通过加载那些实现了插件接口的dll来实现插件的使用。NopCommerce也是这样,但作为MVC Web应用程序会有一些不一样,首先是不同信任级别(Full Trust,Medium Trust)的时候加载dll的策略会有不一样,另外就是怎样显示插件中的View的问题。

放插件的文件夹

NopCommerce的插件放在网站主目录的Plugins目录下,Plugins下面有很多文件夹,一个插件类库就是一个文件夹。在插件类库中修改编译输出的地址为网站主目录的Plugins文件夹,这样插件生成的dll 就能自动在目标文件夹下面。如下图:

另一个文件夹是ShadowCopy文件夹,就在Plugins/bin文件夹下。关于为什么要用ShadowCopy,住这篇文章中有所叙述,NopCommerce就是参考它的实现。里面也详细叙述了信任级别的问题。

网站启动

我们先来看PluginManager.Initialize方法。通过在PluginManager类上定义如下属性保证PluginManager的Initialize方法在网站开始的时候运行,早于Application_Start运行。

[assembly: PreApplicationStartMethod(typeof(PluginManager), "Initialize")]

在Application_Start之前运行初始化代码主要是为了让网站应用程序可以引用到加载的dll。

核心类

IPluginFinder.cs接口:获取插件的信息接口,在ioc里的Nop.Web.Framework.DependencyRegistrar注册此接口。系统启动的时候会加载到内存里。

IPlugin.cs:插件的操作接口,主要有设置插件的属性信息,安装插件接口,卸载插件接口。BasePlugins.cs 实现IPlugin.cs的方法。

PluginDescriptor.cs 插件的实体类,包含了插件的版本、描述,类型,文件名称,作者,等等一系列状态。

PluginFileParser.cs 包含对插件的实体操作方法,主要是写入插件的描述信息。

PluginFinder.cs 加载所有的插件,并获取它们的信息.

PluginManager.cs 插件管理的主类,看里面的注释,它的插件机制应该是参考的Umbraco这个cms的。

加载插件

首先加载插件的描述。每一个插件都必须定义一个插件描述文件,用文本文件Description.txt来定义,名字也是约定的,不能是其他名字。在插件的类库中添加Description.txt,对插件进行描述。Description中的文本字段的格式是固定的,PluginManager会把Description.txt文件转化成PluginDescriptor类,然后存储在内存中。Description中的 DisplayOrder字段表示了这个插件的顺序,以便在界面上显示。获取所有的插件描述文件后,它就会去InstalledPlugins.txt里面看,在

InstalledPlugins.txt里面有的就是已经安装的查件,没有的话就是没有安装的。PluginDescriptor.Installed属性描述了这个信息。

把需要加载的dll复制到Plugins/bin文件夹下,当然都是要继承自IPlugIn接口的,通过Assembly.Load 在家这个 dll,再用BuildManager.AddReferencedAssembly把这个dll加载到网站这个应用程序中。要注意的是 BuildManager.AddReferencedAssembly必须早网站程序的Application_PreStartInit过程中加入,也就是在Application_Start前。这是要引用的插件都被放在了Plugins/bin下,并被CLR 引用了。被引用的插件的 Assembly引用将被保存在PluginManager的静态列表中ReferencedPlugins。PluginManager的 Initialize方法到此结束。

在界面上显示插件

举例来说,我们在定义插件的时候会定义一种类型的插件,比如送货方式。那么我们在定义插件的时候会继承2个接口,一个是IPlugin接口,一个是 IShippingMethod接口。在需要显示送货方式插件的时候通过PluginFinder.GetPlugins ().ToList() 方法去获取。PluginFinder会去上一步的PluginManager.ReferencedPlugins列表里面去寻找。返回的是 IShippingMethod的实例。NopCommerce 有个txt文件:InstalledPlugs.txt。只有在这个里面的插件最终会加载到界面上去。可以通过NopCommerce的查件管理页面把最终需要作用于网站的插件加入到这个文件中。

配置插件

NopCommerce的admin网站可以对插件进行配置。如下图:可以配置Display Order 和 IsActive等。主要的逻辑是更新该插件的Description.txt文件和内存中的IPlugin.Descriptor里面的属性。

定义插件中的Controller,Action和View

稍微复杂的插件基本都包含自己要处理的界面和逻辑。所以在插件的类库中可以定义插件的界面View 和相关Controller和Action。在建立Controller和View的时候,不一定要按照规范的Controllers文件夹和Views文件夹来定义,可以定义自己的风格。

在Action中返回View的时候,要输入View的名称,这个名称要包含名称空间,例如:

return View("Nop.Plugin.DiscountRules.HasAllProducts.Views.DiscountRulesHasAllProducts.Configure", model);

因为,在编译过后的插件dll中,作为嵌入资源的View会被编译成名叫Nop.Plugin.Payments.CashOnDelivery.Views.PaymentCashOnDelivery.Configure.cshtml的资源文件。NopCommerce通过一些插件的Configure界面,把一些插件的配置信息保存到数据库中。然后在前台页面显示的时候再从数据库获取。

读取嵌入的资源View

插件作为一个类库被加载到应用程序域中。而在定义插件的View的时候,需要把cshtml文件的属性修改成Embedded Resource。它是作为嵌入式资源放到AppDomain中去的。我们可以通过VirtualPathProvider,使 Web 应用程序可以从虚拟文件系统中检索资源,您可以在这篇文章中找到相关知识,NopCommerce的实现和这篇文章是一样的。在NopCommerce中的Nop.Web.Framework类库中有个 EmbeddedViews文件夹,里面包含了如果处理嵌入的View的一些类。最后需要在Global.asax进行注册。NopCommerce的代码如下:

//register virtual path provider for embedded views

var embeddedViewResolver = EngineContext.Current.Resolve();

var embeddedProvider = new EmbeddedViewVirtualPathProvider(embeddedViewResolver.GetEmbeddedViews()); HostingEnvironment.RegisterVirtualPathProvider(embeddedProvider);

编写NopCommerce插件

可以参考官方文档。其中有一条建议非常好,就是Copy原来的插件,在上面修改。

NopCommerce是如何使用Autofac实现依赖注入的

IOC和DI

IOC中文名被称作控制反转(Inversion of Control),DI被称为依赖注入(Dependency Injection),可参考Martin Fowler的这篇文章来了解这两个概念:IoC容器和DependencyInjection模式。使用控制反转模式开发项目流程是先建立接口,然后再实现类,或许有人不习惯这样的开发方法,但在规模较大的软件架构中,这种方法却可以有效的降低类之间的互相依赖的情况,不但能增加架构的弹性,也能有效的降低软件的复杂度。

如果不考虑控制反转的情况,采用直接创建类,并直接在应用层调用该类,如此一来,应用层的对象就会与BLL(业务逻辑层)对象高度依赖,这样的依赖会导致这两个类无法拆开,从而增加了这个类的维护难度,同时导致了单元测试难以进行。为了解决耦合度问题,从而引入了控制反转的概念。

Autofac介绍

Autofac是一款IOC框架,比较于其他的IOC框架,如https://www.sodocs.net/doc/d16630372.html,、Unity、Castle等,它更显得轻量级,同时保证了高性能。它具有以下优点:

1和C#语言联系紧密,可以使用C#语言的很多特性,譬如Lambda表达式等;

2较低的学习曲线,只需了解IoC和DI的概念以及在何时需要使用它们即可;

3XML配置支持;

4自动装配;

5与https://www.sodocs.net/doc/d16630372.html, MVC3集成;(Orchard也是使用Autofac实现IOC的)

在MVC3项目中使用Autofac

在MVC3工程中使用Autofac的最好也是最简单的方法是使用NuGet来安装Autofac.Mvc3,安装完成以后,在Global.asax的Application_Start方法中添加如下代码:

protected void Application_Start()

{

var builder = new ContainerBuilder();

builder.RegisterControllers(typeof(MvcApplication).Assembly);

var container = builder.Build();

DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

// Other MVC setup...

这样就开启了Controller的依赖注入功能。其中的DependencyResolver是一个全局静态类,MVC3提供了对依赖注入的支持,SetResolver函数用于设置使用哪个Resolver(解析器)来进行依赖注入,这里使用的是Autofac的依赖注入解析器。如果要使用自己的解析器,必须在这里使用SetResolver函数设置。

1. 注册Controller

可以使用下面的方法对特定的Controller进行注册:

var builder = new ContainerBuilder();

builder.RegisterType().InstancePerRequest();

同时可以使用Autofac提供的RegisterControllers扩展方法来对程序集中所有的Controller一次性的完成注册:

var builder = new ContainerBuilder();

builder.RegisterControllers(typeof(MvcApplication).Assembly);

2. 注册Model Binder

与控制器的注册类似,模型绑定也可以再Global.asax.cs中注册。您可以通过如下操作完成整个程序集的注册:

var builder = newContainerBuilder();

builder.RegisterModelBinders(Assembly.GetExecutingAssembly());

builder.RegisterModelBinderProvider();

您也必须记住使用RegisterModelBinderProvider扩展方法来注册RegisterModelBinderProvider。这个方法用是Autofac 对IModelBinderProvider接口的实现。

因为RegisterModelBinders扩展方法通过扫描程序集来添加模型绑定的,所以您需要指定IModelBuilder注册的目标类是什么类型。

[ModelBinderType(typeof(string))]

public class StringBinder : IModelBinder

{

public override object BindModel(ControllerContext controllerContext,

ModelBindingContext bindingContext)

{

//do implementation here

}

}

多行的ModelBuilderTypeAttribute实例可以添加到需要对个类型注册的类中。

3. 注入HTTP抽象类

MVC集成的Autofac模块将会为HTTP抽象类添加HTTP 请求的生命收起范围内的注册。包括依稀抽象类:●HttpContextBase

●HttpRequestBase

●HttpResponseBase

●HttpServerUtilityBase

●HttpSessionStateBase

●HttpApplicationStateBase

●HttpBrowserCapabilitiesBase

●HttpCachePolicyBase

●VirtualPathProvider

需要使用上面的抽象应该使用容器的RegisterModule方法来添加AutofacWebTypesModule

builder.RegisterModule(newAutofacWebTypesModule());

4. 注入View page

您可以通过在容器创建之前添加ViewRegistrationSource 到容器中使属性注入来使MVC页面可用。

builder.RegisterSource(newViewRegistrationSource());

您的viewpage必须继承MVC类中用于创建,当使用Razor试图引擎时将需要继承WebViewPage类:

public abstract class CustomViewPage : WebViewPage

{

public IDependencyDependency { get; set; }

}

当使用的是webform的试图引擎时,ViewPage,ViewMasterPage和ViewUserControl类都得到相应的支持。

public abstract class CustomViewPage : ViewPage

{

public IDependencyDependency { get; set; }

}

必须确保您实际的试图页面继承了您自定义的基类。在Razor视图引擎.cshtml中可以使用@inherits指令来实现:

@inherits Example.Views.Shared.CustomViewPage

使用webform时可以做如下设置

<%@PageLanguage="C#"MasterPageFile="~/Views/Shared/Site.Master"

Inherits="Example.Views.Shared.CustomViewPage" %>

5. 对Filter Attribute进行属性注入

为过滤器使用属性注入必须在容器创建之前调用RegisterFilterProvider方法,并将其传到AutofacDependencyResolver

ContainerBuilder builder = new ContainerBuilder();

builder.RegisterControllers(Assembly.GetExecutingAssembly());

builder.Register(c => new Logger()).As().InstancePerHttpRequest();

builder.RegisterFilterProvider();

IContainer container = builder.Build();

DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

然后您就可以为您的过滤器添加属性了,并且

public class CustomActionFilter : ActionFilterAttribute

{

public ILogger Logger { get; set; }

public override void OnActionExecuting(ActionExecutingContext filterContext)

{

Logger.Log("OnActionExecuting");

}

}

下面是类似用户验证过滤器的自定义特性

public class CustomAuthorizeAttribute : AuthorizeAttribute

{

public ILogger Logger { get; set; }

protected override bool AuthorizeCore(HttpContextBase httpContext)

{

Logger.Log("AuthorizeCore");

return true;

}

}

应用如下:

[CustomActionFilter]

[CustomAuthorizeAttribute]

public ActionResult Index()

{

// ...

}

关于Autofac更多的信息,可以参考autofac在google code上的wiki文档:

https://www.sodocs.net/doc/d16630372.html,/p/autofac/wiki/Mvc3Integration

NopCommerce是如何使用Autofac实现依赖注入的?

NopCommerce将所有和Autofac注入相关的工作都放到了EngineContext中,在Global.asax的Application_Start函数的第一句代码即是:

//initialize engine context

EngineContext.Initialize(false);

从这里开始EngineContext的初始化工作,初始化时会创建一个新的NopEngine,参数false指定当NopEngine不为空时是否重新生成一个新的NopEngine。

[MethodImpl(MethodImplOptions.Synchronized)]

public static IEngine Initialize(bool forceRecreate)

{

if (Singleton.Instance == null || forceRecreate)

{

var config = ConfigurationManager.GetSection("NopConfig") as NopConfig;

Debug.WriteLine("Constructing engine " + DateTime.Now);

Singleton.Instance = CreateEngineInstance(config);

Debug.WriteLine("Initializing engine " + DateTime.Now);

Singleton.Instance.Initialize(config);

}

return Singleton.Instance;

}

NopEngine 使用单例模式,在整个程序运行期间存在一个实例,代码首先会判断NopEngine是否为空,为空的话则根据web.config中配置的NopConfig节点信息创建一个新的NopEngine实例,然后对该实例进行初始化操作。web.config 中的配置信息如下:

requirePermission="false" />

CreateEngineInstance函数中使用new NopEngine()创建了一个NopEngine实例,在NopEngine的构造函数处对Autofac 的容器(Container)作了初始化,如下代码:

public NopEngine(EventBroker broker, ContainerConfigurer configurer)

{

var config = ConfigurationManager.GetSection("NopConfig") as NopConfig;

InitializeContainer(configurer, broker, config);

}

private void InitializeContainer(ContainerConfigurer configurer, EventBroker broker, NopConfig config)

{

var builder = new ContainerBuilder();

_containerManager = new ContainerManager(builder.Build());

configurer.Configure(this, _containerManager, broker, config);

}

NopCommerce通过ContainerManager对容器做了一层封装,方便对其他类型的IOC框架的扩充和支持。Configure函数完成了所有依赖的注入,同时查找所有实现了IDependencyRegistrar接口的类,并调用其Register方法,注册内容包括Http context、web helper、controller、data layer、plugin、cache manager、work context、services、settings、event consumers 等等。

关于ContainerManager/ContainerConfigurer和IDependencyRegistrar是实现IOC的关键,下面对这两个部分做详细的讨论。

// todo:仍需继续分析具体实现

ContainerManager/ContainerConfigurer

ContainerManagerContainerManager对依赖注入中使用的容器做了一层封装,提供了这些函数:

●AddComponent/AddComponentInstance/AddComponentWithParameters

●Resolve/ResolveAll/ResovleUnregistered

●UpdateContainer

DependencyRegistrar

●web helper

●controller

●data layer

●plugin

●cache manager

●work context

●services

●settings

●event consumers

nopCommerce中cache分析

入口:

///

/// Gets a category

///

///Category identifier

///Category

public virtual Category GetCategoryById(int categoryId)

{

if (categoryId == 0)

return null;

string key = string.Format(CATEGORIES_BY_ID_KEY, categoryId);

return _cacheManager.Get(key, () => { return _categoryRepository.GetById(categoryId); });

}

//"CurrentCategoryId" property of "CategoryNavigationModel" object depends on the current category or product.

//We need to clone the cached model (the updated one should not be cached)

var model = (CategoryNavigationModel)cachedModel.Clone();

model.CurrentCategoryId = activeCategoryId;

return PartialView(model);

}

功能描述:

1,生成cacheKey

2, 调用_cacheManager获取数据

接下来,看看_cacheManager Get方法是如何定义的。

_cacheManager.Get定义

///

/// Extensions

///

public static class CacheExtensions

{

public static T Get(this ICacheManager cacheManager, string key, Func acquire)

{

return Get(cacheManager, key, 60, acquire);

}

public static T Get(this ICacheManager cacheManager, string key, int cacheTime, Func acquire)

{

if (cacheManager.IsSet(key))

{

return cacheManager.Get(key);

}

else

{

var result = acquire();

//if (result != null)

cacheManager.Set(key, result, cacheTime);

return result;

}

}

}

由定义可知,当从缓存存中取不到数据时,则执行匿名函数acquire获取数据。

获取数据成功后,设置缓存,这样下次就可以直接从缓存中获取数据了。

Get方法中调用的是ICacheManager接口的方法,因此需要看看是哪个类实现了该接口。方法是通过查找IoC注册,找到实现ICacheManager接口的类。

基于Web教学管理系统的设计与实现

基于Web的实验教学管理系统的设计与实现 陈兵陈六平* (中山大学化学与化学工程学院广州510275) 摘要本文阐述了基于Web的实验教学管理系统的开发与设计思想,以及应用ASP技术实现其前 台和后台信息交互的方法及过程。发展了一个新的实验教学管理模式,对于促进实验教学实施科学 的网络化和信息化管理具有现实意义。 关键词基于Web,实验教学管理系统,C/S模型,Web服务,数据库系统。 Internet的迅速发展及校园网的建成,加快了高校教学网络化的进程。整个社会信息变革的同时,学校也面临信息化管理的挑战。作为教学管理的一个重要环节,实验教学管理要负责教学、教研、考核、管理等多项任务,工作复杂、繁琐,模式固定,信息交换频繁。因此,针对某些学科专业的基础实验课程,非常有必要建立一个基于Web的实验教学管理系统。覆盖了全校的校园网络为建立基于Web的管理信息系统提供了良好的基础。而各部门计算机的普及,使用计算机的人员越来越多,这就为管理系统的运行和维护提供了人员保障。另外,管理系统的建立也有利于各级领导及时、全面地了解实验教学情况。 针对化学基础实验课程的教学特点,本文设计开发了一套实验教学网络管理系统,下面对此予以介绍。 1.系统设计目标 基于Web的实验教学管理系统应当具备这样的功能[1]:在校园内任何一台联网计算机上,学生可以进行实验项目的相关查询,教师也可以方便地登录学生实验的成绩;有合理的成绩评定方式,能充分发挥奖勤罚惰的作用;有相应的安全保障,避免预约信息资料的丢失或破坏,以及实验成绩不被篡改;具有很强的统计及报表输出功能;能够建立起有效的师生交流渠道等。 *基金项目:中山大学化学学院创新化学实验研究基金(批准号:01005)资助。 第一作者:陈兵(1980年),中山大学化学与化学工程学院98基地班 通讯联系人:陈六平副教授 E-mail:cesclp@https://www.sodocs.net/doc/d16630372.html,

题库管理系统设计文档

(此文档为word格式,下载后您可任意编辑修改!) 华南农业大学 软件开发技术实践 课程设计实验报告 小组成员: 教师:林毅申 提交日期: 2013年11月30日

华南农业大学信息学院 课程设计

1、基本信息 1.1 小组基本信息 1.2 项目基本信息 这次我们小组开发的是一个面向一所大学内的任课老师以及在校学生的题库管理系统。作为数字化校园的一部分,该系统的主要的功能包括为教师用户提供的查阅题库,新组试卷功能和面向学生的在线考试功能。题库分为两部分,一部分是之前教师利用组卷功能得到并保存的试卷,一部分是不同类型的题目。题目范围为学校内各门课程期末考试的试题,包括公共基础课以及各学院开设的不同课程。题目不仅包括普通的文字类题目,还包括一些包含复杂元素如图片,特殊公式等的题目,做到基本兼容现在学校内能看到的题目。 考虑到小组成员的技术水平以及项目的实际需要,该系统是采用C/S模式。为提高效能,服务器方面采用IOCP模型,客户端采用WPF技术来改善Winform在界面上的劣势。 1.3 项目技术信息

2、系统架构图 注:实线表示数据传输方向,虚线表示模块间调用关系,由被调用者指向调用者 服务器程序: 数据加密模块: 采用一种加密算法,(具体哪种算法等系统实现时,再进行确定),将即将发送的数据进行加密。保证数据再传输过程中的安全性。与客户端中的数据加密模块原理一样。 数据解密模块: 采用与加密算法相对应的解密算法,将接受到数据,进行解密,还原得到原始的数据。与客户端中的数据解密模块原理一样。 消息队列: 为了能实现同时让尽量多的客户连接到服务器,所以不使用一线程处理一客户模型的服务器。这里的消息队列是将所有用户对服务器的各种请求按照先进先出的规则排列起来。等待处理。如果实现是使用windows io完成端口和对应的SOCKET进行绑定,这个消息队列是由系统生成和维护的。 工作者线程池: 线程池用于维护和管理服务器中所有以工作者身份存在的线程,工作者线程就是用来处理客户请求的线程。线程池的线程会互斥的到消息队列中取出对应的客户请求进行处理。没有请求时候,所有线程都处于阻塞状态等待消息队列中出现客户请求。当工作者线程获得客户请求的时候会按顺序去调用数据解密模块,数据传输格式解析模块,业务逻辑处理模块,加密发送数据模块。 数据传输格式解析模块: 数据在网络传输的过程中,我们给它规定特定的格式。通过该模块,服务器可以清楚的知道,客户需要服务器为他实现哪些功能。但是这里解析的数据需要通过解密之后,才能解析。对应的客户端想要与服务器进行交互,就需要使用这个特定的格式发送数据。 业务逻辑处理模块: 这个模块就是服务器具体工作的模块,模块中包含服务器能够为客户端提供的所有服务。工作者线程通过解析数据格式,知道客户的需求,再从这个模块中调用指定的服务。这个模块也是直接和数据库进行交互的模块。 数据发送加密模块: 业务逻辑模块处理完客户的请求的服务之后,需要为客户返回处理后的结果。可能是简单的操作成功和失败的返回结果,也可能是直接数据的传输。和加密模块结合在一起,说明数据发送前需要进行加密。 数据库模块: 采用sql server做数据库管理,https://www.sodocs.net/doc/d16630372.html,技术实现面向业务层的接口。

理发店管理系统设计文档

理发店管理系统设计说明书

目录 一、文档简介 (3) 1.1 文档目的 (3) 1.2 背景 (3) 1.3 读者对象 (3) 1.4 定义 (4) 1.5 参考文献 (4) 1.6 术语与缩写解释 (4) 二、总体设计 (4) 2.1 需求规定 (4) 2.2 运行环境 (4) 2.3 物理结构示意图 (5) 2.4 总体结构图 (5) 2.5 客户端程序组成 (5) 2.6 基本设计概念和处理流程 (6) 三、接口设计 (7) 3.1 用户接口 (7) 3.2 外部接口 (8) 3.3 部接口 (8) 四、系统数据库设计 (10) 4.1 数据库环境说明 (10) 4.2 数据库的命名规则 (11) 4.3 逻辑结构设计 (11) 4.4 物理结构设计 (12) 五、系统出错处理设计 (13) 5.1 出错信息 (13) 5.2 补救措施 (14) 5.3 系统维护设计 (14)

一、文档简介 1.1 文档目的 1.编写本说明书的目的在于: (1)将系统划分成物理元素,即程序、文件、数据库、文档等。 (2)设计软件结构,即将需求规格转换为体系结构,划分出程序的基本模块组成,确定模块间的相互关系,并确定系统的数据结构。 2.本说明书的用途在于寻找实现目标系统的各种不同方案,分析员从这些可供选择的方案中选取若干个合理的方案,为每个合理的方案都准备一份系统流程图,列出组成系统的物理元素,进行成本\效益分析,从中选出一个最佳方案向用户和使用部门负责推荐。如果用户和使用部门负责人接受了推荐的方案,分析员应该进一步为这个最佳方案设计软件结构。通常,设计出初步的软件结构后还要进一步改进,从而得到更合理的结构,进行必要的数据库设计,确定测试要求并且制定测试计划。 3.本说明书的主要读者为系统分析员和用户和使用部门的有关人员,为后面的系统开发提供依据。 作为BSS理发店管理系统设计文档的重要组成部分,本文档主要对软件后台数据库的概念模型设计和物理模型设计做出了统一的规定,同时确定了每个表的数据字典结构。本文档是开发人员实际建立BSS数据库及其数据库对象的重要参考依据。同时本文档对软件的整个系统的结构关系进行了详细的描述,并对相关容作出了统一的规定。 1.2 背景 理发店是人们日常生活中不可缺少的一部分,有一定规模的理发店具有多名理发师和众多顾客,一般情况下,当忙碌起来以后,很难记清楚每名理发师的工作量,不便于日后考核;同时大量的会员如果仅适用传统的纸质和卡片记录管理,容易出错,而且不方便统计。计算机应用技术迅猛发展,开发一套理发店的理发师和会员管理系统具有很强的现实意义。 1.3 读者对象 本文档的主要读者包括: 1.本系统的设计人员:包括模块设计人员。 2.本系统的系统开发人员:包括数据库开发、编码人员。 3.本系统的测试人员。

文件管理系统课程设计

课程名称:操作系统 实验题目:文件管理系统 1、课程设计选题 (3) 1.1主要设计内容 3 1.2主要设计思路 3 2、课程设计需求分析 3 3、概要设计 (4) 3.1整体设计框架 4 3.2各模块的基本功能 4 4、系统实现 5 4.1原理 6 4.2各模块算法思想 6 4.3流程图描述 9 4.4代码描述 10 5、系统测试 11

5.1系统主界面 11 5.2子系统功能测试 11 6、总结 19 7、参考文献样式 19 1、课程设计选题 1.1主要设计内容 本课程设计主要是用C语言编写,设计的是一个模拟的多用户多级目录的文 件管理系统。通过具体的文件存储空间的管理、文件的物理结构、目录结构和文 件操作的实现,加深对文件系统内部功能和实现过程的理解。 1.2主要设计思路 首先系统要完成初始化的任务,建立起整个系统,等待用户注册,注册成功后,用户登录模块,对用户的用户名进行验证,如果用户登录成功,则系统进入 等待用户输入的状态,用户选择相应指令后,系统按照即定方式处理用户请求, 用户退出后,系统转入登录模块,等待下一位用户的登录。 2、课程设计需求分析 本系统为多用户多级目录的文件管理系统,用户可以根据所注册的用户名登 陆来对文件或是文件进行操作。多用户功能可以满足不同用户不同的需求,同时 也起到了很好的保密作用。 文件系统为用户提供了按名存取的功能,以使得用户能透明地存储访问文

件。为了实现按名存取,文件需要对文件存储设备进行合理的组织,分配;对存储在文件存储设备上的文件进行保护,保密和提供共享的手段。另外,文件系统还要提供检索文件或文件中记录的手段,文件系统就是完成上述功能的一组软件和数据结构的集合。 模拟一个文件管理系统,要完成对文件的基本操作,文件的基本操作有文件、文件夹的打开、新建、删除和读取写入文件,创建更改目录,列出目录内容等信息。系统建立了文件目录树,存储文件系统中的所有文件。对于用户名下的文件,用文件目录树的分枝来存贮。 采用命令行操作界面很直观,也方便用户进行操作,用户只要按照操作界面所显示的命令来操作就行了。 因为存在着同一个目录下不能有同名文件的问题。所以在进行文件的基本操作时要考虑到在已经有的文件中是否有同名文件,有的话则输出提示信息。 3、概要设计 3.1整体设计框架 系统初始化界面是由用户注册,用户登录,退出系统三个模块组成。用户登录模块再由创建用户,进入目录,删除用户,显示所有用户,显示位示图,修改用户资料几大模块组成。然后各个模块再由一些小模块组成。其中创建文件,打开关闭文件,读写文件等文件操作模块包括在进入目录模块里面。 3.2各模块的基本功能 3.21系统初始化 系统的初始化包括初始化了磁盘的空间即位示图、一个管理员用户 3.22用户注册模块 用户可以在这里注册,用户名和密码的最大长度都为10个字节,如果用户名不重复的话,则注册成功,用户的权限默认为一般用户。

教务管理系统开发

教务管理系统开发 目录 1 IT项目管理课程设计任务书 (1) 1.1 题目 (1) 1.2 要求 (1) 2 总体设计 (5) 2.1 总进度计划 (5) 2.2 工作分解 (6) 2.3 网络计划 (7) 3 风险管理 (7) 4数据与成果 (11) 5总结 (11) 6 参考文献 (11)

1 IT项目管理课程设计任务书 1.1 题目 教务管理系统工程项目管理。 1.2 要求 (1)整体要求: 1.系统要求提供教师工作平台和学生工作平台。 2. 系统要求有严格的权限管理,权限要在数据方面和功能方面都要体现。 3. 系统要求有可扩充性,可以在现有系统的基础上,通过前台就可加挂其他功能模块。 (2)通用功能 对于每个教师,登录系统后,都应提供如下功能 l)电子课表:系统根据学校总排课的情况和该教师的任课情况自动生成电子课表各该教师查阅。 2)会议通知和公告:系统根据该教师的权限,自动列出该教师需要查阅的会议通知和公告,同时若具备起草和发布通知和公告,则系统提供相应功能。发送通知和公告应可自由设定相应的权限组。如全体学生、全体老师、一年级全体老师等。 3)日程安排:该日程安排应可分级设定,教师登录后可看到与自己有关的日程,同时能对自己的日程进行安排,日程安排同时需要设置自动提醒动能。 4)个人日记:系统可为每个用户设置一个习于个人记事的功能 5)通讯录:系统自动从教师基本信息和学生基本信息中抽取通讯记录,形成公共通讯录用于用户查询使用,同时应给用户提供一个个人通讯录,该通信录应能够录入、修改、删除、检索。 6)教师答疑:系统自动抽取在学生平台提出的需该教师回答的问题,由教师进行解答,并记录相应的状态。 7)家庭作业:教师课利用此功能对学生进行作业布置和批改。 (三)学校日常业务管理功能 1.招生管理 本功能完成各学校从招生到入学的全部过程。其业务流程图如图2-“招生管理业务流程

电子档案管理系统解决方案设计

电子文档信息管理系统 解决方案

山东东昀电子科技有限公司

目录 1. 系统功能模块的划分和各模块的设计 (1) 1.1总体功能设计 (1) 1.2信息管理 (4) 1.2.1 数据录入 (5) 1.2.2 文件上传、下载 (6) 1.3日常管理 (7) 1.3.1 检索查询 (7) 1.3.3 统计报表 (8) 1.4视频资料管理 (10) 1.4.3 媒体文件资料管理 (10) 1.5系统设置 (11) 1.5.1 建立符合用户要求的文档管理结构 (11) 1.5.2 对现有文档管理系统的其他设置 (12) 1.6系统安全 (13) 1.6.1 用户管理 (14) 1.6.2 角色管理 (14) 1.6.3 权限管理 (14) 1.7日志管理 (17) 1.8数据存储和备份 (18) 1.8.1 数据存储 (18) 1.8.2 数据备份 (20)

1. 系统功能模块的划分和各模块的设计1.1总体功能设计 如图所示:

电子文档信息自动化管理系统总体设计如上面的系统逻辑架构,根据文档管理工作的分工不同分为:信息采集、日常管理、信息服务、系统安全、系统设置、软件接口六个部分。 其中信息采集、日常管理和信息服务三部分包括了用户文档信息管理的主要业务内容,实现了文档信息的收集整理、日常管理和利用服务的网络化和电子化。 信息采集主要负责文档信息的整理、编目与电子文件的自动挂接,完成文档信息的收集、录入和数字化工作。 日常管理部分主要完成电子文档的鉴定、销毁、移交、编研、征集等工作,同时可以辅助实体管理、形成文档的目录、进行借阅、利用、统计等管理工作。 信息服务主要通过简单方便的方式,为用户提供快捷的文档信息服务。 系统安全则充分保证了文档系统和数据的安全性,使对电子文档信息的安全管理能够控制到每一具体功能操作和每一具体文件。 系统设置部分为用户搭建符合自身文档信息管理需要的文档管理结构提供了定制工具,可以让用户自己量身定制本单位的文档管理结构,无论是从眼前,还是从长远考虑,都将比

软件开发文档模板

软件开发文档模板 1 可行性研究报告 可行性研究报告的编写目的是:说明该软件开发项目的实现在技术、经济和社会条件方面的可行性;评述为了合理地达到开发目标而可能先择的各种方案;说明论证所选定的方案。可行性研究报告的编写内容要求如下: 1.1 引言 1.1.1 编写目的 1.1.2 背景 1.1.3 定义 1.1.4 参考资料 1.2 可行性研究的前提 1.2.1 要求 1.2.2 目标 1.2.3 条件、假定和限制 1.2.4 进行可行性研究的方法 1.2.5 评价尺度 1.3 对现有系统的分析 1.3.1 数据流程和处理流程 1.3.2 工作负荷 1.3.3 费用开支 1.3.4 人员 1.3.5 设备 1.3.6 局限性 1.4 所建议的系统 1.4.1 对所建议系统的说明 1.4.2 数据流程各处理流程 1.4.3 改进之处 1.4.4 影响 1.4.4.1 对象设备的影响 1.4.4.2 对软件的影响 1.4.4.3 对用户单位机构的影响 1.4.4.4 对系统动行的影响 1.4.4.5 对开发的影响 1.4.4.6 对地点和设施的影响 1.4.4.7 对经费开支的影响 1.4.5 局限性 1.4.6 技术条件方面的可行性 1.5 可选择其他系统方案 1.5.1 可选择的系统方案 1 1.5.2 可选择的系统方案 2 …… 1.6 投资及收益分析 1.6.1 支出 1.6.1.1 基本建设投资

1.6.1.2 其他一次性支出 1.6.1.3 非一次性支出 1.6.2 收益 1.6. 2.1 一次性收益 1.6. 2.2 非一次性收益 1.6. 2.3 不可定量的收益 1.6.3 收益/投资比 1.6.4 投资回收周期 1.6.5 敏感性分析 1.7 社会条件方面的可行性 1.7.1 法律方面的可行性 1.7.2 使用方面的可行性 1.8 结论 2 项目开发计划 编制项目开发计划的目的是用文件的形式,把对于在开发过程中各项工作的负责人员、开发进度所需经费预算、所需软、硬件条件等问题作出安排记载下来,以便根据本计划开展和检查本项目的开发工作。编制内容要求如下: 2.1 引言 2.1.1 编写目的 2.1.2 背景 2.1.3 定义 2.1.4 参考资料 2.2 项目概述 2.2.1 工作内容 2.2.2 主要参加人员 2.2.3 产品及成果 2.2. 3.1 程序 2.2. 3.2 文件 2.2. 3.3 服务 2.2. 3.4 非移交产品 2.2.4 验收标准 2.2.5 完成项目的最迟期限 2.2.6 本计划的审查者与批准者 2.3 实施总计划 2.3.1 工作任务的分解 2.3.2 接口人员 2.3.3 进度 2.3.4 预算 2.3.5 关键问题 2.4 支持条件 2.4.1 计算机系统支持 2.4.2 需要用户承担的工作 2.4.3 需由外单位提供的条件 2.5 专题计划要点

文档管理系统论文

1.系统目标 本系统的目标是开发一个操作简单、界面友好、功能齐全的管理系统,在网上完成有关文档的管理工作,包括用户登录、注册、文档的添加、浏览、选择、下载;用户个人信息的维护;用户信息的管理等等。本系统提供了一个方便教师和学生交流的平台,将其应用于教学管理中,可以减少教师和学生的工作量,方便双方的交流,不受时间和地点限制,能够大大提高有关文档的管理效率。 2.开发工具和环境 2.1 开发框架https://www.sodocs.net/doc/d16630372.html, https://www.sodocs.net/doc/d16630372.html,是 Active Server Page (ASP) 的下一个版本,是一种建立在通用语言上的程序构架,能被用于一台Web服务器来建立强大的Web应用程序。https://www.sodocs.net/doc/d16630372.html,提供许多比现在的Web开发模式强大的优势。因为https://www.sodocs.net/doc/d16630372.html,是基于通用语言的编译运行的程序,不像以前的ASP即时解释程序,而是程序首次在服务器端运行时就进行编译,这样的执行效果比一条一条的解释强很多。所以它的强大性和适应性,可以使它运行在Web应用软件开发的多数平台上。通用语言的基本库,消息机制,数据接口的处理都能无缝的整合到https://www.sodocs.net/doc/d16630372.html,的Web应用中。同时,https://www.sodocs.net/doc/d16630372.html,语言独立化。所以,可以选择一种最适合自己

的语言来编写程序,如: C#,VB,Jscript等。另外,https://www.sodocs.net/doc/d16630372.html,可以使用一些自带组件和自定义组件。同时,https://www.sodocs.net/doc/d16630372.html,使运行一些很平常的任务如表单的提交、客户端身份的验证、分布系统和网站的配置变得非常简单。 https://www.sodocs.net/doc/d16630372.html,使用一种字符基础的分级配置系统,使服务器环境和应用程序的设置更加简单。一个https://www.sodocs.net/doc/d16630372.html,的应用程序在一台服务器系统的安装只需要简单的拷贝一些必要的文件,不需要系统的重新启动。多处理器环境的https://www.sodocs.net/doc/d16630372.html,已经成为一种可以用于多处理器的开发工具。 2.2开发环境Visual Studio Visual Studio 是微软公司推出的开发环境。是目前最流行的Windows 平台应用程序开发环境。Visual Studio 可以用来创建Windows 平台下的 Windows 应用程序和网络应用程序,也可以用来创建网络服务、智能设备应用程序和 Office 插件。 2.3开发语言C# C#派生于C/C++,是Microsoft专门为使用.NET平台而创建的一种新型编程语言,也是在移植到其他操作系统上的.NET版本中使用的主要语言。与Windows的体系结构相似,易为开发人员所熟悉。C#是面向对象的编程语言,具有面向对象编程语言的一切特性,封装性

教学管理系统项目开发计划

二、项目开发计划 1.引言1 1.1编写目的1 1.2项目背景1 1.3定义2 1.4参考资料2 2.项目概述2 2.1工作内容2 2.2条件与限制 2 2.3产品2 2.4运行环境2 2.5服务3 2.6验收标准3 3.实施计划3 3.1任务分解3 3.2进度3 3.3预算3 3.4关键问题3 4.人员组织及分工 3 5.交付期限3 6.专题计划要点3 1.引言 1.1编写目的 此项目开发计划书的编写主要是为了给《教学管理系统》做重要的规划和调整,在整个开发过程中起到引导的作用,以及给读者提供简要的说明。 1.2项目背景 我们小组所要开发的项目是教学管理系统,随着信息时代的发展以及计算机广泛的普及,人们的日常学习办公越来越离不开计算机,而对于学校的教务管理中心和老师来说,若能有一套有效的教学管理系统,无疑会大大的提高办公效率,方便他们对学生信息的管理。因此学院教务管理中心委托我们开发一个功能完善的数据管理软件,能够快速处理学生信息"添加","查询"以及"删除"等功能。 1.3定义 Macromedia Dreamweaver 8:网页设计工具 Microsoft SQL Server:数据库工具 静态数据--系统固化在内的描述系统实现功能的一部分数据 动态数据--在软件运行过程中用户输入的后系统输出给用户的一部分数据,也就是系统要处理的数据。 数据字典--数据字典中的名字都是一些属性与内容的抽象和概括,它们的特点是数据的"

严密性"和"精确性",没有半点含糊。 1.4参考资料 Visual Basic 程序设计基础林永兴中国水利水电出版社2011.1.1 数据库系统实现加西亚莫里亚机械工业出版社2010.1.1 《软件工程(第五版)》张海藩清华大学出版社 《软件工程模型与方法》,肖丁等,北京邮电大学出版社。 《https://www.sodocs.net/doc/d16630372.html,+Dreamweaver8案例精粹》武新华等,西安电子科技大学出版社 《信息系统应用与开发案例教程》,陈承欢,清华大学出版社。 2.项目概述 2.1工作内容 教学管理系统主要针对学校以及管理老师 该系统功能如下: 1.能够存储大量学生信息,并能够方便有效的进行学生信息数据操作和管理,这主要包括: 1)学生信息的添加,删除以及修改。 2)学生信息的多键字检索查询。 2.能够对需要的信息可以提供打印输出。 2.2条件与限制 完成本项目需4为同学,又我们小组4名同学共同完成此项目,我们四个分别承担该项目的设计报告与开发等工作。该系统用户为学校以及教务管理中心。 项目完成期限限定在2011年11月15日之前。 2.3产品 2.3.1程序 教务管理系统,JAVA script 数据库。 2.3.2文档 系统开发计划书。 系统需求说明书。 系统设计说明书。 2.4运行环境 软件环境:操作系统:Windows 2000以上数据库:SQL Server 2005 硬件环境:处理器:Inter或者AMD 内存:1 G以上 2.5服务 培训安装,维护和运行支持从使用该系统开始,维护期限为一年。 2.6验收标准 各个功能均能正常使用,并且满足教务管理中心的需求。 3.实施计划 3.1任务分解 韩光辉:可行性研究报告和项目开发计划。 高翔:概要设计说明书。 杨鹏飞:需求规格说明书。 宋兰兰(组长):详细设计说明书。 3.2进度

试试题库管理系统毕业论文

试题库管理系统 (伊犁师学院计算机系,XX 伊宁835000) 摘要:随着计算机办公自动化程度的不断提高,开发各种数据库管理应用软件用于各种工作中能有效地提高工作效率,节省时间,能使学校的教学工作上一个新的台阶。传统的人工命题形成试卷,往往会出现大量的重复劳动,并且形成的试卷因出卷人的不同其质量会差距很大,这样一来会直接导致考试结果波动很大,使考试的科学考评效果大幅度降低,这也往往引起学生和教师的广泛议论和关注,解决这一早就出现的问题一直是许多人的迫切愿望,由于各种考试名目繁多,试卷容广杂,使出卷难度加大,要出一份好试卷更是难上加难;另外,许多基础学科容长期不变或基本不变,这就使建立试题库成为非常必要和可能。通过筛选、总结、修正,使以往大量优秀的试题进入试题库,继承了前人辛勤的劳动和智慧的结晶,也顺应了标准化命题的要求。 本系统是在WINDOWS98平台上,以Visual Basic6.0为工具,利用OLE等技术设计实现了一个试题库管理系统。系统设有特权用户(Supervisor),对系统的所有资源实施管理;一般用户只可选择访问已经授权可访问的资源。为试卷选题可通过人工进行,也可给出各种具体的条件,然后由程序自动来选定完成。试卷容是文本文档处理的各种数据。 关键词:OLE;试题库;试卷生成;试卷管理 中图分类号:TP311 应用Visual Basic6.0可视化编成工具开发软件速度快,界面实现简单方便,具有高可靠性、便于维护调试和高效率等突出优点。在深入学习和研究了Visual Basic6.0这一可视化继承开发环境的基础上和在参阅了大量文献资料的基础上,同时了解到我国大、中学校录取新学生、考察学生学习情况的手段主要还是通过考试,而每次考试,都要花费老师大量的心血去筛选试题、组织试卷、整理试题答案等。根据这些情况,我们开发设计了该《试题库管理系统》应用软件,以实现课程的试题库管理和处理,相信它必将在教学中发挥积极的作用。 1.概述 1.1研究背景 1. 随着计算机办公自动化程度的不断提高,开发各种数据库管理应用软件用于各种工作中

文档管理系统的解决方案.doc

文档管理系统解决方案 2010.08

1概述 .............................................................................................................................................................................. - 4 - 1.1系统目标 (4) 1.2系统框架 (4) 2设计方案 ...................................................................................................................................................................... - 5 - 2.1系统管理 (5) 2.1.1组织机构 ........................................................................................................................................................ - 5 - 2.1.2人员管理 ........................................................................................................................................................ - 5 - 2.1.3编码配置 ........................................................................................................................................................ - 6 - 2.1.4权限管理 ........................................................................................................................................................ - 6 - 2.1.5文档后台管理 ................................................................................................................................................ - 6 - 2.2文档管理主页 (6) 2.2.1文档发布 ........................................................................................................................................................ - 6 - 2.2.2文档排名 ........................................................................................................................................................ - 6 - 2.2.3文档推荐 ........................................................................................................................................................ - 6 - 2.2.4文档分类 ........................................................................................................................................................ - 6 - 2.3文档管理功能 (6) 2.3.1文档上传 ........................................................................................................................................................ - 7 - 2.3.2文档下载 ........................................................................................................................................................ - 7 - 2.3.3文档阅读 ........................................................................................................................................................ - 7 - 2.3.4文档播放 ........................................................................................................................................................ - 7 - 2.3.5文档查找 ........................................................................................................................................................ - 8 - 2.3.6文档统计 ........................................................................................................................................................ - 8 - 2.4系统接口 (8)

开发接口文档-API文档模板

XXX项目接口文档版本控制信息 获取所有字段 获取所有字段 请求地址:/session/field/findAll 请求参数 响应

请求例子:响应例子:{"code":"10000","exception":null,"isSuccess":true,"message":"成功,系统处理正常! ","page":0,"pageSize":0,"returnObject":null,"returnValue":{"types":null,"villages":null,"companys":[{"iconColour":"","iconSize":0,"ico nStyle":"","id":4,"name":"XX"},{"iconColour":"","iconSize":0,"iconStyle":"","id":5,"name":"XX"},{"iconColour":"","iconSize":0,"iconSty le":"","id":7,"name":"XX"}]},"totals":0} 文件上传 文件上传(ajax) 请求地址:/session/file/upload 请求参数 响应 请求例子:var formData = new FormData(); ("file", [0]); $.ajax({ url : routePath + "/session/file/upload", type : 'POST', data : formData,

processData : false, contentType : false, success : function(result) { result = (result); if == "10000"){ ('上传成功!'); $("#editHeadPortrait").val } } }); 响应例子:returnValue里包含了 fileName和filePath 字段管理-所属类型 新增所属类型 请求地址:/session/fieldType/save 请求参数 响应 请求例子:响应例子:{"code":"10000","exception":null,"isSuccess":true,"message":"成功,系统处理正常!","page":0,"pageSize":0,"returnListSize":0,"returnObject":null,"returnValue":null,"totals":0}

文件管理系统设计方案和对策

文件管理系统设计方案 传统的管理和保存文件的方式是人工生成和保管文件(包括:生成、传阅、审批、进入受控状态等),文件通常是保存在文件柜中的。 由于文件数量多,版本复杂,在实际使用中经常出现问题,例如:文件版本不一致、文件查找困难、文件管理处理历史记录报表工作量过大等。本方案旨在解决单位对大量工程和技术文件的管理,达到并确保工作人员手中文件版本的一致性、文件更改的可追溯性,同时以实现电子公告、电子通知、电子邮件、公文收发等功能来提高单位日常办公及管理的自动化。 一、文件管理系统的建设目标和意义 目标: 满足企业对文件信息进行集中管理、查询的需要 通过文件的集中管理,使企业实现资料共享,资料同步更新 企业重要文档的使用权限设置,一方面节约了资本,另一方面自动化管理,保证了资料的保密性和安全性 简化了员工查找和使用资料的工作步骤,使员工把时间放在其他更有价值的工作上,减少重复劳动,提高工作效率,为企业争取更多 利润 把无纸化办公和自动化办公结合起来,实现了无纸化和物理化文档管理的有机组合 把先进的数据库技术运用于文档管理,促进企业信息化管理的进步文件管理系统建设意义: 1、分类、管理企业文件 文件管理系统通过数据库管理,对企业纷杂的文件内容进行分门别类的管理,按照不同的介质(图片、影音、word、excel、ppt、pdf等)进行存放管理。 文件管理系统通过权限管理,对不同的员工开放不同级别的文件库,最大程

度保证企业的文件安全。 2、共享、学习企业文件 文件管理系统通过内部网络将文件资本进行共享,让更多的人分享到企业文件资本,拓宽部门和员工的知识范围。 3、应用、增值文件资本 文件管理平台构建面向企业业务流程的文件管理系统,使得工作过程中显形知识结构化,隐形知识显形化。 通过文件的不断重复应用,实现文件增值。有效的规避了人员升迁流动所造成了关键业务领域的损失,让业务运行不辍。 4、提升企业竞争力 创造企业新竞争价值,增加企业利润,降低企业成本,提高企业效率。建立企业新文化,鼓励思想自由,培育创新精神。 通过减少反应时间来提高为客户服务的水平,通过快速向市场提供产品和服务来增加收入。 二、文件管理系统的建设要求 首先是支持的文件内容要全面,从文件管理的内容角度,至少应该包括: ?对信息的发布,比如直接发布各种内容 ?对文档的管理,如各类DOC、XLS、PPT等文件 ?对数据信息的管理,如各类报表等等 有利于充分利用文件: ?对链接的处理:在内容中可以互相链接,它是有效利用文件的非常重要的环节 ?强有力的索引能力,特别是全文检索 ?对于动态数据的强有力查询能力,比如可以根据各种条件进行查询

教学资源管理系统设计

《教学资源管理系统》需求分析设计说明书 学院:信息学院研 13级

学号: 1043113266 姓名:杨涛 目录 一. 引言 (3) 1.1教学资源管理系统的发展 (3) 1.2教学资源管理系统功能和特点 (4) 1.3教学资源管理系统设计目的 (5) 1.4教学资源管理系统开发步骤 (4) 二. 需求说明 (4) 2.1需求分析 (6) 2.2可行性分析 (6) 2.2.1 技术可行性 (6) 2.2.2 经济可行性 (5) 2.2.3 操作可行性 (5)

三. 系统构架及开发工具简介 (7) 3.1应用系统架构方式 (7) 3.1.1 B/S架构概述 (7) 3.1.2 系统体系结构 (6) 3.2开发工具简介 (7) 3.2.1 系统开发技术JSP (7) 3.2.2 ORACLE简介 (7) 四. 概要设计 (8) 4.1系统具体功能 (8) 4.1.1 系统的整体功能模块 (8) 4.1.2 系统的不同用户操作权限介绍 (8) 4.1.3 系统整体界面设计 (8) 4.2系统整体结构设计 (8) 4.2.1 一般用户登陆操作流程介绍 (9) 4.2.2 一般用户登陆后台验证流程介绍 (9) 4.3数据库设计 (10) 4.3.1 逻辑设计 (14) 4.3.2 数据字典设计 (14)

一. 引言 1.1 教学资源管理系统的发展 随着Internet的飞速发展,教学资源的数量与日俱增。如何对这些资源进行有效的管理和组织是相当有必要的。但是,简单地实现以二进制形式组织教学资源、以计算机管理代替人工管理教学资源这个功能是不能满足信息化教育教学的要求的。随着教育改革的深入发展,改变传统课程实施过于强调学生在教室接受学习、死记硬背、机械训练的现状,倡导学生主动参与、勇于探究、勤于动手,培养学生搜集和处理信息的能力、获取新知识的能力、分析和解决问题的能力以及合作的能力是当今信息化教学的一个发展方向。即教学的重心开始由“教”转向“学”,使学生完全从教师控制的家教式、被动式学习状态转变为自主学习、双向交流的状态。 目前,美国和英国等发达国家的教育资源管理系统都往网络化方向发展。即在原有功能基础上增加一些实时的教学功能,比如:教师在线解答疑难问题、学生通过观看在线视频、视频点播或者进入虚拟教室来实时地进行学习,这也是我国教学资源管理系统的一个发展趋势。 1.2 教学资源管理系统功能和特点 本系统能实现一般教学资源管理系统应该具有的基本功能。比如:学生用户快速搜索、浏览、下载学校最新公告和其所需教程、课件;教师用户发布课件、上传相关教学辅助材料,对相关课程,教案等进行增加,编辑,删除。教

电子档案管理系统解决方案

电子文档信息管理系统 解决方案 山东东昀电子科技有限公司

目录 1. 系统功能模块的划分和各模块的设计 (1) 1.1总体功能设计 (1) 1.2信息管理 (4) 1.2.1 数据录入 (5) 1.2.2 文件上传、下载 (6) 1.3日常管理 (7) 1.3.1 检索查询 (7) 1.3.3 统计报表 (8) 1.4视频资料管理 (10) 1.4.3 媒体文件资料管理 (10) 1.5系统设置 (11) 1.5.1 建立符合用户要求的文档管理结构 (11) 1.5.2 对现有文档管理系统的其他设置 (12) 1.6系统安全 (13) 1.6.1 用户管理 (14) 1.6.2 角色管理 (14) 1.6.3 权限管理 (14) 1.7日志管理 (17) 1.8数据存储和备份 (18) 1.8.1 数据存储 (18) 1.8.2 数据备份 (20)

1. 系统功能模块的划分和各模块的设计1.1总体功能设计 如图所示:

电子文档信息自动化管理系统总体设计如上面的系统逻辑架构,根据文档管理工作的分工不同分为:信息采集、日常管理、信息服务、系统安全、系统设置、软件接口六个部分。 其中信息采集、日常管理和信息服务三部分包括了用户文档信息管理的主要业务内容,实现了文档信息的收集整理、日常管理和利用服务的网络化和电子化。 信息采集主要负责文档信息的整理、编目与电子文件的自动挂接,完成文档信息的收集、录入和数字化工作。 日常管理部分主要完成电子文档的鉴定、销毁、移交、编研、征集等工作,同时可以辅助实体管理、形成文档的目录、进行借阅、利用、统计等管理工作。 信息服务主要通过简单方便的方式,为用户提供快捷的文档信息服务。 系统安全则充分保证了文档系统和数据的安全性,使对电子文档信息的安全管理能够控制到每一具体功能操作和每一具体文件。 系统设置部分为用户搭建符合自身文档信息管理需要的文档管理结构提供了定制工具,可以让用户自己量身定制本单位的文档管理结构,无论是从眼前,还是从长远考虑,都将比

相关主题