thinkphp – 苏demo的别样人生 https://www.libaocai.com 行走于凡尘俗世,活得别样人生 Sun, 10 Sep 2017 05:57:28 +0000 zh-CN hourly 1 https://wordpress.org/?v=6.2.4 【开发框架推荐】FastAdmin 一款基于ThinkPHP5+Bootstrap的后台开发框架 https://www.libaocai.com/6516.html Sun, 10 Sep 2017 05:57:28 +0000 http://www.libaocai.com/?p=6516 FastAdmin是一款基于ThinkPHP5+Bootstrap的后台开发框架。

特性:

1、基于Auth验证的权限管理。支持无限级父子级权限继承,支持管理员多角色,支持目录和控制器结构一键生成权限节点。

2、完善的前端功能组件开发。基于AdminLTE二次开发,基于Bootstrap开发,自适应手机、平板、PC。

3、多语言支持,服务端及客户端支持。

4、第三方登录整合。支持:QQ、微信、微博等。

转载请注明:苏demo的别样人生 » 【开发框架推荐】FastAdmin 一款基于ThinkPHP5+Bootstrap的后台开发框架

]]>
thinkphp buildHtml 函数实现网站静态化 https://www.libaocai.com/5591.html https://www.libaocai.com/5591.html#respond Sat, 26 Nov 2016 03:21:54 +0000 http://www.libaocai.com/?p=5591 操作步骤:

1.入口文件index.php文件中定义生成静态页面的文件位置

define( 'HTML_PATH' , './Html' );

2.config文件夹中的config.php配置静态页面的类型,设为 html

'HTML_FILE_SUFFIX' => '.html' , // 默认静态文件后缀

3.代码示例

废话不多说:

  /**
   * 模板显示公共函数支持
   * @param string $action
   * @param string $template
* @desc 调用示例
* $this->template('eindex','exchange_list');
   */
  public function template($action = '',$template=''){
      if (C('IS_HTML')) {
          $page_name     = !empty($action) ? $action : ACTION_NAME;//页面名称
          $template_name = !empty($template) ? $template : ACTION_NAME;//模板名称
          //判断是否已经生成静态页面
          if (!is_file(HTML_PATH . '/' . $page_name . C('HTML_FILE_SUFFIX'))) {
              $this->buildHtml($page_name, HTML_PATH . '/', $template_name, 'utf8');//这里的utf8不能写成utf-8
          }
          $temp_path = HTML_PATH . '/' . $page_name . C('HTML_FILE_SUFFIX');
          $this->display($temp_path);
      } else {
          $this->display();
      }
  }

调用示例:

$this->template('index','new_index');

4.补充说明
这里的buildHtml是thinkphp内置的函数,这里的意思是:
将index的模板文件生成utf8编码格式的静态网页,该文件名为 1 .html,存在于根目录的htm文件中
该函数有 5 个参数,具体如下 :
buildHtml($htmlfile,$htmlpath,$templateFile,$charset,$contentType = ‘text/html’ )
参数:
$htmlfile 生成的静态文件名称
$htmlpath 生成的静态文件路径
$templateFile 指定要生成静态的模板文件
$charset 生成静态文件的编码格式
$contentType 生成静态文件的类型

 

转载请注明:苏demo的别样人生 » thinkphp buildHtml 函数实现网站静态化

]]>
https://www.libaocai.com/5591.html/feed 0
thinkphp find_in_set 用法 https://www.libaocai.com/5574.html https://www.libaocai.com/5574.html#respond Thu, 03 Nov 2016 07:22:05 +0000 http://www.libaocai.com/?p=5574 mysql手册中find_in_set函数的语法:

FIND_IN_SET(str,strlist)

假如字符串str 在由N 子链组成的字符串列表strlist 中,则返回值的范围在 1 到 N 之间。
一个字符串列表就是一个由一些被‘,’符号分开的子链组成的字符串。如果第一个参数是一个常数字符串,而第二个是type SET列,则   FIND_IN_SET() 函数被优化,使用比特计算。
如果str不在strlist 或strlist 为空字符串,则返回值为 0 。如任意一个参数为NULL,则返回值为 NULL。这个函数在第一个参数包含一个逗号(‘,’)时将无法正常运行。

代码示例:

$check_condition = array(
    'is_del'  => 0,
    '_string' => 'FIND_IN_SET("'.$attr_id.'", object_ids)',
);
$check = M('goods_attr_n')->where($check_condition)->count();

