<?php
namespace Common\Controller;
use Think\Controller;
class DefaultController extends Controller {

public function __construct(){
header("Content-type: text/html; charset=UTF-8");
parent::__construct();
if(!defined('__URL__')) define('__URL__', __CONTROLLER__);
if(!defined('__PUBLIC__')) define('__PUBLIC__', __ROOT__.'/Public');
$this->initial();
}

private function initial(){
global $publicData;
if(empty($publicData['peizhi'])){
$peizhi=SL('Param')->getPZ();
if(empty($peizhi['logopath'])) $peizhi['logopath']='/Public/index/night/logo.png';
$publicData['peizhi']=$peizhi;
}
}

/**
* 编辑器图片上传
*/
public function upload(){
$dir=$_GET['dir'];
if(empty($dir)) $dir='images';
//logo上传
if ($_FILES) {
$path = SL('Upload')->uploadImage($dir);
if (!strstr($path, 'Uploads')) {
$buffer=[0,
$path];
}else{
$buffer=[1,$path];
}
}else{
$buffer=[0,'请上传文件'];
}

$this->reback($buffer,!IS_AJAX);
}

/**
* 描述:对不存在的方法进行处理
* @author fengxing
* https://www.sanweie.com
*/
function __call($functionName, $args){
//getCookie方法
if(strpos($functionName,'getCookie')===0){
return $this->getCookieCommon($functionName,$args);
}
//setCookie方法
if(strpos($functionName,'setCookie')===0){
return $this->setCookieCommon($functionName,$args);
}
//获取接口方法
if(strpos($functionName,'getApi')===0){
return getApi($functionName,$args);
}

if( 0 === strcasecmp($functionName,ACTION_NAME.C('ACTION_SUFFIX'))) {
if(method_exists($this,'_empty')) {
// 如果定义了_empty操作 则调用
$this->_empty($functionName,$args);
}elseif(file_exists_case($this->view->parseTemplate())){
// 检查是否存在默认模版 如果有直接输出模版
$this->display();
}else{
if(C('SHOW_PAGE_ERROR_MORE')==1){
E(L('_ERROR_ACTION_').':'.ACTION_NAME);
return;
}
//记录错误信息
D('Base')->addErrorLog(array('description'=>'ActionName:'.ACTION_NAME.' FunctionName:'.$functionName.'('.serialize($args).') source:'.$_SERVER['HTTP_REFERER']));
emptyUrl();
return;
}
}else{
if(C('SHOW_PAGE_ERROR_MORE')==1){
E(__CLASS__.':'.$functionName.L('_METHOD_NOT_EXIST_'));
return;
}
//记录错误信息
D('Base')->addErrorLog(array('description'=>__CLASS__.':'.$functionName.'('.serialize($args).')'));
emptyUrl();
return;
}
}
/**
* 描述:获取分组下的对应Cookie内容
* @return array
* @author fengxing
*/
private function getCookie($cookieName,$style='USER'){
return cookie(C('FX_'.$style.'_AUTH_KEY').$cookieName);
}

/**
* 通用获取cookie方法 用于__call
* @param string $functionName 当前调用的方法名称
* @param string $args 参数数组
* @return mixed
* @author fengxing
*/
private function getCookieCommon($functionName,$args){
$function=preg_replace('/^getCookie/','',$functionName);
$moduleName = '';
if(isset($args[0])){
$moduleName = $args[0];
}
//以下方法判断存在的方法
switch($function){
case 'UserID':
$userID = $this->getCookie('_UID',$moduleName);
if(!$userID && isset($_POST['userID'])) $userID = $_POST['userID'];
return $userID;
break;
case 'Code':
$code=$this->getCookie('_CODE',$moduleName);
if(!$code && isset($_POST['userCode'])) $code=$_POST['userCode'];
return $code;
break;
case 'Time':
return $this->getCookie('_TIME',$moduleName);
break;
default:
return $this->getCookie('_'.strtoupper($function),$moduleName);
}
}
/**
* 描述:设置分组下的对应Cookie内容
* @return array
* @author fengxing
*/
private function setCookie($cookieName,$value='',$option=null,$moduleName='USER'){
if(empty($moduleName)){
$moduleName='USER';
}
cookie(C('FX_'.$moduleName.'_AUTH_KEY').$cookieName,$value,$option);
}

/**
* 通用获取cookie方法 用于__call
* @param string $functionName 当前调用的方法名称
* @param string $args 参数数组
* @return mixed
* @author fengxing
*/
private function setCookieCommon($functionName,$args){
$function=preg_replace('/^setCookie/','',$functionName);
//以下方法判断存在的方法
switch($function){
case 'UserID':
return $this->setCookie('_UID',$args[0],$args[1],$args[2]);
break;
case 'Code':
$code=$this->setCookie('_CODE',$args[0],$args[1],$args[2]);
return $code;
break;
case 'Time':
return $this->setCookie('_TIME',$args[0],$args[1],$args[2]);
break;
default:
return $this->setCookie('_'.strtoupper($function),$args[0],$args[1],$args[2]);
}
}
/**
* 返回错误码
* @param string $errorNum 错误码 多个则以逗号间隔
* @param int $flag 类型 默认0返回错误页面 1返回ajax数据 2返回字符串
* @param string $url 跳转路径
* @param string $replace 错误码中%s替换 多个则以逗号间隔
* @return string|json
* @author fengxing
*/
protected function setError($errorNum,$flag=0,$url='',$replace='') {
$this->ajaxSetError($errorNum,$flag,$url,$replace);
}

/**
* 返回正确数据
* @param string $data 需要返回的数据
* @return json
* @author fengxing
*/
protected function setBack($data, $url = '', $second = 3, $moreData = array()) {
if( IS_AJAX || $data['return']==2) {
$return = [$data, $url, $second, $moreData];
$this->ajaxSetBack($return);
exit();
}
$this->ajaxSetBack($data, $url, $second, $moreData);
exit();
}

/**
* 通用返回数据
* @param array $buffer 返回数组
* 错误array(0,'错误编号','跳转地址',替换数据,跳转默认时间)
* 正确array(1,'正确提示|模板数据','跳转地址','跳转默认时间','更多数据包括cookie数据')
* 模板数据格式 array('pageName'=>'页面标题','buffer'=>array('数据内容'))
* @param int $ifTemplate 是否有可能模板输出 1是 0否
* @param int $ifFetch 是否返回模板输出数据 1是 0否
* @param array $moreData 更多的数据输出
* @return null
* @author fengxing
*/
public function reback($buffer, $ifTemplate = 0, $ifFetch = 0) {
if ($buffer[0] === 0) { //输出错误
if (empty($buffer[4]) || !is_numeric($buffer[4]))
$this->setError($buffer[1], IS_AJAX, $buffer[2], $buffer[3], $buffer[4]);
}else {
if ($ifTemplate == 1) { //输出模板
/* 载入模板标签 */
if ($ifFetch)
return $this->loadTemplate($buffer[1], $buffer[2], $ifFetch);
$this->loadTemplate($buffer[1], $buffer[2]);
}else { //输出成功
if (empty($buffer[3]) || !is_numeric($buffer[3]))
$buffer[3] = 3;
$this->setBack($buffer[1], $buffer[2], $buffer[3],$buffer[4]);
}
}
}
/**
* 载入模板数据
* @param int $buffer 模板数据
* @param int $tempFile 模板文件
* @param int $ifFetch 是否返回模板输出数据 1是 0否
* https://www.bang4.cn
* @author fengxing
*/
public function loadTemplate($params, $tempFile = '', $ifFetch = 0) {
foreach ($params as $i => $param) {
$this->assign($i, $param); //模板标识
}
if ($ifFetch === 0)
$this->display($tempFile);
return $this->fetch($tempFile);
}

/**
* ajax 返回所有错误码
* @param string $errorNum 错误码 多个则以逗号间隔
* @param int $flag=0 类型 默认0返回错误页面 1返回ajax数据 2返回字符串
* @param string $url 跳转路径
* @param string $replace 错误码中%s替换 多个则以逗号间隔
* @param string $diplayContent='Public/error' 默认加载模板
* @return string|json
* @author demo
*/
public function ajaxSetError($errorNum,$flag=0,$url='',$replace='',$displayContent=''){

if(!$errorNum) return ; //错误码为空

//兼容多个错误码
if(!is_array($errorNum)) $numArray=explode(',',$errorNum);
else $numArray=$errorNum;

$error = implode(',', $numArray);
if (!$error)
$error = '未知错误!'; //错误描述为空

if(empty($error)){
$error=$errorNum; //错误描述为空
$errorNum=0;
}
if ($flag === false)
$flag = 0;
if ($flag === true)
$flag = 1;

//返回类型
switch($flag){
case 0:
$this->showPageMsg($error, $url,3,$displayContent);
break;
case 1:
if($url){
$data=[$error, $url, 3];
}else{
$data=$error;
}

$newData['data']=$data;
$newData['status']=0;
$this->ajaxReturn($newData,'json',JSON_UNESCAPED_UNICODE);
break;
case 2:
return $error;
break;
}
}
/**
* 返回正确数据
* @param string $data 需要返回的数据
* @param string $url 跳转地址
* @param int $second 跳转间隔时间
* @return json
* @author demo
*/
public function ajaxSetBack($data,$url='',$second=3, $moreData = array()) {
if( IS_AJAX || $data['return']==2) {
$newData['data']=$data;
$newData['status']=1;
if(!empty($moreData)) $newData['code']=$moreData;
$this->ajaxReturn($newData,'json',JSON_UNESCAPED_UNICODE);
}
$this->showPageMsg($data,$url,$second);
}
/**
* 返回json数据
* @param array $data 需要返回的数据
* @return json
* @author demo
*/
public function ajaxBack($data) {
$this->ajaxReturn($data,'json',JSON_UNESCAPED_UNICODE);
}

/**
* 提示信息
* @param string $msgDetail 错误提示标题
* @param string $link 跳转地址
* @param bool $autoRedirect = true 跳转地址
* @param int $seconds=3 等待时间
* @param sting $displayContent 调取模板名称
* https://www.2017549.com
* @return bool
* @author demo
*/
public function showPageMsg($msgDetail, $link='', $seconds = 3,$displayContent=''){
if(empty($displayContent)) $displayContent=MODULE_NAME.'@Public/msg';
if ($link) {
$links[0]['text'] = '进入>>';
$links[0]['href'] = $link;
$links[0]['target'] = '_self';
}else{
$links[0]['text'] = '返回上一页';
$links[0]['href'] = 'javascript:history.go(-1)';
$links[0]['target'] = '_self';
}
$this->assign('msg', $msgDetail);
$this->assign('links', $links);
$this->assign('jumpUrl', $links[0]['href']);
$this->assign('waitSecond', $seconds);
$this->display($displayContent);
exit;
}
/**
* 验证码显示
* @param $imageMsg array 验证码设置属性
* @author fengxing
*/
public function verify($imageMsg=''){
import("Common.Tool.Image");
if(!empty($imageMsg)){
extract($imageMsg);
\Image :: buildImageVerify($total,$num,$style,$width,$height,$action);
}else{
\Image :: buildImageVerify();
}
}
}

