应用SAAS结构技术的开源药店管理系统-如何自己部署这种SOA/SAAS结构的应用

一、药店系统内容说明

在前些时间,我们发布了一个基于AgileEAS.NET平台的SAAS结构的案例-AgileEAS.NET平台开发实例-药店系统-快速的SAAS开发体验,在文章中同时向大家提供了基于SAAS部署安全的演示客户端下载,也向大家提供了包含全部源代码下载。

AgileEAS.NET平台是一套应用系统快速开发平台,用于帮助中小软件开发商快速构建自己的企业信息管理类开发团队,以达到节省开发成本、缩短开发时间,快速适应市场变化的目的,AgileEAS.NET应用开发平台包含基础类库、资源管理平台、运行容器、开发辅助工具等四大部分,资源管理平台为敏捷并行开发提供了设计、实现、测试等开发过程的并行。

药店系统案例以及案例所提供的SAAS部署技术是依赖于AgileEAS.NET平台提供的,这个案例是一个规格比较小,但却很有代表性的一个案例,涵盖了在企业应用系统开发中的一系列技术、比如Orm技术、平台加插入技术、分布式通信技术/WCF/WebService、SAAS技术、SOA思想等。

之前的文章应用SAAS结构技术的开源药店管理系统-源代码结构说明给大家介绍了一下药店系统的源代码目录结构:

