From c77746bbf60edfac2bf3d10d75c59901af12b375 Mon Sep 17 00:00:00 2001 From: Yuan Chiu Date: Thu, 2 Oct 2014 18:19:32 +0800 Subject: [PATCH] Create User Class --- htdocs/config.sample.php | 7 + htdocs/lib/Database/DBUser.php | 124 +++++++++- htdocs/lib/User/User.php | 428 ++++++++++++++++++++++++++++++++- htdocs/lib/User/UserAdmin.php | 9 +- htdocs/lib/Util/Password.php | 19 +- tests/User/UserAdminTest.php | 2 - tests/Util/PasswordTest.php | 2 +- 7 files changed, 567 insertions(+), 24 deletions(-) diff --git a/htdocs/config.sample.php b/htdocs/config.sample.php index 8f82bbb..871814d 100644 --- a/htdocs/config.sample.php +++ b/htdocs/config.sample.php @@ -1,4 +1,11 @@ insertUser('eric', 'passwd', 'user', null, 1, 'harf-line-learn', '1', '偉人', 'Eric Chiou', 'eric@example.com', null); + * + * echo 'Finish'; + * } + * + * + * // 若設定的DBMS不被支援 則丟出例外 + * catch (Database\Exception\DatabaseNoSupportException $e) { + * echo 'No Support in ', $e->getType(); + * } catch (Exception $e) { + * echo 'Caught other exception: ', $e->getMessage(); + * echo '

'. $e->getCode() .'

'; + * } + * + * @param string $uId 使用者名稱 * @param string $password 密碼 - * @param string $gId 群組 - * @param string $cId 班級 - * @param string $enable 啟用此帳號 - * @param string $l_mode 學習模式 - * @param string $m_mode 教材模式 + * @param string $gId 群組 + * @param string $cId 班級 + * @param string $enable 啟用此帳號 + * @param string $l_mode 學習模式 + * @param string $m_mode 教材模式 * @param string $nickName 暱稱 * @param string $realName 姓名 - * @param string $email 電子郵件地址 - * @param string $memo 備註 + * @param string $email 電子郵件地址 + * @param string $memo 備註 */ public function insertUser($uId, $password, $gId, $cId, $enable, $l_mode, $m_mode, @@ -75,8 +99,47 @@ class DBUser extends Database { /** * 查詢一位使用者帳號資料 + * + * + * 範例: + * + * require_once __DIR__.'/../config.php'; + * require_once UELEARNING_LIB_ROOT.'/Database/DBUser.php'; + * use UElearning\Database; + * + * try { + * $db = new Database\DBUser(); + * + * $userInfo = $db->queryUser('yuan'); + * echo '
'; print_r($userInfo); echo '
'; + * } + * + * + * // 若設定的DBMS不被支援 則丟出例外 + * catch (Database\Exception\DatabaseNoSupportException $e) { + * echo 'No Support in ', $e->getType(); + * } catch (Exception $e) { + * echo 'Caught other exception: ', $e->getMessage(); + * echo '

'. $e->getCode() .'

