Fork me on GitHub
图书商城项目总论

图书商城项目总论

这些年来,我随指南针公司做了一些网站。在这里也感谢指南针用户对鄙人的大力支持,厚爱。汇聚很多程序员多年的智慧,今天我把多年来积累的经验汇聚到一个图书商城项目里面,为大家介绍网站的源代码。关键的环节在于融会贯通,举一反三。

先从注册开始,注册说起来相对来比较简单

                       

一、登录界面

注册界面里面有文本框,有用户名的检测 – 用到“AJAX”这个知识点

填写完信息点击注册后,有个js或是jq的校验

当信息全部填写完,用户点击注册按钮后,把表单里面的数据向服务端提交,在服务端接收数据,插入数据库。

 

那么,除了把用户信息插入数据库当中之外,我们还要实现用户激活的功能。就是获取用户输入邮箱,根据邮箱发一封邮件。邮件的内容就是激活链接。

 

把用户信息写入数据库相对简单,问题是怎么去发邮件,怎么发激活链接?这是我们重点讲解的内容。介绍怎么知道用户点没点链接,怎样进行激活。

 

接下来做的一个功能就是找回密码功能。

 

二、找回密码演示界面

根据用户的邮箱,把用户名和密码发给用户。这也是我们重点讲解的内容。

这部分用到了之前我们讲解的缓存。

接下来我们做下用户注册之后上传头像的功能,

以前我们上传的时候可能用的是<input type=”File”>但是用户的体验度不是特别的好,为什么呢?<input type=”submit”>一点submit就刷新了。

我们要做个无刷新上传。讲解两种方式,重点介绍flash开源的组件。

 

三、无刷新上传演示

上传之后,完成截取功能。

 

四、头像截取功能介绍

讲解flash组件的使用,上传的服务端代码,jq和js实现截取,获取坐标。

然后实现登录功能:

 

五、登录功能介绍

这里要实现用户名,密码的校验,实现:“记住我”的功能。记住我使用cookie。

这块说完了之后,我们再说下AJAX的登录模式。

 

六、AJAX登录模式

以及遮罩效果,遮罩我们使用jq来实现。

下一步我们看下:图书列表的展示,我们怎样用美工做好的html网页,怎么样把数据从数据库中拿出来并且进行绑定。

具体实现步骤,从服务端获取相关数据,绑定以及分页的实现。排序的基本实现,还会详细探讨下viewstate。

 

七、图书列表展示

 

八、分页效果一

 

九、另外一种分页的模式

看完另外一种分页的形式后,我们看下url重新问题。

 

十、url重写

并且深入探讨url重写问题。url重写主要就是为了SEO网站优化的问题。

接下来看下怎么生成静态页:

 

十一、生成静态页

也就是纯html网页,当用户量比较大的时候,我们最好做成静态页。

然后再看下评论的发布。

 

十二、评论的发布

这里要实现评论的发布,以及评论内容的加载。重点关注的是时间问题,非具体时间的显示。请仔细看下我们评论区域,不是普通的文本编辑器,是个ubb的文本编辑器。

在这里还要看下xss跨站点脚本攻击的问题和敏感词过滤问题(禁用词,审查词,替换词)。关于审查词,如:发票。这两个字先提交到数据库,管理员进行审核。

接下来的内容自己可以做了,就是评论内容的无刷新分页。

还有就是当滚动条滚动到页面的最下端的时候,才显示评论信息的功能。

这些都讲解完成后,进入购物车功能:

 

十三、购物车功能

  在这里实现商品的增加,商品的递减,商品的删除一系列功能。用jq或js完成。

  接下来我们完成结算的功能讲解。

 

十四、结算功能

 进入到订单确认页面里面,输入收货人的地址,选择支付方式,在这里重点讲解怎么实现支付宝。当然在这里我们使用的是模拟的支付宝系统,带大家理解下原理,以及流程。

 接下来就到结算功能了,在这里用户要完成下订单操作,向支付宝发送数据的功能。

 介绍完这部分内容以后,我们再详细的介绍下编辑器。

 