AWK9D(U16H)39}}L`}LQ[BS

之后很有多的朋友希望我在写一篇文章向大家讲一个怎么使用这个源代码包自己部署SAAS结构的药店系统。

二、如何一步一步的部署

首先我们从AgileEAS.NET官网下载药品系统源代码压缩包DrugShop.rar,下载之后解压到本地文件,比如E:\DrugShop,在解开的压缩包之中,可以看不一个叫“药店系统-发布版本”的文件夹,这里面即为进行SAAS部署的必要文件。

“药店系统-发布版本”结构如下:

%M6U07HG@F8M%H_6EA1E)}C

第一步:编译药店系统源代码

修改解压后根目录中的“build-all.bat”文件如下:

   1: setlocal 
   2:  
   3: REM 设置路径
   4: set dic=E:\DrugShop
   5:  
   6: REM 编译解决方案
   7: C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe %dic%\药店系统-源码-VS2010\DrugShop.sln /t:Rebuild /p:Configuration=Release
   8:  
   9: REM 复制文件到发布版本/应用服务器
  10: copy %dic%\药店系统-源码-VS2010\Publish\DrugShop.DAL.dll  %dic%\药店系统-发布版本\AppServer\Bin /y
  11: copy %dic%\药店系统-源码-VS2010\Publish\DrugShop.BLL.dll  %dic%\药店系统-发布版本\AppServer\Bin /y
  12:  
  13: REM 复制文件到发布版本/升级版本
  14: copy %dic%\药店系统-源码-VS2010\Publish\DrugShop.*.dll  %dic%\药店系统-发布版本\AppServer\xClient\Files /y
  15:  
  16: REM 复制文件到发布版本/客户端
  17: copy %dic%\药店系统-源码-VS2010\Publish\DrugShop.*.dll  %dic%\药店系统-发布版本\WinClient /y
  18:  
  19: pause

执行build-all.bat,编译全部源代码并完成向发布目录的文件复制。

第二步:创建/恢复数据库

在压缩包“药店系统-数据库备份”,包含数据库的备份文件、数据库文件和数据库脚本:

FML(C84O36NDOQIU62XI[5R

在早先的版本之中,没有提供SQL2000数据库的支持,我随后补充了SQL2000的建库、建表脚本,我们可以任选一种方式进行数据恢复,支持SQL2000/SQL2005/SQL2008,我在本例进行附加,本地安装SQL2008R2数据库。

image

第三步:安装业务/中间服务

修改“药店系统-发布版本\AppServer\Bin\install.bat,调整一下路径:

   1: setlocal 
   2: set dic=E:\DrugShop
   3: %dic%\药店系统-发布版本\AppServer\Bin\EAS.WindowsService /i /name=DrugShop
   4: pause

执行install.bat脚本完成服务安装,我们可以在计算机管理:

6ZPGR3~Y(R4TQ[LU@RBROFQ

我们看到一个命名实例为DrugShop的AgileEAS.NET Application Service,在这个服务实例之中运行药品系统的业务逻辑,可以通过服务管理进行启动和停止它。

第四步:启动业务/中间服务

在启动业务/中间服务之前,请先修改服务配置文件之中的数据库连接信息:

   1: <?xml version="1.0"?>
   2: <configuration>
   3:   <configSections>
   4:     <section name="eas" type="EAS.ConfigHandler,EAS.MicroKernel"/>
   5:   </configSections>
   6:   <eas>
   7:     <windowsservices>
   8:       <config httpPort="8080" tcpPort="6688"/>
   9:       <services>
  10:         <service name="EAS.RMIService" key="EAS.RMIService"/>
  11:         <service name="EAS.SmartUpdateService" key="EAS.SmartUpdateService"/>
  12:       </services>
  13:     </windowsservices>
  14:     <objects>
  15:       <!--定义数据访问相关组件。-->
  16:       <object name="DataConnection" assembly="EAS.Data" type="EAS.Data.Access.SqlClientConnection" LifestyleType="Thread">
  17:         <property name="ConnectionString" type="string" value="Data Source=.;Initial Catalog=drugshop;User ID=sa;Password=sa" />
  18:       </object>
  19:       <object name="DataAccessor" assembly="EAS.Data" type="EAS.Data.Access.SqlClientAccessor" LifestyleType="Thread">
  20:         <property name="Connection" type="object" value="DataConnection" />
  21:       </object>
  22:       <object name="OrmAccessor" assembly="EAS.Data" type="EAS.Data.ORM.OrmAccessor" LifestyleType="Thread">
  23:         <property name="DataAccessor" type="object" value="DataAccessor" />
  24:       </object>
  25:       <object name="ServiceBridger" assembly="EAS.MicroKernel" type="EAS.Services.LocalServiceBridger" LifestyleType="Thread" />
  26:       <!--日志组件。-->
  27:       <object name="Logger" assembly="EAS.MicroKernel" type="EAS.Services.TextLogger" LifestyleType="Singleton">
  28:       </object>
  29:       <object name="EAS.RMIService" assembly="EAS.Distributed.ServiceHost" type="EAS.Distributed.RMIServiceAddIn" LifestyleType="Singleton">
  30:         <property name="EnableLogging" type="bool" value="false" />
  31:       </object>
  32:       <object name="EAS.SmartUpdateService" assembly="EAS.Distributed.ServiceHost" type="EAS.SmartUpdate.ServiceAddIn" LifestyleType="Singleton"/>
  33:     </objects>
  34:   </eas>
  35:   <startup>
  36:     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  37:   </startup>
  38: </configuration>
在本配置文件之中,请根据自己的数据库连接信息修改数据库连接,请根据自己的喜好,修改服务实例的通信端口,共包含两个端口http及tcp端口,默认http端口为8080,tcp端口为6688,请自行修改为两个未必点用的端口。

第五步:生成智能升级配置信息

在本例之中,程序自带了自动升级服务,下面简单介绍一下服务器上的配置:

客户端程序的自动升级及升级配置信息存放在应用服务程序的XClient目录之下:

DZSGTNS)2~0~R_ZQYCG`E_5

