【软件工程】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 ) |
/*创建中亚车友会数据库产品表 产品表包括(车友用品,优惠礼品) 属性(产品编号,拆品名称,产品价格,会员价格,产品图片,产品介绍,产品类型)*/
1 2 3 4 5 6 7 8 9 10 | 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层源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | 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层源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | /// <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层源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 | 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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步