转载请注明:苏demo的别样人生 » thinkphp find_in_set 用法

]]>
https://www.libaocai.com/5574.html/feed 0
thinkphp 3.2 引入memcache 支持 https://www.libaocai.com/5201.html https://www.libaocai.com/5201.html#respond Fri, 15 Jul 2016 03:30:02 +0000 http://www.libaocai.com/?p=5201 'Memcache', 'ME […]]]> conf/Config.php
引入

        'DATA_CACHE_TYPE' => 'Memcache',
        'MEMCACHE_HOST'   => 'tcp://127.0.0.1:11211',
        'DATA_CACHE_TIME' => '3600',

使用实例:

$Cache = Cache::getInstance('Memcache');
 $Cache->set("aa",60,60);
  echo $Cache->get("aa")."==";

转载请注明:苏demo的别样人生 » thinkphp 3.2 引入memcache 支持

]]>
https://www.libaocai.com/5201.html/feed 0
thinkPHP EaseTemplate模板引擎驱动 https://www.libaocai.com/5066.html https://www.libaocai.com/5066.html#respond Sun, 12 Jun 2016 02:37:24 +0000 http://www.libaocai.com/?p=5066 Ease Template 模板能够改善网站的结构,其特点有:

* 可以在几秒钟改变整个站点的外观;
* 可以让网站更容易实现多语言;
* 抽象程序设计,没有垃圾HTML代码;
* 稳定性能初期的强大甚至超越混编代码;
* 提供完善的 Debug 平台;
* 开发效率快地令人惊讶;
* 更容易重用模版;
* 开源版权保护(保证您的版权不会被侵犯)。(国产软件)

这里用到的是 thinkPHP里面EaseTemplate模板引擎.

老司机,话不投机,直接贴代码:

 

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2012 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------

defined('THINK_PATH') or exit();
/**
 * EaseTemplate模板引擎驱动 
 * @category Extend
 * @package Extend
 * @subpackage Driver.Template
 * @author liu21st <liu21st@gmail.com>
 */
class TemplateEase {
 /**
 * 渲染模板输出
 * @access public
 * @param string $templateFile 模板文件名
 * @param array $var 模板变量
 * @return void
 */
 public function fetch($templateFile,$var) {
 $templateFile = substr($templateFile,strlen(TMPL_PATH),-5);
 $CacheDir = substr(CACHE_PATH,0,-1);
 $TemplateDir = substr(TMPL_PATH,0,-1);
 vendor('EaseTemplate.template#ease');
 if(C('TMPL_ENGINE_CONFIG')) {
 $config = C('TMPL_ENGINE_CONFIG');
 }else{
 $config = array(
 'CacheDir' => $CacheDir,
 'TemplateDir' => $TemplateDir,
 'TplType' => 'html'
 );
 }
 $tpl = new EaseTemplate($config);
 $tpl->set_var($var);
 $tpl->set_file($templateFile);
 $tpl->p();
 }
}

转载请注明:苏demo的别样人生 » thinkPHP EaseTemplate模板引擎驱动

]]>
https://www.libaocai.com/5066.html/feed 0
如何查看当前使用的thinkphp版本号? https://www.libaocai.com/4846.html https://www.libaocai.com/4846.html#respond Tue, 05 Apr 2016 13:51:17 +0000 http://www.libaocai.com/?p=4846 方法一:

在代码里输出:

THINK_VERSION

方法二:

在Common文件夹中找到runtime.php

1

2

转载请注明:苏demo的别样人生 » 如何查看当前使用的thinkphp版本号?

]]>
https://www.libaocai.com/4846.html/feed 0
ThinkPHP的RBAC(基于角色权限控制)详解 https://www.libaocai.com/3861.html https://www.libaocai.com/3861.html#respond Fri, 07 Aug 2015 01:31:24 +0000 http://www.libaocai.com/?p=3861 一、什么是RBAC

基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注。

在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。

在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色。角色可依新的需求和系统的合并而赋予新的权限,而权限也可根据需要而从某角色中回收。角色与角色的关系可以建立起来以囊括更广泛的客观情况。

二、ThinkPHP中的RBAC

先看下官方给的实例所用到的数据表,通过5张表实现权限控制,定义如下:

RBAC 要用到5个数据表

think_user (用户表)

think_role (用户分组表)

think_node (操作节点)

think_role_user (用户和用户分组的对应)

think_access (各个操作和用户组的对应)

 

user

用户表

role

角色表,有哪些角色,该角色与对应的userid用户相关联

role_user

