From a4c02d8876feae1ffef3b6a1a61ed2fada878784 Mon Sep 17 00:00:00 2001 From: wlx Date: Tue, 12 Nov 2013 13:16:26 +0000 Subject: [PATCH] merge heihedata branch from r4060 to r4071 --- .../default/controllers/AccountController.php | 89 ++--- .../controllers/KnowledgeController.php | 148 ++++---- .../default/views/scripts/data/view.phtml | 46 ++- .../default/views/scripts/heihe/view.phtml | 43 ++- .../default/views/scripts/hiwater/view.phtml | 43 ++- .../views/scripts/knowledge/author.phtml | 29 +- .../views/scripts/knowledge/datacenter.phtml | 15 +- .../views/scripts/knowledge/index.phtml | 48 ++- .../views/scripts/knowledge/navi.phtml | 17 +- .../views/scripts/knowledge/paper.phtml | 6 +- .../views/scripts/knowledge/search-data.phtml | 23 +- .../views/scripts/knowledge/user.phtml | 21 +- .../views/scripts/knowledge/water.phtml | 56 +++ application/module/Users/Account.php | 332 ++++++++++++++++++ application/module/Users/Event/EditEvent.php | 11 + application/module/Users/Event/LoginEvent.php | 12 + application/module/Users/Event/PwdEvent.php | 13 + .../module/Users/Event/RegisterEvent.php | 13 + application/module/Users/Gravatar.php | 20 ++ .../module/Users/Listener/AccountListener.php | 64 ++++ .../module/Users/Listener/EditListener.php | 35 ++ .../module/Users/Listener/PwdListener.php | 30 ++ application/module/Users/Member.php | 138 ++++++++ .../module/Users/Operation/EditOperate.php | 88 +++++ .../module/Users/Operation/LoginOperate.php | 111 ++++++ .../module/Users/Operation/PwdOperate.php | 94 +++++ .../Users/Operation/RegisterOperate.php | 192 ++++++++++ 27 files changed, 1514 insertions(+), 223 deletions(-) create mode 100644 application/default/views/scripts/knowledge/water.phtml create mode 100644 application/module/Users/Account.php create mode 100644 application/module/Users/Event/EditEvent.php create mode 100644 application/module/Users/Event/LoginEvent.php create mode 100644 application/module/Users/Event/PwdEvent.php create mode 100644 application/module/Users/Event/RegisterEvent.php create mode 100644 application/module/Users/Gravatar.php create mode 100644 application/module/Users/Listener/AccountListener.php create mode 100644 application/module/Users/Listener/EditListener.php create mode 100644 application/module/Users/Listener/PwdListener.php create mode 100644 application/module/Users/Member.php create mode 100644 application/module/Users/Operation/EditOperate.php create mode 100644 application/module/Users/Operation/LoginOperate.php create mode 100644 application/module/Users/Operation/PwdOperate.php create mode 100644 application/module/Users/Operation/RegisterOperate.php diff --git a/application/default/controllers/AccountController.php b/application/default/controllers/AccountController.php index fe8aa7ba..2601283e 100755 --- a/application/default/controllers/AccountController.php +++ b/application/default/controllers/AccountController.php @@ -1,4 +1,7 @@ view->pageID = "account-secure"; - include_once("helper/view.php"); include_once("Users.php"); $usr = new Users($this->db); @@ -261,17 +263,18 @@ class AccountController extends Zend_Controller_Action if ($form->getValue('unit')) $u->unit=$form->getValue('unit'); if ($form->getValue('project')) $u->project=$form->getValue('project'); if ($u->save()) { - //发送欢迎邮件 - $mail=new WestdcMailer($this->view->config->smtp); - $body=file_get_contents($this->view->config->register->email->template); - $body=str_replace("[username]",$formData['username'],$body); - $mail->setBodyText($body); - $mail->setFrom($this->view->config->service->email,'西部数据中心服务组'); - $mail->addTo($formData['email']); - //中文标题有乱码,在1.5版本中尚未解决 - //ref: http://framework.zend.com/issues/browse/ZF-2532 - $mail->setSubject('欢迎使用中国西部环境与生态数据中心'); - $mail->send(); + + //注册邮件 + $mail_template = "member-register"; + $mail_data = array( + 'name'=>$formData['username'], + ); + + $mail = new Mail(); + + $mail->loadTemplate($mail_template,$mail_data); + $mail->addTo($formData['email'],$formData['username']); + $mail->send(); //自动登录系统 $this->login($formData['username'],$formData['password']); @@ -285,7 +288,6 @@ class AccountController extends Zend_Controller_Action function loginAction() { - include_once("helper/view.php"); $success=false; @@ -536,22 +538,21 @@ class AccountController extends Zend_Controller_Action $sql="update users set activation=? where email=?"; $uid=uniqid(); $db->query($sql,array($uid,$formData['email'])); - $mail=new WestdcMailer($this->view->config->smtp); - $body="尊敬的西部数据中心用户: - 有人提出了针对此用户名的密码重置请求。 - - 用户名:"; - $body.=$username; - $body.=" + + //发邮件 + $mail_template = "users-changepassword"; + $mail_data = array( + 'name'=>$username, + 'url' => view::getHostLink()."/account/fetchpwd/".$username."/".$uid + ); + + $mail = new Mail(); + + $mail->loadTemplate($mail_template,$mail_data); + $mail->addTo($formData['email'],$username); + $mail->send(); + - 若想重置您的密码请打开下面的链接,否则请忽略此邮件,一切如常。 -"; - $body.="http://westdc.westgis.ac.cn/account/fetchpwd/".$username."/".$uid; - $mail->setBodyText($body); - $mail->setFrom($this->view->config->service->email,'西部数据中心服务组'); - $mail->addTo($formData['email']); - $mail->setSubject('密码已重置'); - $mail->send(); $this->view->messages[]='请检查您的新邮件中的确认激活链接。'; $this->view->form=false;//do not echo form } else @@ -567,22 +568,22 @@ class AccountController extends Zend_Controller_Action { $sql="update users set salt='',activation='',password=md5('".$tmp_pwd."') where username=? and activation=?"; $db->query($sql,array($login,$key)); - $mail=new WestdcMailer($this->view->config->smtp); - $body="尊敬的西部数据中心用户: - 您的密码已修改。 - - 用户名:"; - $body.=$login; - $body.="密码:".$tmp_pwd; - $body.=" - http://westdc.westgis.ac.cn/account/login"; - $mail->setBodyText($body); - $mail->setFrom($this->view->config->service->email,'西部数据中心服务组'); - $mail->addTo($urow->email); - $mail->setSubject('您的新密码'); - $mail->send(); - $this->view->messages[]='请查收您新邮件中的新密码'; - $this->view->form=false;//do not echo form + + //发邮件 + $mail_template = "users-changepassword"; + $mail_data = array( + 'name'=>$login, + 'tmp_pwd' => $tmp_pwd + ); + + $mail = new Mail(); + + $mail->loadTemplate($mail_template,$mail_data); + $mail->addTo($urow->email,$login); + $mail->send(); + + $this->view->messages[]='请查收您新邮件中的新密码'; + $this->view->form=false;//do not echo form } } diff --git a/application/default/controllers/KnowledgeController.php b/application/default/controllers/KnowledgeController.php index dd6baa2e..db750d94 100755 --- a/application/default/controllers/KnowledgeController.php +++ b/application/default/controllers/KnowledgeController.php @@ -15,7 +15,7 @@ class KnowledgeController extends Zend_Controller_Action function datacenterAction() { $siteid="e31f5ea7-a4af-4ae3-9ac1-1a84132c4338";//site uuid from geonetowrk - $sql="select * from mdref mr left join reference r on mr.refid=r.id where mr.uuid=? order by r.id desc"; + $sql="select * from mdref mr left join reference r on mr.refid=r.id where mr.uuid=? order by r.year desc, reference desc"; $sth = $this->db->prepare($sql); $sth->execute(array($siteid)); $rows = $sth->fetchAll(); @@ -26,56 +26,73 @@ class KnowledgeController extends Zend_Controller_Action Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml'); $this->view->paginator=$paginator; } + function waterAction() + { + $sql="select * from reference where id in (select refid from mdref where uuid in (select uuid from en.normalmetadata)) order by year desc, reference desc"; + $sth = $this->db->prepare($sql); + $sth->execute(); + $rows = $sth->fetchAll(); + $paginator = Zend_Paginator::factory($rows); + $paginator->setCurrentPageNumber($this->_getParam('page')); + $paginator->setItemCountPerPage(10); + $paginator->setView($this->view); + Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml'); + $this->view->paginator=$paginator; + } + function userAction() - { - $sql="select * from reference where id in (select refid from mdref where reftype=1 and uuid in (select uuid from normalmetadata)) order by id desc"; - $sth = $this->db->prepare($sql); - $sth->execute(); - $rows = $sth->fetchAll(); - $paginator = Zend_Paginator::factory($rows); - $paginator->setCurrentPageNumber($this->_getParam('page')); - $paginator->setItemCountPerPage(10); - $paginator->setView($this->view); - Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml'); - $this->view->paginator=$paginator; - } - function authorAction() - { - $sql="select * from reference where id in (select refid from mdref where reftype=0 and uuid in (select uuid from normalmetadata)) order by id desc"; - $sth = $this->db->prepare($sql); - $sth->execute(); - $rows = $sth->fetchAll(); - $paginator = Zend_Paginator::factory($rows); - $paginator->setCurrentPageNumber($this->_getParam('page')); - $paginator->setItemCountPerPage(10); - $paginator->setView($this->view); - Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml'); - $this->view->paginator=$paginator; - } + { + $sql="select * from reference where id in (select refid from mdref where reftype=1 and uuid in (select uuid from normalmetadata)) order by year desc, reference desc"; + $sth = $this->db->prepare($sql); + $sth->execute(); + $rows = $sth->fetchAll(); + $paginator = Zend_Paginator::factory($rows); + $paginator->setCurrentPageNumber($this->_getParam('page')); + $paginator->setItemCountPerPage(10); + $paginator->setView($this->view); + Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml'); + $this->view->paginator=$paginator; + } - function westplanAction() - { - $sql="select distinct array_to_string(array(select author from knl_author t where t.item_id=c.item_id order by place asc),'; ') as author,c.title,c.publisher,c.ts_created,c.ts_issued,c.item_id,c.url from knl_article c where c.url <>'' order by ts_created desc"; - $sth = $this->db->prepare($sql); - $sth->execute(); - $rows = $sth->fetchAll(); - $paginator = Zend_Paginator::factory($rows); - $paginator->setCurrentPageNumber($this->_getParam('page')); - $paginator->setItemCountPerPage(10); - $paginator->setView($this->view); - Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml'); - $this->view->paginator=$paginator; - } - function searchAction() - { - $key=$this->_request->getParam('q'); - $source=$this->_request->getParam('searchsource'); - if(preg_match("/\"|'|<|>/",$key)) - { - $data=array('<'=>'<','>'=>'>', "\'"=>'’', "\""=>'”'); + function authorAction() + { + $sql="select * from reference where id in (select refid from mdref where reftype=0 and uuid in (select uuid from normalmetadata)) order by year desc, reference desc"; + $sth = $this->db->prepare($sql); + $sth->execute(); + $rows = $sth->fetchAll(); + $paginator = Zend_Paginator::factory($rows); + $paginator->setCurrentPageNumber($this->_getParam('page')); + $paginator->setItemCountPerPage(10); + $paginator->setView($this->view); + Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml'); + $this->view->paginator=$paginator; + } - $patterns = array(); - $replacements = array(); + function westplanAction() + { + $sql="select distinct array_to_string(array(select author from knl_author t where t.item_id=c.item_id order by place asc),'; ') as author,c.title,c.publisher,c.ts_created,c.ts_issued,c.item_id,c.url from knl_article c where c.url <>'' order by ts_created desc"; + $sth = $this->db->prepare($sql); + $sth->execute(); + $rows = $sth->fetchAll(); + $paginator = Zend_Paginator::factory($rows); + $paginator->setCurrentPageNumber($this->_getParam('page')); + $paginator->setItemCountPerPage(10); + $paginator->setView($this->view); + Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml'); + $this->view->paginator=$paginator; + } + + function searchAction() + { + $key=$this->_request->getParam('q'); + $author = (int)$this->_request->getParam('author'); + $place = (int)$this->_request->getParam('place'); + $source=$this->_request->getParam('searchsource'); + if(preg_match("/\"|'|<|>/",$key)) + { + $data=array('<'=>'<','>'=>'>', "\'"=>'’', "\""=>'”'); + $patterns = array(); + $replacements = array(); foreach($data as $k=>$v) { $patterns[]='/'.$k.'/i'; @@ -86,12 +103,15 @@ class KnowledgeController extends Zend_Controller_Action $key=preg_replace($patterns, $replacements, $key); } - if (!empty($key) && $source=='datasource') { + if (!empty($key)) { $search=new SimpleSearch($key); $where=$search->sql_expr(array("reference")); - $sql="select * from reference where ".$where." order by id desc"; + $sql="select * from reference where ".$where." order by year desc, reference desc"; + } else if ($author && $place) { + $sql="select * from reference where id in (select a1.id from ref_author a1,ref_author a2 where a1.firstname=a2.firstname and a1.lastname=a2.lastname and a2.id=$author and a2.place=$place)"; + } $sth = $this->db->prepare($sql); - $sth->execute(); + $sth->execute(); $rows = $sth->fetchAll(); $paginator = Zend_Paginator::factory($rows); $paginator->setCurrentPageNumber($this->_getParam('page')); @@ -102,29 +122,13 @@ class KnowledgeController extends Zend_Controller_Action $this->view->key=$key; $this->view->source=$source; $this->_helper->viewRenderer('search-data'); - } - else if (!empty($key) && $source=='westsource') { - $search=new SimpleSearch($key); - $where=$search->sql_expr(array("c.title","a.author")); - $sql="select distinct a.author,c.title,c.publisher,c.ts_created,c.ts_issued,c.item_id,c.url from knl_article c left join knl_author a on c.item_id=a.item_id where c.url <>'' and a.place=1 and $where order by ts_created desc"; - $sth = $this->db->prepare($sql); - $sth->execute(); - $rows = $sth->fetchAll(); - $paginator = Zend_Paginator::factory($rows); - $paginator->setCurrentPageNumber($this->_getParam('page')); - $paginator->setItemCountPerPage(10); - $paginator->setView($this->view); - Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination_param.phtml'); - $this->view->paginator=$paginator; - $this->view->key=$key; - $this->view->source=$source; - //$this->_helper->viewRenderer('search-data'); - } - } + + } + function paperAction() { - $id = (int)$this->_request->getParam('id'); - $sql="select * from reference where id=$id"; + $id = (int)$this->_request->getParam('id'); + $sql="select * from reference where id=$id"; $sth = $this->db->prepare($sql); $sth->execute(); $this->view->paper = $sth->fetch(); diff --git a/application/default/views/scripts/data/view.phtml b/application/default/views/scripts/data/view.phtml index 696e39ed..88c54e7c 100755 --- a/application/default/views/scripts/data/view.phtml +++ b/application/default/views/scripts/data/view.phtml @@ -19,6 +19,7 @@ h3.gs_rt{font-size:110%;} #file-list li li:hover {background-color: #dedede;} #file-list li li li:hover {background-color: #eeeeee;} +render('breadcrumbs.phtml'); ?> metadata;if ($md):?>

escape($md->title); if ($md->title_en) echo '
'.$this->escape($md->title_en);?> @@ -48,31 +49,56 @@ if ($md->title_en) echo '
'.$this->escape($md->title_en);?> ?> (下载引用:RIS格式 | RIS英文格式 | Bibtex格式 | Bibtex英文格式)

ref) : ?>
-