十五、编辑器

  在这里我们要了解下它的基本使用,再带大家学习词库

 

十六、词库

  要实现敏感词的过滤功能的话,在我们的系统里面必须得有个词库。在这里我们讲解下词库的添加与下载。

  接下来我们再讲解下日志记录问题。用到一个开源的框架。

  再来介绍下开源的定时框架。就是每隔多长时间去执行什么任务。比如:每天一个约定时间去统计今天的订单数。

  这些介绍完以后,我们再来介绍下SEO的问题。

  最后的文章里面会给大家介绍下视频处理的问题,就是怎么样做视频的播放的问题。当用户上传任意的格式的视频的时候我们怎么样进行转换。转完以后又怎么播放。

 

十七、播放有关内容

  接下来再说下权限管理的内容:

  这块我们单独的进行演示

 

十八、权限管理系统

 

十九、权限管理-用户管理

  当admin管理员进入的时候,可以展示出所有的菜单。管理员可以添加新的用户,添加完用户以后可以给这个用户添加角色。

 

二十、权限管理-角色管理

  然后为这个角色指定权限。

 

二十一、为角色指定权限

  以及菜单管理。

 

二十二、菜单管理

  菜单用户可以进行添加。

 

二十三、添加菜单

  然后菜单项也是与权限相关联的。当管理员登陆的时候,菜单全部展开,普通用户登录,只能展示出相应的菜单。所以说,菜单也有权限编号。当用户登录的时候拿到菜单的权限编号和用户的权限编号进行对比,来决定显示哪个菜单。

 

好,总论讲解完毕,下面进入详细环节。先看下权限管理内容。

权限表分析:在权限管理里面最重要的是三个对象,用户管理对象,角色管理对象,权限管理对象。这里就用到了面向对象的思想。

请看下面的图示:

 

二十四、权限管理数据库分析

先看下名词解释,用户很好理解。什么叫角色呢?老师,学生都是角色。权限也比较的好理解。

在这里用户为什么没有跟权限直接的进行关联呢?

用户要和角色进行关联,用户属于某个角色。在这里举个例子讲解:杨川川入职了,就是个新员工,公司里面有个打卡系统,经理要开给杨川川在办公系统开个账户。现在公司决定新入职的员工权限提升一次,之前5个权限,现在6个权限。假如说系统在设计的时候是用户和权限直接关联的。本月来的10个新员工,都要调整权限。但是用户要是和角色相关联的话,这时,只要把新员工的权限改下就行了。所有属于新员工的用户权限就都发生变化了。

下面我们就看下权限的数据库怎么进行设计了,最基本的得有用户表,角色表,权限表。

用户表里面有哪几个字段呢?

用户编号,用户名,密码,性别,邮件。

角色表里面有哪几个字段呢?

角色编号,角色名。

权限表里面有哪几个字段呢?

权限编号,权限名。

用户跟角色进行关联,按照我们之前讲解的内容,两个表就有关系了。主外建关系。如果我在用户表里面加个角色编号的话,你们认为合理么?

一个用户属于一个角色,一个角色下可以有多个用户,所以说这两个表的关系就是多对多的关系。既然是多对多的关系,我们怎么表现出这种关系呢?

还得需要一张表,就是用户角色关系表。用户和角色的关系就体现在用户关系角色表里面了。

用户关系角色表里面应该有哪些字段呢?

用户编号,角色编号。

角色表跟权限表是个什么关系呢?

也是个多对多的关系,所以,再建一张表,叫做角色权限关系表。

这张表中有:角色编号,权限编号的字段。

这五张表就是我们的核心表了,还有一张我多增加的表叫做权限类别表。然后权限都放在一个大类下面。

有:类别编号,类别名称字段。

