280 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			280 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			PHP
		
	
	
<?php
 | 
						||
/*
 | 
						||
* @link http://kodcloud.com/
 | 
						||
* @author warlee | e-mail:kodcloud@qq.com
 | 
						||
* @copyright warlee 2014.(Shanghai)Co.,Ltd
 | 
						||
* @license http://kodcloud.com/tools/license/license.txt
 | 
						||
*/
 | 
						||
 | 
						||
//群组管理【管理员调用,or组空间大小变更】
 | 
						||
//根目录id为1==》共享空间
 | 
						||
class systemGroup extends Controller{
 | 
						||
	public static $staticSql = null;
 | 
						||
	private $sql;
 | 
						||
	function __construct()    {
 | 
						||
		parent::__construct();
 | 
						||
		$this->sql= self::loadData();
 | 
						||
		$this->_init();
 | 
						||
	}
 | 
						||
 | 
						||
	//保证只加载一次文件
 | 
						||
	public static function loadData(){
 | 
						||
		if(is_null(self::$staticSql)){
 | 
						||
			self::$staticSql = systemGroupData();
 | 
						||
		}
 | 
						||
		return self::$staticSql;
 | 
						||
	}
 | 
						||
	public static function getInfo($theId){
 | 
						||
		$sql = self::loadData();
 | 
						||
		return $sql->get($theId);
 | 
						||
	}
 | 
						||
 | 
						||
	/**
 | 
						||
	 * 空间使用变更
 | 
						||
	 * @param  [type] $theId   [userID or groupID]
 | 
						||
	 * @param  [type] $sizeAdd [变更的大小  sizeMax G为单位   sizeUse Byte为单位]
 | 
						||
	 */
 | 
						||
	public static function spaceChange($theId,$sizeAdd=false){
 | 
						||
		$sql = self::loadData();
 | 
						||
		$info = $sql->get($theId);
 | 
						||
		if(!is_array($info)){
 | 
						||
			show_json(LNG('data_not_full'),false);
 | 
						||
		}
 | 
						||
		if($sizeAdd===false){//重置用户空间;避免覆盖、解压等导致的问题
 | 
						||
			$pathinfo = _path_info_more(GROUP_PATH.$info['path'].'/');
 | 
						||
			$currentUse  = $pathinfo['size'];
 | 
						||
			if(isset($info['homePath']) && file_exists(iconv_system($info['homePath']))){
 | 
						||
				$pathinfo = _path_info_more(iconv_system($info['homePath']));
 | 
						||
				$currentUse  += $pathinfo['size'];
 | 
						||
			}
 | 
						||
		}else{
 | 
						||
			$currentUse = floatval($info['config']['sizeUse'])+floatval($sizeAdd);
 | 
						||
		}
 | 
						||
		$info['config']['sizeUse'] = $currentUse<0?0:$currentUse;
 | 
						||
		$sql->set($theId,$info);
 | 
						||
	}
 | 
						||
 | 
						||
	/**
 | 
						||
	 * 空间剩余检测
 | 
						||
	 * 1073741824 —— 1G
 | 
						||
	 */
 | 
						||
	public static function spaceCheck($theId){
 | 
						||
		$sql = self::loadData();
 | 
						||
		$info = $sql->get($theId);
 | 
						||
		if(!is_array($info)){
 | 
						||
			show_json(LNG('data_not_full'),false);
 | 
						||
		}
 | 
						||
		$sizeUse = floatval($info['config']['sizeUse']);
 | 
						||
		$sizeMax = floatval($info['config']['sizeMax']);
 | 
						||
		if($sizeMax!=0 && $sizeMax*1073741824<$sizeUse){
 | 
						||
			show_json(LNG('space_is_full'),false);
 | 
						||
		}
 | 
						||
	}
 | 
						||
 | 
						||
	//管理员调用
 | 
						||
	//===================
 | 
						||
	private function _init(){
 | 
						||
		if(count($this->sql->get()) > 0) return;
 | 
						||
		$default = array(
 | 
						||
			'1' =>array(
 | 
						||
				'groupID'   =>  '1',
 | 
						||
				'name'      =>  'root',
 | 
						||
				'parentID'  =>  '',
 | 
						||
				'children'  =>  '',
 | 
						||
				'config'    =>  array('sizeMax' => floatval(1.5),
 | 
						||
									  'sizeUse' => floatval(1024*1024)),//总大小,目前使用大小
 | 
						||
				'path'      =>  'root',
 | 
						||
				'createTime'=> time(),
 | 
						||
			)
 | 
						||
		);
 | 
						||
		$this->sql->reset($default);
 | 
						||
		$this->initDir($default[0]['path']);
 | 
						||
	}
 | 
						||
	//删除 path id
 | 
						||
	public static function _filterList($list,$filter_key = 'path'){
 | 
						||
		if($GLOBALS['isRoot']) return $list;
 | 
						||
		foreach ($list as $key => &$val) {
 | 
						||
			unset($val[$filter_key]);
 | 
						||
		}
 | 
						||
		return $list;
 | 
						||
	}
 | 
						||
 | 
						||
	public function get() {
 | 
						||
		$items = self::_filterList($this->sql->get());
 | 
						||
		show_json($items,true);
 | 
						||
	}
 | 
						||
 | 
						||
	/**
 | 
						||
	 * 群组添加
 | 
						||
	 * systemGroup/add&name=t1&parentID=101&sizeMax=0
 | 
						||
	 */
 | 
						||
	public function add(){
 | 
						||
		if (!isset($this->in['name']) || //必填项
 | 
						||
			!isset($this->in['parentID']) ||
 | 
						||
			!isset($this->in['sizeMax'])
 | 
						||
			) show_json(LNG('data_not_full'),false);
 | 
						||
 | 
						||
		//名称可以重复
 | 
						||
		$groupID = $this->sql->getMaxId().'';
 | 
						||
		$groupName = rawurldecode($this->in['name']);
 | 
						||
		$groupInfo = array(
 | 
						||
			'groupID'   =>  $groupID,
 | 
						||
			'name'      =>  $groupName,
 | 
						||
			'parentID'  =>  $this->in['parentID'],
 | 
						||
			'children'  =>  '',
 | 
						||
			'config'    =>  array('sizeMax' => floatval($this->in['sizeMax']),//G
 | 
						||
								  'sizeUse' => floatval(1024*1024)),//总大小,目前使用大小
 | 
						||
			'path'      =>  make_path($groupName),
 | 
						||
			'createTime'=> time(),
 | 
						||
		);
 | 
						||
		if(file_exists(iconv_system(GROUP_PATH.$groupInfo['path'])) ){
 | 
						||
			$groupInfo['path'] = make_path($groupInfo['path'].'_'.$groupInfo['groupID']);
 | 
						||
		}
 | 
						||
 | 
						||
		//用户组目录
 | 
						||
		if( isset($this->in['homePath'])){
 | 
						||
				$homePath = _DIR(rawurldecode($this->in['homePath']));
 | 
						||
			if(file_exists($homePath)){
 | 
						||
				$groupInfo['homePath'] = iconv_app($homePath);
 | 
						||
			}
 | 
						||
		}else{
 | 
						||
			unset($groupInfo['homePath']);
 | 
						||
		}
 | 
						||
		$this->_parentChildChange($groupInfo,true);//更新父节点
 | 
						||
		if ($this->sql->set($groupID,$groupInfo)) {
 | 
						||
			$this->initDir($groupInfo['path']);
 | 
						||
			show_json(LNG('success'));
 | 
						||
		}
 | 
						||
		show_json(LNG('error'),false);
 | 
						||
	}
 | 
						||
 | 
						||
	/**
 | 
						||
	 * 编辑 systemGroup/edit&groupID=101&name=warlee&sizeMax=0
 | 
						||
	 */
 | 
						||
	public function edit() {
 | 
						||
		if (!$this->in['groupID']) show_json(LNG('data_not_full'),false);
 | 
						||
		$groupInfo = $this->sql->get($this->in['groupID']);
 | 
						||
		if(!is_array($groupInfo)){//用户不存在
 | 
						||
			show_json(LNG('not_exists'),false);
 | 
						||
		}
 | 
						||
 | 
						||
		//name sizeMax parentID
 | 
						||
		if(isset($this->in['name'])){
 | 
						||
			$groupInfo['name'] = rawurldecode($this->in['name']);
 | 
						||
		}
 | 
						||
		if(isset($this->in['sizeMax'])){
 | 
						||
			$groupInfo['config']['sizeMax'] = floatval($this->in['sizeMax']);
 | 
						||
		}
 | 
						||
		if( isset($this->in['parentID']) &&
 | 
						||
			$groupInfo['parentID']!= '' && //根目录不能修改父节点
 | 
						||
			$this->in['parentID']!=$groupInfo['parentID']){//父节点变更
 | 
						||
 | 
						||
			$childChange = explode(',',$groupInfo['children']);
 | 
						||
			if( in_array($this->in['parentID'],$childChange) 
 | 
						||
				|| $this->in['parentID'] == $this->in['groupID']){//不能移动到子节点;死循环
 | 
						||
				show_json(LNG('current_has_parent'),false);
 | 
						||
			}
 | 
						||
			self::spaceChange($this->in['groupID']);//重置用户使用空间
 | 
						||
			$this->_parentChildChange($groupInfo,false);//向所有父节点,删除包含此节点的children
 | 
						||
			$groupInfo['parentID'] = $this->in['parentID'];
 | 
						||
			$this->_parentChildChange($groupInfo,true);//向所有新的父节点,添加包含此节点的children
 | 
						||
		}
 | 
						||
 | 
						||
		//用户组目录
 | 
						||
		if( isset($this->in['homePath'])){
 | 
						||
			$groupInfo['homePath'] = _DIR(rawurldecode($this->in['homePath']));
 | 
						||
			if(!file_exists($groupInfo['homePath'])){
 | 
						||
				show_json(LNG('not_exists'),false);
 | 
						||
			}
 | 
						||
			$groupInfo['homePath'] = iconv_app($groupInfo['homePath']);
 | 
						||
		}else{
 | 
						||
			unset($groupInfo['homePath']);
 | 
						||
		}
 | 
						||
		if($groupInfo != $this->sql->get($this->in['groupID'])){
 | 
						||
			$this->sql->set($this->in['groupID'],$groupInfo);
 | 
						||
		}
 | 
						||
		show_json(LNG('success'));
 | 
						||
	}
 | 
						||
 | 
						||
	/**
 | 
						||
	 * 删除 ?systemMember/del&userID=102
 | 
						||
	 */
 | 
						||
	public function del() {
 | 
						||
		if (!isset($this->in['groupID'])) show_json(LNG('data_not_full'),false);
 | 
						||
		if (strlen($this->in['groupID']) <= 1) show_json(LNG('default_user_can_not_do'),false);
 | 
						||
		$groupInfo = $this->sql->get($this->in['groupID']);
 | 
						||
		$this->_parentChildChange($groupInfo,false);//向所有父节点,删除包含此节点的children
 | 
						||
		$this->sql->set(//将该节点的子节点的父节点设置为根目录
 | 
						||
			array('parentID',$groupInfo["groupID"]),
 | 
						||
			array('parentID','1')
 | 
						||
		);
 | 
						||
		systemMember::groupRemoveUserUpdate($groupInfo["groupID"]);//用户所在组变更
 | 
						||
		$this->sql->remove($this->in['groupID']);
 | 
						||
 | 
						||
		if( strlen($groupInfo['path'])!=0){
 | 
						||
			del_dir(iconv_system(GROUP_PATH.$groupInfo['path'].'/'));
 | 
						||
			show_json(LNG('success'));
 | 
						||
		}
 | 
						||
		show_json(LNG('error'),false);
 | 
						||
	}
 | 
						||
 | 
						||
 | 
						||
	//============内部处理函数=============
 | 
						||
	//回溯更改节点的children
 | 
						||
	private function _parentChildChange($groupInfo,$isAdd){
 | 
						||
		if(!is_array($groupInfo)){
 | 
						||
			show_json(LNG('not_exists'),false);
 | 
						||
		}
 | 
						||
		if($groupInfo['parentID'] == 1){
 | 
						||
			return;
 | 
						||
		}
 | 
						||
		$childChange = explode(',',$groupInfo['children']);
 | 
						||
		if($childChange[0]==''){
 | 
						||
			unset($childChange[0]);
 | 
						||
		}
 | 
						||
		$childChange[] = $groupInfo['groupID'];//包含当前
 | 
						||
		while(strlen($groupInfo['groupID'])>2){//节点id从100开始
 | 
						||
			$groupInfo = $this->sql->get($groupInfo['parentID']);
 | 
						||
			if(!is_array($groupInfo)){
 | 
						||
				show_json(LNG('not_exists'),false);
 | 
						||
			}
 | 
						||
			$childrenNew = explode(',',$groupInfo['children']);
 | 
						||
			if($childrenNew[0]==''){
 | 
						||
				unset($childrenNew[0]);
 | 
						||
			}
 | 
						||
			if($isAdd){//添加
 | 
						||
				foreach ($childChange as $key=>$val) {
 | 
						||
					$childrenNew[] = $val;
 | 
						||
				}
 | 
						||
			}else{//删除
 | 
						||
				foreach ($childrenNew as $key=>$val) {
 | 
						||
					if(in_array($val,$childChange))
 | 
						||
					unset($childrenNew[$key]);
 | 
						||
				}
 | 
						||
			}
 | 
						||
			$childStr = implode(',',$childrenNew);
 | 
						||
			if($childStr != $groupInfo['children']){//有变更
 | 
						||
				$groupInfo['children'] = $childStr;
 | 
						||
				$this->sql->set($groupInfo['groupID'],$groupInfo);
 | 
						||
			}
 | 
						||
		}
 | 
						||
	}
 | 
						||
 | 
						||
	//
 | 
						||
	/**
 | 
						||
	 *初始化用户数据和配置。
 | 
						||
	 */
 | 
						||
	public function initDir($path){
 | 
						||
		$root = array('home','data');
 | 
						||
		$newGroupFolder = $this->config['settingSystem']['newGroupFolder'];
 | 
						||
		$home = explode(',',$newGroupFolder);
 | 
						||
		$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));
 | 
						||
		}
 | 
						||
	}
 | 
						||
}
 |