基于Asp.net三层构架的医药公司综合管理系统设计与实现

时间:2022-09-24 08:45:13

基于Asp.net三层构架的医药公司综合管理系统设计与实现

摘 要:介绍了在.Net Framework4.0+SQLserver2005环境下开发医药公司综合管理系统的过程,阐述了系统结构设计和数据库设计,并给出了具体的实现过程和关键技术。

关键词:Linq;SQLserver2005;医药公司综合管理系统

中图分类号:TP319 文献标识码:A 文章编号:16727800(2012)011009203

作者简介:杜天行(1990-),男,四川文理学院计算机科学系学生,研究方向为软件工程;王光琼(1965-),女,硕士,四川文理学院计算机科学系副教授,研究方向为软件工程、数据库与数据挖掘、人工智能。

1 系统需求分析

药品公司管理系统首要的需求在于药品的管理,其开发主要包括后台数据库的建立、维护以及前端管理系统的开发两个方面。数据库的难点在于数据库的多表关系以及多表操作而前端管理系统的开发难点主要在于方便的用户操作,多样化而简便的用户交互方式(用户体验)。

详细分析该系统需要满足以下几个方面的需求:对药品的管理包括药品机器厂商等资料的管理、库存管理以及公司店铺药品的买卖管理;公司的财务管理包括员工的工资管理、药品销售额、公司资金流向等管理;员工管理包括员工的工作情况统计、奖惩制度等管理、以及固定资产管理。各个模块间的关系联系紧密,相辅相成,构成整个医药公司的系统(见图1)。

2 系统设计

根据需求,本系统采用的模式是C/S模式结构,采用.NET经典的三层构架进行设计,数据持久层采用Linq完全面向对象的方式进行设计,使用泛型的方式来整合CRUD操作以使得系统类的方法能得到最高的重用性,同时使用内置编程的方式来处理数据库的事务操作。

数据库采用SQL Server2005,因为实际使用时数据量将比较庞大,所以为了兼容性和数据量考虑,使用同为微软的SQL Server产品。通过VS提供的Linq可视化操作窗体,可以很容易地得到从数据库到数据持久层中基本类的映射,节省了很多手写类时的工作量。

图1 系统结构

3 数据库设计

实现该系统的药品进销存管理主要涉及如下几张表:Product:存储药品的信息;Store:存储库存信息;Stock:存储进货单信息;ShopStore:存储店铺里药品信息;Sell:存储卖货信息;User:存储该系统的用户信息。数据库关系如图2所示。

4 技术路线

主要采用的技术线如图3所示。

5 关键技术

5.1 Linq的使用

首先,为数据库操作类DB_Helper创建一个类,该类使用泛型定义,代码如下:

public class DB where T : class

然后创建Linq上下文实体类,通过该实体对数据库的表进行CRUD操作。同时,使用Linq的方式对数据库进行操作会应用该框架的缓存机制,它可以在不修改表的情况下始终不访问数据库而是通过存储在内存中的数据进行查询。其代码如下:

图2 数据库关系

图3 研究技术路线

public ComManagerDataContext {get; set; }

public DB(){

dt = new ComManagerDataContext() ;}

接下来编写对各个类的CRUD操作,此时定义的泛型开始起作用了,使用泛型的方式,可以使得一种操作只需要写一次而进行重用,具体代码如下:

// 从数据库中取出整张T表

public Table getTable()

{return dt.GetTable();}

// 从数据库的T表中查询全字段的值集合对象实例

public IEnumerable Select(Func whereExpression)

{ return dt.GetTable().Where(whereExpression); }

// 从数据库的T表中查询某一个字段(类型为K)的值

public IEnumerable Select(Func whereExpression,Func selectExpression) where K:class

{return dt.GetTable().Where(whereExpression).Select(selectExpression);}

上面的第二个和第三个查询语句使用了的机制,将一个方法作为这个查询语句的条件,我们对该方法的调用可以采用C#3.5提供的Lambda表达式来进行书写,使得代码更加简洁易懂。第三个语句返回的是一个匿名类型,可以通过Var符号实例化得到该对象。

接下来编写插入、更新和删除语句,在用户使用期间,为获得程序运行中的错误信息,而如果让前端用户看到错误的提升那将是非常不友好的,于是考虑在出错时为数据库的Error表添加一行错误的具体情况,便于管理员查看:

