zoukankan      html  css  js  c++  java
  • 获得可操作项

    前言

    在后台管理中,我们很可能会根据某个状态获取它的可操作项。举个例子,在已完成状态你可以进行xxx,xxx,xxx,操作,然后在上课中你可以进行xxx,xxx,xxx,操作。

    然后今天在写代码的时候看到前辈写的实现逻辑,觉得很不错啊,就记录了下来以供参考。

    1. 配置状态码

        const STATUS_WAIT_PAY         = 0;    //待付款
        const STATUS_WAIT_FOR_CLASS   = 10;   //待上课
        const STATUS_SUCCESS          = 20;   //上课中
        const STATUS_FINISHED         = 50;   //已完成
        const STATUS_CANCEL           = -10;  //已取消或请假

    配置状态码的作用是什么呢?我们在程序实现的逻辑里,会用不同的状态码来代表程序运行的不同状态,很可能你在写的时候就忘记某个状态码代表的是什么状态。所以用const修改的字符来代表状态。

    那这个时候就有人就问了:为什么不用static来修饰呢?原因有以下几点:

    (1) const赋完值之后值就不能改变了,我们一般用字符串表示状态是不希望它改变的,而使用static时我们可以给它一个值,而这个值往往可以继续改变。

    (2) const前面没public、protected这样的权限(7.1的php中const也可以添加,以前的不能),而static是可以添加权限的。

    (3) 还有const只能修饰静态变量,static可以修饰静态方法和静态变量

    (4)在调用const修饰的变量的时候不用加$符号。

    相同点:

    (1) 两者都属于类,都只能使用self::xxx的方法或者 class::xxx的方法来调用

    好了简单普及一下const的知识。接着我们再来看看下面的实现逻辑

    2. 操作映射:

    private $operationMap = [
            [
                'desc' => 'xxx', // 描述
                'function' => 'xxx', // 功能对应方法
                'statusMap' => [ // 适用状态
                    self::STATUS_WAIT_PAY,
                    self::STATUS_WAIT_FOR_CLASS,
                ],
            ],
            [
                'desc' => 'xxx', // 描述
                'function' => 'xxx', // 功能对应方法
                'statusMap' => [ // 适用状态
                    self::STATUS_WAIT_PAY,
                    self::STATUS_WAIT_FOR_CLASS,
                ],
            ],
            [
                'desc' => 'xxx', // 描述
                'function' => 'xxx', // 功能对应方法
                'statusMap' => [ // 适用状态
                    self::STATUS_WAIT_PAY,
                    self::STATUS_WAIT_FOR_CLASS,
                ],
            ],
            [
                'desc' => 'xxx', // 描述
                'function' => 'xxx', // 功能对应方法
                'statusMap' => [ // 适用状态
                    self::STATUS_WAIT_PAY,
                    self::STATUS_WAIT_FOR_CLASS,
                ],
            ],
    ]

    3. 获取当前状态

    从数据库中查询某条信息的状态

    4. 根据状态获取这个状态下可以获取的操作

            $response = []; // 提前定义好变量数组,来存储数据
            if (is_null($status)) { // 进行异常处理,很优秀啊,哈哈哈
                return [];
            }
    
            foreach ($this->operationMap as $operationId => $operation) { // 遍历操作列表,分成id 和 操作两部分
                $desc = array_get($operation, 'desc', '未知'); // 获取操作内的desc信息
                $function = array_get($operation, 'function', ''); // 获取操作内的function信息
                $statusMap = array_get($operation, 'statusMap', []); // 获取该操作对应的操作码
                if (in_array($status, $statusMap)) { // 开始进行映射,不过in_array的效率并不高。如果是我的话,我会选择适用isset函数 isset($stasusMap[$status])
                    $response[$operationId] = [ // 返回结果
                        'desc' => $desc,
                        'function' => $function
                    ];
                }
            }
    
            return $response;

    5. 获取完可以操作的状态之后可能会有另外一些限制。

    比如说:要执行这个操作,不仅要是在这个状态,而且还要满足时间的限制,这是时候你就可以这样做。

            foreach ($operations as $key => $op) {
                $function = array_get($op, 'function');
                // 如果是在2018.11.30之前,那么就不显示教室抓拍,因为这个功能11.30号才上线
                if ($timeFrom < '2018-11-30' && $function == 'classroomSnapShot') {
                    unset($operations[$key]);
                }
                //进入房间按钮,开课前半小时才可以看到
                if (in_array($function, ['adminInto', 'assistantInto'])) {
                    if (!$allowInto) {
                        unset($operations[$key]);
                    }
                }
            }

    6. 得到这些操作之后前端就可以根据操作'function'来绑定后端的函数

                @foreach($operations as $operationId => $operation)
                    <a class="layui-btn layui-btn-primary" style="margin-top: 20px;"
                       onclick="parent.{{$operation['function']}}({{$reservationId}}, {{$roomId}}, {{$orderId}})">
                        {{$operation['desc']}}
                    </a>
                @endforeach

    7. 然后访问后端函数,处理数据,返回结果。

    结语:

    多看别人的代码啊!这样能使自己进步很大!!!!!!!!

  • 相关阅读:
    C# 一个用到WPF 和 反射的例子.
    Html 效果之 A 标签.
    HttpModule 的权限管理
    C# 入门经典示例.
    CSS 圆角边框
    .NET 平台文件去除行号
    C#调用WinApi关闭电脑屏幕含自动监视有无输入活动检测
    还是XP好啊
    SQL执行效率测试语句
    自用SqlHelper
  • 原文地址:https://www.cnblogs.com/cjjjj/p/10063234.html
Copyright © 2011-2022 走看看