其中Files目录之中存放客户端程序运行所需要的所有程序集及其他文件,config目录之中只包含用于控制程序集升级的文件清单信息,如下格式所示:

   1: <?xml version="1.0" encoding="utf-8"?>
   2: <SmartConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   3:   <URI>http://www.smarteas.net/</URI>
   4:   <Name>AgileEAS.NET升级配置文件</Name>
   5:   <Description>用于AgileEAS.NET平台SmartClient/ActiveX运行容器模块升级之用</Description>
   6:   <StartEx />
   7:   <Time>2011-05-17T20:14:27.6537091+08:00</Time>
   8:   <Files>
   9:     <SmartFile>
  10:       <FileName>DrugShop.BLL.dll</FileName>
  11:       <Version>1.0.0.0</Version>
  12:       <Time>2011-05-17T19:52:04.5989573+08:00</Time>
  13:     </SmartFile>
  14:     <SmartFile>
  15:       <FileName>DrugShop.DAL.dll</FileName>
  16:       <Version>1.0.0.0</Version>
  17:       <Time>2011-05-17T19:52:03.2296807+08:00</Time>
  18:     </SmartFile>
  19:     <SmartFile>
  20:       <FileName>DrugShop.Res.dll</FileName>
  21:       <Version>0.0.0.0</Version>
  22:       <Time>2011-05-17T19:52:07.8126581+08:00</Time>
  23:     </SmartFile>
  24:     <SmartFile>
  25:       <FileName>DrugShop.WinUI.dll</FileName>
  26:       <Version>1.1.0.0</Version>
  27:       <Time>2011-05-17T19:52:06.8200238+08:00</Time>
  28:     </SmartFile>
  29:     <SmartFile>
  30:       <FileName>EAS.Data.DataUIMapper.dll</FileName>
  31:       <Version>1.0.0.0</Version>
  32:       <Time>2011-05-16T15:34:26.4489149+08:00</Time>
  33:     </SmartFile>
  34:     <SmartFile>
  35:       <FileName>EAS.Data.dll</FileName>
  36:       <Version>4.0.0.0</Version>
  37:       <Time>2011-05-16T13:57:51.7015166+08:00</Time>
  38:     </SmartFile>
  39:     <SmartFile>
  40:       <FileName>EAS.Develop.Debuger.dll</FileName>
  41:       <Version>4.0.0.0</Version>
  42:       <Time>2011-05-16T22:57:10.1958392+08:00</Time>
  43:     </SmartFile>
  44:     <SmartFile>
  45:       <FileName>EAS.Distributed.Client.dll</FileName>
  46:       <Version>3.0.0.0</Version>
  47:       <Time>2011-05-16T15:34:26.4489149+08:00</Time>
  48:     </SmartFile>
  49:     <SmartFile>
  50:       <FileName>EAS.Distributed.Contracts.dll</FileName>
  51:       <Version>3.0.0.0</Version>
  52:       <Time>2011-05-16T15:34:26.4489149+08:00</Time>
  53:     </SmartFile>
  54:     <SmartFile>
  55:       <FileName>EAS.Distributed.ServiceHost.dll</FileName>
  56:       <Version>3.0.0.0</Version>
  57:       <Time>2011-05-16T15:34:26.4489149+08:00</Time>
  58:     </SmartFile>
  59:     <SmartFile>
  60:       <FileName>EAS.Explorer.AddIn.Assist.dll</FileName>
  61:       <Version>4.0.0.0</Version>
  62:       <Time>2011-05-16T15:34:26.4489149+08:00</Time>
  63:     </SmartFile>
  64:     <SmartFile>
  65:       <FileName>EAS.Explorer.BLL.dll</FileName>
  66:       <Version>2.0.0.0</Version>
  67:       <Time>2011-05-16T15:34:26.4489149+08:00</Time>
  68:     </SmartFile>
  69:     <SmartFile>
  70:       <FileName>EAS.Explorer.DAL.Interface.dll</FileName>
  71:       <Version>4.0.0.0</Version>
  72:       <Time>2011-05-16T15:34:26.4489149+08:00</Time>
  73:     </SmartFile>
  74:     <SmartFile>
  75:       <FileName>EAS.Explorer.DAL.Oracle.dll</FileName>
  76:       <Version>4.0.0.0</Version>
  77:       <Time>2011-05-16T15:34:26.4489149+08:00</Time>
  78:     </SmartFile>
  79:     <SmartFile>
  80:       <FileName>EAS.Explorer.DAL.SQLServer.dll</FileName>
  81:       <Version>4.0.0.0</Version>
  82:       <Time>2011-05-16T15:34:26.4489149+08:00</Time>
  83:     </SmartFile>
  84:     <SmartFile>
  85:       <FileName>EAS.Explorer.dll</FileName>
  86:       <Version>3.0.0.0</Version>
  87:       <Time>2011-05-16T15:34:26.4489149+08:00</Time>
  88:     </SmartFile>
  89:     <SmartFile>
  90:       <FileName>EAS.Explorer.Res.dll</FileName>
  91:       <Version>1.1.0.0</Version>
  92:       <Time>2011-05-16T10:57:51.5773604+08:00</Time>
  93:     </SmartFile>
  94:     <SmartFile>
  95:       <FileName>EAS.Explorer.Web.dll</FileName>
  96:       <Version>4.0.0.0</Version>
  97:       <Time>2011-05-16T15:31:33.6162114+08:00</Time>
  98:     </SmartFile>
  99:     <SmartFile>
 100:       <FileName>EAS.Explorer.WebClient.dll</FileName>
 101:       <Version>1.0.0.0</Version>
 102:       <Time>2011-05-16T10:57:59.0757893+08:00</Time>
 103:     </SmartFile>
 104:     <SmartFile>
 105:       <FileName>EAS.Explorer.WPF.Res.dll</FileName>
 106:       <Version>1.1.0.0</Version>
 107:       <Time>2011-04-23T16:22:55.2651826+08:00</Time>
 108:     </SmartFile>
 109:     <SmartFile>
 110:       <FileName>EAS.MicroKernel.dll</FileName>
 111:       <Version>4.0.0.0</Version>
 112:       <Time>2011-05-16T20:11:14.9469295+08:00</Time>
 113:     </SmartFile>
 114:     <SmartFile>
 115:       <FileName>EAS.OracleClient.dll</FileName>
 116:       <Version>1.1.0.0</Version>
 117:       <Time>2011-05-16T10:57:52.0613881+08:00</Time>
 118:     </SmartFile>
 119:     <SmartFile>
 120:       <FileName>EAS.OrmDesigner.exe</FileName>
 121:       <Version>2.0.0.0</Version>
 122:       <Time>2011-05-16T15:10:16.3558135+08:00</Time>
 123:     </SmartFile>
 124:     <SmartFile>
 125:       <FileName>EAS.Report.Controls.dll</FileName>
 126:       <Version>3.0.0.0</Version>
 127:       <Time>2011-05-16T15:34:26.4489149+08:00</Time>
 128:     </SmartFile>
 129:     <SmartFile>
 130:       <FileName>EAS.SmartUpdateConfig.exe</FileName>
 131:       <Version>1.0.0.0</Version>
 132:       <Time>2011-05-16T15:10:16.3558135+08:00</Time>
 133:     </SmartFile>
 134:     <SmartFile>
 135:       <FileName>EAS.SmartUpdater.exe</FileName>
 136:       <Version>1.0.0.0</Version>
 137:       <Time>2011-05-16T15:10:16.3558135+08:00</Time>
 138:     </SmartFile>
 139:     <SmartFile>
 140:       <FileName>EAS.WinClient.exe</FileName>
 141:       <Version>4.1.0.0</Version>
 142:       <Time>2011-05-16T15:10:16.3558135+08:00</Time>
 143:     </SmartFile>
 144:     <SmartFile>
 145:       <FileName>EAS.Windows.Controls.dll</FileName>
 146:       <Version>4.0.0.0</Version>
 147:       <Time>2011-05-16T15:34:26.4489149+08:00</Time>
 148:     </SmartFile>
 149:     <SmartFile>
 150:       <FileName>EAS.Windows.dll</FileName>
 151:       <Version>4.0.0.0</Version>
 152:       <Time>2011-05-16T15:31:25.0985964+08:00</Time>
 153:     </SmartFile>
 154:     <SmartFile>
 155:       <FileName>EAS.Windows.GuiTemplate.dll</FileName>
 156:       <Version>3.0.0.0</Version>
 157:       <Time>2011-05-16T15:34:26.4489149+08:00</Time>
 158:     </SmartFile>
 159:     <SmartFile>
 160:       <FileName>Fireball.CodeEditor.dll</FileName>
 161:       <Version>1.0.0.1</Version>
 162:       <Time>2006-04-20T17:49:27.578125+08:00</Time>
 163:     </SmartFile>
 164:     <SmartFile>
 165:       <FileName>Fireball.CodeEditor.SyntaxFiles.dll</FileName>
 166:       <Version>1.0.0.2</Version>
 167:       <Time>2006-04-20T17:49:28.34375+08:00</Time>
 168:     </SmartFile>
 169:     <SmartFile>
 170:       <FileName>Fireball.Core.dll</FileName>
 171:       <Version>1.1.0.1</Version>
 172:       <Time>2006-04-20T13:48:00.125+08:00</Time>
 173:     </SmartFile>
 174:     <SmartFile>
 175:       <FileName>Fireball.SyntaxDocument.dll</FileName>
 176:       <Version>1.0.0.0</Version>
 177:       <Time>2006-04-20T13:48:04.1875+08:00</Time>
 178:     </SmartFile>
 179:     <SmartFile>
 180:       <FileName>Fireball.Win32.dll</FileName>
 181:       <Version>1.0.0.0</Version>
 182:       <Time>2006-04-20T13:47:57.921875+08:00</Time>
 183:     </SmartFile>
 184:     <SmartFile>
 185:       <FileName>Fireball.Windows.Forms.dll</FileName>
 186:       <Version>1.9.0.0</Version>
 187:       <Time>2006-04-20T17:40:03.640625+08:00</Time>
 188:     </SmartFile>
 189:     <SmartFile>
 190:       <FileName>itextsharp.dll</FileName>
 191:       <Version>4.1.2.0</Version>
 192:       <Time>2011-04-19T10:03:15.1486735+08:00</Time>
 193:     </SmartFile>
 194:     <SmartFile>
 195:       <FileName>Microsoft.Data.ConnectionUI.Dialog.dll</FileName>
 196:       <Version>8.0.50727.42 (RTM.050727-4200)</Version>
 197:       <Time>2011-04-19T14:03:23.948859+08:00</Time>
 198:     </SmartFile>
 199:     <SmartFile>
 200:       <FileName>Microsoft.Data.ConnectionUI.dll</FileName>
 201:       <Version>8.0.50727.42 (RTM.050727-4200)</Version>
 202:       <Time>2011-04-19T14:03:23.9863596+08:00</Time>
 203:     </SmartFile>
 204:     <SmartFile>
 205:       <FileName>NetronGraphLib.dll</FileName>
 206:       <Version>2.2.3328.30433</Version>
 207:       <Time>2009-02-10T16:54:28.046875+08:00</Time>
 208:     </SmartFile>
 209:     <SmartFile>
 210:       <FileName>RdlEngine.dll</FileName>
 211:       <Version>3.9.7.0</Version>
 212:       <Time>2011-05-16T10:57:32.5537424+08:00</Time>
 213:     </SmartFile>
 214:     <SmartFile>
 215:       <FileName>RdlViewer.dll</FileName>
 216:       <Version>3.9.6.0</Version>
 217:       <Time>2011-05-16T10:57:34.8538739+08:00</Time>
 218:     </SmartFile>
 219:     <SmartFile>
 220:       <FileName>ReportDesigner.dll</FileName>
 221:       <Version>3.9.7.0</Version>
 222:       <Time>2011-05-16T10:57:48.085178+08:00</Time>
 223:     </SmartFile>
 224:     <SmartFile>
 225:       <FileName>ReportDesigner.Start.exe</FileName>
 226:       <Version>1.0.0.0</Version>
 227:       <Time>2011-05-16T10:57:50.9183227+08:00</Time>
 228:     </SmartFile>
 229:   </Files>
 230: </SmartConfig>
