【软件工程】web规格开发全过程
规格开发------中亚万惠车友会
此文以中亚万惠车友会开发,综合所知软件工程相关知识进行整体运用。其中涉及用例图,用例描述,用户字典,领域建模,非公能性需求,时序图,概念分析,架构设计,详细概念设计,开发涉及(依赖关系,用户交互,开发环境),部署分析,类关系和子系统设计,数据库设计,数据库分析和涉及,以及三层架构,五视图和部分涉及模式(依赖倒置原则,开放封闭原则)等主要有以下几个步骤:撰写中亚万惠(车友会)项目需求规格说明书,架构的分析与设计,子系统与类的分析与设计,数据库的分析与设计,最终总结。
一 撰写中亚万惠(车友会)项目需求规格说明书
1 用例视图
用例视图描述如下:本用例参与者user(用户)和system(管理员)。但是具体操作和权限是不同的,我们依次分析:
User权限:
Lookmain(查看主页面信息):包含以下主要功能1,cheyoudongxiang(车用动向新闻)2,huwaihuodong(户外活动新闻)3,cheyouyongpin(车友用品)4,lvyouyouhui(旅游优惠)5,cheyoudaren(车友达人)6,zhongyagongsi(中亚公司)7,huiyuanlipin(会员礼品)几个功能模块。
1, cheyoudongxiang(车用动向新闻):此模块负责记录车友最近新闻,用以丰富会员动态交互。前台界面(main)主要显示最新的几条,用户可以点击更多去查看全部新闻。在更多车友动向新闻界面左侧显示最近更新的10条信息。用户点击任何一条信息都会查看到详细新闻内容。
2, huwaihuodong(户外活动新闻)此模块负责记录车友户外活动新闻,用以丰富会员动态交互。前台界面(main)主要显示最新的几条,用户可以点击更多去查看全部新闻。在更多车户外活动新闻界面左侧显示最近更新的10条信息。用户点击任何一条信息都会查看到详细新闻内容。
3, 3,cheyouyongpin(车友用品)本模块是中亚推出一个服务车友的盈利性模块,主要以图片介绍形式显示。主要介绍车用品。用户可以查看更多用品,也可以点击图片,查看详细信息。用来找到买家,线下联系交易。
4, 4,lvyouyouhui(旅游优惠)本模块是中亚推出一个服务车友的盈利性模块,主要以图片介绍形式显示。主要旅游优惠,类似团购等。用户可以查看更多旅游优惠信息,也可以点击图片,查看详细信息。用来找到买家,线下联系交易。
5, cheyoudaren(车友达人):本模块形式类似flash动画,实际通过js完成,主要针对一些用户游玩信息的显示。
6, 6,zhongyagongsi(中亚公司):上属公司,该块为一个超链接。
7, 7,huiyuanlipin(会员礼品):超链接,点击会员信息跳转更多会员礼品信息,点击查看详情。
System权限
Systemmessage(后台管理):1,messagenews(新闻管理)2,messageproduct(产品管理)3,messagehuiyuan(会员管理)
1, messagenews(新闻管理):该模块有两个部分组成分别是车友动向新闻和户外活动新闻,其他属性类似,可以通过news的type类型区分,这时要注意的。其次本模块负责新闻添加,修改和批量或单独删除(类似qq邮箱删除)完成对新闻的管理。
2, messageproduct(产品管理)该模块有两个部分组成分别是车友用品产品和旅游优惠产品,其他属性类似,可以通过product的type类型区分,这时要注意的。其次本模块负责产品添加,修改和批量或单独删除(类似qq邮箱删除)完成对新闻的管理。
3, messagehuiyuan(会员管理):负责对管理员和会员信息修改管理功能。
Login(后台登陆):本模块针对管理员权限,通过输入密码和用户名进行验证,还有就是验证通过参数化查询,以防止sql注入式攻击,增强安全性。
2 用例描述
2.1. LookMain
英文名称:<LookMain>
中文名称:<登陆首页>
参与者 :<User>
2.1.1 简要说明
用户只需要打开连接即可直接进入,可以对首页新闻(车友动向<cheyoudongxiang>,户外活动<huwaihudong>),公司产品业务(车友用品<cheyouyongpin>,旅游优惠<lvyouyouhui>),车友达人<cheyoudaren>,会员礼品<huiyuanlip>最新消息的浏览。点击更多可查看更多及详细内容
2.1.2 事件流
基本流
(1) 用户:输入中亚万惠(车友会)网址;
(2) 用户:用户进入首页:
(a) 用户:选择更多,则执行基本流(3);
(a1)用户:选择基本流(3) (a),则执行基本流(4);
(a2) 用户:选择基本流(3) (b),则执行基本流(4);
(a3)用户:选择关闭,则执行基本流(6);
(b) 用户:选择具体新闻题目(图片),则执行基本流(4);
(c)用户:选择具体链接,则执行基本流(5);
(d)用户:选择关闭,则执行基本流(6);
(3) 系统:显示更多消息;
(a) 系统:左侧显示更多最新消息题目;
(b) 系统:右侧显示更多全部消息;
(4) 系统: 显示详细内容。
(5) 系统: 打开具体链接。
(6)系统:退出结束用例。
2.1.3 备选流
(1) 查看会员:如果系统检测到用户名、密码不存在或错误,则提示用户输入的登录信息不正确,系统返回到选择登录前的状态,用户可以重新输入/修改登录信息,正确则查看个人信息。
2.1.4 特殊需求(约束和非功能性需求)
1 第一特殊需求 要求链接网址正确。
2.1.5 前置条件
1.4.1 第一前置条件 链接网址正确。
2.1.6 后置条件: 无要求
2.1.7 扩展点:无需扩展。
2.1.8 附加说明:只要会员才能实现登陆查看个人信息。
2.1.9 优先级:不要求优先级。
2.2. Login
英文名称:<Login>
中文名称:<登录>
参与者 :<system>
2.2.1 简要说明
对登录的流程进行描述,操作者输入用户名、密码、进行登录。登陆成功后进行后台管理
2.2.2 事件流
1.2.1 基本流
(1) 系统:显示登录界面;
(2) 管理员:输入登录信息,登录信息包括:用户名、密码;
(3) 管理员:可能进行下面两种操作:
(a) 管理员:选择登录,则执行基本流(4);
(b) 管理员:选择重置,则返回到基本流(1);
(4) 系统:检查用户的登录信息,可能有下边两种情况;
(a) 登录成功:执行基本流(5);
(b) 登录失败:执行备选流(1);
(5) 登录成功,结束此用例。
2.2.3 备选流
(1) 登录失败:如果系统检测到用户名、密码不存在或错误,则提示用户输入的登录信息不正确,系统返回到选择登录前的状态,管理员可以重新输入/修改登录信息,重新执行基本流(3)。
2.2.4 特殊需求(约束和非功能性需求)
1 第一特殊需求 要求用户密码安全。
2 第一特殊需求 要求仅限管理员登陆。
2.2.5 前置条件
1.4.1 第一前置条件 系统已启动到登录界面。
2.2.6 后置条件
1.5.1 第一后置条件
管理员登录成功后,根据用户类型进入到相应界面。管理员用户进入到管理员界面, 1.5.2 第二后置条件
管理员登录失败,返回到登录界面。
2.2.7 扩展点:可以提供用户登陆修改个人信息
2.2.8 附加说明1 附加说明1登录过程要求安全性。
2 附加说明1 仅限管理员登陆
2.2.9 优先级没有与此相关的内容。
2.3. systemmessage
英文名称:< systemmessage >
中文名称:<后台管理>
参与者 :<system>
2.3.1 简要说明
管理员登陆成功后,可以对新闻(车友动向<dongxiang>,户外活动<huwai>),公司产品业务(车友用品<yongpin>,旅游优惠<youhui>),车友达人<daren>,会员礼品<liping>等进行管理
2.3.2 事件流
基本流
(1) 管理员:登陆成功;
(2) 管理员:用户进入管理界面:
(a) 管理员:选择新闻,则执行基本流(3);
(a1)管理员:选择户外新闻,则执行基本流(3)(a);
(a2) 管理员:选择车友动向,则执行基本流3) (b);
(a3)管理员:选择关闭,则执行基本流(6);
(b) 管理员:产品类型,则执行基本流(4);
(a1)管理员:选择车友用品,则执行基本流(4)(a);
(a2) 管理员:选择旅游优惠,则执行基本流4) (b);
(a3)管理员:选择关闭,则执行基本流(6);
(c)管理员:其他,则执行基本流(5);
(a1)管理员:选择会员礼品,则执行基本流(5)(a);
(a2) 管理员:选择车友达人,则执行基本流(5) (b);
(a3)管理员:选择关闭,则执行基本流(6);
(d)管理员:选择关闭,则执行基本流(6);
(3) 系统:新闻类型;
(a) 系统:户外新闻;
(b) 系统:车友动向;
(4) 系统: 产品类型。
(a) 系统:车友用品;
(b) 系统:旅游优惠;
(5) 系统: 其他。
(a) 系统:会员礼品;
(b) 系统:车友达人;
(6)系统:退出结束用例。
2.3.3 备选流
(1) 管理员登陆:如果系统检测到用户名、密码不存在或错误,则提示用户输入的登录信息不正确,系统返回到选择登录前的状态,用户可以重新输入/修改登录信息,正确则查看个人信息。
2.3.4 特殊需求(约束和非功能性需求)
1 第一特殊需求 要求登陆正确。
2 第二特殊需求 要求管理员登陆
2.3.5 前置条件 要求登陆正确。。
2.3.6 后置条件: 必须是管理员
2.3.7 扩展点:可用于用户登陆及部分信息查看。
2.3.8 附加说明:只要管理员才能实现登陆查看个人信息。
2.3.9 优先级:不要求优先级。
3 领域建模与用户字典
领域建模:
用户字典:
3.1 myuser
实体名 |
myuser(系统管理员) |
说明 |
系统管理员可以登陆后,对新闻(车友动向<dongxiang>,户外活动<huwai>),公司产品业务(车友用品<yongpin>,旅游优惠<youhui>),车友达人<daren>,会员礼品<liping>等进行管理 |
基本属性 |
编号 用户名 密码 |
实体名 |
u_id(编号) |
说明 |
系统管理员编号,通过设置标示符由系统自动生成。设置为int型,例如:1 |
从属实体 |
myuser |
实体名 |
u_user(用户名) |
说明 |
管理员用户名。设置nvarchar(50)型。 |
从属实体 |
myuser |
实体名 |
u_pwd(密码) |
说明 |
系统管理员密码。设置nvarchar(50)型。 |
从属实体 |
myuser |
3.2 news
实体名 |
news(车友新闻) |
说明 |
主要包括新闻(车友动向<dongxiang>,户外活动<huwai>)业务封装和使用 |
基本属性 |
编号 新闻编号 新闻题目 发布时间 新闻内容 新闻类型 |
实体名 |
id(编号) |
说明 |
编号,通过设置标示符由系统自动生成。设置为int型,例如:1 |
从属实体 |
news |
实体名 |
n_id(新闻编号) |
说明 |
新闻编号,唯一性,便于做查询和操作编号。设置为int型 |
从属实体 |
news |
实体名 |
n_title(新闻题目) |
说明 |
新闻题目,设置为nvarchar(100)型 |
从属实体 |
news |
实体名 |
n_time(发布时间) |
说明 |
新闻发布时间,设置为nvarchar(30)型 |
从属实体 |
news |
实体名 |
n_content(新闻内容) |
说明 |
新闻内容,,设置nvarchar(max)型 |
从属实体 |
news |
实体名 |
n_type(新闻类别) |
说明 |
新闻类别(户外活动,车友动向),设置nvarchar(50)型 |
从属实体 |
news |
3.3 product
实体名 |
product(车友产品) |
说明 |
主要包括对公司产品业务(车友用品<yongpin>,旅游优惠<youhui>)管理 |
基本属性 |
编号 产品编号 产品名称 产品价格 会员价格 产品图片 产品介绍 产品类型 |
实体名 |
id(编号) |
说明 |
编号,通过设置标示符由系统自动生成。设置为int型,例如:1 |
从属实体 |
product |
实体名 |
P_id(产品编号) |
说明 |
产品编号,唯一性,便于做查询和操作编号。设置int型 |
从属实体 |
product |
实体名 |
P_name(产品名称) |
说明 |
产品名称,设置nvarchar(50) |
从属实体 |
product |
实体名 |
P_price(产品价格) |
说明 |
产品价格,设置nvarchar(50) |
从属实体 |
product |
实体名 |
h_price(会员价格) |
说明 |
会员价格,设置nvarchar(50) |
从属实体 |
product |
实体名 |
P_pic(产品图片) |
说明 |
产品图片,设置nvarchar(50) |
从属实体 |
product |
实体名 |
P_note(产品介绍) |
说明 |
产品介绍,设置nvarchar(max) |
从属实体 |
product |
实体名 |
P_type(产品类型) |
说明 |
产品类型(车友用品,旅游优惠),设置nvarchar(50)类型 |
从属实体 |
product |
4 非功能性需求表
质量属性:
性能 |
性能稳定 |
安全性 |
密码安全,采用参数化查询;数据库存储安全,防止SQL注入式攻击。 |
易用性 |
配备使用流程图,界面简洁实用为主。 |
持续可用性 |
程序基本稳定,控制在适宜人群范围之内 |
可伸展性 |
前台采用DIV+CSS模式,分层管理,后台用三层架构。增强伸缩性和扩展性 |
互操作性 |
数据库层,UI层,业务层独立处理,可根据需求改动。 |
可靠性 |
允许在需求人数同时在线,不易死机,采取阶段式测试和系统总体测试。优化功能和代码。 |
鲁棒性 |
能接受一般的非法操作,给予合适处理。 |
易理解性 |
前台容易被用户理解使用,代码尽可能模块化,外加详细注释。 |
可扩展性 |
前台采取DIV+CSS分层管理,容易结构和样式扩展,后台分层管理,可增减功能,或是更换数据库,增强代码复用功能。 |
可重用性 |
前台css类样式以及后台类库和部分存储过程可被复用。 |
可测试性 |
尽可能采取多浏览器兼容,便于测试。 |
可维护性 |
UI和后台分层管理,便于维护 |
可移植性 |
逻辑代码单独封装,类单独复用,数据库采用数据层类处理,可移植性强。 |
分析后的约束
技术 |
C#语言,ASP.NET技术,CSS+DIV+js,Linq技术,存储过程,AXJX,多层架构等技术水平高。 |
平台 |
WinXP以上平台,采用VS2010平台开发 |
数据库 |
采用SQL2008数据库 |
界面风格 |
Web页面 |
时间 |
一周 |
其他 |
系统力求浏览器兼容多,可扩展性强,实用性高,界面优美 |
二 架构的分析与设计
第一部分:架构分析部分,概要架构设计
1 架构分析:序列图
本系统开发核心模块有三,分别如下:用户前台操作,管理员登陆,管理员后台操作。先将三部分序列图一一列出,具体操作如下:
1.1绘制用户前台查看车友动向时序图:
如图1所示。
1.2绘制管理员登陆时序图:
图2 管理员登陆后台时序分析图
1.3绘制管理员后台删除新闻时序图
图3 删除信息操作时序分析图
2 概念架构设计
在感念设计阶段,考虑方便灵活开发出项目,再结合以后维护考虑到使用三层架构,分别为界面层,业务逻辑层和数据层,即所谓(UI层,BLL层,DLL层)。具体各层功能操作如下:
首先,布局完成后,采用依赖倒置原则,从底层数据库层开发,依次业务逻辑层直到界面层。
2.1数据层:封装各个实体间的方法操作,包括对实体的增加,删除,修改,查询(参数查询,非参数查询)等功能,并在各个方法进行注释(主题,时间,作者)便于之后修改和版本更新
2.2业务逻辑层(实体层):封装各个实体的属性,并对属性进行私有化声明以提高安全性。然后在各个属性后进行注释。以求符合开放封闭原则
2.3界面层:界面层只需要引用数据层和业务逻辑层,引用后直接在相应执行代码上对相应方法调用。同样和操作前必须加以注释(主题,时间,作者)。
综述以上,结合开放封闭原则和依赖倒置原则基本达到要求,以使其更改便利,然后使用详细注释便于读取修改。其还有个特性就是为以后版本2做开放。
具体如图4 所示。
图4 系统逻辑架构概要设计
第二部分:架构设计部分,细化架构设计
一、逻辑视图
2 系统逻辑层次图
中亚万惠车友会主要分 为三层:界面层,业务逻辑层和数据层。
界面层的主要功能包括:
(1) 采用div+css布局时,修改扩展界面设计时降低前台耦合度。
(2) 通过引用业务逻辑和数据层进行方法调用,具体方法具体调用降低后台耦合。
业务逻辑层的主要功能包括:
(1) 采用业务逻辑层使其属性私有封装,增强安全性且便于管理
(2)不同实体业务逻辑封装到不同类里面
实体层的主要功能包括:
(1) 对不同实体的ADO操作放在不同数据类中
(2) 单一实体类中具体方法具体封装,符合开放封闭原则
具体如图5所示。
图5 系统逻辑视图
二、开发视图
1 系统开发环境图
本系统开发环境依旧是microsoft的fromwork环境下进行开发。本系统在FormWork4.0环境下开发出的版本1.对其接口要求符合microsoft的fromwork3.0以上版本均支持.开发语言则使用c#语言。数据库则采用sql server2008开发,对数据库要求在sql server2008以上版本均支持。
如图6所示。
图6 系统开发环境图
2 系统开发依赖关系视图
本程序命名为zhongya,可执行文件即是zhongya.exe。其在NET FormWork框架下VS2010环境中开发出,依赖数据ku为SQL Server2008.其所有接口类库均来自NET FormWork类库。本实验又分为三层架构,界面主要依赖vs2010中div+css开发,后台代码依赖于c#语言开发,数据库依赖SQL SERVER2008。
如图7所示。
图7 系统开发图
2 系统开发交互关系视图
从图8中不难看出里面包括4个类分别是界面类(UI)业务逻辑类(model)实体类(BLL)持久类即数据类(DAL)。
界面类(UI):依赖于实体类(BLL),以便属性设置。依赖数据层(DAL),以便数据操作方法调用,依赖业务逻辑层(Model)以便实体,数据层和界面交互。
实体类(BLL):依赖于数据层,作为类似通信,起着中间调用和属性封装作用。
持久类即数据类(DAL):封装各个实体数据操作类,在具体类中进行具体方法二次封装。其为最底层所以不具备任何依赖。
业务逻辑类(model):业务逻辑层是一个抽象类,负责实体类和界面类交互,故依赖于实体类。
如图8所示。
图8 系统开发交互关系图
三、部署视图
本系统开发后终归发布,所以部署尤为重要,本系统于本机测试,所以服务器即为本机采用的sql server2008 ,对于访问pc要求,执行文件在NET Fromwork框架下运行,所运行需求的硬件条件是windows操作系统。其具体部署如图9。
如图9所示。
图9 系统部署图
综述:以上开发均为版本1下设计,随后版本2以及版本3升级可能有些视图会发生细微变动。
三 子系统与类的分析与设计
一、类关系图纵览
子系统设计类关系尤为重要,从下图1不难看出本系统采用三层架构开发。其三层架构即为(界面层,业务逻辑层,数据层)各层之间的联系以及接口如下所述:
数据层(dal):数据层是具体实现的底层,不具备任何依赖。开发过程中,本系统共有5个实体,化为3张表,即为用户表,新闻表(车友动向新闻,户外活动新闻)产品表(车友用品,旅游优惠),在实现过程中,将其封装5个数据类(daluser.cs,daldxnews.cs,dalhdnews,dalypnproduct.cs,dallyproduct.cs)。在每个类中二次封装具体实现:例如(动向新闻类)daldxnew.scs,其具体实现方法和接口为查询新闻(select()),参数查询新闻(select(parameter)),添加新闻(insert(parameter)),删除新闻(delect(parameter)),修改新闻(update(parameter))等具体方法接口。
业务逻辑层(bll):首选引用dal层,然后封装每个实体的具体属性,并设置属性私有,以便于安全性和扩展,在bll留有接口,对dal方法调用,以形参形式留有接口。
界面层(UI):界面层尤为重要,主要实现和用户交互,所以前台设计本系统采用div+css,这样便于修改和设置。其接口在于css.cs类进行前台布局美化。还有一个接口就是:通过引用bll和dal,调用bll方法,具体调用dal底层方法,以实现具体操作。
以上对所以层和层之间接口均已介绍完,其这样使用优点有3个即是分层便于管理和界面更换,其次使用依赖倒置原则增强业务分析理解,和开放封闭原则,以最大最优化的实现修改和变化。
具体如图1所示。
图1 类关系图纵览
二、界面层类关系图
界面层类关系图的介绍,本系统基于NET Formwork4.0下,使用web创建,基于page运行,界面类(UI)页面实现了类的调用关系、继承关系,设计模式。界面层类关系图的介绍,本系统基于NET Formwork4.0下,使用web创建,基于page运行,页面实现了类的调用关系、继承关系,设计模式。
具体描述如下:
界面调用关系:通过前台即是UI(界面类)层调用bll(实体类)层留有的接口,以实现ui具体方法,无需理会后台(dal)如何实现,当然调用时基于已完成的数据层(dal)。Bll中的类调用dal,通过dal调用,以实现中间通信或是逻辑前提为界面类(UI)提供接口。Dal只是负责各个实体类方法具体实现,也是底层数据方法实现,负责与数据库进行交互。
继承关系:本系统主要有5个实体分别为:管理员登陆用户,户外活动新闻,车友动向新闻,旅游优惠,车友用品,然而数据库设计接段将:,(户外活动新闻,车友动向新闻)划分为新闻,(旅游优惠,车友用品)划分为产品。所以户外活动新闻和车友动向新闻继承于新闻;旅游优惠,车友用品继承于产品。具体如图2.
设计模式:本系统使用三层架构体现了高内聚低耦合思想,采用自下向上设计思想符合依赖倒置原则。每层操作封闭处理符合开放封闭原则。在数据库实现采用适配器设计模式。
具体描述如下:
界面调用关系:通过前台即是UI(界面类)层调用bll(实体类)层留有的接口,以实现ui具体方法,无需理会后台(dal)如何实现,当然调用时基于已完成的数据层(dal)。
继承关系:本系统主要有5个实体分别为:管理员登陆用户,户外活动新闻,车友动向新闻,旅游优惠,车友用品,然而数据库设计接段将:,(户外活动新闻,车友动向新闻)划分为新闻,(旅游优惠,车友用品)划分为产品。所以户外活动新闻和车友动向新闻继承于新闻;旅游优惠,车友用品继承于产品。其主要继承实体类(Bll)
设计模式:每层操作封闭处理符合开放封闭原则。在数据库实现采用适配器设计模式。
具体如图2所示。
图2 界面层类关系图
三、实体层类关系图
实体层类关系图的介绍,本系统基于NET Formwork4.0下,基于dal层下,页面实现了类的调用关系、继承关系,设计模式。界面层类关系图的介绍,本系统基于NET Formwork4.0下,使用web创建,基于page运行,页面实现了类的调用关系、继承关系,设计模式。
具体描述如下:
界面调用关系:通过前台即是UI(界面类)层调用bll(实体类)层留有的接口,以实现ui具体方法,无需理会后台(dal)如何实现,当然调用时基于已完成的数据层(dal)。Bll中的类调用dal,通过dal调用,以实现中间通信或是逻辑前提为界面类(UI)提供接口。Dal只是负责各个实体类方法具体实现,也是底层数据方法实现,负责与数据库进行交互。主要调用数据层(dal)
继承关系:本系统主要有5个实体分别为:管理员登陆用户,户外活动新闻,车友动向新闻,旅游优惠,车友用品,然而数据库设计接段将:,(户外活动新闻,车友动向新闻)划分为新闻,(旅游优惠,车友用品)划分为产品。所以户外活动新闻和车友动向新闻继承于新闻;旅游优惠,车友用品继承于产品。主要继承数据层(dal)方法.
设计模式:本系统使用三层架构体现了高内聚低耦合思想,采用自下向上设计思想符合依赖倒置原则。每层操作封闭处理符合开放封闭原则。在数据库实现采用适配器设计模式。
接口:
具体如图3所示
图3 实体层类关系图
四 数据库的分析与设计
一、数据库分析
本系统经分析可知总归有5个实体登陆用户(myuser)车友动向新闻(news)户外活动新闻(news)旅游优惠(product)车友用品(product)。基于这些实体属性在试验一以述,这里只是简述,车友动向新闻和户外活动新闻属性基本相同都是新闻类别,而旅游优惠和车友用品属性基本相同都是业务产品,那么基于此索性建立三个表,在news和product中分别加一个type进行区分。这样数据库表已经建立,耦合度很低了。在分析news和product两张表没有直接联系,但是考虑到登陆时,可以把信息放在同一张myuser、表中以降低冗余度,故作以下数据分析:
具体如图1所示。
二、数据库关系图
通过图2不难看出有三张表分别是news(新闻表),myuser(登录表)product(业务产品表)具体表属性分析:
news表:
n_id(新闻编号,类型int) n_title(新闻题目,类型 nvarchar(50))
n_time(发布时间,类型 nvarchar(50) n_content(新闻内容,类型 nvarchar(max)
n_type(新闻类别,类型 nvarchar(50)
注:新闻类型本系统分为:车友动向新闻和户外活动新闻。具有扩展性。
myuser表:
u_id(用户编号,类型int) u_user(用户名,类型 nvarchar(50)
u_pwd(用户密码,类型 nvarchar(50)
product 表:
p_id(产品编号,类型int) p_name(产品名称,类型 nvarchar(50)
p_priceh(产品价格,类型 nvarchar(50) h_price(会员价格,类型 nvarchar(50)
p_pic(产品图片,类型 nvarchar(50) p_note(产品介绍,类型 nvarchar(max)
p_type(产品类型,类型 nvarchar(50)
注:新闻类型本系统分为:车友动向新闻和户外活动新闻。具有扩展性。
关系描述:news与myuser使用都依赖于用户
Product与myuser之间依赖于管理员,
News与product本身没有联系
具体如图2所示。
图2 数据库关系图纵览
五 总结
一、 需求获取总结
需求分析一再强调软件开发的重中之中,结合上课所学,书本所讲述,外加中亚万惠车友会小系统的完成。让我对此有实践性的认识。软件需求分析特点:应尽量提供软件实现功能需求的全部信息,使得软件设计人员和软件测试人员不再需要需求方的接触。这就要求软件需求分析内容应正确、完整、一致和可验证。此外,为保证软件设计质量,便于软件功能的休整和验证,软件需求表达无岔意性,具有可追踪性和可修改性。下面结合总结和实践,以知识总结为引子,具体到实例和分析解决的方式进行描述如下:需求分析的具体内容可以归纳为五个方面:软件的功能需求,软件的非功能性需求,软件质量属性,软件对外接口,软件设计和实现上的约束。
软件的功能需求
功能需求通常为三个层次(1)业务需求(2)用户需求(3)系统需求。基于此结合中亚万惠。业务分析后大体功能基本确定主要包括以下模块:车友动向,户外新闻,车友用品,旅游优惠,车友达人,会员礼品,后台登陆,中亚简介等。大方向已定,下面寻求客户需求,客户只是潜意识的翻出一个模板界面,要求与此类型。本身不懂技术所以造成不少麻烦。界面设计和实现完全依赖于自己。到此需求基本结束。
软件的非功能性需求
除了功能需求之外,非功能需求也同样不可少。非功能需求主要包括:性能需求,质量属性,对外接口等,具体分析解决如下:
软件质量属性(如表1)
表1 如下:
性能 |
性能稳定 |
安全性 |
密码安全,采用参数化查询;数据库存储安全,防止SQL注入式攻击。 |
易用性 |
配备使用流程图,界面简洁实用为主。 |
持续可用性 |
程序基本稳定,控制在适宜人群范围之内 |
可伸展性 |
前台采用DIV+CSS模式,分层管理,后台用三层架构。增强伸缩性和扩展性 |
互操作性 |
数据库层,UI层,业务层独立处理,可根据需求改动。 |
可靠性 |
允许在需求人数同时在线,不易死机,采取阶段式测试和系统总体测试。优化功能和代码。 |
鲁棒性 |
能接受一般的非法操作,给予合适处理。 |
易理解性 |
前台容易被用户理解使用,代码尽可能模块化,外加详细注释。 |
可扩展性 |
前台采取DIV+CSS分层管理,容易结构和样式扩展,后台分层管理,可增减功能,或是更换数据库,增强代码复用功能。 |
可重用性 |
前台css类样式以及后台类库和部分存储过程可被复用。 |
可测试性 |
尽可能采取多浏览器兼容,便于测试。 |
可维护性 |
UI和后台分层管理,便于维护 |
可移植性 |
逻辑代码单独封装,类单独复用,数据库采用数据层类处理,可移植性强。 |
软件对外接口
对外接口主要通过三层架构实现,三层通过前台即是UI(界面类)层调用bll(实体类)层留有的接口,以实现ui具体方法,无需理会后台(dal)如何实现,当然调用时基于已完成的数据层(dal)。Bll中的类调用dal,通过dal调用,以实现中间通信或是逻辑前提为界面类(UI)提供接口。Dal只是负责各个实体类方法具体实现,也是底层数据方法实现,负责与数据库进行交互。主要调用数据层(dal)
软件设计和实现上的约束。(如表2)
表2 如下:
技术 |
C#语言,ASP.NET技术,CSS+DIV+js,Linq技术,存储过程,AXJX,多层架构等技术水平高。 |
平台 |
WinXP以上平台,采用VS2010平台开发 |
数据库 |
采用SQL2008数据库 |
界面风格 |
Web页面 |
时间 |
一周 |
其他 |
系统力求浏览器兼容多,可扩展性强,实用性高,界面优美 |
二、 架构分析与设计总结
本阶段设计分两个部分,分别是概念架构和细化架构,以下是结合中亚万惠系统与五视图具体总结
架构分析可运用五视图法:
一 概念架构设计
在感念设计阶段,考虑方便灵活开发出项目,再结合以后维护考虑到使用三层架构,分别为界面层,业务逻辑层和数据层,即所谓(UI层,BLL层,DLL层)。具体各层功能操作如下:
首先,布局完成后,采用依赖倒置原则,从底层数据库层开发,依次业务逻辑层直到界面层。
2.1数据层:封装各个实体间的方法操作,包括对实体的增加,删除,修改,查询(参数查询,非参数查询)等功能,并在各个方法进行注释(主题,时间,作者)便于之后修改和版本更新
2.2业务逻辑层(实体层):封装各个实体的属性,并对属性进行私有化声明以提高安全性。然后在各个属性后进行注释。以求符合开放封闭原则
2.3界面层:界面层只需要引用数据层和业务逻辑层,引用后直接在相应执行代码上对相应方法调用。同样和操作前必须加以注释(主题,时间,作者)。
综述以上,结合开放封闭原则和依赖倒置原则基本达到要求,以使其更改便利,然后使用详细注释便于读取修改。其还有个特性就是为以后版本2做开放。
逻辑设计
中亚万惠车友会主要分 为三层:界面层,业务逻辑层和数据层。
界面层的主要功能包括:
(1) 采用div+css布局时,修改扩展界面设计时降低前台耦合度。
(2) 通过引用业务逻辑和数据层进行方法调用,具体方法具体调用降低后台耦 合
业务逻辑层的主要功能包括:
(1) 采用业务逻辑层使其属性私有封装,增强安全性且便于管理
(2)不同实体业务逻辑封装到不同类里面
实体层的主要功能包括:
(1 对不同实体的ADO操作放在不同数据类中
(2) 单一实体类中具体方法具体封装,符合开放封闭原则
二、开发设计
系统开发环境设计
本系统开发环境依旧是microsoft的fromwork环境下进行开发。本系统在FormWork4.0环境下开发出的版本1.对其接口要求符合microsoft的fromwork3.0以上版本均支持.开发语言则使用c#语言。数据库则采用sql server2008开发,对数据库要求在sql server2008以上版本均支持。
系统开发依赖关系设计
本程序命名为zhongya,可执行文件即是zhongya.exe。其在NET FormWork框架下VS2010环境中开发出,依赖数据ku为SQL Server2008.其所有接口类库均来自NET FormWork类库。本实验又分为三层架构,界面主要依赖vs2010中div+css开发,后台代码依赖于c#语言开发,数据库依赖SQL SERVER2008。
系统开发交互关系设计
不难看出里面包括4个类分别是界面类(UI)业务逻辑类(model)实体类(BLL)持久类即数据类(DAL)。
界面类(UI):依赖于实体类(BLL),以便属性设置。依赖数据层(DAL),以便数据操作方法调用,依赖业务逻辑层(Model)以便实体,数据层和界面交互。
实体类(BLL):依赖于数据层,作为类似通信,起着中间调用和属性封装作用。
持久类即数据类(DAL):封装各个实体数据操作类,在具体类中进行具体方法二次封装。其为最底层所以不具备任何依赖。
业务逻辑类(model):业务逻辑层是一个抽象类,负责实体类和界面类交互,故依赖于实体类。
部署设计
本系统开发后终归发布,所以部署尤为重要,本系统于本机测试,所以服务器即为本机采用的sql server2008 ,对于访问pc要求,执行文件在NET Fromwork框架下运行,所运行需求的硬件条件是windows操作系统。
三、 子系统与类分析与设计总结
子系统类设计部分,主要从类关系设计,界面设计,实体设计三大部分着手,具体如下:
类关系设计
子系统设计类关系尤为重要,从下图1不难看出本系统采用三层架构开发。其三层架构即为(界面层,业务逻辑层,数据层)各层之间的联系以及接口如下所述:
数据层(dal):数据层是具体实现的底层,不具备任何依赖。开发过程中,本系统共有5个实体,化为3张表,即为用户表,新闻表(车友动向新闻,户外活动新闻)产品表(车友用品,旅游优惠),在实现过程中,将其封装5个数据类(daluser.cs,daldxnews.cs,dalhdnews,dalypnproduct.cs,dallyproduct.cs)。在每个类中二次封装具体实现:例如(动向新闻类)daldxnew.scs,其具体实现方法和接口为查询新闻(select()),参数查询新闻(select(parameter)),添加新闻(insert(parameter)),删除新闻(delect(parameter)),修改新闻(update(parameter))等具体方法接口。
业务逻辑层(bll):首选引用dal层,然后封装每个实体的具体属性,并设置属性私有,以便于安全性和扩展,在bll留有接口,对dal方法调用,以形参形式留有接口。
界面层(UI):界面层尤为重要,主要实现和用户交互,所以前台设计本系统采用div+css,这样便于修改和设置。其接口在于css.cs类进行前台布局美化。还有一个接口就是:通过引用bll和dal,调用bll方法,具体调用dal底层方法,以实现具体操作。
以上对所以层和层之间接口均已介绍完,其这样使用优点有3个即是分层便于管理和界面更换,其次使用依赖倒置原则增强业务分析理解,和开放封闭原则,以最大最优化的实现修改和变化。
界面层类设计
界面层类关系图的介绍,本系统基于NET Formwork4.0下,使用web创建,基于page运行,界面类(UI)页面实现了类的调用关系、继承关系,设计模式。界面层类关系图的介绍,本系统基于NET Formwork4.0下,使用web创建,基于page运行,页面实现了类的调用关系、继承关系,设计模式。
具体描述如下
界面调用关系:通过前台即是UI(界面类)层调用bll(实体类)层留有的接口,以实现ui具体方法,无需理会后台(dal)如何实现,当然调用时基于已完成的数据层(dal)。Bll中的类调用dal,通过dal调用,以实现中间通信或是逻辑前提为界面类(UI)提供接口。Dal只是负责各个实体类方法具体实现,也是底层数据方法实现,负责与数据库进行交互。
继承关系:本系统主要有5个实体分别为:管理员登陆用户,户外活动新闻,车友动向新闻,旅游优惠,车友用品,然而数据库设计接段将:,(户外活动新闻,车友动向新闻)划分为新闻,(旅游优惠,车友用品)划分为产品。所以户外活动新闻和车友动向新闻继承于新闻;旅游优惠,车友用品继承于产品。具体如图2.
设计模式:本系统使用三层架构体现了高内聚低耦合思想,采用自下向上设计思想符合依赖倒置原则。每层操作封闭处理符合开放封闭原则。在数据库实现采用适配器设计模式。
具体描述如下:
界面调用关系:通过前台即是UI(界面类)层调用bll(实体类)层留有的接口,以实现ui具体方法,无需理会后台(dal)如何实现,当然调用时基于已完成的数据层(dal)。
继承关系:本系统主要有5个实体分别为:管理员登陆用户,户外活动新闻,车友动向新闻,旅游优惠,车友用品,然而数据库设计接段将:,(户外活动新闻,车友动向新闻)划分为新闻,(旅游优惠,车友用品)划分为产品。所以户外活动新闻和车友动向新闻继承于新闻;旅游优惠,车友用品继承于产品。其主要继承实体类(Bll)
设计模式:每层操作封闭处理符合开放封闭原则。在数据库实现采用适配器设计模式。
实体层类设计
实体层类关系图的介绍,本系统基于NET Formwork4.0下,基于dal层下,页面实现了类的调用关系、继承关系,设计模式。界面层类关系图的介绍,本系统基于NET Formwork4.0下,使用web创建,基于page运行,页面实现了类的调用关系、继承关系,设计模式。
具体描述如下:
界面调用关系:通过前台即是UI(界面类)层调用bll(实体类)层留有的接口,以实现ui具体方法,无需理会后台(dal)如何实现,当然调用时基于已完成的数据层(dal)。Bll中的类调用dal,通过dal调用,以实现中间通信或是逻辑前提为界面类(UI)提供接口。Dal只是负责各个实体类方法具体实现,也是底层数据方法实现,负责与数据库进行交互。主要调用数据层(dal)
继承关系:本系统主要有5个实体分别为:管理员登陆用户,户外活动新闻,车友动向新闻,旅游优惠,车友用品,然而数据库设计接段将:,(户外活动新闻,车友动向新闻)划分为新闻,(旅游优惠,车友用品)划分为产品。所以户外活动新闻和车友动向新闻继承于新闻;旅游优惠,车友用品继承于产品。主要继承数据层(dal)方法.
设计模式:本系统使用三层架构体现了高内聚低耦合思想,采用自下向上设计思想符合依赖倒置原则。每层操作封闭处理符合开放封闭原则。在数据库实现采用适配器设计模式。
接口:
四、数据设计总结
还原课堂:数据库设计:
概念设计----》详细设计-----》具体实施----》持久化存储
概念设计:
数据库本系统经分析可知总归有5个实体登陆用户(myuser)车友动向新闻(news)户外活动新闻(news)旅游优惠(product)车友用品(product)。基于这些实体属性在试验一以述,这里只是简述,车友动向新闻和户外活动新闻属性基本相同都是新闻类别,而旅游优惠和车友用品属性基本相同都是业务产品,那么基于此索性建立三个表,在news和product中分别加一个type进行区分。这样数据库表已经建立,耦合度很低了。在分析news和product两张表没有直接联系,但是考虑到登陆时,可以把信息放在同一张myuser、表中以降低冗余度,故作以下数据分析:
详细设计:
有三张表分别是news(新闻表),myuser(登录表)product(业务产品表)具体表属性分析:
news表:
n_id(新闻编号,类型int) n_title(新闻题目,类型 nvarchar(50))
n_time(发布时间,类型 nvarchar(50) n_content(新闻内容,类型 nvarchar(max)
n_type(新闻类别,类型 nvarchar(50)
注:新闻类型本系统分为:友动向新闻和户外活动新闻。具有扩展性。
myuser表:
u_id(用户编号,类型int) u_user(用户名,类型 nvarchar(50)
u_pwd(用户密码,类型 nvarchar(50)
product 表:
p_id(产品编号,类型int) p_name(产品名称,类型 nvarchar(50)
p_priceh(产品价格,类型 nvarchar(50) h_price(会员价格,类型 nvarchar(50)
p_pic(产品图片,类型 nvarchar(50) p_note(产品介绍,类型 nvarchar(max)
p_type(产品类型,类型 nvarchar(50)
注:新闻类型本系统分为:车友动向新闻和户外活动新闻。具有扩展性。
关系描述:news与myuser使用都依赖于用户
Product与myuser之间依赖于管理员,
News与product本身没有联系
创建代码:
/*创建中亚车友会数据库*/
create database zhongya;
/*创建中亚车友会数据库新闻表 新闻表包括(户外活动,车友动向) 属性(编号,新闻题目,发布时间,新闻内容,新闻类型) */
create table news ( n_id int IDENTITY(1,1) unique not null, n_title nvarchar(50) not null, n_time nvarchar(50) not null, n_content nvarchar(max) not null, n_type nvarchar(50) not null )
/*创建中亚车友会数据库产品表 产品表包括(车友用品,优惠礼品) 属性(产品编号,拆品名称,产品价格,会员价格,产品图片,产品介绍,产品类型)*/
create table product ( p_id int IDENTITY(1,1) unique not null, p_name nvarchar(50) not null, p_price nvarchar(50) not null, h_price nvarchar(50) not null, p_pic nvarchar(50) , p_note nvarchar(max) not null, p_type nvarchar(50) not null )
中亚万惠车友会部分源代码
(界面层)UI层源代码
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { bdhd();//户外运动新闻显示 bddx();//车友动向新闻显示 bdyp();//车友用品图片显示 bdyh();//优惠旅游信息显示 } } /// <summary> /// 主题:新闻层引用 /// </summary> model.modhd mhd = new model.modhd();//引用用户活动model层 dal.hdnews dhd = new dal.hdnews();//引用用户活动dal层 /// <summary> /// 主题:车友用品产品层引用 /// </summary> model.myongpin myp = new model.myongpin();//引用车友用品model层 dal.yongpinproduct dyp = new dal.yongpinproduct();//引用车友用品dal层 /// <summary> /// 主题:优惠旅游层引用 /// </summary> model.myongpin myh = new model.myongpin();//引用优惠旅游model层 dal.youhui dyh =new dal.youhui();//引用优惠旅游dal层 /// <summary> ///主题:主页显示户外活动新闻标题和时间 ///时间:2012年11月28日11:25:56 ///作者:bnc /// </summary> public void bdhd() { DataSet ds = dhd.selhd(); GVhuodong.DataSource = ds; GVhuodong.DataBind(); } /// <summary> ///主题:主页显示车友动向新闻标题和时间 ///时间:2012年11月28日11:25:56 ///作者:bnc /// </summary> public void bddx() { DataSet ds = dhd.seldx(); GVCX.DataSource = ds; GVCX.DataBind(); } /// <summary> ///主题:主页显示车友用品新闻标题和时间 ///时间:2012年11月28日11:25:56 ///作者:bnc /// </summary> public void bdyp() { DataSet ds = dyp.selyp(); //FormView1.DataSource = ds; //FormView1.DataBind(); DataList1.DataSource = ds; DataList1.DataBind(); } /// <summary> ///主题:主页显示优惠旅游 ///时间:2012年11月28日11:25:56 ///作者:bnc /// </summary> public void bdyh() { DataSet ds = dyh.selyh(); FormView2.DataSource = ds; FormView2.DataBind(); } } 注:界面层代码量过大,只拿主页核心代码粘贴出来。
(业务逻辑层)model层源代码
/// <summary> /// 题目:新闻属性 /// 时间:2012年11月28日14:35:50 /// 作者:bnc /// </summary> public class modhd { public int n_id { get; set; }//新闻编号 public string n_title { get; set; }//新闻题目 public string n_time { get; set; }//新闻发布时间 public string n_content { get; set; }//新闻内容 public string n_type { get; set; }//新闻类别 } /// <summary> /// 题目:产品属性 /// 时间:2012年11月28日14:37:40 /// 作者:bnc /// </summary> public class myongpin { public int p_id { get; set; }//产品编号 public string p_name { get; set; }//产品名称 public string p_price { get; set; }//产品价格 public string h_price { get; set; }//会员价格 public string p_pic { get; set; }//产品图片 public string p_note { get; set; }//产品介绍 public string p_type { get; set; }//产品类别 } /// <summary> /// 题目:管理员属性 /// 时间:2012-12-1 17:05:32 /// 作者:bnc /// </summary> public class user { public int u_id { get; set; }//管理员编号 public string u_user { get; set; }//管理员名称 public string u_pwd { get; set; }//管理员密码 }
(数据层)DAL层源代码
public class hdnews { SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlcon"].ConnectionString); SqlDataAdapter da; SqlCommand cmd; /// <summary> /// 1 /// 题目:户外活动新闻题目时间显示 /// 时间:2012年11月28日13:55:30 /// 作者:bnc /// </summary> /// <returns></returns> public DataSet selhd() { da=new SqlDataAdapter("select top 6 * from news where n_type='户外活动新闻'",con); DataSet ds = new DataSet(); da.Fill(ds); if (ds.Tables[0].Rows.Count > 0) { return ds; } else { return null; } } /// <summary> /// 1 /// 题目:更多户外活动新闻题目时间显示 /// 时间:2012-11-29 15:54:46 /// 作者:bnc /// </summary> /// <returns></returns> public DataSet selallhd() { da = new SqlDataAdapter("select * from news where n_type='户外活动新闻'", con); DataSet ds = new DataSet(); da.Fill(ds); if (ds.Tables[0].Rows.Count > 0) { return ds; } else { return null; } } /// <summary> /// 1 /// 题目:户外活动新闻菜单查看 /// 时间:2012年11月28日22:00:20 /// 作者:bnc /// </summary> /// <returns></returns> public DataSet selhdcd() { da = new SqlDataAdapter("select * from news where n_type='户外活动新闻'", con); DataSet ds = new DataSet(); da.Fill(ds); if (ds.Tables[0].Rows.Count > 0) { return ds; } else { return null; } } /// <summary> /// 1 /// 题目:户外活动新闻详细信息 /// 时间:2012-11-29 15:25:23 /// 作者:bnc /// </summary> /// <returns></returns> public DataSet selhdxw(string id) { da = new SqlDataAdapter("select * from news where n_type='户外活动新闻' and n_id='"+id+"'", con); DataSet ds = new DataSet(); da.Fill(ds); if (ds.Tables[0].Rows.Count > 0) { return ds; } else { return null; } } /// <summary> /// 1 /// 题目:根据类型删除信息 /// 时间:2012年11月30日15:21:49 /// 作者:bnc /// </summary> /// <returns></returns> public bool deletenews(string type, string id) { con.Open(); cmd = new SqlCommand("delete news where n_type='" + type + "' and n_id='" + id + "'", con); int i = cmd.ExecuteNonQuery(); con.Close(); if (i > 0) { return true; } else { return false; } } /// <summary> /// 1 /// 题目:删除信息后刷新页面 /// 时间:2012年11月30日15:21:49 /// 作者:bnc /// </summary> /// <returns></returns> public DataSet selectnews(string type, string id) { con.Open(); da = new SqlDataAdapter("select * from news where n_type='" + type + "' and n_id='" + id + "'", con); DataSet ds = new DataSet(); da.Fill(ds); if (ds.Tables[0].Rows.Count > 0) { return ds; } else { return null; } } /// <summary> /// 1 /// 题目:更新查询数据绑定 /// 时间:2012年11月30日15:21:49 /// 作者:bnc /// </summary> /// <returns></returns> public DataSet selupdenews(string nid) { con.Open(); da = new SqlDataAdapter("select * from news where n_id='" + nid + "'", con); DataSet ds = new DataSet(); da.Fill(ds); con.Close(); if (ds.Tables[0].Rows.Count > 0) { return ds; } else { return null; } } /// <summary> /// 1 /// 题目:更新信息后刷新页面 /// 时间:2012年11月30日18:20:48 /// 作者:bnc /// </summary> /// <returns></returns> public bool updatenews(string title, string time, string content, string type, string nid) { con.Open(); cmd = new SqlCommand("update news set n_title='" + title + "',n_time='" + time + "', n_content='" + content + "',n_type='" + type + "' where n_id='" + nid + "' ", con); int i=cmd.ExecuteNonQuery(); con.Close(); if (i>0) { return true; } else { return false; } } /// <summary> /// 1 /// 题目:添加信息后刷新页面 /// 时间:2012年11月30日18:20:48 /// 作者:bnc /// </summary> /// <returns></returns> public bool insertnews(string title, string time, string content, string type) { con.Open(); cmd = new SqlCommand("insert into news values('" + title + "','" + time + "','" + content + "','" + type + "')", con); int i=cmd.ExecuteNonQuery(); if (i>0) { return true; } else { return false; } } /// 2 /// 题目:车友动向新闻题目时间显示 /// 时间:2012年11月28日13:55:30 /// 作者:bnc /// </summary> /// <returns></returns> public DataSet seldx() { da = new SqlDataAdapter("select top 6 * from news where n_type='车友动向新闻'", con); DataSet ds = new DataSet(); da.Fill(ds); if (ds.Tables[0].Rows.Count > 0) { return ds; } else { return null; } } /// <summary> /// 2 /// 题目:更多车友动向新闻题目时间显示 /// 时间:2012-11-29 15:54:46 /// 作者:bnc /// </summary> /// <returns></returns> public DataSet selalldx() { da = new SqlDataAdapter("select * from news where n_type='车友动向新闻'", con); DataSet ds = new DataSet(); da.Fill(ds); if (ds.Tables[0].Rows.Count > 0) { return ds; } else { return null; } } /// <summary> /// 2 /// 题目:车友动向新闻菜单查看 /// 时间:2012年11月28日22:00:20 /// 作者:bnc /// </summary> /// <returns></returns> public DataSet seldxcd() { da = new SqlDataAdapter("select top 10 * from news where n_type='车友动向新闻'", con); DataSet ds = new DataSet(); da.Fill(ds); if (ds.Tables[0].Rows.Count > 0) { return ds; } else { return null; } } /// <summary> /// 2 /// 题目:车友动向新闻详细信息 /// 时间:2012-11-29 15:25:23 /// 作者:bnc /// </summary> /// <returns></returns> public DataSet seldxxw(string id) { da = new SqlDataAdapter("select * from news where n_type='车友动向新闻' and n_id='" + id + "'", con); DataSet ds = new DataSet(); da.Fill(ds); if (ds.Tables[0].Rows.Count > 0) { return ds; } else { return null; } } } 注释:本程序完全自主完成,各层功能均能实现,本源码只是截取每层核心部分代码
到此,伴随着几个小时的结束,小伙的这篇文章也该告一段落了,经过这次小型项目的运用以及总结,小伙确实收获很多,今天拿来跟园友共享。本文所有总结都是本人完成,由于也是刚接触软件工程以及设计模式不久,其中错误之处,还望大虾指点改正,一则惠己,二则也避了误人之过。
作者:白宁超,工学硕士,现工作于四川省计算机研究院,研究方向是自然语言处理和机器学习。曾参与国家自然基金项目和四川省科技支撑计划等多个省级项目。著有《自然语言处理理论与实战》一书。 自然语言处理与机器学习技术交流群号:436303759 。
出处:http://www.cnblogs.com/baiboy/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。