根据用户表的id给出对应的角色id相关联,也就是给用户分配角色,比如userid为3的角色为2,根据role角色表,7代表员工的角色

access

access表,权限表,比如角色id为2,也就是员工的权限,可以的对应的结点

note

结点表,代表有哪些应用-模块-模块方法,并且定义了之间的一种关系,比如noteid为30的是Public模块,noteid为31,32,33,34的方法add,insert,edit,update都属于Public。noteid为85的test方法,属于noteid为84的Game模块下的方法。

三、config配置文件详解

我们看看thinkphp官方示例中的config文件:

array(
‘APP_AUTOLOAD_PATH’=>’@.TagLib’,
‘SESSION_AUTO_START’=>true,
‘USER_AUTH_ON’ =>true,
‘USER_AUTH_TYPE’ =>1, // 默认认证类型 1 登录认证 2 实时认证
‘USER_AUTH_KEY’ =>’authId’, // 用户认证SESSION标记
‘ADMIN_AUTH_KEY’ =>’administrator’,
‘USER_AUTH_MODEL’ =>’User’, // 默认验证数据表模型
‘AUTH_PWD_ENCODER’ =>’md5′, // 用户认证密码加密方式
‘USER_AUTH_GATEWAY’ =>’/Public/login’,// 默认认证网关
‘NOT_AUTH_MODULE’ =>’Public’, // 默认无需认证模块
‘REQUIRE_AUTH_MODULE’ =>”, // 默认需要认证模块
‘NOT_AUTH_ACTION’ =>”, // 默认无需认证操作
‘REQUIRE_AUTH_ACTION’ =>”, // 默认需要认证操作
‘GUEST_AUTH_ON’ =>false, // 是否开启游客授权访问
‘GUEST_AUTH_ID’ =>0, // 游客的用户ID
‘DB_LIKE_FIELDS’ =>’title|remark’,
‘RBAC_ROLE_TABLE’ =>’think_role’,
‘RBAC_USER_TABLE’ =>’think_role_user’,
‘RBAC_ACCESS_TABLE’ =>’think_access’,
‘RBAC_NODE_TABLE’ =>’think_node’,
‘SHOW_PAGE_TRACE’=>1//显示调试信息
);

大家看注释就应该懂大半了,其中Public模块是无需认证的,道理很简单,没登录之前大家都是游客身份,如果登录页面也要权限,那从哪里登录呢?是吧,呵呵。默认网关地址就是认证失败,没有权限跳转到此处,重新登陆。ADMIN_AUTH_KEY表示超级管理员权限,如果你在user表建立一个名为admin的用户,那么这个用户就是超级管理员,不用给它分配权限,什么权限都有,为什么要设置一个这样的管理员,因为当你把权限分配错了容易引起系统权限混乱,搞得大家都访问不了,这时候超级管理员就来了。

四、RBAC类的几个重要的方法

authenticate($map,$model=”)方法 传入查询用户的条件和用户表的MODEL 返回数组包含用户的信息

saveAccessList($authId=null)方法 传入用户的ID 此方法不返回值,只是设置 $_SESSION[‘_ACCESS_LIST’]的值,其中包含了所有该用户对应的用户组的有权限操作的所有节点 $_SESSION[‘_ACCESS_LIST’][‘项目名’][‘模块名’][‘操作名’],以后判断权限就是判断当前项目,模块和操作是否在 $_SESSION[‘_ACCESS_LIST’]中能找到。s

checkAccess() 方法 检测当前模块和操作是否需要验证 返回bool类型

checkLogin()方法 检测登录

AccessDecision($appName=APP_NAME) 方法 就是检测当前项目模块操作 是否在$_SESSION[‘_ACCESS_LIST’]数组中,也就是说 在 $_SESSION[‘_ACCESS_LIST’] 数组中$_SESSION[‘_ACCESS_LIST’][‘当前操作’][‘当前模块’][‘当前操作’]是否存在。如果存在表示有权限 否则返回flase。

getAccessList($authId) 方法 通过查询数据库 返回权限列表 $_SESSION[‘_ACCESS_LIST’]的值了。

 

 

转载请注明:苏demo的别样人生 » ThinkPHP的RBAC(基于角色权限控制)详解

]]>
https://www.libaocai.com/3861.html/feed 0
ThinkPHP中的like查询方法 https://www.libaocai.com/1103.html https://www.libaocai.com/1103.html#respond Sun, 04 Jan 2015 05:00:02 +0000 http://www.libaocai.com/?p=1103 方法一:
$carrymodel = D(“Carry”);
$condition[“FromAddress”] = array(“like”, “%”.$rname);
$condition[“ToAddress”] = array(“like”, “%”.$rname);
$carryrecord = $carrymodel->where($condition)->findAll();