建议参考文献

+

相关文献(作者推荐)

    ref as $ref) : - echo '
  1. '.$ref->reference; + echo '
  2. '.$ref->reference; + echo '查看'; if (empty($ref->link)) { - if(!empty($ref->attid)) + if(!empty($ref->attid)) echo '下载'; + }else{ + echo '下载'; + } + echo "
  3. "; + endforeach; + ?> +
+ themeref) :?> + +
+

专题文献

+
    + themeref as $ref) : + echo '
  1. '.$ref->reference; + echo '查看'; + if (empty($ref->link)) + { + if(!empty($ref->attid)) + echo ' | 下载'; }else{ - echo '下载'; + echo ' | 下载'; } echo "
  2. "; endforeach; ?>
- - userref) : ?> + userref) : ?>
-

数据用户发表文献

+

数据施引文献

    userref as $ref) : + echo '
  1. '.$ref->reference; + echo '查看'; if (empty($ref->link)) - echo '
  2. '.$ref->reference.'
  3. '; - else - echo '
  4. '.$ref->reference.' 下载
  5. '; + { + if(!empty($ref->attid)) + echo '下载'; + }else{ + echo '下载'; + } + echo ""; endforeach; ?>
diff --git a/application/default/views/scripts/heihe/view.phtml b/application/default/views/scripts/heihe/view.phtml index 23b3a51b..7e752c00 100755 --- a/application/default/views/scripts/heihe/view.phtml +++ b/application/default/views/scripts/heihe/view.phtml @@ -71,31 +71,56 @@ if ($md->title_en) echo '
'.$this->escape($md->title_en);?> ?> (下载引用:RIS格式 | RIS英文格式 | Bibtex格式 | Bibtex英文格式)

