获得可操作项
前言
在后台管理中,我们很可能会根据某个状态获取它的可操作项。举个例子,在已完成状态你可以进行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. 然后访问后端函数,处理数据,返回结果。
结语:
多看别人的代码啊!这样能使自己进步很大!!!!!!!!