本文件由智能升级配置程序EAS.SmartUpdateConfig.exe产生,我们打开XClient\Files目录下的EAS.SmartUpdateConfig.exe程序集:

image

点击文件右边的浏览按钮选择配置文件保存位置(Xclient\config\smartupdate.xml),升级文件目录选择Xclient\Files,点击“扫描文件夹”,然后“保存”完成升级配置信息的生成。

第六步:运行SAAS客户端

在“药店系统-发布版本”目录的Winclient目录之中,包含了药品系统SAAS运行的客户端程序集及配置信息,在运行之前,需要修改一下配置文件中的两个服务URL,一个是用于控制升级的服务、配置信息存放于update.inf文件之中:

   1: # AgileEAS.Net 平台升级控制文件。
   2:  
   3: [config]
   4:  
   5: allow = 1
   6: url = net.tcp://localhost:6688/EAS.SmartUpdateService

其中 allow为是否开启升级,1开启,0不开启,默认为1,url为升级服务位置,修改为net.tcp://localhost:6688/EAS.SmartUpdateService

另一个是程序的SOA分布式通信服务url,这个通过EAS.WinClient.exe.config文件进行修改:

   1: <?xml version="1.0" encoding="utf-8"?>
   2: <configuration>
   3:   <configSections>
   4:     <section name="eas" type="EAS.ConfigHandler,EAS.MicroKernel" />
   5:   </configSections>
   6:   <eas>
   7:     <configurations>        <item name="WorkstationUser" value="Administrator;0001;0003" />
   8:         <item name="LastUser" value="0003" />
   9:         <item name="SmartLogin" value="true" />
  10:         <item name="Startup" value="" />
  11:         <item name="SystemStyle" value="MdiStyle" />
  12:         <item name="NavigationStyle" value="TreeStyle" />
  13:         <item name="NavigationExpand" value="true" />
  14:         <item name="Desktop" value="Enable" />
  15:         <item name="MultiInstance" value="Enable" />
  16:         <item name="EnableSkin" value="false" />
  17:         <item name="SkinStyle" value="MacOS" />
  18: </configurations>
  19:     <objects>
  20:       <!--分布式通信组件。-->
  21:       <object name="ServiceBridger" assembly="EAS.Distributed.Client" type="EAS.Distributed.ServiceBridger" LifestyleType="Singleton">
  22:         <property name="ServiceName" type="string" value="RMIService" />
  23:       </object>
  24:       <object name="DataAccessor" assembly="EAS.Distributed.Client" type="EAS.Distributed.DataAccessor" LifestyleType="Singleton">
  25:         <property name="ServiceBridger" type="object" value="ServiceBridger" />
  26:       </object>
  27:       <object name="OrmAccessor" assembly="EAS.Distributed.Client" type="EAS.Distributed.OrmAccessor" LifestyleType="Singleton">
  28:         <property name="ServiceBridger" type="object" value="ServiceBridger" />
  29:         <property name="DataAccessor" type="object" value="DataAccessor" />
  30:       </object>
  31:       <!--日志管理-->
  32:       <object name="Logger" assembly="EAS.MicroKernel" type="EAS.Services.TextLogger" LifestyleType="Singleton" />
  33:       <!--资源平台所需组件-->
  34:       <object name="EAS.Explorer.DAL" assembly="EAS.Explorer.DAL.SQLServer" type="EAS.Explorer.DAL.SQLServer.DALManager" LifestyleType="Singleton" />
  35:       <object name="EAS.Explorer.Resource" assembly="DrugShop.Res" type="DrugShop.Res.Resources" LifestyleType="Singleton" />
  36:     </objects>
  37:     <services>
  38:       <!--<service name="RMIService" service-type="WebService" singleton="true" url="http://www.agilelab.cn/xservice/rmiservice.asmx" />-->
  39:       <service name="RMIService" service-type="WcfService" singleton="true" url="net.tcp://localhost:6688/EAS.RMIService" />
  40:     </services>
  41:   </eas>
  42: </configuration>