// 向数据库的T表中插入一条数据

public bool Insert(T newEntity)

{bool RS = true;

String ErrorMessage = String.Empty;

try

{dt.GetTable().

InsertOnSubmit(newEntity);

dt.SubmitChanges();}

catch (Exception EX)

{RS = false;

ErrorHS(EX.Message);}

return RS; }

// 更新数据库

public bool Update(T oldentity,T newentity, Action update)

{ bool RS = true;

String ErrorMessage = String.Empty;

try{update(oldentity,newentity);

dt.SubmitChanges();}

catch (Exception EX)

{RS = false;

ErrorHS(EX.Message); }

return RS;}

// 从数据库中删除数据

public bool Delete(T deleteEntity)

{ bool RS = true;

String ErrorMessage = String.Empty;

try{dt.GetTable().DeleteOnSubmit(deleteEntity);

dt.SubmitChanges();}

catch (Exception EX){

RS = false;

ErrorHS(EX.Message);}

return RS; }

以上,介绍了该系统的最底层——数据持久层的开发技巧与示范,该4种方法适用于单表的操作,如果要使用多表同时操作那么可以增加方法或者存储过程来进行实现。

5.2 个别模块的技术难点

5.2.1 药品进销存模块

该模块中多次使用了如今流行的模糊搜索药品名称文本框自动补全功能,类似百度的联想搜索,该技术的使用方法是使用Ajax方法对输入文本框进行监听并在用户进行输入操作时动态地调用后台的匹配方法在数据库中进行Linq模糊查找,再用Ajax于前台显示模糊搜索的结果(见图4)。

图4 药品进销存模块界面

关键代码:

#region 辅助商品输入功能

[System.Web.Services.WebMethodAttribute(), System.Web.Script.Services.ScriptMethodAttribute()]

public static string[] GetSpecificationList(string prefixText, int count, string contextKey)

{

Product_Manager Product_MG = new Product_DAO();

List Select_Name = Product_MG.Select_ProductS(

P => P.Pro_Name.Contains(prefixText),

K => K.Pro_Name);

List Select_EasyPing = Product_MG.Select_ProductS(

P => P.Pro_EasyPing.Contains(prefixText.ToLower()),

K => K.Pro_Name

).ToList();

return Select_Name.Union(Select_EasyPing).ToArray();

}

#endregion

5.2.2 固定资产管理

固定资产管理主要是对公司的固定设备、运输工具、房屋及建筑物等进行增、删、报修、租借、归还等的管理。

增加固定资产,是对购入的固定资产进行记录。界面如图5所示。

图5 增加固定资产界面

管理人员根据收到的进货单进行相应的信息填写,其中使用状态是不可编辑的,当采购部的人员将采购的发票拿来确定后,管理人员再修改使用状态。添加成功后,马上从数据库中重新读取数据,从而局部刷新列表,可以马上查看刚进行的操作是否成功,其中光棒效果较为有特色。

光棒效果关键代码:

if(e.Row.RowTypeDataControlRowType.DataRo)

{

e.Row.Attributes.Add("onmouseover", "currentColor=this.style.backgroundColor;this.style.backgroundColor='#99CCFF'"); e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=currentColor");

}

6 结语

本系统实现了药品管理系统的一套复杂而强大的管理功能,使各个方面的管理更加有条不紊,能帮助员工更轻松地管理各个方面的事务,为加强医药公司的管理提供了一个功能齐全、使用快捷的系统。

参考文献:

[1] ROGER 3.5高级编程——应用LINQ & Enitity Framework[M].北京:清华大学出版社,2010.

[2] BILL 3.5高级编程[M].第5版.北京:清华大学出版社,2008.

[3] SCOTT KLEIN.LINQ高级编程[M].北京:清华大学出版社,2009.

[4] 龚赤兵.Visual Studio 2008中的LINQ开发技术[M].北京:机械工业出版社,2009.

[5] 王宝祥.基于 的数据库访问技术研究[J].计算机应用与软件,2004(2).

上一篇:优质远程学习资源建设策略探究 下一篇:TreeView控件在C#应用程序中的应用研究