zoukankan      html  css  js  c++  java
  • 机房收费系统学生下机结账小结

      

      这几天一直在考虑机房收费系统学生下机操作。学生下机。一则须要加入学生下机记录信息。还须要计算学生在整

    个上机过程中所花费的金额,而且更新学生剩余金额。那么如何做在性能上或者扩展上更好一些呢?

     操作 

     

      1.加入学生下机信息

      2.计算学生上机时间

      3.依据上机时间来计算学生所花费的金额

      4.更新学生的剩余金额

    设计模式

     

    在通过学生上机时间来计算学生所花费的金额这步操作上,须要进行一些条件分支语句的推断。由于上机时间被分为

    了三部分:准备时间、至少上机时间、上机时间。所以在步骤3中有大量的条件分支语句。从某种程度上看,这是一

    种不好的现象。

     

    为了解决问题。能够增加设计模式来解除大量的条件分支语句的推断。

     

       策略模式

    http://blog.csdn.net/luckyzhoustar/article/details/27661807

            

    策略模式的使用。封装了不同类型用户之间计算消费金额的算法,对于以后的扩展极其有利。比方说假设以后,学生

    能够採取一小时一积分的形式,来兑换一些礼品或者一些其它的增值服务的话。那么策略模式就特别的easy扩展,仅仅

    须要添加一个策略就能够了。可是也有一些问题。假设全部同一时候强制下机的话。人数过多的话,须要不断的计算消费

    金额和更新后台数据库,easy导致系统崩溃的状态。

     状态模式 

    http://blog.csdn.net/luckyzhoustar/article/details/27679497

         

    状态模式的应用,仅仅只是简单的接触了if……else分支推断的操作,对于系统以后假设在时间上有所扩展的话,比較有

    优势。比方说学生连续上机超过4小时的话。能够免费添加一小时上网时间,这时候仅仅要简单的添加一个状态就可以,

    也是比較easy扩展的。

    职责链模式

    http://blog.csdn.net/luckyzhoustar/article/details/27689679

       

    职责链模式的应用跟状态模式同样也是解除了If……else分支推断的操作,没有太大实质性的意义。

    小结 

      关于以上三种模式对于学生下机计算消费金额的操作中,后两种模式可能加起来有些牵强。仅仅是单纯的为了解除

    if……else分支推断的耦合操作,没有太大实质性的意义。而策略模式才是王道,才真真正正的符合这个场景。由于策

    略模式从本身上来说。就是定义算法家族,分别封装起来,让它们之间能够互相替换。

      可是我们从三种模式中发现。假设一旦强制全部人下机的话。而且在上机人数过多的情况下,前台须要不断地与后

    台server打交道,可能会出现崩溃的状况。为了解决问题,小编又有了新的想法。

    建议:对于设计模式。在这个阶段能够大胆的尝试创新。这也是对自己前段时间学习的一种磨练,不管用的好与坏这都无所谓。

    仅仅有你不断的利用。你才会掌握设计模式的真谛。

    触发器

    是SQL server 提供给程序猿和数据分析员来保证数据完整性的一种方法。它是与表事件相关的特殊的存储过程,它的运行不是由程序调用。也不是手工启动。而是由事件来触发。

    因此我们能够通过触发器的操作,在后台数据库中自己主动的实现更新学生下机金额的计算。

    我们把算法所有封装到触发器中,全然的解除前段与数据库的联系。当前段更新学生下机记录的时候。直接触发触发器,自己主动的完毕学生剩余金额的更新操作。这样在某种程度上就降低了当众多人强制下机的时候,系统出现崩溃的状况。

    代码

    <span style="font-size:18px;"><span style="font-size:24px;">--假设这个存储过程存在的话,就删除
    if(OBJECT_ID('tgr_UpdateOffline','tr') is not null)
    drop trigger tgr_UpdateOffline
    go
    create trigger tgr_UpdateOffline
    on onlineInfo
    for insert--插入触发
    as
    --定义变量
    declare @regulareUser float,@instantUser float,
    @atleastTime float,@prepareTime float,@stuid char(11),
    @consumeTime float,@money float,@atleastMoney float
    select @regulareUser =RegularUser,@instantUser =instantUser,@atleastTime=atleastTime,@prepareTime =preparetime,@atleastMoney=AtLeastMoney
    from BasicData 
    --计算出学生上机消费时间
    select @stuid=stuid,@consumeTime= datediff(minute,convert(time(0),offTime),convert(time(0),onlineTime)) from inserted 
    
    
    --開始推断学生上机花费的时间
    --begin...and操作封装计算学生剩余金额操作
    begin
    if @consumeTime -@prepareTime <0 
    set @money=0
    else
    if @consumeTime -@prepareTime -@atleastTime <0
    set @money=@atleastMoney 
    else
    set @money=@instantUser/60 * @consumeTime 
    end
    
    --最后更新学生剩余金额操作
    update StudentInfo set money =money-@money where stuid=@stuid 
    
    </span></span>

    当然了为了能够优化触发器,在更新学生剩余金额表上能够建立有关于学生卡号的索引。能够提高执行速度。 

    以上就是小编对于学生下机计算金额操作的小结,假设各位有更好的建议,能够多多交流。

     

  • 相关阅读:
    解决SharePoint 文档库itemadded eventhandler导致的上传完成后,编辑页面保持报错的问题,错误信息为“该文档已经被编辑过 the file has been modified by...”
    解决SharePoint 2013 designer workflow 在发布的报错“负载平衡没有设置”The workflow files were saved but cannot be run.
    随机实例,随机值
    Spring4笔记
    struts2笔记(3)
    struts2笔记(2)
    获取文本的编码类型(from logparse)
    FileUtil(from logparser)
    DateUtil(SimpleDateFormat)
    struts2笔记
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7151419.html
Copyright © 2011-2022 走看看