录
摘 要 1
第一章 绪论 2
1.1研究背景 2
1.2研究意义 2
1.3国内外文献综述 2
1.3.1国外文献综述 2
1.3.2国内文献综述 3
第2章 汽车之家门户网站的需求分析 4
2.1系统的可行性分析 4
2.1.1系统的经济可行性 4
2.1.2系统的技术可行性 4
2.1.3系统的操作可行性 4
2.2系统的目标分析 5
2.3系统的功能需求分析 5
2.3.1游客用例分析 6
2.3.2会员用例分析 7
2.3.3管理员用例分析 8
2.4系统数据库分析 9
第3章 汽车之家门户网站的设计 10
3.1系统功能模块的划分 10
3.2系统数据流图 10
3.3系统数据库设计 12
第4章汽车之家门户网站的实现 15
4.1系统实现的功能 15
4.2汽车产品浏览查询模块实现 15
4.3会员注册模块实现 15
4.4留言本功能模块实现 16
4.5用户管理模块实现 16
4.6汽车产品公告模块实现 16
第5章 汽车之家门户网站的测试 18
5.1系统测试概述 18
5.2系统测试用例 18
结论 21
参考文献 22
致 谢 23
摘 要
随着互联网的快速发展,汽车企业为了求生存、谋发展,必须顺应时代的发展潮流,为汽车企业构建一套企业门户网站平台,从而在竞争日益复杂的汽车市场中占据先机。互联网的商业价值愈发显现,各个企业以网络为基础,构建一个信息化平台,是大势所趋,基于网路平台的市场竞争将是未来汽车企业的主攻点,在充满机遇和挑战的现代化浪潮中,汽车企业必须与时俱进,否则将会处于被动的局面。
关键词:汽车企业;门户网站;ASP.NET;信息化平台;Web应用程序
第4章汽车之家门户网站的实现
4.1系统实现的功能
在本文第三章和第四章的基础上,将基于ASP.NET的汽车企业门户网站系统的功能模块划分为九大模块,本将将实现这九大模块,分别为:汽车产品浏览查询模块、会员注册模块、留言本功能模块、用户管理模块、汽车产品公告模块、汽车产品新闻模块、留言本管理模块、汽车产品管理模块以及密码找回模块。
4.2汽车产品浏览查询模块实现
该功能模块实现用户对汽车产品信息的方便浏览,包括汽车产品介绍、最新汽车新闻热点、本网站最新公告等消息,这些浏览内容清晰条理,以最大限度的方便用户的浏览,此外为了满足用户对本网站汽车产品的查询要求,本网站提供对汽车产品类别和汽车产品具体信息查询,通过这种层次化的查询方式,便于客户快速准确的查询到自己关心的商品。
1)汽车产品介绍、最新汽车新闻热点、本网站最新公告这些内容通过DataList控件进行显示,对DataList任务进行部署,在项模板(ItemTemplate)上进行编辑,在对表单进行布局设计后,将要显示的数据项列出,并在每一个数据项目名称后边添加一个Label,在其对应的Label任务中完成DataBinds的编辑工作,使用自定义绑定,用代码表达式方式完成对数据的绑定,建立与底层数据库的连接,从而完成数据的显示。
2)汽车产品查询功能是通过AutoSearch.axpx和AutoSearch.aspx.cs页面文件来完成的,在汽车产品查询表单中,通过DropDownList控件来选择搜索条件,在TextBox控件中输入搜索关键字,在“类别”列表中选择车型,点击“搜索”按钮,执行btnsel_Click”事件,在数据库中查询相应数据,并在查询表单的页面中通过Gridview控件显示查询结果。
4.3会员注册模块实现
该功能模块实现用户的注册功能,本网站汽车信息查询,用户留言等内容的完成需要用户登陆,当游客注册本网站成为本系统的合法用户时可以使用这些功能。该功能模块UserRegister.aspx页面来实现,当点击首页中的注册按钮时,页面转到UserRegister.aspx页面,在该页面中部署好表单布局,罗列出用户注册成会员的所有待注册信息,用户名、密码等内容使用TextBox控件来完成,角色通过DropDownList控件来实现,在ListlItem成员中添加“普通用户”,用户就可以以“普通会员”的角色来注册;当点击本表单中的“注册”按钮时,执行“BtnUser_Reg_Click”事件,执行SQL插入语句,将用户的注册信息,插入到数据库的会员表中。
4.4留言本功能模块实现
该功能模块实现留言本功能,给本系统的用户提供留言功能,是实现企业和用户密切交流的有效途径,通过构建这样一种沟通桥梁,企业可以及时的得到用户的反馈信息,对企业中存在的产品和服务问题进行调整和改进,同时用户也能快速的得到企业的答复,从而解除心中的疑虑,这样,企业和用户之间可以建立良好的信息传递机制。
该功能模块通过LeaveMes.aspx页面来实现,当会员登陆本系统后,通过点击导航栏中的“留言本”,页面转到LeaveMes.aspx页面,在此页面中已经对表单完成了布局,用户在TextBox控件中添加留言主题、留言内容、留言时间以及留言人等内容,通过点击“提交留言”,完成BtnLeaveMes_Click”事件,将会员提交的留言,通过执行SQL插入语句,插入到数据库表LeaveMes中,此外通过点击表单中的“查看我的留言”按钮,执行“BtnCheckMes Click”事件,通过SQL选择语句来显示会员的所有留言。
4.5用户管理模块实现
该功能模块实现管理员对本网站注册会员的管理,包括添加用户、修改用户和别除用户,实现该功能的页面为UserManger..aspx.当管理员成功登陆后台系统时,通过点击“用户管理”按钮,弹出用户管理表单页面,在该页面中引用木板,将母版中的ContentPlaceHolder控件与本页面合并,通过GridView控件来显示所有的会员信息,信息的显示是通过数据绑定操作来实现。
点击“添加新用户”按钮,转到UserMangerAdd.aspx页面,在该页面中完成用户信息添加,通过点击“添加”按钮,执行BtnUserAdd Click”事件,将表单信息插入到数据库User表中;点击UserManger.aspx页面中“修改”按钮,转到UserMangerUpdate.aspx页面,将表单中的信息修改,执行SQL更新命令,更新到数据库表User中;点击UserManger..aspx页面中“删除”按钮,转到UserMangerDelete.aspx页面,执行SQL删除命令,将数据从数据库表User中删除。
4.6汽车产品公告模块实现
该功能模块实现管理员对本网站汽车产品公告的管理,包括添加公告、修改公告和删除公告,实现该功能的页面为Notice Manger..aspx。
当管理员成功登陆后台系统时,通过点击“公告管理”按钮,弹出公告管理表单页面,这个过程与4.5小节类似,在该页面中引用木板,将母版中的ContentPlaceHolder控件与本页面合并,通过GridView控件来显示所有的公告信息,信息的显示是通过数据绑定操作来实现,公告管理模板的表单如图4.6所示。点击“添加公告”按钮,转到NoticeMangerAdd.aspx页面,在该页面中完成公告信息添加,通过点击添加”按钮,执行BtnNoticeAdd Click”事件,将表单信息插入到数据库Notice表中;点击NoticeManger..aspx页面中“修改”按钮,转到NoticeMangerUpdate.aspx页面,将表单中的信息修改,执行SQL更新命令,更新到数据库表Notice中;点击NoticeManger..aspx页面中“删除”按钮,转到NoticeMangerDelete.aspx页面,执行SQL别除命令,将数据从数据库表Notice中删除。
互控件的名称和定义在学术界并没有统一的标准,也许在说某一个名字的时候你并没有理解它的意思,本文主要是让大家来见识一下那些常用的交互控件,一起来看看~
曾几何时,对于刚入圈的交互设计师遇到一些具有国际视野(略带一丝装逼)的产品经理时,也会出现上图中的情形。亦或许在某个不经意的瞬间,你也曾犯过下图的错误。那我们今天来认识一下那些常用的交互控件~
其实关于交互控件的名称和定义在学术界并没有统一的标准,但是目前市场主流的OS厂商都有自己的标准定义,分为:Apple的Human Interface Guidelines 和 Google的Material Design。
可以看到:在Apple的Human Interface Guidelines中apple将交互控件归入视图(Views)中,而Google的Material Design将交互控件归入组件(Components)中。
在这里我不会严格按照两家给出的标准对每一个控件都做详尽的赘述,我将把工作中常用的组件按照功能来划分一下并参考iOS和Google对于这些组件的描述,来向大家简单梳理一下他们的定义和用法。
在正式开始之前,我先简单介绍一下模态与非模态。下面是维基百科关于模态窗口(Modal window)的标准解释。其含义就是:模态窗口下,用户被强制必须先与当前视窗进行交互才能回到主窗口,此时用户的行为是线性的。由于其会打断用户操作并且强制用户进行交互,因此模态控件的使用必须谨慎。
反之,非模态即用户不被强制先与当前视窗进行交互也可以回到主窗口,用户行为是非线性的,拥有更多主动权。
这类控件包括Popup(或者叫Popover)、Action views、Action sheets/ Sheets_bottom、Dropdown menu,其共同特点是由用户主动触发(默认隐藏)、轻量化、指向性较强、包含操作、不会自动消失。
这类控件多用于屏幕空间的移动设备,作为低频但重要的操作入口(Dropdown menu在PC的应用场景同样很多)。这一类控件多半是非模态的。
iOS的Popup(Popover)与Android的Dropdown menu的使用场景和展现形式基本类似,主要用于收纳一些默认不展示的低频选项, 不过值得注意的是:Popup和Dropdown menu出现的位置和方式与其入口的位置是有很大关系的,特别当入口按钮是位于屏幕边缘的时候尤其需要注意。
此外,Popup(Popover)自带箭头的强指示性,同样适用于展示隐藏操作或新功能上线后的用户教育。
不同于Popup(Popover)和Dropdown menu几乎可以出现在屏幕的任何位置,Action views和Action sheets/ Sheets_bottom一般出现在屏幕底部。同样,他们也是用于容纳并展示低频但重要的操作。
这类控件包括Toast、Snackbars、HUD,其共同特点是:不一定由用户主动触发、轻量化且一般不包含操作,展示时间较短(一般在3秒以内)且会自动消失,这类控件多用于系统状态或者用户操作结果的展示。同样,这类控件基本都是非模态的。
根据维基和android开发者指南的解释:Toast是一种小巧的作为操作反馈的信息窗口,并且会自动消失。
有意思的是,据说一位微软前员工在开发MSN Messenger时,觉得MSN弹出通知方式很像烤面包(Toast)烤熟时从烤面包机(Toaster)里弹出来一样,因此把这种提示方式命名为Toast,后来这位微软前员工带着这一习惯命名跳槽去了Google。
其实,在实际应用中,Toast的应用延伸较多,除了作为操作反馈的信息展示窗口,还常常被用来作为系统状态更新时的提示,并且在出现的位置上,也没有非常严格的定义。
按照使用场景和元素来说,Snackbars可以简单理解为Toast的升级版本,但根据Google Material Design的定义,我们可以发现:Snackbars与Toast的主要差别在于前者可以包含一个操作按钮,而后者不包含。
在实际应用中,Snackbars的应用范围其实比较广,我们会发现:Snackbars主要被用在展示一些对用户很重要的操作结果,比如:删除文件或者快速引导。
HUD全称叫做UIProgressHUD,其实在iOS Human Interface Guidelines中并没有Toast和Snackbars这样的定义,但是与之对应的是UIProgressHUD(直译为界面进程浮层),这种控件是iOS系统私有的,在App Store上线的app原则上是不能直接获取的,所以出现了许多模仿的第三方控件(主要是app开放者用以与iOS的UI风格保持一致的嵌入式组件)。
其实,我们这样理解这三者之间的关系更加简单明了:Google的Toast≈iOS的HUD,Snackbars=Toast+操作按钮,Toast+Snackbars+HUD都是用来展示app或者系统内的状态信息。
这类控件主要是Dialogs/ Alerts,严格意义上来说,其实Alerts(警告型对话框)也是属于Dialogs中的一种。Google的Material Design将Dialogs分为:Alert Dialog、Simple Dialog、Communication Dialog和Full-screen Dialog,但是在iOS中并没有定义Dialogs这种控件,而只是对Alerts做了定义。
对话框的精髓在于让用户聚焦,它一般有两种使用场景:
由于警示型对话框出现的形式非常直接(包含用户主动触发与系统自动触发),且常常会打断用户当前操作行为(强打扰性),因此绝大部分的警示型对话框被用在关键信息处理或者关键状态提示上,
如:
值得注意的是:在警示型对话框中的按钮文案使用一定要避免歧义,不要让用户做选择变成一道哲学命题。
Google Material Design总结了一些Alert Dialog按钮文案的一些基本规则:
(1)文案要释义操作行为,比如:当问题为“您是否要放弃编辑当前的邮件”相比于用简单的“是”或“否”,使用“放弃编辑”和“继续编辑”用户更能清楚操作后的预期效果。
(2)从用户习惯来说,对于当前提问的肯定回答应置于右侧,而否定回答应置于左侧 。
同样接着上一个例子,当问及“您是否要放弃编辑当前的邮件”时,“放弃编辑”应该置于右侧,而“继续编辑”应该置于左侧。
(3)对于APP内或系统重要状态的提示,不要给多余的按钮而让用户费解。
(4)最好不要在警示型对话框中放置诸如“了解更多”等第三个按钮,因为它会将用户引导至其他内容而导致用户中断/忘记当前对话框的操作。
简易对话框用以展示用户做即时决断的选项,选项本身既是信息又是按钮,不包含单独的文案按钮。
一般用于多选其一且不用二次确认的场景,如:地区选择、语言选择、邮箱地址选择等。
确认对话框用于需要用户进行选择并手动确认的场景,不同于简易对话框,用户可以选择一项或者多项,并且包含确认和取消按钮。
全屏对话框包含一些列的操作任务,这些操作任务可能需要用到键盘输入并且还可能包含子对话框,典型的使用场景如:填写表单、设置日程等。
附上参考文献的原文链接:
Google Material Design— https://material.io/design/components/dialogs.html#usage
iOS Human Interface Guidelines— https://developer.apple.com/ios/human-interface-guidelines/views/alerts/
Android Developers— https://developer.android.com/guide/topics/ui/notifiers/toasts
Modal window— https://en.wikipedia.org/wiki/Modal_window
UIProgressHUD— http://iphonedevwiki.net/index.php/UIProgressHUD
Toast(computing)— https://en.wikipedia.org/w/index.php?title=Toast_(computing)&oldid=459336160
本文由 @ johnnylhj 原创发布于人人都是产品经理。未经许可,禁止转载
题图作者提供
、entity framework 相关类的理解。
首先,House数据库在映射后会生成一个名为HouseEntities的类,这个类我们称之为数据上下文,可以简单的理解为数据库的部分映射(如果映射了全部的表,视图,存储过程,则可看作全部映射)。
使用数据库的时候,不需要像ADO.NET那样,显式的创建sqlconnection。sqlcommand,sqldataadapter,连接数据库只需要创建一个数据上下文的实例即可,创建实例的过程,即可看作创建了数据连接。当然,创建了连接是要关闭的,否则会增大连接池的负担。因此,在entity framework中最常用using的方式来确保连接会被关闭。
using (HouseEntities db=new HouseEntities()) {//新建了一个数据上下文,它实现了IDisposable接口,使用USING可以确保其最终被dispose。如果不是用using,请在返回前主动调用db.Dispose(); }
上面的代码新建了一个数据上下文对象,相当于简单的new了一个sqlconnection。然后con.open,con.close。期间没有做任何操作
数据上下文实例中,包含着所有表与视图的映射,我们称之为实体集,它是由db.House这样的形式来进行调用的,可以简单理解为数据表,而House类则是实体类,可以看作一条数据的实例化映射。这样说可能会有点抽象,那下面我们将用一个例子来演示如何进行添加操作。
二、entity framework 添加数据
House house=new House() { Area=10.2m, Seller_ID=1, Floor=1, Street="南京路", Name="第一百货商店", Price=99999.1m, Region="黄浦区" }; using (HouseEntities db=new HouseEntities()) { house=db.House.Add(house); db.SaveChanges(); //db是数据上下文,House是数据实体类的一个集合,Add方法用于向上下文中添加实例,最后必须要经过db.savingchanges()来进行数据存储 }
上面的例子相当于执行了insert into House并给参数赋值的SQL命令,需要注意的是,在生成实体类对象的时候,必须要给所有非空字段赋值,哪怕你给这个字段指定过默认值,其次,就是在所有添加,修改,删除操作的时候,必须要进行db.savingchanges(),这个方法会让EF比较提取出的部分与数据库之间的差异,并生成SQL语句完成修改。
上面的话也许比较难以理解,总之,添加数据就是1.新建一个实体类的对象,2,新建一个数据上下文,把实体类对象附加到上下文,3.savingchanges来提交更改。
如果我们需要知道添加是否成功,savingchanges时会返回受到影响的行数,我们可以通过它来判断是否执行成功。
如果我们需要添加多条数据,可以在将所有实例都ADD进上下文之后在进行savingchanges,此时数据将会被一次提交。
如果我们需要在本条数据添加成功后调取ID,在执行完savingchanges后,可以直接以实体类对象.id的形式来直接调用。
二、查询数据
/// <summary> /// 通过ID查找House /// </summary> /// <param name="id">House的ID</param> /// <returns>查找到的HOUSE</returns> public static House GetHouseByID(int id) { House house=null; //需要返回的house using (HouseEntities db=new HouseEntities()) { house=db.House.Where(x=> x.ID==id).FirstOrDefault(); //db是数据上下文,House是数据实体类的一个集合,where里是lambda表达式,进行查询 //最后的FirstOrDefault是取第一条或默认,如果取不到对应条件的数据则会返回NULL } return house; }
以上代码就是根据id查询单条数据的原生方法了,由于未对数据库做任何更改,所以不需要进行savingchanges。
在查询时,虽然有first这样的方法,但我们仍旧应该坚持使用firstordefault来确保查询条件不会引发错误。
/// <summary> /// 通过地区查找Houses /// </summary> /// <param name="region">House所在区域</param> /// <returns>查找到的HOUSES</returns> public static List<House> GetHousesByRegion(string region) { List<House> houses=null; //需要返回的house列表 using (HouseEntities db=new HouseEntities()) { houses=db.House.Where(x=> x.Region==region).ToList(); //查询条件后跟ToList方法,就可以获得指定条件下的数据表了 } return houses; }
上面的代码,可以让我们根据地区来查找房屋列表,返回的对象是一个泛型的List,可以简单理解为ADO.NET中的dataTable,当然,它也是可枚举类型,所以,你仍旧可以直接将其绑定到GridView,Repeater,DropDownList等数据控件中。
三、修改数据
EF原生的数据修改需要一个特别的操作,attach,这个操作可以将某个新生成的对象附加到数据上下文中。
/// <summary> /// 更新House /// </summary> /// <param name="house">House的实例</param> /// <returns>是否成功</returns> public static bool UpDateHouse(House house) { bool isComplete=false; //需要返回的bool using (HouseEntities db=new HouseEntities()) { house=db.House.Attach(house); db.Entry(house).State=System.Data.Entity.EntityState.Modified; isComplete=db.SaveChanges() > 0; //对于无法验证是否存在于映射中的实例,首先要进行attach操作,其次,为了保证update指令被执行,我们还需要entry到这个数据上下文的实例汇中,把它的状态设置为已修改 } return isComplete; }
上面的方法可以确保数据会被修改,但我们仍需注意,如果传入的house与映射中的house相比毫无变化的话,受影响行数仍旧为0,提示将会是修改失败,这点与ADO.NET有明显差异。
四、删除数据
/// <summary> /// 通过ID删除House /// </summary> /// <param name="id">需要删除的house的ID</param> /// <returns>是否执行成功</returns> public static bool DeleteHouseByID(int id) { bool isComplete=false; //是否执行成功 using (HouseEntities db=new HouseEntities()) { var house=db.House.Where(x=> x.ID==id).FirstOrDefault(); //首先查询需要删除的house db.House.Remove(house); //然后执行remove方法,将对象从映射中移除 isComplete=db.SaveChanges() > 0; } return isComplete; }
删除数据的时候,首先需要查找相对的对象,之后从映射中移除,最终进行savingchanges。
以上就是EF最基本的增删改查了,其中的删除,修改操作与ADO.NET相比,不仅代码有差异,思想上也有不小的出入,需要多加理解才能运用自如。
*请认真填写需求信息,我们会在24小时内与您取得联系。