sql= self::load_data(); $this->_init(); } //保证只加载一次文件 public static function load_data(){ if(is_null(self::$static_sql)){ self::$static_sql = system_group_data(); } return self::$static_sql; } public static function get_info($the_id){ $sql = self::load_data(); return $sql->get($the_id); } /** * 空间使用变更 * @param [type] $the_id [user_id or group_id] * @param [type] $use_size_add [变更的大小 size_max G为单位 size_use Byte为单位] */ public static function space_change($the_id,$use_size_add=false){ $sql = self::load_data(); $info = $sql->get($the_id); if(!is_array($info)){ show_json($this->L["data_not_full"],false); } if($use_size_add===false){//重置用户空间;避免覆盖、解压等导致的问题 $pathinfo = _path_info_more(GROUP_PATH.$info['path'].'/'); $current_use = $pathinfo['size']; if(isset($info['home_path']) && file_exists(iconv_system($info['home_path']))){ $pathinfo = _path_info_more(iconv_system($info['home_path'])); $current_use += $pathinfo['size']; } }else{ $current_use = floatval($info['config']['size_use'])+floatval($use_size_add); } $info['config']['size_use'] = $current_use<0?0:$current_use; $sql->set($the_id,$info); } /** * 空间剩余检测 * 1073741824 —— 1G */ public static function space_check($the_id){ $sql = self::load_data(); $info = $sql->get($the_id); if(!is_array($info)){ show_json($this->L["data_not_full"],false); } $size_use = floatval($info['config']['size_use']); $size_max = floatval($info['config']['size_max']); if($size_max!=0 && $size_max*1073741824<$size_use){ show_json($GLOBALS['L']['space_is_full'],false); } } //管理员调用 //=================== private function _init(){ if(count($this->sql->get()) > 0) return; $default = array( '1' =>array( 'group_id' => '1', 'name' => 'root', 'parent_id' => '', 'children' => '', 'config' => array('size_max' => floatval(1.5), 'size_use' => floatval(1024*1024)),//总大小,目前使用大小 'path' => 'root', 'create_time'=> time(), ) ); $this->sql->reset($default); $this->_initDir($default[0]['path']); } //删除 path id public static function _filter_list($list,$filter_key = 'path'){ if($GLOBALS['is_root']) return $list; foreach ($list as $key => &$val) { unset($val[$filter_key]); } return $list; } public function get() { $items = self::_filter_list($this->sql->get()); show_json($items,true); } /** * 群组添加 * system_group/add&name=t1&parent_id=101&size_max=0 */ public function add(){ if (!isset($this->in['name']) || //必填项 !isset($this->in['parent_id']) || !isset($this->in['size_max']) ) show_json($this->L["data_not_full"],false); //名称可以重复 $group_id = $this->sql->get_max_id().''; $group_name = rawurldecode($this->in['name']); $group_info = array( 'group_id' => $group_id, 'name' => $group_name, 'parent_id' => $this->in['parent_id'], 'children' => '', 'config' => array('size_max' => floatval($this->in['size_max']),//G 'size_use' => floatval(1024*1024)),//总大小,目前使用大小 'path' => make_path($group_name), 'create_time'=> time(), ); if(file_exists(iconv_system(GROUP_PATH.$group_info['path'])) ){ $group_info['path'] = make_path($group_info['path'].'_'.$group_info['group_id']); } //用户组目录 if( isset($this->in['home_path'])){ $group_info['home_path'] = _DIR(rawurldecode($this->in['home_path'])); if(!file_exists($group_info['home_path'])){ show_json($this->L['not_exists'],false); } $group_info['home_path'] = iconv_app($group_info['home_path']); }else{ unset($group_info['home_path']); } $this->_parent_child_change($group_info,true);//更新父节点 if ($this->sql->set($group_id,$group_info)) { $this->_initDir($group_info['path']); show_json($this->L['success']); } show_json($this->L['error'],false); } /** * 编辑 system_group/edit&group_id=101&name=warlee&size_max=0&parent_id */ public function edit() { if (!$this->in['group_id']) show_json($this->L["data_not_full"],false); $group_info = $this->sql->get($this->in['group_id']); if(!is_array($group_info)){//用户不存在 show_json($this->L['not_exists'],false); } //name size_max parent_id if(isset($this->in['name'])){ $group_info['name'] = rawurldecode($this->in['name']); } if(isset($this->in['size_max'])){ $group_info['config']['size_max'] = floatval($this->in['size_max']); } if( isset($this->in['parent_id']) && $group_info['parent_id']!= '' && //根目录不能修改父节点 $this->in['parent_id']!=$group_info['parent_id']){//父节点变更 $child_change = explode(',',$group_info['children']); if(in_array($this->in['parent_id'],$child_change)){//不能移动到子节点;死循环 show_json($this->L['current_has_parent'],false); } self::space_change($this->in['group_id']);//重置用户使用空间 $this->_parent_child_change($group_info,false);//向所有父节点,删除包含此节点的children $group_info['parent_id'] = $this->in['parent_id']; $this->_parent_child_change($group_info,true);//向所有新的父节点,添加包含此节点的children } //用户组目录 if( isset($this->in['home_path'])){ $group_info['home_path'] = _DIR(rawurldecode($this->in['home_path'])); if(!file_exists($group_info['home_path'])){ show_json($this->L['not_exists'],false); } $group_info['home_path'] = iconv_app($group_info['home_path']); }else{ unset($group_info['home_path']); } if($group_info != $this->sql->get($this->in['group_id'])){ $this->sql->set($this->in['group_id'],$group_info); } show_json($this->L['success']); } /** * 删除 ?system_member/del&user_id=102 */ public function del() { if (!isset($this->in['group_id'])) show_json($this->L["data_not_full"],false); if (strlen($this->in['group_id']) <= 1) show_json($this->L['default_user_can_not_do'],false); $group_info = $this->sql->get($this->in['group_id']); $this->_parent_child_change($group_info,false);//向所有父节点,删除包含此节点的children $this->sql->set(//将该节点的子节点的父节点设置为根目录 array('parent_id',$group_info["group_id"]), array('parent_id','1') ); system_member::group_remove_user_update($group_info["group_id"]);//用户所在组变更 $this->sql->remove($this->in['group_id']); if( strlen($group_info['path'])!=0){ del_dir(iconv_system(GROUP_PATH.$group_info['path'].'/')); show_json($this->L['success']); } show_json($this->L['error'],false); } //============内部处理函数============= //回溯更改节点的children private function _parent_child_change($group_info,$is_add){ if(!is_array($group_info)){ show_json($this->L['not_exists'],false); } if($group_info['parent_id'] == 1){ return; } $first_id = $group_info['group_id']; $child_change = explode(',',$group_info['children']); if($child_change[0]==''){ unset($child_change[0]); } $child_change[] = $group_info['group_id'];//包含当前 while(strlen($group_info['group_id'])>2){//节点id从100开始 $group_info = $this->sql->get($group_info['parent_id']); if(!is_array($group_info)){ show_json($this->L['not_exists'],false); } $children_new = explode(',',$group_info['children']); if($children_new[0]==''){ unset($children_new[0]); } if($is_add){//添加 foreach ($child_change as $key=>$val) { $children_new[] = $val; } }else{//删除 foreach ($children_new as $key=>$val) { if(in_array($val,$child_change)) unset($children_new[$key]); } } $child_str = implode(',',$children_new); if($child_str != $group_info['children']){//有变更 $group_info['children'] = $child_str; $this->sql->set($group_info['group_id'],$group_info); } } } // /** *初始化用户数据和配置。 */ private function _initDir($path){ $root = array('home','data');//recycle $new_group_folder = $this->config['setting_system']['new_group_folder']; if(!is_array($new_group_folder)){ $new_group_folder = $this->config['setting_system_default']['new_group_folder']; } $home = explode(',',$new_group_folder); $path = GROUP_PATH.$path.'/'; foreach ($root as $dir) { mk_dir(iconv_system($path.$dir)); } foreach ($home as $dir) { mk_dir(iconv_system($path.'home/'.$dir)); } } }