其中:<service name="RMIService" service-type="WcfService" singleton="true" url="net.tcp://localhost:6688/EAS.RMIService" />即为服务地址。

完成以上修改之后,即可运行客户端程序,使用0001,0002,0003登录,密码都为空,管理员密码为“sa”。

image

三、平台发布下载

有关于平台最新版本的最新发布版本的程序集、类库手册、相关资料,请大家从AgileEAS.NET平台的官网http://www.smarteas.net/进行下载,官网设有独立的下载页面,从这里下载:官网下载页面

四、如何联系

如果您在使用AgileEAS.NET开发平台中有什么问题,请使用如下几种联系方式或者沟通方式。

1、官方网站:

AgileEAS.NET平台:http://www.smarteas.net/

敏捷软件工程实验室:http://www.agilelab.cn/

2、AgileEAS.NET平台交流群:

AgileEAS.NET平台交流群:120661978(超级群)[新建]
AgileEAS.NET平台交流群:125643764(高级群)[新建]
AgileEAS.NET平台交流群:147168308(高级群)[新建]

3、系统架构交流群:

系统架构交流群:9105332(高级群)(已满)
系统架构交流群1:124825459(高级群)(已满)
系统架构交流群2:49124441(高级群)(已满)
系统架构交流群3:47025564(高级群)(已满)

链接

AgileEAS.NET平台开发指南-文章索引

AgileEAS.NET应用开发平台介绍-文章索引

AgileEAS.NET平台应用开发教程-案例计划

AgileEAS.NET平台开发Step By Step系列-药店系统-索引

posted @ 2011-06-20 10:01  魏琼东  阅读(5397)  评论(10编辑  收藏  举报