ref) : ?>
-

建议参考文献

+

相关文献(作者推荐)

    ref as $ref) : echo '
  1. '.$ref->reference; + echo '查看'; if (empty($ref->link)) { - if(!empty($ref->attid)) + if(!empty($ref->attid)) echo '下载'; + }else{ + echo '下载'; + } + echo "
  2. "; + endforeach; + ?> +
+ themeref) :?> + +
+

专题文献

+
    + themeref as $ref) : + echo '
  1. '.$ref->reference; + echo '查看'; + if (empty($ref->link)) + { + if(!empty($ref->attid)) + echo ' | 下载'; }else{ - echo '下载'; + echo ' | 下载'; } echo "
  2. "; endforeach; ?>
- - userref) : ?> + userref) : ?>
-

数据用户发表文献

+

数据施引文献

    userref as $ref) : + echo '
  1. '.$ref->reference; + echo '查看'; if (empty($ref->link)) - echo '
  2. '.$ref->reference.'
  3. '; - else - echo '
  4. '.$ref->reference.' 下载
  5. '; + { + if(!empty($ref->attid)) + echo '下载'; + }else{ + echo '下载'; + } + echo ""; endforeach; ?>
diff --git a/application/default/views/scripts/hiwater/view.phtml b/application/default/views/scripts/hiwater/view.phtml index e69fd7d8..2330ecdc 100644 --- a/application/default/views/scripts/hiwater/view.phtml +++ b/application/default/views/scripts/hiwater/view.phtml @@ -69,31 +69,56 @@ if ($md->title_en) echo '
'.$this->escape($md->title_en);?> ?> (下载引用:RIS格式 | RIS英文格式 | Bibtex格式 | Bibtex英文格式)

