zoukankan      html  css  js  c++  java
  • 网上书城总结笔记

    这次项目的开发,在写需求分析和详细概要设计说明书的时候,是严格按照软件工程规定的软件生命周期开发的

    原本的用意是根据文档指导开发程序,但是因为自己经验不足,需求分析不到位,设计说明书编写的内容也是不完整的

    以至于到最后,还是变成了程序指导文档的情况。

    在绝大部分情况下,不管是说明文档的编写还是程序代码的实现,都是一个团队共同完成的事情

    所以在这个时候,一个人势单力薄的形式就很明显了。。。

    so~得出结论->写开发文档的时候一定要考虑全面->一个神一样的团队是必不可少的

    然后就是开发过程中遇到的问题了

    说起来很尴尬

    原本是用动软的代码生成器直接生成的三层,实在懒得自己写

    然后生成的项目有些命名空间有问题,而且全完没有用的类一大堆

    遂通通删掉之

    然后看了看清楚了不少的项目

    竟然还自己点了点头,表示很满意

    之后

    开始着手修改项目为抽象工厂模式

    然后嫌弃IDAL中每一个数据库的表都要对应一个接口

    遂抽象出一个IDalBase<T>的泛型接口

    只要一个接口,所有的dal类都继承于它,要添加新的功能时就在添加相应的接口,再让对应的dal类继承并实现

    遂删掉生成的IDAL接口

    然后又用CodeSmith生成dal层类的代码(中间还有一段自己写生成模板的时间。。。)

    刚开始想法是好的,实现了代码重用和抽象,也根据单一职责原则将各个功能都分到不同的接口(除了基本的功能)

    然后随着项目的开发,问题就出现了

    在IDalBase接口中的基本的方法定义的太草率,很多到开发结束用都没用到

    而在中间的时候已经发现了这个问题,遂想修改IDalBase,但是突然发现

    只要动了一个,dal中的所有类都要跟着改变

    真正的牵一发而动全身啊。。。

    而且必须保证表的属性数据类型必须是一样的,如:

    根据id查找一条记录

    Model.model GetById(int id)

    这就要求所有的dal类都要通过int类型的id来查数据库,要是有一个表id数据类型不是int呢?

    由于发现的时候项目已经完成一半了,想要重新修改工作量很大。。

    只能通过添加功能接口来避免这个问题

    这就造成了

    IDalBase中的方法很多都没用到

    功能接口越来越多(可能有选择恐惧症=。=   太多的接口都不知道怎么命名啊!到最后看起来都是好长好长的名字。。。。)

    so~又得出结论->项目的构架刚开始设计的时候一定要想好,不然要么更改(更改工作量很大),要么继续错下去(导致项目结构很糟糕)

    在项目开发之始,原本的设想是给管理员设计一个配置页面

    在这个页面中可以把整个网站一站静态化

    但是后来在实现的时候发现

    由于每个页面都嵌套了母版页

    而在母版页中有一个地方是每时每刻需要跟新数据并展示出来的

    所以又导致了此功能没办法实现~

    so~结论是->经常被访问,而不经常改变的页面才是适合做静态页的

    在附上为什么要使用静态页的原因:降低服务器和数据库压力,也有利于SEO优化

    还有就是一个url重写的问题

    在项目开发快要完成之后,才想要进行url重写

    但为时已晚

    项目中的每个页面的url都已经固定好了

    要在更改的话还是那句话,工作量太大不适合我。。。(你是有多懒。。)

    so~总结->还是要用什么技术在项目设计的时候一样要考虑清楚!

    还是附上已经准备好的url重写的流程吧:

    为啥要进行url重写?

    简单来说

    1.有利于SEO

    2.避免在更改网站结构的时候使得用户收藏夹的连接变成死链接

    实现的方法:

    这里使用UrlRewriter实现

    下载地址:UrlRewriter

    将dll文件下载下来之后添加到项目引用

    在web.config文件中进行配置

    1.configSections必须放在configuration节点下的第一项,否则会报错

      <configSections>
        <section name="rewriter"
                 requirePermission="false"
                 type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter" />
      </configSections>
    2.接下来将下面的代码添加到配置文件,rewriter节点中,最后一个是根据正则表达式来匹配重写的(推荐)

    其他都是写死的,要写很多

    <system.web>
        <httpModules>
          <add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter"/>
        </httpModules>
    
        <httpRuntime executionTimeout="3600" maxRequestLength="1048576" requestPathInvalidCharacters="" requestValidationMode="2.0"/>
        <compilation debug="true" targetFramework="4.0"/>
        <customErrors mode="Off"/>
      </system.web>
    
      <rewriter>
        <rewrite url="~/Index" to="~/Index.aspx" />
        <rewrite url="~/BookDetail/(.+)" to="~/BookDetail.aspx?id=$1" />
        <rewrite url="~/BooksView/(.+)" to="~/BooksView.aspx?categoryId=$1" />
        <rewrite url="~/DiscountBooks" to="~/DiscountBooks.aspx" />
        <rewrite url="~/GoodBooks" to="~/GoodBooks.aspx" />
        <rewrite url="~/News" to="~/News.aspx" />
        <rewrite url="~/Register" to="~/Register.aspx" />
        <rewrite url="~/RSS" to="~/RSS.aspx" />
        <rewrite url="~/SearchBooks" to="~/SearchBooks.aspx" />
        <rewrite url="~/products/(.+)" to="~/products.aspx?category=$1" />
      </rewriter>
    完成了这些配置之后url重写就管用了

    例如:用户请求Index,重写之后会请求Index.aspx

    最后是项目中用到的一些流程和技术

    1.找回密码可以使用的流程:
    用户填写用户名和邮箱,点击找回密码
    发送重置的密码到用户邮箱
    用户可以通过重置的密码登陆并修改密码


    2.将网站的配置信息设计一个配置页面提供管理员使用

    原来的配置信息是存放在web.config文件中的

    好处:不需要改源代码重新编译,直接修改配置文件的xml,保存就可以了
    坏处:如果网站已经投入使用,修改配置文件会造成网站重启,会丢失正在操作的用户的状态等信息

    最好的方法:在网站的后台管理中,专门写一个配置信息的页面,在这里提供了友好的界面以修改相关的配置信息(配置信息在数据库中存取而不放在配置文件中了)
    这时会出现一个问题,当用户的数量很大的时候,如果每个用户请求都要读取数据库中的配置信息,服务器压力很大,这时候可以使用缓存,用户请求配置信息时直接从缓存中拿出,当管理员修改数据库中的配置信息时缓存失效(移除相关的HttpRuntime.Cache)


    3.权限控制方式

    详情请看

    asp.net权限控制的方式

    4.网上购买支付功能

    asp.net购物车,订单以及模拟支付宝支付(一)---购物车表及添加购物车流程

    asp.net购物车,订单以及模拟支付宝支付(二)---订单表

    asp.net购物车,订单以及模拟支付宝支付(三)---提交订单

    asp.net购物车,订单以及模拟支付宝支付(四)---模拟支付宝支付

    5.CKeditor+SWFUpload

    CKEditor+SWFUpload实现功能较为强大的编辑器(一)---CKEditor配置

    CKEditor+SWFUpload实现功能较为强大的编辑器(二)---SWFUpload配置

    CKEditor+SWFUpload实现功能较为强大的编辑器(三)---后台接收图片流程

    6.限制用户登录错误次数

    7.显示评论的时候为几天前的格式

    8.用三层实现多条件检索

    9.RSS订阅功能

    10.敏感词过滤

    最后就是项目开发的时候需要注意的一些小问题:

    1.接收Get请求的参数的时候一定要先判断一下是否为我们需要的值,因为用户可以随意修改url中的参数
    2.sql语句如select 不要直接写* 写具体需要的字段  
    3.考虑很多细枝末节
    4.模板页中已经引用的文件在子页面中不需要在引用了,否则可能会报错
    5.考虑每个页面是否能静态化和进行url重写
    6.使用ajax进行异步请求的时候,要注意对页面的改变
    7.客户端服务端双向校验
    8.页面静态化和整页缓冲的场景使用
    9.记录用户名和id的静态类要放在ui中,因为各个表现层(如:asp.net,手机ui层等)用来储存这些信息的方式都不一样,如Session,Cookie等

    10.ui向bll传参数的时候不要使用TreeNode等这些只能在winform中用的有限制的参数,只能传int,string,model这些通用的数据类型

  • 相关阅读:
    Kubernetes stateful set讲解以及一个基于postgreSQL的具体例子
    如何在Kubernetes里给PostgreSQL创建secret
    如何使用Kubernetes的configmap通过环境变量注入到pod里
    使用Gardener在Google Cloud Platform上创建Kubernetes集群
    通过describe命令学习Kubernetes的pod属性详解
    使用describe命令进行Kubernetes pod错误排查
    一个简单的例子理解Kubernetes的三种IP地址类型
    不同编程语言在发生stackoverflow之前支持的调用栈最大嵌套层数
    (十)golang--运算符
    (九)golang--标识符的命名规则
  • 原文地址:https://www.cnblogs.com/jchubby/p/4429749.html
Copyright © 2011-2022 走看看