php通用用户首页及模板输出代码实例的更多相关文章

  1. STC15系列通用-STC15F2K60S2/STCW4K32S4读取DHT11温湿度传感器数据串口输出代码实例工程免费下载

    //为了方便大家调试,另附程序工程共大家下载,下载地址:https://www.90pan.com/b1908750 ​ //************************** //程序说明:stc ...

  2. heredoc(实现模板与代码的分离)

    heredoc(实现模板与代码的分离) 一.总结 heredoc实现模板与代码的分离,实现的是在后台编程语言中批量输出html代码,在这个批量输出的html代码中又可以嵌套编程语言变量.所以很方便. ...

  3. JavaWeb_(request和response)用户登录注册模板_基础版

    用户登录注册模板进阶版 传送门 用户登录注册模板基础版 登录:当用户登录成功时,跳转到personCenter.jsp,当用户登录失败时,跳转到login.jsp并给出提示 注册:当用户注册成功时,跳 ...

  4. 谈谈 Act 的依赖注入 和 模板输出 - 回答 drinkjava 同学提问

    1. 背景 依赖注入工具 jBeanBox 的作者 drinkjava 同学最近在 Actframework gitee 项目 的提出了如下评论: 你这个DI工具的出发点可能有问题,一个MVC工具为什 ...

  5. 《如何让TT T4模板输出多个文件(VS2010中)》-- access911.net 文章

    <如何让TT T4模板输出多个文件(VS2010中)>-- access911.net 文章   问题:   VS2010中自带的 TT 模板功能挺好用,但是如何定义其输出的目录,或者如何 ...

  6. 按照已有的模板输出<一>(如发票)

    按照已有的模板输出<一> 普通的发票基本上都是固定模式,所以我们一般写好固定的模板,把其中需要变动的地方,以特定符号来代替.每次打印发票的时候,只需将其中的特定符号转换成我们需要显示的数据 ...

  7. C#根据用户输入字符串,输出大写字母有几个,小写字母有几个

    static void Main(string[] args) { // 根据用户输入字符串,输出大写字母有几个,小写字母有几个. Console.WriteLine("请输入一行英文代码& ...

  8. 创建JDBC模板简化代码、JDBC应用的事务管理以及连接池的作用

    一.创建JDBC模板简化代码 一个简单的查询.要做这么一大堆事情,并且还要处理异常,我们不防来梳理一下: 1.获取connection  2.获取statement  3.获取resultset  4 ...

  9. 编程算法 - 求1+2+...+n(模板类) 代码(C++)

    求1+2+...+n(模板类) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 求1+2+...+n, 要求不能使用乘除法\for\whil ...

  10. JavaWeb_(session和application)用户登录注册模板_进阶版

    用户登录注册模板_基础版 传送门 用户登录注册模板进阶版 添加了获得获得当前登录用户信息及存储登录人数 用户登录后,在首页.注册页.登录页显示登录用户信息和存储登录人数信息 目录结构 <%@pa ...

随机推荐

  1. [Java SE/JDK]Intellij IDEA中设置JDK版本

    1 Intellij IDEA 修改JDK版本 第1步:配置JDK环境变量 装好JDK之后,要添加一个环境变量:JAVA_HOME 第2步:修改Idea配置 由Maven决定的版本 <build ...

  2. 4.测试类mapper报错

    1.总结:前几天还有今天一直在弄测试类报错的原因,想着项目是一个大整体,写一个mappe测试类,测试一个mapper,这样后面不会出错: 但是在测试mapper的时候一直,出现mapper值为空的异常 ...

  3. Android 为什么事件分发的入口函数是dispatchTouchEvent

    参考:https://xiaozhuanlan.com/topic/8946537021 从触摸屏幕到事件在底层传输最终会到: private int processPointerEvent(Queu ...

  4. sql lag函数

    lag https://spark.apache.org/docs/latest/api/sql/#lag lag(input[, offset[, default]]) OVER (PARTITIO ...

  5. vivo 推送系统的容灾建设与实践

    作者:vivo 互联网服务器团队 - Yu Quan 本文介绍了推送系统容灾建设和关键技术方案,以及实践过程中的思考与挑战. 一.推送系统介绍 vivo推送平台是vivo公司向开发者提供的消息推送服务 ...

  6. [双目视差] 立体匹配算法推理 - SGBM算法(一)

    文章目录 立体匹配算法推理 - SGBM算法(一) 一.SGBM与SGM的区别 二.代价计算 立体匹配算法推理 - SGBM算法(一) SGBM立体匹配算法,总体来讲包含以下6个步骤: Preproc ...

  7. [Opencv-C++] 1.1Opencv环境准备

    Opencv环境准备 一.Opencv各版本下载 二.安装: 1.先下载OpenCV的源码: 2.解压到服务器任意目录: 3.进入源码目录 4.事先安装下列软件 5.进入到cmake 6.cmake编 ...

  8. Linux 内存管理 pt.2

    哈喽大家好我是咸鱼,在<Linux 内存管理 pt.1>中我们学习了什么是物理内存.虚拟内存,了解了内存映射.缺页异常等内容 那么今天我们来接着学习 Linux 内存管理中的多级页表和大页 ...

  9. AWS CLI入门教程(亲测)

    背景 因为公司有用到S3,所以整理了一个S3的简单入门教程.当然,入门之后有其他更高级的用法需求,就靠自己去查文档了.入门的教程能让你快速上手,不至于翻阅一堆文档,容易被劝退.这里主要是介绍如何用cl ...

  10. flask接口参数校验 jsonschema 的使用

    开头 flask接口开发中参数校验可以用到的方法有很多,但是我比较喜欢跟前端的js检验类似,故选用到了 jsonschema 这个参数校验的库 Demo 下面是一个比较全的参数校验的接口,日后方便参考 ...