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>

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

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

     

  • 相关阅读:
    Mybatis中tinyint(1)数据自动转化为boolean处理
    使用spring-cloud-starter-bus-amqp做微服务配置刷广播,config-client配置 未刷新的 问题
    深入Spring Boot: 怎样排查 java.lang.ArrayStoreException
    springboot activiti 配置项详解
    MySQL_插入更新 ON DUPLICATE KEY UPDATE
    Maven:mirror和repository 区别
    ajax请求二进制流图片并渲染到html中img标签
    不要在工作中做滥竽充数的人
    获取客户端IP地址的三个HTTP请求头的区别
    web服务器获取请求客户端真实地址的方法
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4079999.html
Copyright © 2011-2022 走看看