ref) : ?>
-

建议参考文献

+

相关文献(作者推荐)

    ref as $ref) : echo '
  1. '.$ref->reference; + echo '查看'; if (empty($ref->link)) { - if(!empty($ref->attid)) + if(!empty($ref->attid)) echo '下载'; + }else{ + echo '下载'; + } + echo "
  2. "; + endforeach; + ?> +
+ themeref) :?> + +
+

专题文献

+
    + themeref as $ref) : + echo '
  1. '.$ref->reference; + echo '查看'; + if (empty($ref->link)) + { + if(!empty($ref->attid)) + echo ' | 下载'; }else{ - echo '下载'; + echo ' | 下载'; } echo "
  2. "; endforeach; ?>
- - userref) : ?> + userref) : ?>
-

数据用户发表文献

+

数据施引文献

    userref as $ref) : + echo '
  1. '.$ref->reference; + echo '查看'; if (empty($ref->link)) - echo '
  2. '.$ref->reference.'
  3. '; - else - echo '
  4. '.$ref->reference.' 下载
  5. '; + { + if(!empty($ref->attid)) + echo '下载'; + }else{ + echo '下载'; + } + echo ""; endforeach; ?>
diff --git a/application/default/views/scripts/knowledge/author.phtml b/application/default/views/scripts/knowledge/author.phtml index 88a92cf9..2ed61408 100644 --- a/application/default/views/scripts/knowledge/author.phtml +++ b/application/default/views/scripts/knowledge/author.phtml @@ -5,7 +5,7 @@ $this->headTitle()->setSeparator(' - '); $this->headLink()->appendStylesheet('/css/mdreview.css'); $this->breadcrumb('首页'); $this->breadcrumb('知识积累'); -$this->breadcrumb('数据作者'); +$this->breadcrumb('作者推荐文献库'); $this->breadcrumb()->setSeparator(' > '); $this->headScript()->appendFile('/js/jquery.colorbox-min.js'); $this->headLink()->appendStylesheet('/css/colorbox.css'); @@ -16,20 +16,23 @@ $this->headLink()->appendStylesheet('/css/colorbox.css');
-

数据作者文献库

+

作者推荐文献库

- paginator)): ?> -
    - paginator as $item): ?> -
  • - 下载'; - endif; + paginator)): ?> +
      + paginator as $item): ?> +
    1. 查看'; + if (!empty($item['link'])) : + echo ' 下载'; + else : + if (!empty($item['attid'])) echo ' 下载'; + endif; ?> - 相关数据 -
    2. - -
+ 相关数据 + + +
diff --git a/application/default/views/scripts/knowledge/datacenter.phtml b/application/default/views/scripts/knowledge/datacenter.phtml index afbf6bb9..d752644a 100644 --- a/application/default/views/scripts/knowledge/datacenter.phtml +++ b/application/default/views/scripts/knowledge/datacenter.phtml @@ -17,16 +17,19 @@ $this->breadcrumb()->setSeparator(' > ');

数据中心文献库

paginator)): ?> -
    +
      paginator as $item): ?> -
    1. - 下载'; - endif; +
    2. 查看'; + if (!empty($item['link'])) : + echo ' 下载'; + else : + if (!empty($item['attid'])) echo ' 下载'; + endif; ?>
    3. -