方法二:
$model = new Model();
$carryrecord = $model->table(‘dh_info_carry a’)
->field(‘a.*’)
->where(‘a.ToAddress like “%’.$rname.’” or a.FromAddress like “%’.$rname.’”‘)
->findAll();

转载请注明:苏demo的别样人生 » ThinkPHP中的like查询方法

]]>
https://www.libaocai.com/1103.html/feed 0
使用ThinkPHP应该掌握的调试手段 https://www.libaocai.com/1101.html https://www.libaocai.com/1101.html#respond Sun, 04 Jan 2015 04:59:41 +0000 http://www.libaocai.com/?p=1101 使用ThinkPHP应该掌握的调试手段

经常看到有人问到findAll的返回数据类型是什么之类的问题,以及出错了不知道什么原因的情况,其实还是没有熟悉ThinkPHP内置的调试手段和方 法,抛开IDE本身自带的调试方式不说,如果你正在用或者打算用ThinkPHP开发的话,那么下面一些和调试相关的方法你是应该要了解和掌握的:
1、在项目配置文件里面打开调试模式DEBUG_MODE,这样能够让你发现大部分的错误原因
2、如果不想使用调试模式,可以单独开启页面Trace显示。发现很多人不想使用调试模式的原因居然是因为有页面Trace信息的输出,其实这里面有一个 误区,以为调试模式就一定会有页面Trace,但其实调试模式和页面Trace没有必然的关系,只是因为打开调试模式后,系统默认的调试配置文件会开启页 面 Trace显示,所以你完全可以给项目单独定义调试配置文件。
3、使用系统定义的dump函数,该方法同var_dump可以输出任何类型的变量信息,而且更加有利于在浏览器里面查看,例如:
Copy code

$User = D(“User”);$list    = $User->findAll();dump($list);

4、页面Trace信息只能显示当前页面执行的sql语句,但无法查看ajax方式执行的后台操作里面的sql语句,所以你还可以开启sql日志记录 SQL_DEBUG_LOG 来记录每一条执行的sql语句,并且可以查看到每条sql语句的执行时间 sql日志文件位于Logs目录下面,会自动按日期来区分每天的sql日志。
5、另外一个是在执行某个数据操作后怀疑sql执行有错误的话,可以使用模型类的getLastSql方法来查看上次执行的sql语句,以便分析具体的错误原因。例如:
Copy code

$User = D(“User”);$User->id = 3;$User->name = ‘ThinkPHp’;$User->save();echo $User->getLastSql();// 输出 update think_user set name=’ThinkPHP’ where id=3;

6、当需要调试某段代码的运行时间的时候,可以使用系统提供的debug_start($label)和debug_end($label)方法,例如:
Copy code

debug_start(‘demo’);// 这里是你的代码段…….debug_end(‘demo’);