在权限表中,增加个:类别编号的字段。

 

二十五、数据库当中的六张表

 

二十六、权限管理模块核心表结构

我们看到还有像菜单表,用户信息表中还有部门这样的字段。刚才的六张表的分析,以思路为主,采用的字段都是最基本的字段。

刚才我们分析了数据表的创建过程,关键是思路,能理解这个过程就可以了.

下一步我们开始设计登录的内容,打开项目,我们先用手写的三层,后面讲到图书商城项目的时候再演示代码生成器.

 

二十七、web登录(1)

 

二十八、放验证码的位置

验证码插入位置:

View Code

下一步我们怎么把验证码放到登录页面上,我们该怎么放呢?

 

二十九、将验证码引入-用个img标签

接下来我点验证码的时候需要个切换效果,这个效果怎么实现呢?

我们用js来实现,我在这加了个a标签,在a标签里面写了个onclick

在js的函数里面怎么写呢?获取验证码的id,然后改变src属性,获取随机数加个毫秒数,这样第一步就完成了。

 

三十、切换验证码的代码

下一步我们就开始点击:登录按钮

现在我们在后台,后台的用户访问少,所以这里可以用服务端控件。

 

三十一、构建三层的时候需要注意的地方

 

三十二、DbHelperSQL

 

 

动软的代码生成器,把数据库连接字符串都放在appSettings里面了。不要放在这里面,因为ms为我们提供了connectionStrings。

那么我们在什么时候会用到appSettings里的键值对呢?比如分页,每页显示多少条记录,以前都写在程序里面。用户不想一页显示10条的话,我们只能再改程序。

最好的方式是写在配置文件里面,不需要改源代码。我们可以把关于每页显示多少页的项,放在appSettings里面。 ConfigurationManager.AppSettings["key"]获取一下。

 

三十三、配置文件中需要注意的地方

  其实,把经常变动的内容放在配置文件中也不是最佳的选择。如果现在网站正在服务器运行的情况下,正在使用这套程序的用户的会话丢了。最好的解决方式就是做个页面。可以在自己网站的后台做个页面,这个后面马上就讲。

像使用的数据库变化了这样的问题,涉及到抽象工厂。就是面向接口编程。建议看下《大话设计模式》。

 

三十四、配置页面

 

三十五、数据访问层我们回顾的内容

 

三十六、用户校验的DAL层代码

别忘了引用下model

下面写下业务逻辑层

 

三十七、用户校验的BLL层代码

  这里的BLL就是个打酱油的,别忘了引用DAL和Model。

接下来终于回到了web层。

引用bLL和Model,注意:每写完一层,我们都需要重新生成一下。

插入代码位置:

View Code

下面我们重点讨论下:session

session的主要作用就是记录用户登录信息,为什么要放进session,干什么用呢?在后台的页面里面进行校验。

 

三十八、新建test页

这个网页只有登录的用户才可以看,

 

三十九、登录测试页面

  网站管理员操作的后台页面有很多,在每个页面加这段代码的话,自己累,用户也非常的不爽。我们有什么好的方法处理这个问题么?

可以用过滤器:HttpModule---其中最核心的就是19个事件。

 

四十、19个事件

  看表,得知使用第九个。如何使用这张表:由于每一个动态页面都会走过滤器,我们就可以在过滤器里面进行判断。过滤器有19个事件,我们一查表发现是第9个。

  那么,我们怎么去使用第9个事件呢?

 可以自己定义个类,来继承HttpModule这个接口,也可以在全局配置文件里面,到底使用哪种方式,随便你.

下面我写好了这段代码,分享源代码贡大家使用:

插入CheckAdminModule.cs位置:

View Code

关键是配置项,我们要在Web.config里面配置一下。

                       

四十一、Web.config

上面的内容中我们把登录给大家写了一下,接着我们看下登录成功以后

 

四十二、跳转一

 

四十三、跳转二

 