+
diff --git a/application/default/views/scripts/knowledge/index.phtml b/application/default/views/scripts/knowledge/index.phtml index 66596a82..a9765cbb 100755 --- a/application/default/views/scripts/knowledge/index.phtml +++ b/application/default/views/scripts/knowledge/index.phtml @@ -10,16 +10,6 @@ $this->breadcrumb()->setSeparator(' > ');
+ \ No newline at end of file diff --git a/application/module/Users/Account.php b/application/module/Users/Account.php new file mode 100644 index 00000000..e692f95c --- /dev/null +++ b/application/module/Users/Account.php @@ -0,0 +1,332 @@ +db = \Zend_Registry::get('db'); + }else{ + $this->db = $db; + } + + $this->config = \Zend_Registry::get('config'); + + + } + + public function events(\Zend_EventManager_EventCollection $events = NULL) + { + if ($events !== NULL) { + $this->events = $events; + } elseif ($this->events === NULL) { + $this->events = new \Zend_EventManager_EventManager(__CLASS__); + } + return $this->events; + } + + //获取账号信息,数组 + public function getAccountInfo($id = 0) + { + if($id == 0) + { + $id = view::User('id'); + } + $sql = "SELECT * FROM {$this->memberTable} WHERE id=$id"; + $rs = $this->db->query($sql); + return $rs->fetch(); + } + + //注册 + public function register($data) + { + + $params = compact('data'); + $results = $this->events()->trigger('register.checkParam', $this, $params); + $cache_data = $results->bottom(); + + if($cache_data !== true) + { + if(!is_array($cache_data)) + { + return array('error'=>$cache_data); + }else{ + return $cache_data; + } + } + + $results = $this->events()->trigger('register.checkUser', $this, $params); + $cache_data = $results->bottom(); + + if($cache_data !== true) + { + if(!is_array($cache_data)) + { + return array('error'=>$cache_data); + }else{ + return $cache_data; + } + } + + $loginData = array( + 'username'=>$data['username'], + 'password'=>$data['password'] + ); + + $data['password'] = md5($data['password']); + $data['usertype'] = "member"; + unset($data['confirm_password']); + + $dbh = new dbh(); + + $id = $dbh->insert($this->memberTable,$data,true); + + if(!empty($id) && is_numeric($id)) + { + $this->storeLogin($loginData); + $mb = new Member(); + $mb->putcookie($data[$this->FieldUsername],$data[$this->FieldPasword]); //username, md5(password) + $params = compact('data','id'); + $results = $this->events()->trigger('register.success', $this, $params); + return array("success" => 1); + }else{ + if($id === false) + { + return array('error'=>'服务器开小差了,请稍后再试'); + }else{ + return array('error'=>'服务器处理中遇到错误,请联系管理员'); + } + } + + }//register + + //登陆 + public function login($data) + { + $results = $this->events()->trigger('login.checkParam', $this, compact('data')); + $cache_data = $results->bottom(); + + if($cache_data !== true) + { + if(!is_array($cache_data)) + { + return array('error'=>$cache_data); + }else{ + return $cache_data; + } + } + + $state = $this->storeLogin($data); + + $mb = new Member(); + $mb->putcookie($data[$this->FieldUsername],md5($data[$this->FieldPasword])); + + return $state; + }//login + + //storeLogin + public function storeLogin($data) + { + $auth = \Zend_Auth::getInstance(); + $authAdapter = new \Zend_Auth_Adapter_DbTable($this->db); + $authAdapter->setTableName($this->memberTable) + ->setIdentityColumn($this->FieldUsername) + ->setCredentialColumn($this->FieldPasword); + $authAdapter->setIdentity($data[$this->FieldUsername])->setCredential(md5($data[$this->FieldPasword])); + $result = $auth->authenticate($authAdapter); + if ($result->isValid()) { + + $user = $authAdapter->getResultRowObject(null,$this->FieldPasword); + $email = $user->email; + $results = $this->events()->trigger('login.success.createAvatar', $this, compact('email')); + $user->avatar = $results->bottom(); + $auth->getStorage()->write($user); + + $id = $user->id; + @$results = $this->events()->trigger('login.success.updateStatus', $this, compact('id')); + + return array('success'=>1); + } + return array('error'=>'处理中发现错误,请重试'); + } + + //注册信息参数 + public function getParam(\Zend_Controller_Request_Abstract $request) + { + $data = array( + 'username'=>$request->getParam('username'), + 'password'=>$request->getParam('password'), + 'confirm_password'=>$request->getParam('confirm_password'), + 'email'=>$request->getParam('email'), + 'realname'=>$request->getParam('realname') + ); + return $data; + } + + //获取用户账户修改参数 + public function getEditParam(\Zend_Controller_Request_Abstract $request) + { + $type = $request->getParam('type'); + + if($type == "general") + { + $data = array( + 'realname'=>$request->getParam('realname'), + 'signature'=>$request->getParam('signature'), + 'description'=>$request->getParam('description') + ); + } + + if($type == "password") + { + $data = array( + 'password' => $request->getParam('password'), + 'password_new'=>$request->getParam('password_new'), + 'password_confirm'=>$request->getParam('password_confirm') + ); + } + return $data; + } + + //编辑 + public function edit($data,$type) + { + $results = $this->events()->trigger('edit.checkParam', $this, compact('data','type')); + $cache_data = $results->bottom(); + + if($cache_data !== true) + { + return $cache_data; + } + + if($type == "general") + { + $data['signature'] = htmlspecialchars($data['signature']); + $data['description'] = htmlspecialchars($data['description']); + }else if($type == "password") + { + $data['password'] = md5($data['password_new']); + unset($data['password_new']); + unset($data['password_confirm']); + }else{ + return "参数错误"; + } + + $dbh = new dbh(); + $uid = view::User('id'); + if($dbh->update($this->memberTable,$data," id=$uid") === true) + { + return true; + }else{ + return false; + } + } + + //找回密码 + public function getMyPassword($email) + { + $results = $this->events()->trigger('pwd.forgot.checkParam', $this, compact('email')); + $cache_data = $results->bottom(); + + if($cache_data !== true) + { + return $cache_data; + } + + $sql = "SELECT * FROM {$this->memberTable} WHERE email='$email'"; + $rs = $this->db->query($sql); + $row = $rs->fetch(); + + if(!isset($row['username']) || empty($row['username'])) + { + return array('error'=>"此邮箱并未注册",'place'=>'email'); + } + + $salt = md5($email.'---'.$row['username']); + + $sql = "UPDATE {$this->memberTable} SET salt='$salt' WHERE id={$row['id']}"; + $state = $this->db->exec($sql); + + if($state<1) + { + return array('error'=>"处理中出现错误,请重试",'place'=>'email'); + } + + $mail_template = "forgotpassword"; + $mail_data = array( + 'name'=>$row['realname'], + 'link'=> view::getHostLink().'/account/getpassword/salt/'.$salt + ); + + $mail = new Mail(); + + $mail->loadTemplate($mail_template,$mail_data); + $mail->addTo($email,$row['realname']); + $mail->send(); + + return array("success"=>1); + } + + //重置密码 + public function resetPassword($data) + { + $results = $this->events()->trigger('pwd.reset.checkParam', $this, compact('data')); + $cache_data = $results->bottom(); + + if($cache_data !== true) + { + return $cache_data; + } + + $sql = "SELECT * FROM {$this->memberTable} WHERE salt=?"; + $sth = $this->db->prepare($sql); + $sth->execute(array($data['salt'])); + $row = $sth->fetch(); + + if(!isset($row['username']) || empty($row['username'])) + { + return array('error'=>"您提供的校验码不正确,请重新申请重置密码",'place'=>'confirm_password'); + } + + if($row['username'] !== $data['username']) + { + return array('error'=>"您提供的校验码不正确,请重新申请重置密码",'place'=>'confirm_password'); + } + + $sql = "UPDATE {$this->memberTable} SET password='".md5($data['password'])."',salt='' WHERE id={$row['id']}"; + $this->db->exec($sql); + + $mail_template = "getpassworded"; + $mail_data = array( + 'name'=>$row['realname'], + ); + $mail = new Mail(); + $mail->loadTemplate($mail_template,$mail_data); + $mail->addTo($row['email'],$row['realname']); + $mail->send(); + + return true; + + } + +} \ No newline at end of file diff --git a/application/module/Users/Event/EditEvent.php b/application/module/Users/Event/EditEvent.php new file mode 100644 index 00000000..99488769 --- /dev/null +++ b/application/module/Users/Event/EditEvent.php @@ -0,0 +1,11 @@ +event = new \Zend_EventManager_EventManager(); + + if(empty($type)) + { + $type = "both"; + } + + $this->type = $type; + } + + public function attach(\Zend_EventManager_EventCollection $events) + { + if($this->type == "both") + { + $this->attachRegisterEvents($events); + $this->attachLoginEvents($events); + } + + if($this->type == "register") + { + $this->attachRegisterEvents($events); + } + + if($this->type == "login") + { + $this->attachLoginEvents($events); + } + } + + public function detach(\Zend_EventManager_EventCollection $events) + { + + } + + private function attachRegisterEvents(\Zend_EventManager_EventCollection $events) + { + $_Events = new RegisterOperate(); + $events->attach('register.checkParam', array($_Events, 'checkParam'), 100); + $events->attach('register.checkUser', array($_Events, 'checkUser'), 80); + $events->attach('register.success', array($_Events, 'registerSuccess'), 50); + } + + private function attachLoginEvents(\Zend_EventManager_EventCollection $events) + { + $_Events = new LoginOperate(); + $events->attach('login.checkParam', array($_Events, 'checkParam'), 100); + $events->attach('login.success.updateStatus', array($_Events, 'updateStatus'), 50); + $events->attach('login.success.createAvatar', array($_Events, 'createAvatar'), 50); + } + +} diff --git a/application/module/Users/Listener/EditListener.php b/application/module/Users/Listener/EditListener.php new file mode 100644 index 00000000..bcf2ce56 --- /dev/null +++ b/application/module/Users/Listener/EditListener.php @@ -0,0 +1,35 @@ +event = new \Zend_EventManager_EventManager(); + + if(empty($type)) + { + $type = "both"; + } + + $this->type = $type; + } + + public function attach(\Zend_EventManager_EventCollection $events) + { + $_Events = new EditOperate(); + $events->attach('edit.checkParam', array($_Events, 'checkParam'), 100); + $events->attach('edit.success', array($_Events, 'editSuccess'), 50); + } + + public function detach(\Zend_EventManager_EventCollection $events) + { + + } + +} diff --git a/application/module/Users/Listener/PwdListener.php b/application/module/Users/Listener/PwdListener.php new file mode 100644 index 00000000..c1afb947 --- /dev/null +++ b/application/module/Users/Listener/PwdListener.php @@ -0,0 +1,30 @@ +event = new \Zend_EventManager_EventManager(); + } + + public function attach(\Zend_EventManager_EventCollection $events) + { + $_Events = new PwdOperate(); + $events->attach('pwd.forgot.checkParam', array($_Events, 'forgotPwdCheckParam'), 100); + $events->attach('pwd.forgot.sendmail', array($_Events, 'sendGetPasswordMail'), 50); + $events->attach('pwd.reset.checkParam', array($_Events, 'resetPwdCheckParam'), 100); + $events->attach('pwd.reset.sendmail', array($_Events, 'sendGetPasswordMail'), 50); + } + + public function detach(\Zend_EventManager_EventCollection $events) + { + + } + +} diff --git a/application/module/Users/Member.php b/application/module/Users/Member.php new file mode 100644 index 00000000..fcb2bce2 --- /dev/null +++ b/application/module/Users/Member.php @@ -0,0 +1,138 @@ +db = \Zend_Registry::get('db'); + }else{ + $this->db = $db; + } + + $this->config = \Zend_Registry::get('config'); + + if(!empty($_COOKIE['scr'])) + { + $this->scr = $_COOKIE['scr']; + } + if(!empty($_COOKIE['user'])) + { + $this->user= $_COOKIE['user']; + } + } + + + /** + * 检测cookie + */ + public function checkcookie() + { + $uname = $this->user; + $hash = $this->scr; + + if(!empty($uname) && !empty($hash)) + { + if (preg_match("/[<|>|#|$|%|^|*|(|)|{|}|'|\"|;|:]/i",$uname) || preg_match("/[<|>|#|$|%|^|*|(|)|{|}|'|\"|;|:]/i",$hash)) + { + $this->mid=0; + return false; + } + else{ + $sql = "select {$this->FieldUsername} as userid,{$this->FieldPasword} as pwd from {$this->memberTable} where {$this->FieldUsername}='$uname'"; + $rs = $this->db->query($sql); + $row = $rs->fetch(); + $scr = $this->makescr($row['userid'],$row['pwd']); + + if($hash == $scr) + { + $this->srpwd=$row['pwd']; + return true; + } + else { + return false; + } + }//cookie安全 + }else { + return false; + }//exit + }//function checkcookie + + /** + * putcookie + * + * 登陆成功后放置cookie,包含安全码 + * + * @param String $uname + * @param String $pwd + * @param Int $time + */ + public function putcookie($uname,$pwd,$time = 604800) + { + try { + $scrString = $this->makescr($uname,$pwd);//加密验证串:防止用户密码被盗;防止伪造cookie。 + + if(!is_numeric($time)) + { + $time = 604800; + } + + setcookie('user',$uname,time()+$time,'/'); + setcookie('scr',$scrString,time()+$time,'/'); + + return true; + } catch (Exception $e) { + return false; + } + + }//function putcookie + + /** + * 生成安全码 + * + * @param String $u + * @param String $p + */ + public function makescr($u,$p) + { + return substr(md5($u.$p.$this->ck),3,20); + } + + /** + * 清除cookie + */ + static function flushcookie() + { + setcookie('user','',time()-99999,'/'); + setcookie('scr','',time()-99999,'/'); + } + + public function getUser() + { + $sql = "SELECT * FROM ".$this->memberTable." m ORDER BY m.id DESC"; + $rs = $this->db->query($sql); + return $rs->fetchAll(); + } + +} \ No newline at end of file diff --git a/application/module/Users/Operation/EditOperate.php b/application/module/Users/Operation/EditOperate.php new file mode 100644 index 00000000..a31a1d71 --- /dev/null +++ b/application/module/Users/Operation/EditOperate.php @@ -0,0 +1,88 @@ +db = \Zend_Registry::get('db'); + }else{ + $this->db = $db; + } + + $this->config = \Zend_Registry::get('config'); + } + + public function checkParam(\Zend_EventManager_Event $e){ + + $data = $e->getParam('data'); + $type = $e->getParam('type'); + + if($type == 'general') + { + + if(empty($data['realname'])) + { + return "请输入真实姓名"; + } + + if(mb_strlen($data['realname'],"UTF-8")>10 ) + { + return "姓名不要超过10个字"; + } + } + + if($type == "password") + { + if(strlen($data['password'])>18 || strlen($data['password_new'])>18) + { + return "密码过长"; + } + if(strlen($data['password_new'])<=6 || strlen($data['password_confirm'])<=6) + { + return "密码过短"; + } + if(md5($data['password_new']) != md5($data['password_confirm'])) + { + return "两次输入的密码不同"; + } + + $uid = view::User('id'); + $sql = "SELECT {$this->FieldPasword} FROM {$this->tbl_member} WHERE id=$uid"; + $rs = $this->db->query($sql); + $row = $rs->fetch(); + + if(md5($data['password']) != $row[$this->FieldPasword]) + { + return "原密码不正确"; + } + } + + return true; + }//checkParam + + public function editSuccess(\Zend_EventManager_Event $e){ + + $data = $e->getParam('data'); + + + return true; + } + +} \ No newline at end of file diff --git a/application/module/Users/Operation/LoginOperate.php b/application/module/Users/Operation/LoginOperate.php new file mode 100644 index 00000000..7dd145f6 --- /dev/null +++ b/application/module/Users/Operation/LoginOperate.php @@ -0,0 +1,111 @@ +db = \Zend_Registry::get('db'); + }else{ + $this->db = $db; + } + + $this->config = \Zend_Registry::get('config'); + } + + public function checkParam(\Zend_EventManager_Event $e){ + + $data = $e->getParam('data'); + + if(!is_array($data)) + { + return "参数错误"; + } + + if(empty($data['username'])) + { + return array('error'=>"请输入用户名",'place'=>'username'); + } + + if(!empty($data['username'])) + { + if(!preg_match("/^[a-zA-Z][a-zA-Z0-9_]{4,15}$/",$data['username'])) + { + return array('error'=>"用户名应当以字母开头,由字母数字和下划线组成,并且长度在5到25个字符之间",'place'=>'username'); + } + } + + if(empty($data['password'])) + { + return array('error'=>"请输入密码",'place'=>'password'); + } + + $sql = "SELECT id,{$this->FieldPasword} FROM {$this->tbl_member} WHERE {$this->FieldUsername}=?"; + $sth = $this->db->prepare($sql); + $rs = $sth->execute(array($data[$this->FieldUsername])); + $row = $sth->fetch(); + + if(isset($row['id']) && !empty($row['id'])) + { + if(strlen($row[$this->FieldPasword]) !== 32) + { + return array('error'=>"您的密码或因安全原因或其他问题已经被重置,请先重置密码再登陆",'place'=>'password'); + } + if($row[$this->FieldPasword] !== md5($data['password'])) + { + return array('error'=>"密码错误",'place'=>'password'); + } + return true; + }else{ + return array('error'=>"用户不存在",'place'=>'username'); + } + + }//checkParam + + public function updateStatus(\Zend_EventManager_Event $e){ + + $id = (int)$e->getParam('id'); + + if(!is_numeric($id)) + { + return false; + } + + $update = array( + $this->FieldLastlogin => date("Y-m-d H:i:s"), + $this->FieldLastloginIp => $_SERVER["REMOTE_ADDR"] + ); + + $dbh = new dbh(); + @$statusUpdate = $dbh->update($this->tbl_member,$update," id=$id "); + + return true; + }//loginSuccess + + public function createAvatar(\Zend_EventManager_Event $e){ + + $email = $e->getParam('email'); + $avatar = new Gravatar(); + return $avatar->Get($email); + + }//loginSuccess + + + +} \ No newline at end of file diff --git a/application/module/Users/Operation/PwdOperate.php b/application/module/Users/Operation/PwdOperate.php new file mode 100644 index 00000000..ae87513f --- /dev/null +++ b/application/module/Users/Operation/PwdOperate.php @@ -0,0 +1,94 @@ +db = \Zend_Registry::get('db'); + }else{ + $this->db = $db; + } + + $this->config = \Zend_Registry::get('config'); + } + + public function forgotPwdCheckParam(\Zend_EventManager_Event $e){ + + $email = $e->getParam('email'); + + if(empty($email)) + { + return array('error'=>"请输入电子邮箱,作为找回密码和接受通知的联系方式",'place'=>'email'); + } + + if (!preg_match('/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/',$email)) + { + return array('error'=>"请输入正确的电子邮件",'place'=>'email'); + } + + return true; + }//checkParam + + public function sendGetPasswordMail(\Zend_EventManager_Event $e){ + + $email = $e->getParam('email'); + + + return true; + } + + public function resetPwdCheckParam(\Zend_EventManager_Event $e) + { + $data = $e->getParam('data'); + + if(empty($data['username'])) + { + return array('error'=>"请输入用户名",'place'=>'username'); + } + + if(empty($data['password'])) + { + return array('error'=>"请输入密码",'place'=>'password'); + } + + if(strlen($data['password']) < 6) + { + return array('error'=>"密码长度太短,为了安全最少输入6位哦",'place'=>'password'); + } + + if(strlen($data['password']) > 14) + { + return array('error'=>"密码太长,亲您记得住吗?不要超过14位哦",'place'=>'password'); + } + + if(empty($data['confirm_password'])) + { + return array('error'=>"请再次输入密码已确认输入正确",'place'=>'confirm_password'); + } + + if(md5($data['password']) != md5($data['confirm_password'])) + { + return array('error'=>"两次输入的密码不同,请重新输入",'place'=>'confirm_password'); + } + + return true; + } + +} \ No newline at end of file diff --git a/application/module/Users/Operation/RegisterOperate.php b/application/module/Users/Operation/RegisterOperate.php new file mode 100644 index 00000000..8bc1f3d1 --- /dev/null +++ b/application/module/Users/Operation/RegisterOperate.php @@ -0,0 +1,192 @@ +db = \Zend_Registry::get('db'); + }else{ + $this->db = $db; + } + + $this->config = \Zend_Registry::get('config'); + } + + public function checkParam(\Zend_EventManager_Event $e){ + + $data = $e->getParam('data'); + + if(!is_array($data)) + { + return "参数错误"; + } + + if(empty($data['username'])) + { + return array('error'=>"请输入用户名",'place'=>'username'); + } + + if(!empty($data['username'])) + { + if(!preg_match("/^[a-zA-Z][a-zA-Z0-9_]{4,15}$/",$data['username'])) + { + return array('error'=>"用户名应当以字母开头,由字母数字和下划线组成,并且长度在5到16个字符之间",'place'=>'username'); + } + } + + if(empty($data['password'])) + { + return array('error'=>"请输入密码",'place'=>'password'); + } + + if(strlen($data['password']) < 6) + { + return array('error'=>"密码长度太短,为了安全最少输入6位",'place'=>'password'); + } + + if(strlen($data['password']) > 14) + { + return array('error'=>"密码太长,请不要超过14位",'place'=>'password'); + } + + if(empty($data['confirm_password'])) + { + return array('error'=>"请再次输入密码已确认输入正确",'place'=>'confirm_password'); + } + + if(md5($data['password']) != md5($data['confirm_password'])) + { + return array('error'=>"两次输入的密码不同,请重新输入",'place'=>'confirm_password'); + } + + if(empty($data['email'])) + { + return array('error'=>"请输入电子邮箱,作为找回密码和接受通知的联系方式",'place'=>'email'); + } + + if (!preg_match('/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/',$data['email'])) + { + return array('error'=>"请输入正确的电子邮件,推荐使用QQ邮箱和Gmail邮箱",'place'=>'email'); + } + + if(empty($data['realname'])) + { + return array('error'=>"请输入姓名",'place'=>'realname'); + } + + if(mb_strlen($data['realname'],"UTF-8")>10 ) + { + return array('error'=>"真实姓名请不要超过10个字",'place'=>'realname'); + } + + return true; + }//checkParam + + public function checkUser(\Zend_EventManager_Event $e){ + + $data = $e->getParam('data'); + + if(!is_array($data)) + { + return "用户信息验证失败,请重新尝试"; + } + + $sql = "SELECT id,{$this->FieldUsername},{$this->FieldEmail} FROM ".$this->tbl_member." WHERE {$this->FieldUsername}='{$data['username']}' OR {$this->FieldEmail}='{$data['email']}'"; + + $rs = $this->db->query($sql); + + $row = $rs->fetch(); + + if(isset($row['id']) && !empty($row['id'])) + { + if($row[$this->FieldUsername] == $data['username']) + { + return array('error'=>'您的用户名已经注册过账号,您是否忘记了密码?','place'=>'username'); + } + + if($row[$this->FieldEmail] == $data['email']) + { + return array('error'=>'您的邮箱已经注册过账号,请换一个邮箱','place'=>'email'); + } + + return array('error'=>'您的用户名或邮箱已经使用过,注册新账号请换一个用户名'); + } + + return true; + }//checkUser + + public function registerSuccess(\Zend_EventManager_Event $e){ + + $data = $e->getParam('data'); + + if(!is_array($data)) + { + return false; + } + + $id = $e->getParam('id'); + + if(!is_numeric($id)) + { + return false; + } + + $mail_template = "register"; + $mail_data = array( + 'name'=>$data['realname'], + 'content'=>$this->getMailContent() + ); + + $mail = new Mail(); + + $mail->loadTemplate($mail_template,$mail_data); + $mail->addTo($data['email'],$data['realname']); + $mail->send(); + + return true; + }//registerSuccess + + //邮件内容 + public function getMailContent() + { + $sql = "SELECT v.id,v.title,v.thumb,v.status,v.content,m.realname,m.username FROM tbl_voice v + LEFT JOIN tbl_member m ON v.userid = m.id + WHERE v.status > 0 + ORDER BY v.id DESC + LIMIT 5"; + $rs = $this->db->query($sql); + $latest = $rs->fetchAll(); + + $content = ""; + + foreach($latest as $k=>$v) + { + if($v['thumb'] != '[]') + { + $thumb = json_decode($v['thumb'],true); + $text = mb_strlen($v['content'],"UTF-8") > 100 ? mb_substr($v['content'],0,100,"UTF-8") : $v['content']; + $content .= '

'.$v['title']. ' / ' .$v['realname'].'
'.$text.'
查看播放

'; + } + } + + return $content; + }//getMailContent(); + +} \ No newline at end of file