转载请注明:苏demo的别样人生 » 使用ThinkPHP应该掌握的调试手段

]]>
https://www.libaocai.com/1101.html/feed 0
Thinkphp CURD 增 删 改 查 https://www.libaocai.com/1099.html https://www.libaocai.com/1099.html#respond Sun, 04 Jan 2015 04:59:11 +0000 http://www.libaocai.com/?p=1099 一、创建操作 在ThinkPHP使用add方法新增数据到数据库。 使用方法如下: $User=M("User");//实例化User对象 $data['name']='ThinkPHP'; $data['email']='ThinkPHP@gmail.com'; $User->add($data); 或者使用data方法连贯操作 $User->data($data)->add(); 如果在add之前已经创建数据对象的话(例如使用了create或者data方法),add方法就不需要再传入数据了。 使用create方法的例子: $User=M("User");//实例化User对象 //根据表单提交的POST数据创建数据对象 $User->create(); $User->add();//根据条件保存修改的数据 如果你的主键是自动增长类型,并且如果插入数据成功的话,Add方法的返回值就是最新插入的主键值,可以直接获取。 二、读取数据 在ThinkPHP中读取数据的方式很多,通常分为读取数据和读取数据集。 读取数据集使用findall或者select方法(findall和select方法等效): $User=M("User");//实例化User对象 // 查找status值为1的用户数据以创建时间排序返回10条数据 $list = $User->where('status=1')->order('create_time')->limit(10)->select(); select方法的返回值是一个二维数组,如果没有查询到任何结果的话,也是返回一个空的数组。配合上面提到的连贯操作方法可以完成复杂的数据查询。而最复杂的连贯方法应该是where方法的使用,因为这部分涉及的内容较多,我们会在查询语言部分就如何进行组装查询条件进行详细的使用说明。基本的查询暂时不涉及关联查询部分,而是统一采用关联模型来进行数据操作,这一部分请参考关联模型部分。 读取数据使用find方法: 读取数据的操作其实和数据集的类似,select可用的所有连贯操作方法也都可以用于find方法,区别在于find方法最多只会返回一条记录,因此limit方法对于find查询操作是无效的。 $User=M("User");//实例化User对象 // 查找status值为1name值为think的用户数据 $User->where('status=1 AND name="think" ')->find(); 即使满足条件的数据不止一条,find方法也只会返回第一条记录。 如果要读取某个字段的值,可以使用getField方法,例如: $User=M("User");//实例化User对象 // 获取ID为3的用户的昵称 $nickname = $User->where('id=3')->getField('nickname'); 当只有一个字段的时候,始终返回一个值。 如果传入多个字段的话,可以返回一个关联数组: $User=M("User");//实例化User对象 // 获取所有用户的ID和昵称列表 $list = $User->getField('id,nickname'); 返回的list是一个数组,键名是用户的id, 键值是用户的昵称nickname。 三、更新数据 在ThinkPHP中使用save方法更新数据库,并且也支持连贯操作的使用。 $User=M("User");//实例化User对象 //要修改的数据对象属性赋值 $data['name']='ThinkPHP'; $data['email']='ThinkPHP@gmail.com'; $User->where('id=5')->save($data);//根据条件保存修改的数据 为了保证数据库的安全,避免出错更新整个数据表,如果没有任何更新条件,数据对象本身也不包含主键字段的话,save方法不会更新任何数据库的记录。 因此下面的代码不会更改数据库的任何记录 $User->save($data); 除非使用下面的方式: $User=M("User");//实例化User对象 //要修改的数据对象属性赋值 $data['id']=5; $data['name']='ThinkPHP'; $data['email']='ThinkPHP@gmail.com'; $User->save($data);//根据条件保存修改的数据 如果id是数据表的主键的话,系统自动会把主键的值作为更新条件来更新其他字段的值。 还有一种方法是通过create或者data方法创建要更新的数据对象,然后进行保存操作,这样save方法的参数可以不需要传入。 $User=M("User");//实例化User对象 //要修改的数据对象属性赋值 $data['name']='ThinkPHP'; $data['email']='ThinkPHP@gmail.com'; $User->where('id=5')->data($data)->save();//根据条件保存修改的数据 使用create方法的例子: $User=M("User");//实例化User对象 //根据表单提交的POST数据创建数据对象 $User->create(); $User->save();//根据条件保存修改的数据 上面的情况,表单中必须包含一个以主键为名称的隐藏域,才能完成保存操作。 如果只是更新个别字段的值,可以使用setField方法: $User=M("User");//实例化User对象 //更改用户的name值 $User-> where('id=5')->setField('name','ThinkPHP'); setField方法支持同时更新多个字段,只需要传入数组即可,例如: $User=M("User");//实例化User对象 //更改用户的name和email的值 $User-> where('id=5')->setField(array('name','email'),array('ThinkPHP','ThinkPHP@gmail.com')); 而对于统计字段(通常指的是数字类型)的更新,系统还提供了setInc和setDec方法: $User=M("User");//实例化User对象 $User->setInc('score','id=5',3); //用户的积分加3 $User->setInc('score','id=5'); //用户的积分加1 $User->setDec('score','id=5',5); //用户的积分减5 $User->setDec('score','id=5'); //用户的积分减1 四、删除数据 在ThinkPHP中使用delete方法删除数据库中的记录。同样可以使用连贯操作进行删除操作。 $User=M("User");//实例化User对象 $User->where('id=5')->delete();//删除id为5的用户数据 $User->where('status=0')->delete();//删除所有状态为0的用户数据 delete方法可以用于删除单个或者多个数据,主要取决于删除条件,也就是where方法的参数,也可以用order和limit方法来限制要删除的个数,例如: //删除所有状态为0的5 个用户数据按照创建时间排序 $User->where('status=0')->order('create_time')->limit('5')->delete();

转载请注明:苏demo的别样人生 » Thinkphp CURD 增 删 改 查

]]>
https://www.libaocai.com/1099.html/feed 0