获得可操作项

前言

在后台管理中,我们很可能会根据某个状态获取它的可操作项。举个例子,在已完成状态你可以进行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. 然后访问后端函数,处理数据,返回结果。

 

结语:

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

posted @ 2018-12-04 11:44  泥土里的绽放  阅读(243)  评论(0编辑  收藏  举报