211 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			211 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace app\adminapi\model;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use app\common\model\BaseModel;
							 | 
						||
| 
								 | 
							
								use think\Cache;
							 | 
						||
| 
								 | 
							
								use think\Model;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class AuthRule extends BaseModel
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    protected $name = 'api_auth_rule';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // 开启自动写入时间戳字段
							 | 
						||
| 
								 | 
							
								    protected $autoWriteTimestamp = 'int';
							 | 
						||
| 
								 | 
							
								    // 定义时间戳字段名
							 | 
						||
| 
								 | 
							
								    protected $createTime = 'createtime';
							 | 
						||
| 
								 | 
							
								    protected $updateTime = 'updatetime';
							 | 
						||
| 
								 | 
							
								    // 数据自动完成字段
							 | 
						||
| 
								 | 
							
								    protected $insert = ['py', 'pinyin'];
							 | 
						||
| 
								 | 
							
								    protected $update = ['py', 'pinyin'];
							 | 
						||
| 
								 | 
							
								    // 拼音对象
							 | 
						||
| 
								 | 
							
								    protected static $pinyin = null;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    protected static function init()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        self::$pinyin = new \Overtrue\Pinyin\Pinyin('Overtrue\Pinyin\MemoryFileDictLoader');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        self::beforeWrite(function ($row) {
							 | 
						||
| 
								 | 
							
								            if (isset($_POST['row']) && is_array($_POST['row']) && isset($_POST['row']['condition'])) {
							 | 
						||
| 
								 | 
							
								                $originRow = $_POST['row'];
							 | 
						||
| 
								 | 
							
								                $row['condition'] = $originRow['condition'] ?? '';
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								        self::afterWrite(function ($row) {
							 | 
						||
| 
								 | 
							
								            Cache::rm('__menu__');
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function getTitleAttr($value, $data)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return __($value);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function getMenutypeList()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return ['addtabs' => __('Addtabs'), 'dialog' => __('Dialog'), 'ajax' => __('Ajax'), 'blank' => __('Blank')];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function setPyAttr($value, $data)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (isset($data['title']) && $data['title']) {
							 | 
						||
| 
								 | 
							
								            return self::$pinyin->abbr(__($data['title']));
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return '';
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function setPinyinAttr($value, $data)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (isset($data['title']) && $data['title']) {
							 | 
						||
| 
								 | 
							
								            return self::$pinyin->permalink(__($data['title']), '');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return '';
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 获取会员组别规则列表
							 | 
						||
| 
								 | 
							
								     * @return array|bool|\PDOStatement|string|\think\Collection
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function getRuleList($admin_id,$where=[],$full = false)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $group_ids = AuthGroupAccess::where("uid",$admin_id)->column("group_id");
							 | 
						||
| 
								 | 
							
								        if(!$group_ids && !$full) return [];
							 | 
						||
| 
								 | 
							
								        $groups = AuthGroup::where('id', 'in', $group_ids)->select();
							 | 
						||
| 
								 | 
							
								        if (!$groups && !$full ) {
							 | 
						||
| 
								 | 
							
								            return [];
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $rules = [];
							 | 
						||
| 
								 | 
							
								        foreach ($groups as $group){
							 | 
						||
| 
								 | 
							
								            $rules = array_merge($rules, explode(',', $group->rules));
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        //包含*全查,否则按值查
							 | 
						||
| 
								 | 
							
								        if ($full || in_array('*', $rules)) {
							 | 
						||
| 
								 | 
							
								            return AuthRule::where($where)->where('status', 'normal')->order('weigh desc,id desc')->select();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return AuthRule::where($where)->where('status', 'normal')->where('id', 'in', $rules)->order('weigh desc,id desc')->select();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    //得到菜单列表
							 | 
						||
| 
								 | 
							
								    public function getMenulist($admin_id,$where= ["ismenu"=>1],$is_tree=false,$full = false,$id_name='id',$pid_name='pid',$child_name='children')
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $menu = $this->getRuleList($admin_id,$where,$full);
							 | 
						||
| 
								 | 
							
								        if(!$is_tree){
							 | 
						||
| 
								 | 
							
								            return $menu;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        // 生成菜单的树状结构 id  pid ,pid=0为顶级菜单
							 | 
						||
| 
								 | 
							
								        $menulist = [];
							 | 
						||
| 
								 | 
							
								        foreach ($menu as $k => $v) {
							 | 
						||
| 
								 | 
							
								            $v = $v->toArray();
							 | 
						||
| 
								 | 
							
								            $v[$id_name] = $v['id'];
							 | 
						||
| 
								 | 
							
								            $v[$pid_name] = $v['pid'];
							 | 
						||
| 
								 | 
							
								            $menulist[$v[$id_name]] = $v;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $tree = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        foreach ($menulist as $k => $v) {
							 | 
						||
| 
								 | 
							
								            if (isset($menulist[$v[$pid_name]])) {
							 | 
						||
| 
								 | 
							
								                $menulist[$v[$pid_name]][$child_name][] = &$menulist[$v[$id_name]];
							 | 
						||
| 
								 | 
							
								            } else {
							 | 
						||
| 
								 | 
							
								                $tree[] = &$menulist[$v[$id_name]];
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return $tree;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function authCheck($admin_id,$auth_name)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $group_ids = AuthGroupAccess::where("uid",$admin_id)->column("group_id");
							 | 
						||
| 
								 | 
							
								        if(!$group_ids) return null;
							 | 
						||
| 
								 | 
							
								        $groups = AuthGroup::where('id', 'in', $group_ids)->select();
							 | 
						||
| 
								 | 
							
								        if (!$groups) {
							 | 
						||
| 
								 | 
							
								            return null;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $rules = [];
							 | 
						||
| 
								 | 
							
								        foreach ($groups as $group){
							 | 
						||
| 
								 | 
							
								            $rules = array_merge($rules, explode(',', $group->rules));
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        //包含*全查,否则按值查
							 | 
						||
| 
								 | 
							
								        if (in_array('*', $rules)) {
							 | 
						||
| 
								 | 
							
								            return AuthRule::where('status', 'normal')->where( 'name|rule_name',$auth_name)->find() ;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return AuthRule::where('status', 'normal')->where( 'name|rule_name',$auth_name)->where('id', 'in', $rules)->find();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function getAllRules($admin_id)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $group_ids = AuthGroupAccess::where("uid",$admin_id)->column("group_id");
							 | 
						||
| 
								 | 
							
								        if(!$group_ids) return null;
							 | 
						||
| 
								 | 
							
								        $groups = AuthGroup::where('id', 'in', $group_ids)->select();
							 | 
						||
| 
								 | 
							
								        if (!$groups) {
							 | 
						||
| 
								 | 
							
								            return null;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $rules = [];
							 | 
						||
| 
								 | 
							
								        foreach ($groups as $group){
							 | 
						||
| 
								 | 
							
								            $rules = array_merge($rules, explode(',', $group->rules));
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        //包含*全查,否则按值查
							 | 
						||
| 
								 | 
							
								        if (in_array('*', $rules)) {
							 | 
						||
| 
								 | 
							
								            return AuthRule::where('status', 'normal')->field("name,rule_name,ismenu")->select() ;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return AuthRule::where('status', 'normal')->where('id', 'in', $rules)->field("name,rule_name,ismenu")->select();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /** 通用新增(后台api版本)
							 | 
						||
| 
								 | 
							
								     * @param $params
							 | 
						||
| 
								 | 
							
								     * @param $trans
							 | 
						||
| 
								 | 
							
								     * @return $this
							 | 
						||
| 
								 | 
							
								     * @throws \Exception
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function add($params,$trans=false){
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (empty($params)) {
							 | 
						||
| 
								 | 
							
								            throw new \Exception(__('Parameter %s can not be empty', ''));
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if ($this->dataLimit && $this->dataLimitFieldAutoFill) {
							 | 
						||
| 
								 | 
							
								            $params[$this->dataLimitField] = $this->auth->id;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								//判断逻辑
							 | 
						||
| 
								 | 
							
								        if($trans){
							 | 
						||
| 
								 | 
							
								            self::beginTrans();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $res = true;
							 | 
						||
| 
								 | 
							
								        try{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            //是否采用模型验证
							 | 
						||
| 
								 | 
							
								            if ($this->modelValidate) {
							 | 
						||
| 
								 | 
							
								                $name = str_replace("\\model\\", "\\validate\\", get_class($this));
							 | 
						||
| 
								 | 
							
								                $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : $name) : $this->modelValidate;
							 | 
						||
| 
								 | 
							
								                $this->validateFailException()->validate($validate);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            $result = $this->allowField(true)->save($params);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if($trans){
							 | 
						||
| 
								 | 
							
								                self::commitTrans();
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }catch (\Exception $e){
							 | 
						||
| 
								 | 
							
								            if($trans){
							 | 
						||
| 
								 | 
							
								                self::rollbackTrans();
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            throw new \Exception($e->getMessage().$e->getFile().$e->getLine());
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return $this;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 |