四十四、然后看看Main.htm里面都是什么

 

四十五、用frameset的好处

可以使用母版页。母版页就是把公共的元素给独立出来。上面和左面都用母版页来做。那么,我在做后台管理系统的时候为什么没用母版页用的是frameset呢?用母版页一点就刷新,体验性不是特别的好。

 

四十六、frameset布局

前台(大众用户看的)页面的布局的时候,一般都用母版页来做,为什么这又不用frameset呢?frameset不利于SEO的优化,搜索引擎都有蜘蛛爬虫,这些蜘蛛不喜欢页面是frameset布局的。frameset放的是不同的页面,蜘蛛所喜欢页面就是一个页面。对于网站的后台(给管理员看的)就无所谓了。

接下来我们再回顾一下frameset的基本用法,

 

四十七、主页面

不需要用body了,因为body里面放的是网页的主体,只管分割,具体的内容显示交给其它的页面了。rows横向分割,iframe是内嵌框架,*剩下的高度或宽度,rows和cols不能同时使用。在left.html中设定target

 

四十八、设定left.html中的target属性

在使用frameset的时候,最好给它定死。noresize这个属性就是干这个事儿的。

下面我们看下菜单表的设计:

 

四十九、菜单设计一frameset

下面我们就看下怎么把菜单给取出来,

 

五十、干掉这条语句

 

五十一、给TreeView起个名字

菜单存在数据表里面,下一步要考虑菜单这个数据表它应该怎么设计。通过观察我们发现菜单是个树状结构,数据表要体现出这种主次关系。那么数据表怎么设计呢?通过父id体现这种主次关系。

 

五十二、数据表设计

那么我们这里不写ParentID行不行呢?做成两个表行不行呢?不行的,子菜单下面可能还有子菜单。所以,以后设计这种树状结构的时候,要增加一个父节点。

 

五十三、这样设计是不行的

下面我们就看下怎么取数据。

                    

五十四、IsPostBack属性

这个判断是我们在服务端经常用到的判断,下面我们再来说一下IsPostBack的用法。曾经是个面试题呦!

IsPostBack这个属性的值是个bool类型的,那么他在什么情况下为true,什么情况下为false呢?

当是一个get请求时,该属性的值为false。

如果是一个post请求时,该属性的值为true。

什么时候发get请求呢?用户在地址栏里面输入网址,点个超链接。

那么什么时候发post请求呢?

提交表单submit的时候。

那么在这个地方,加这个判断的意义是什么呢?

获取所有的菜单项,查询数据库,当用户第一次访问这个页面的时候,我们把数据从数据库里面取出来。加载到TreeView上,页面上有个submit或其它的提交按钮的话,一点按钮,发出post请求。导致页面挥发、刷新。这时还会再走下Page_Load方法,如果不加if(!IsPostBack)判断,又查询数据库了。加上这层判断就不用查询数据库了,因为IsPostBack属性为true,又加了个非。不成立就不执行下面的代码了。

继续往下走,为什么点击按钮导致页面刷新,为什么不用查数据库但是数据没有丢呢?因为VIEWSTATE。

 

五十五、viewstate

画图演示这个问题,

 

五十六、_ _VIEWSTATE出现的场景

那么IsPostBack这个属性,它怎么知道用户发的是get请求还是一个post请求呢?

根据的是请求报文,如果是get请求,请求报文里面只有请求头。如果是post请求还有请求体。

如果发出的是post请求,这时候会把_ _VIEWSTATE发到服务端,服务端一看有隐藏域过来,IsPostBack为true。

 

五十七、禁用隐藏域

当我们禁用隐藏域以后,_ _VIEWSTATE还有,但是它的value很少了。那么,我们想完完整整的干掉隐藏域的话,应该怎么办呢?

 

五十八、彻底干掉隐藏域

  但是,如果把它去掉了,服务端控件就没办法使用了,这样就回到了纯HTML的时代。

