鼠笼管理系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

384 lines
9.8 KiB

<?php
/**
* 基础类
*/
abstract class Ctrl_Base extends Yaf_Controller_Abstract{
/**
* 开启 SESSION : 1
* 必须登录 : 2
* session登陆:3
* 必须管理员 : 4
*/
protected $_auth = 0;
/**
* 当前登录用户
* @var array
*/
public $mCurUser = array();
/**
* 当前借贷账号
*
*/
public $mCurLoan = array();
/**
* 构造函数
*/
public function init(){
#(1 & $this->_auth) && $this->_session();
#(1 < $this->_auth) && $this->_role();
}
/**
* 以某EMAIL身份登录
* @param bool $ip
* @param string $email
*/
private function _login_by_email($ip=false, $email=''){
if(!$ip || !$email) return;
if($ip == USER_IP){
$_SESSION['user'] = array('email'=>$email);
$_GET['yafphp_session'] = 1;
}
}
/**
* 需要登录
*/
protected function _session(){
# 用户唯一标识
if(empty($_COOKIE['USER_PW'])){
@setcookie('USER_PW', $_COOKIE['USER_PW'] = md5(uniqid()), $_SERVER['REQUEST_TIME'] + 172800, '/', null, null, true);
}
# 如果没有PHPSESSID,则程序给生成一个
@$tSessId = md5($_SERVER['HTTP_USER_AGENT'].'YBH'.USER_IP.'.com'.$_COOKIE['USER_PW']);
if(empty($_COOKIE['PHPSESSID']) || $_COOKIE['PHPSESSID'] != $tSessId){
@setcookie('PHPSESSID', $_COOKIE['PHPSESSID'] = $tSessId, $_SERVER['REQUEST_TIME'] + 172800, '/', null, null, true);
}
# 特殊登录方式
#$this->_login_by_email();
# 当前登录用户
if(!empty($_SESSION['user'])){
# 正常用户处理
$this->mCurUser = $_SESSION['user'];
/*$tRedis = Cache_Redis::instance();
if(isset($_GET['yafphp_session']) || $tRedis->hGet('usersession', $this->mCurUser['uid'])){
$this->mCurUser = $_SESSION['user'] = UserModel::getByEmail($this->mCurUser['email']);
$tRedis->hSet('usersession', $this->mCurUser['uid'], 0);
}
*/
if(isset($this->mCurUser['uid'])){
}
}
$this->layout('user', $this->mCurUser);
}
/**
* ajax 验证登录
*/
protected function _ajax_islogin(){
$this->_session();
empty($this->mCurUser) && $this->ajax('请先登录再进行此操作!');
}
/**
* 角色验证
* @param string $msg 提示消息
*/
function _role($msg = ''){
if(empty($this->mCurUser) || (4 & $this->_auth && (('admin' != $this->mCurUser['role']) && ('user' !=$this->mCurUser['role']) && ('read' != $this->mCurUser['role'])))){
$this->showMsg($msg, '/user/login/');
}
}
/**
* 注册变量到模板
* @param str|array $pKey
* @param mixed $pVal
*/
protected function assign($pKey, $pVal = ''){
if(is_array($pKey)){
$this->_view->assign($pKey);
return $pKey;
}
$this->_view->assign($pKey, $pVal);
return $pVal;
}
/**
* 注册变量到布局
* @param str $k
* @param mixed $v
*/
protected function layout($k, $v){
static $layout;
$layout || $layout = Yaf_Registry::get('layout');
@$layout->$k = $v;
$this->assign($k, $v);
}
/**
* SEO设置
*
* @param str $pTitle
* @param str $pKW
* @param str $pDes
*/
protected function seo($pTitle = '', $pKW = '', $pDes = '', $pBodyCss = ''){
$this->assign(array('seot' => $pTitle, 'seok' => $pKW, 'seod' => $pDes, 'bodycss' => $pBodyCss));
}
/**
* 提示信息
*/
protected function showMsg($pMsg, $pUrl = false){
Tool_Fnc::showMsg($pMsg, $pUrl);
}
/**
* 退出消息
*/
protected function exitMsg($pMsg){
echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />', $pMsg;
exit;
}
/**
* AJAX返回
*/
protected function ajax($pMsg = '', $pStatus = 0, $pData = '', $pType = 'json'){
Tool_Fnc::ajaxMsg($pMsg, $pStatus, $pData, $pType);
}
/**
* Flash Ajax
*
* @param str $pMsg
*/
protected function fjax($pMsg){
header('Content-type: text/xml');
echo '<?xml version="1.0" encoding="utf-8"?>', "\n";
echo "<wvke>\n<content><![CDATA[\n";
echo $pMsg;
exit("\n ]]></content>\n</wvke>");
}
/**
* 显示、保存、添加
* @param str|obj $pTable 表名或表对象
* @param array $pData 数据
* @param string $pFieldFilter 过滤字段
* @return false:dberror, true:GET, int:db->pk
*/
protected function _save($pTable, $pData, $pFieldFilter = ''){
# 实例化
if(is_string($pTable)){
$pTable = ucfirst($pTable) . 'Model';
$pTable = new $pTable();
}
$_GET[$pTable->pk] = isset($_REQUEST[$pTable->pk])? intval($_REQUEST[$pTable->pk]): 0;
# 处理POST提交
if('POST' == $_SERVER['REQUEST_METHOD']){
# 过滤掉非法字段
if($pFieldFilter){
$pFieldFilter = explode(',', $pFieldFilter);
foreach($pData as $tField){
if(!in_array($tField, $pFieldFilter)) unset($pData[$tField]);
}
}
# 更新时间
isset($pTable->field['updated']) && $pData['updated'] = $_SERVER['REQUEST_TIME'];
# 修改记录
if($_GET[$pTable->pk]){
$pData[$pTable->pk] = $_GET[$pTable->pk];
$pTable->update($pData) && $tId = $_GET[$pTable->pk];
}
else{
# 新增记录
isset($pTable->field['created']) && $pData['created'] = $_SERVER['REQUEST_TIME'];
if(isset($pData[$pTable->pk])){
unset($pData[$pTable->pk]);
}
$tId = $pTable->insert($pData);
}
return empty($tId)? false: $tId;
}
if($_GET[$pTable->pk]){
$this->_view->assign('data', $pTable->fRow($_GET[$pTable->pk]));
}
$this->assign('fields', $pFieldFilter? explode(',', $pFieldFilter): array_keys($pTable->field));
return 0;
}
/**
* 将表名转为表对象
* @param $pTable str|obj 表名或表对象
*/
protected function _table2obj(&$pTable){
if(is_string($pTable)){
if(strpos($pTable, '_')){
$pTable = str_replace(' ', '_', ucwords(str_replace('_', ' ', $pTable))) . 'Model';
}
else{
$pTable = ucwords($pTable) . 'Model';
}
$pTable = new $pTable();
}
}
/**
* 获得模型的列表
* @param String $pTable 数据表名
* @param String $pConn 条件 L=查询条数 &OB=排序 &cid=分类ID &字段=值
* @return array
*/
protected function _list($pTable, $pConn = '', $pPage = ''){
# 实例化模型
$this->_table2obj($pTable);
# 自动搜索
if(!empty($_GET['field']) && !empty($_GET['kw'])){
empty($pConn) || $pConn .= '&';
# like 搜索
if(false === strpos($_GET['field'], '*')){
$pConn .= $_GET['field'] . '=' . $_GET['kw'];
}
else{
$pConn .= str_replace('*', '', $_GET['field']) . '=LIKE *' . $_GET['kw'] . '*';
}
}
# 查询条数
parse_str($pConn, $tConn);
if(isset($tConn['L'])){
$tLimit = $tConn['L'];
unset($tConn['L']);
}
else{
$tLimit = 10;
}
# 排序
if(isset($tConn['OB'])){
$tOB = $tConn['OB'];
unset($tConn['OB']);
}
else{
$tOB = '';
}
# Where 条件
if(!empty($pTable->options['where'])){
$tWhere = $pTable->options['where'];
} else {
$tWhere = array();
foreach($tConn as $k1 => $v1){
if(0 === strpos($k1, 'SQL')){
# SQL: SQL=abc
$tWhere[] = "$v1";
}
elseif(0 === strpos($v1, 'IN')){
# IN: field=IN(1,2,3) 将转换为 field IN(1,2,3)
$tWhere[] = "$k1 $v1";
}
elseif(0 === strpos($v1, 'LIKE')){
# LIKE:field=LIKE abc* 将转换为 field LIKE 'abc%'
$v1 = str_replace('*', '%', substr($v1, 5));
$tWhere[] = "$k1 LIKE '$v1'";
}
else
$tWhere[] = "$k1='$v1'";
}
if($tWhere = join(' AND ', $tWhere)){
$pTable->where($tWhere);
}
}
# 不带分页
if(false === $pPage){
return $this->_view->assign('datas', $pTable->limit($tLimit)->order($tOB)->fList());
}
# 需要分页
$tField = isset($pTable->options['field'])? $pTable->options['field']: '*';
if(!$tCnt = $pTable->count()){
return $this->_view->assign(array('datas' => array(), 'pageinfo' => ''));
}
$tPage = new Tool_Page($tCnt, $tLimit);
$tWhere && $pTable->where($tWhere);
$this->_view->assign('datas', $pTable->field($tField)->limit($tPage->limit())->order($tOB)->fList());
$this->_view->assign('pageinfo', $tPage->show($pPage));
}
/**
* 删除记录
* @param Orm_Base $pTable 表对象
* @param string $id 主键
*/
protected function _del($pTable, $id){
if($id){
# 实例化模型
if(is_string($pTable)){
$pTable = ucfirst($pTable) . 'Model';
$pTable = new $pTable();
}
$pTable->del($id) && $this->showMsg('删除成功');
}
$this->showMsg('删除失败');
}
/**
* 记录用户登录日志
* @param $email
* @param $status
* @param string $ip
*/
protected function userlog($email, $bak='', $status, $ip=''){
$ip || $ip = USER_IP;
if(!$handle = @fopen(APPLICATION_PATH . "/conf/user$status.log", 'a')){
return false;
}
@fwrite($handle, "[$status] ".date("Y-m-d H:i:s")." $email $bak ip:$ip\n");
@fclose($handle);
}
# 验证码
protected function valiCaptcha(){
if(!isset($_POST['captcha'], $_SESSION['captcha']) || (strtolower($_SESSION['captcha']) != strtolower($_POST['captcha']))){
#$this->assign('captchamsg', '验证码错误');
Tool_Fnc::ajaxMsg('验证码错误');
return false;
}
unset($_SESSION['captcha']);
return true;
}
#邮件激活
protected function emailActivate($uid){
$tMO = new EmailactivateModel;
$pData = $tMO->fRow('SELECT activate_time FROM email_activate WHERE uid = ' . $uid . ' LIMIT 1');
if(!isset($pData['activate_time']) || empty($pData['activate_time'])){
if(true == strpos(REDIRECT_URL , 'user_emailverify')){ return ;}
Tool_Fnc::showMsg('', '/user_emailverify');
}
}
}
function level($user, $level){
$array = array();
for($i=0; $i<count($level); $i++){
if($i < count($level)-2 && $user['credit']<2000000000){
if($level[$i]['credit'] <= $user['credit'] && $level[$i+1]['credit'] > $user['credit'] ){
$array[]=$level[$i];
$array[]=$level[$i+1];
return $array;
}
}elseif($i == count($level)-2 && $user['credit']<2000000000){
$array[0]=$level[$i];
$array[1]='top';
return $array;
}elseif($i == count($level)-1 && $user['credit']>=2000000000){
$array[0]=$level[$i];
$array[1]='top';
return $array;
}
}
}