'; + * } + * * @param string $uId 使用者名稱 - * @return array 使用者資料 (TODO 格式待補) + * @return array 使用者資料陣列,格式為: + * array( + * 'user_id' => <帳號名稱>, + * 'password' => <密碼>, + * 'group_id' => <群組>, + * 'class_id' => <班級>, + * 'enable' => <啟用>, + * 'build_time' => <建立日期>, + * 'learnStyle_mode' => <偏好學習導引模式>, + * 'material_mode' => <偏好教材模式>, + * 'nickname' => <暱稱>, + * 'realname' => <真實姓名>, + * 'email' => <電子郵件地址>, + * 'memo' => <備註> + * ); + * */ public function queryUser($uId) { @@ -113,6 +176,49 @@ class DBUser extends Database { } } + /** + * 修改一位使用者的資料內容 + * + * 範例: + * + * $db = new Database\DBUser(); + * $db->changeUserData('yuan', 'memo', 'hahaha'); + * + * @param string $uId 使用者名稱 + * @param string $field 欄位名稱 + * @param string $value 內容 + */ + public function changeUserData($uId, $field, $value) { + // UPDATE `UElearning`.`chu__User` SET `UMemo` = '測試者' WHERE `chu__User`.`UID` = 'yuan'; + + $sqlField = null; + switch($field) { + case 'user_id': $sqlField = 'UID'; break; + case 'password': $sqlField = 'UPassword'; break; + case 'group_id': $sqlField = 'GID'; break; + case 'class_id': $sqlField = 'CID'; break; + case 'enable': $sqlField = 'UEnabled'; break; + case 'build_time': $sqlField = 'UBuild_Time'; break; + case 'learnStyle_mode': $sqlField = 'LMode'; break; + case 'material_mode': $sqlField = 'MMode'; break; + case 'nickname': $sqlField = 'UNickname'; break; + case 'realname': $sqlField = 'UReal_Name'; break; + case 'email': $sqlField = 'UEmail'; break; + case 'memo': $sqlField = 'UMemo'; break; + default: $sqlField = $field; break; + } + + + $sqlString = "UPDATE ".$this->table('User'). + " SET `".$sqlField."` = :value". + " WHERE `UID` = :uid"; + + $query = $this->connDB->prepare($sqlString); + $query->bindParam(':uid', $uId); + $query->bindParam(':value', $value); + $query->execute(); + } + /** * 移除一位使用者 * @param string $uId 使用者名稱 diff --git a/htdocs/lib/User/User.php b/htdocs/lib/User/User.php index 78cb79a..1804497 100644 --- a/htdocs/lib/User/User.php +++ b/htdocs/lib/User/User.php @@ -5,4 +5,430 @@ namespace UElearning\User; -// TODO: write this code \ No newline at end of file +require_once UELEARNING_LIB_ROOT.'/Database/DBUser.php'; +require_once UELEARNING_LIB_ROOT.'/User/Exception.php'; +require_once UELEARNING_LIB_ROOT.'/Exception.php'; +require_once UELEARNING_LIB_ROOT.'/Util/Password.php'; +use UElearning\Database; +use UElearning\Util; + +/** + * 使用者處理專用類別 + * + * 一個物件即代表這一位使用者 + * + * 建立此物件範例: + * + * require_once __DIR__.'/../config.php'; + * require_once UELEARNING_LIB_ROOT.'/User/User.php'; + * use UElearning\User; + * + * try { + * $user = new User\User('yuan'); + * // TODO: 在這邊寫下要針對這位使用者作什麼事? + * } + * catch (User\Exception\UserNoFoundException $e) { + * echo 'No Found user: '. $e->getUserId(); + * } + * + * @version 2.0.0 + * @package UElearning + * @subpackage User + */ +class User { + + /** + * 使用者ID + * @type string + */ + protected $uId; + + // ------------------------------------------------------------------------ + + /** + * 查詢到此帳號的所有資訊的結果 + * + * 由 $this->getQuery() 抓取資料表中所有資訊,並放在此陣列裡 + * @type array + */ + protected $queryResultArray; + + /** + * 從資料庫取得此帳號查詢 + * + * @throw UElearning\User\Exception\UserNoFoundException + * @since 2.0.0 + */ + protected function getQuery(){ + // 從資料庫查詢使用者 + $db = new Database\DBUser(); + $userInfo = $db->queryUser($this->uId); + + // 判斷有沒有這位使用者 + if( $userInfo != null ) { + $this->queryResultArray = $userInfo; + } + else throw new Exception\UserNoFoundException($this->uId); + } + + /** + * 從資料庫更新此帳號設定 + * + * @since 2.0.0 + */ + protected function setUpdate($field, $value){ + /// 將新設定寫進資料庫裡 + $db = new Database\DBUser(); + $db->changeUserData($this->uId, $field, $value); + $this->getQuery(); + } + + + + // ======================================================================== + + /** + * 建構子 + * + * @param string $inputUID 使用者ID + * @since 2.0.0 + */ + public function __construct($inputUID){ + $this->uId = $inputUID; + $this->getQuery(); + } + + // ======================================================================== + + /** + * 取得帳號名稱 + * + * @return string 帳號名稱 + * @since 2.0.0 + */ + public function getUsername(){ + return $this->uId; + } + + // ------------------------------------------------------------------------ + + /** + * 驗證密碼是否錯誤 + * + * @param string $inputPasswd 密碼 + * @return bool true:密碼正確,false:密碼錯誤 + * @since 2.0.0 + */ + public function isPasswordCorrect($inputPasswd){ + $passUtil = new Util\Password(); + $this_passwd = $this->queryResultArray['password']; + return $passUtil->checkSame($this_passwd, $inputPasswd); + } + + /** + * 更改密碼 + * + * @param string $newPasswd 新密碼 + * @param string $newPasswdMode 新密碼加密方式(可省略) + * @return string 狀態回傳 + * @since 2.0.0 + */ + public function changePassword($newPasswd){ + // 進行密碼加密 + $passUtil = new Util\Password(); + $passwdEncrypted = $passUtil->encrypt($newPasswd); + + // 將新密碼寫進資料庫裡 + $this->setUpdate('password', $passwdEncrypted); + } + + // ======================================================================== + + /** + * 取得帳號建立時間 + * + * @return string 建立時間 + * @since 2.0.0 + */ + public function getCreateTime(){ + return $this->queryResultArray['build_time']; + } + // ======================================================================== + + /** + * 取得所在群組 + * + * @return string 群組ID + * @since 2.0.0 + */ + public function getGroup(){ + return $this->queryResultArray['group_id']; + } + + /** + * 取得所在群組顯式名稱 + * + * @return string 群組名稱 + * @since 2.0.0 + */ + public function getGroupName(){ + // TODO: getGroupName + } + + /** + * 設定所在群組 + * + * @param string $toGroup 群組ID + * @since 2.0.0 + */ + public function setGroup($toGroup){ + // TODO: setGroup + + + } + + // ------------------------------------------------------------------------ + + /** + * 取得所在班級 + * + * @return string 班級ID + * @since 2.0.0 + */ + public function getClass(){ + return $this->queryResultArray['class_id']; + } + + /** + * 取得所在群組顯式名稱 + * + * @return string 班級名稱 + * @since 2.0.0 + */ + public function getClassName(){ + // TODO: getGroupName + } + + /** + * 設定所在群組 + * + * @param string $toGroup 班級ID + * @since 2.0.0 + */ + public function setClass($toClass){ + // TODO: setGroup + + + } + + // ======================================================================== + + /** + * 取得帳號啟用狀態 + * + * @return bool 是否已啟用 + * @since 2.0.0 + */ + public function isEnable(){ + return $this->queryResultArray['enable']; + } + + /** + * 設定帳號啟用狀態 + * + * @param bool $isActive 是否為啟用 + * @since 2.0.0 + */ + public function setEnable($isActive){ + // TODO: 防呆,至少一個帳號是啟用的 + + // 將新設定寫進資料庫裡 + $this->setUpdate('enable', $isActive); + } + + // ======================================================================== + + /** + * 取得這個人的學習導引風格 + * + * @return string 學習導引風格 + * @since 2.0.0 + */ + public function getLearnStyle(){ + // TODO: + } + + /** + * 設定這個人的學習導引風格 + * + * @param string $style 學習導引風格 + * @since 2.0.0 + */ + public function setLearnStyle($style){ + // TODO + + + } + + /** + * 取得這個人的教材風格 + * + * @return string 教材風格 + * @since 2.0.0 + */ + public function getMaterialStyle(){ + // TODO: + } + + /** + * 設定這個人的教材風格 + * + * @param string $style 教材風格 + * @since 2.0.0 + */ + public function setMaterialStyle($style){ + // TODO + + + } + + // ======================================================================== + + /** + * 取得名稱 + * + * @return string 依照有填入多少名字
優先順序: 暱稱→真實名字→帳號名稱 + * @since 2.0.0 + */ + public function getName(){ + // TODO: 代修正 + if($this->getNickName() != "") { + return $this->getNickName(); + } + else if($this->getRealName() != "") { + return $this->getRealName(); + } + else { + return $this->getUsername(); + } + } + + // ------------------------------------------------------------------------ + + /** + * 取得暱稱 + * + * @return string 暱稱 + * @since 2.0.0 + */ + public function getNickName(){ + return $this->queryResultArray['nickname']; + } + + /** + * 修改暱稱 + * + * @param string $input 新暱稱 + * @since 2.0.0 + */ + public function setNickName($input){ + // 將新設定寫進資料庫裡 + $this->setUpdate('nickname', $input); + } + + // ------------------------------------------------------------------------ + + /** + * 取得真實姓名 + * + * @return string 真實姓名 + * @since 2.0.0 + */ + public function getRealName(){ + return $this->queryResultArray['realname']; + } + + /** + * 修改真實姓名 + * + * @param string $input 新真實姓名 + * @since 2.0.0 + */ + public function setRealName($input){ + // 將新設定寫進資料庫裡 + $this->setUpdate('realname', $input); + } + + // ------------------------------------------------------------------------ + + /** + * 取得帳號Email + * + * @return string 使用者資訊的Email + * @since 2.0.0 + */ + public function getEmail(){ + return $this->queryResultArray['email']; + } + + /** + * 修改帳號Email + * + * @param string $input 新Email + * @since 2.0.0 + */ + public function setEmail($input){ + // 將新設定寫進資料庫裡 + $db->changeUserData($this->uId, 'email', $input); + } + + // ------------------------------------------------------------------------ + + /** + * 取得帳號備註資訊 + * + * @return string 使用者帳號備註資訊 + * @since 2.0.0 + */ + public function getMemo(){ + return $this->queryResultArray['memo']; + } + + /** + * 修改帳號備註資訊 + * + * @param string $input 新的帳號備註資訊 + * @since 2.0.0 + */ + public function setMemo($input){ + $this->setUpdate('memo', $input); + } + + // ======================================================================== + + /** + * 取得權限清單 + * + * @access public + * @return array 權限清單 + */ + public function getPermissionList() { + $thisGroup = new UserGroup($this->getQueryInfo("GID")); + return $thisGroup->getPermissionList(); + + } + + /** + * 是否擁有此權限 + * + * @access public + * @global string $FORM_USER 在/config/db_table_config.php的使用者資料表名稱 + * @global string $FORM_USER_GROUP 在/config/db_table_config.php的使用者群組資料表名稱 + * @param string $permissionName 權限名稱 + * @return bool 是否擁有 + */ + public function havePermission($permissionName) { + // TODO + } + +} \ No newline at end of file diff --git a/htdocs/lib/User/UserAdmin.php b/htdocs/lib/User/UserAdmin.php index cff0cfa..a6cfe70 100644 --- a/htdocs/lib/User/UserAdmin.php +++ b/htdocs/lib/User/UserAdmin.php @@ -8,7 +8,9 @@ namespace UElearning\User; require_once UELEARNING_LIB_ROOT.'/Database/DBUser.php'; require_once UELEARNING_LIB_ROOT.'/User/Exception.php'; require_once UELEARNING_LIB_ROOT.'/Exception.php'; +require_once UELEARNING_LIB_ROOT.'/Util/Password.php'; use UElearning\Database; +use UElearning\Util; /** * 管理使用者的操作 @@ -105,11 +107,8 @@ class UserAdmin { } // 進行密碼加密 - /*if( isset($userInfoArray['userId']) ) { - // TODO: 密碼加密 - }*/ - // 加密後的密碼 - $passwdEncrypted = $userInfoArray['password']; + $passUtil = new Util\Password(); + $passwdEncrypted = $passUtil->encrypt( $userInfoArray['password'] ); // 新增一筆使用者資料進資料庫 $db = new Database\DBUser(); diff --git a/htdocs/lib/Util/Password.php b/htdocs/lib/Util/Password.php index 2bd5b45..111f108 100644 --- a/htdocs/lib/Util/Password.php +++ b/htdocs/lib/Util/Password.php @@ -8,6 +8,18 @@ namespace UElearning\Util; /** * 密碼以及加密相關的函式庫 * + * 使用範例: + * + * require_once __DIR__.'/../config.php'; + * require_once UELEARNING_LIB_ROOT.'/Util/Password.php'; + * use UElearning\Util; + * + * $passUtil = new Util\Password(); + * echo $passUtil->generator(10); // 產生10個字的密碼 + * echo $passUtil->encrypt('abc'); // 加密此字串 + * + * // 核對與加密後是否吻合 + * echo $passUtil->checkSame('a9993e364706816aba3e25717850c26c9cd0d89d', 'abc'); * * @author Yuan Chiu * @version 2.0.0 @@ -47,8 +59,7 @@ class Password { * @return string 亂數產生產生後的字串 * */ - public function generator($password_len) - { + public function generator($password_len){ $password = ''; // remove o,0,1,l @@ -70,8 +81,6 @@ class Password { * @since 2.0.0 */ public function encrypt($text){ - // TODO: 尚未測試 - // 從config.php設定檔取得預設加密方式 switch(ENCRYPT_MODE){ case "MD5": @@ -101,8 +110,6 @@ class Password { * @since 2.0.0 */ public function checkSame($encrypted, $text) { - // TODO: 尚未測試 - // 加密此字串 $textToEncypt = $this->encrypt($text); diff --git a/tests/User/UserAdminTest.php b/tests/User/UserAdminTest.php index b3c8212..ff3a387 100644 --- a/tests/User/UserAdminTest.php +++ b/tests/User/UserAdminTest.php @@ -31,8 +31,6 @@ class UserAdminTest extends \PHPUnit_Framework_TestCase $userAdmin->create( array( 'user_id' => $uId, 'password' => $uPassword, - //'password_encrypt' => null, - //'password_encrypted' => null, 'group_id' => $gId, 'class_id' => $cId, 'enable' => $enable, diff --git a/tests/Util/PasswordTest.php b/tests/Util/PasswordTest.php index 8783c61..ad38b10 100644 --- a/tests/Util/PasswordTest.php +++ b/tests/Util/PasswordTest.php @@ -25,7 +25,7 @@ class PasswordTest extends \PHPUnit_Framework_TestCase * * @dataProvider pass_dataProvider */ - public function testCheckSame($data){ + public function testCheckSame($value){ // 加密字串 $encode = $this->passUtil->encrypt($value);