所以说,_ _VIEWSTATE这个东西让人用起来很方便,但是它返回的这坨代码很不爽。浏览器要加载这些东西,让浏览器变得很慢,卡住了一样。一般情况下,我们把隐藏域禁用掉。如果禁用掉的话,每次都要查数据库了。就不能加刚才的if(!IsPostBack)判断了。大家会问,如果我每次查询数据库的话也很慢,其实,在这个地方有外国专家写过博客,连数据库的时间比加载_ _VIEWSTATE的时间要短。一般情况下我们要把_ _VIEWSTATE禁用掉。但是我们现在做的是后台,就无所谓了。要是我们后面做图书列表的话,就没必要用_ _VIEWSTATE了。又不想每次查询数据,就只能启用缓存了。

 

下面我们就写下GetTreeData()

 

五十九、数据访问层代码

 

六十、业务逻辑层代码

 

六十一、UI层代码

接下来我们考虑下权限问题,我们获取用户的权限编号和菜单的权限编号进行一个对比.

                       

六十二、权限编号的由来

首先应获取下用户所具有的权限编号,

 

六十三、分析哪两张表关联好写sql语句

分析结果:角色权限关系表dbo.Accounts_RolePermissions

用户角色关系表dbo.Accounts_UserRoles

通过RoleID关联起来,得到权限编号了。

 

六十四、写好DAL.Account_UserService

 

六十五、写好BLL.Account_UserManager

然后再回到left.aspx.cs页面

 

六十六、登录的时候存到Session里面

 

六十七、权限UI层

最后,我们来看下退出的问题。

 

六十八、放个退出按钮

 

六十九、切换到设计模式

       

七十、退出代码

       这块出问题了,我们用的是frameset,跳转的时候只跳出上面这块。

 

七十一、这样写退出

target的其它选项自己去查,比较简单,不再这里说了。

再加个Loginout.aspx页面。其实退出页做个一般处理程序比较的好。

 

七十二、新建退出页

 

七十三、页面报错

 

七十四、报错的原因

关键就是target属性,今天我们的文章当中就提到了两次。

作者近期文章列表:

C#中级进阶教程(完全免费,献给代码爱好者的最好礼物。注:本作者分享自己精心整理的C#中级进阶教程,无任何商业目的。
希望与更多的代码爱好者交流心得,也请高手多多指点!!!)
三层及其它内容 递归
三层(一)
三层相关案例(及常见的错误)
三层实例(内涵Sql CRUD)
手写代码生成器
SQL数据库 ADO.net 数据库的应用图解一
数据库的应用详解二
ADO.NET(内涵效率问题)
ADO.NET实例教学一
ADO.NET(内含存储过程讲解)
面向过程,面向对象中高级 面向过程,面向对象的深入理解一
面向过程,面向对象的深入理解二
面向对象的深入理解三
无处不在的XML
winform基础 Winform基础
winform中常用的控件
面向过程 三种循环的比较
C#中的方法(上)
我们常见的数组
面向对象 思想的转变
C#中超级好用的类
C#中析构函数和命名空间的妙用
C#中超级好用的字符串
C#中如何快速处理字符串
值类型和引用类型及其它
ArrayList和HashTable妙用一
ArrayList和HashTable妙用二
文件管理File类
多态
C#中其它一些问题的小节
GDI+ 这些年我收集的GDI+代码
这些年我收集的GDI+代码2
HTML概述以及CSS 你不能忽视的HTML语言
你不能忽视的HTML语言2精编篇
你不能忽视的HTML语言3
CSS基本相关内容--中秋特别奉献
CSS基本相关内容2
JavaScript基础 JavaScript基础一
javascript基础二JavaScript DOM编程
jQuery jQuery(内涵: jquery选择器)
 
 
posted on 2012-12-16 19:08  HackerVirus  阅读(317)  评论(0编辑  收藏  举报