Create your Gitee Account
Explore and code with more than 6 million developers,Free private repositories !:)
Sign up
This repository doesn't specify license. Without author's permission, this code is only for learning and cannot be used for other purposes.
Clone or download
Cancel
Notice: Creating folder will generate an empty file .keep, because not support in Git
Loading...
README.md

演示地址:

后台:http://118.24.109.243:8081/login.html 前台:http://118.24.109.243:8081

账号:demo 密码:demo

学习ThinkPHP5记录

2018-3-15

  • 初始化项目提交码云(Gitee)
  • 初步引入前后台模板

2018-3-18

  • 把后台各项静态模板的链接整理好了

  • 新增管理员:

    1、如果post提交没有指定url,则默认当前控制器的当前的方法

    2、新增数据:可以使用Db类:

     助手函数:助手函数没有获取插入表中主键id的方法
     
     模型:

  • 查询管理员的多种方法

    查询方法很多,可以查询手册。

    分页:简洁分页只有上一页和下一页的按钮

  • Thinkphp5中如何引用公共文件里面的函数

    公共文件名称只能是:function.php 把function.php放到application\extra中,会自动引用。

  • url带参数:{:url('shoplist',['id'=>1])}

2018-3-20

  • 栏目无限极分类:

    思路:首先创建一个静态数组,用于存在筛选出来的栏目;传入两个初始值:等级0和父id0,首次 把父id为0的赋值给数组,然后再if中调用自身。最后返回静态数组。

  • 新增栏目

    如果是顶级栏目,则cate_level为1,如果是其他的,则根据cate_pid查询出cate_level,然后新增的cate_level为+1.

  • 删除栏目

    首先查询出其下有没有子栏目及子孙栏目:查询出全部数据,传入要删除的cate_id,再根据cate_pid==cate_id找出cate_id,以此递归下去。

  • 前置操作

    在执行控制器方法前的某个操作

  • 栏目排序

    思路:用cate_id做为name,然后通过cate_id去更新cate_sort的值

2018-3-21

  • 上传图片

    表单类型改为:enctype="multipart/form-data",应用Thinkphp5的上传功能:

  • 模型事件

    指在进行模型的写入操作的时候触发的操作行为,包括模型的save方法和delete 方法。 模型事件只可以在调用模型的方法才能生效,使用查询构造器通过Db类操作是无效的

  • 使用百度富文本编辑器记录

    这当给富文本赋值时,点击输入域,所有的数据都会清空,解决办法,通过UE.getEditor得到editor对象,设置页面一加载就进行赋值

    editor.ready(function(){

      editor.setContent('{$arLists.ar_content}');

    })

2018-3-25

  • 这里有一个问题:checkbox如果没有选中的话,提交表单不会传递值过来,甚至连name都不会传递过来。这里我的处理是:在后台查询出全部,然后再与之相比较

2018-3-26

  • Duplicate entry 'test' for key 1 错误的解决

      原因:由于数据库字段的惟一性约束,不允许重名的字段值存在。
  • 根据当前id去查找所有的父id

      比较当前id与所有数据的id,然后再调用自身,传递当前的id数据的上级id
  • 数组方式进行提交表单

      name的值写成xxx[],形式
      <label>
        <input dataid="id-{$rRes.dataid}" name="g_rules[]" value="{$rRes.r_id}" type="checkbox"  class="inverted checkbox-parent {if condition="$rRes['r_level'] neq 1"}checkbox-child{/if}">
        <span class="text">{$rRes.r_title}</span>
       </label>
    
      后台接收的形式:
      array(3) {
        ["g_title"] => string(2) "33"
        ["g_status"] => string(1) "1"
        ["g_rules"] => array(2) {
          [0] => string(1) "2"
          [1] => string(1) "7"
        }
      }

2018-3-26

  • 引入自动第三方类库问题

    放在extra目录下,不需要命名空间(也就是全局化类),实例化全局化类,''放在类名签名

     	加 ‘\’ 的原因是,tp5的命名空间自动加载规则:自动加载的实现由think\Loader类库完
     
     成,自动加载规范符合PHP的PSR-4,根据对规则的了解,放在extend目录下没有定义
     
     命名空间的类文件,就是全局化的类。实例化全局化的类的话,即用"\"放在类名前表
     
     示此类是全局类,就new一个全局化的类!

    原文链接

  • php数组遍历时插入元素

      $selectRes=$userModel->selectUser();
      foreach ($selectRes as $key=>$val){
          $res=$auth->getGroups($val['user_id']);
          $val['g_title']=$res[0]['g_title'];
      }
      
      这里往$selectRes数组中插入一个g_title元素
  • 动态添加元素

      	 var option=$("<option></option>");
           $(option).val("0");
           $(option).html("请选择");
      	这里相当于<option value="0"></option>

2018-4-2

    关于系统用户的思路:系统默认有一个系统默认用户,拥有所有操作权限,用is_admin来区分
是否系统默认用户,不能删除,普通管理员不能删除、编辑系统默认用户,只有系统默认用户可以编辑,但是也不能删除。不能如果是当前登录用户,不能删除。
	新增用户时,增加验证,必须有用户组钱才能进行增加。
  • 文章图片上传,当大于php.ini的upload_max_filesize设置时,这时获取不到上传的文件信息,这时,我们通过$_FILES['ar_thumb']['error']来判断状态。

    文件上传时产生的错误

    0:表示没有发生任何错误,文件上传成功

    1:表示上传文件的大小超出了再PHP配置文件中upload_max_filesize选项限制的值

    2:表示上传文件大小超出了HTML表单中MAX_FILE_SIZE选项所指定的值

    3:表示文件只被部分上传

    4:表示没有上传任何文件

  • 用户头像

    思路: 两者一开始的默认图像都是随机的,后续修改头像支持上传图片做头像

    系统默认用户:

    普通管理员:

    已经实现(2018-04-08):

    在用户表中增加一个存放头像地址的字段,通过上传头像,如果之前存在则删除,否则更新这条数据,更改成存放头像的地址。在公共(Common)初始化方法中,查询出当前登录用户的信息,把头像地址信息传递到模板中。(前提是所有的控制器继承了改公共类Common)

  • 前台栏目当前位置

    思路:传递当前栏目的id,在后台根据id查找它的父id,再再前台遍历出它的名称。

    后台代码

      /*
       * 根据cateid查找父id
       * */
      public function getParent($cateid){
          $currCate=$this->field('cate_id,cate_name,cate_pid')->where('cate_id',$cateid)->find();
      	/*
      		上面根据id查询出当前点击的栏目的信息
      		如果当前点击的栏目的cate_pid为0,代表它是父栏目
      	*/
          if($currCate['cate_pid']!=0){
              $allCate=$this->select();
              $Arr=$this->__getParent($allCate,$currCate['cate_pid']);
          }
          $Arr[]=$currCate;
          return $Arr;
      }
    
      public function __getParent($data,$pid){
          static $arr=array();
          foreach ($data as $val){
              if($val['cate_id']==$pid){
                  $arr[]=$val;
                  $this->__getParent($data,$val['cate_pid']);
              }
          }
          return $arr;
      }

    前台代码

      <div class="path">
      	<a href="{:url('index/index/index')}">主页</a> >
      	{volist id="pArr" name="postArr"}
      		<a href="{:url('index/artlist/index',['cate_id'=>$pArr['cate_id']])}">{$pArr.cate_name}</a> >
      	{/volist}
     </div>

2018-3-26

			/*
		         * array(6) {
		              [0] => array(2) {
		                ["cf_ename"] => string(8) "sitename"
		                ["cf_value"] => string(21) "thinkphpd项目实战"
		              }
		              [1] => array(2) {
		                ["cf_ename"] => string(12) "sitekeywords"
		                ["cf_value"] => string(13) "学习inkphp5"
		              }
		         }
		        把一个二维数组变成一维数组,每个数组里有两个值,一个值作为一维数组的key,另一个为value
		         * */

2018-4-19

分页传递参数
paginate(4,false,['query' => array('searchval'=>$where)])
第一个参数:每页显示的页数
第二个参数:是否简洁的分页样式
第三个参数:分页的参数,是一个数组类型
搜索内容和搜索关键字匹配改变样式
运用PHP的preg_replace (正则表达式, 替换成, 字符串, 最大替换次数【默认-1,无数次】, 替换次数): <?php echo preg_replace("/$where/i", "<font color=red><b>$where</b></font>", $val['ar_title']); ?>

图片滚动的代码(简洁版):
HTML代码 <div id="demo" style="margin-top: 20px;overflow:hidden;width:98%"> <table border=0 align=center cellpadding=1 cellspacing=1 cellspace=0 > <tr> <td valign=top bgcolor=#F4F4F4 id=marquePic1> <table width='100%' border='0' cellspacing='10'> <tr> <td align=center> <a href="{:url('index/article/index',['ar_id'=>$yl.ar_id])}" title="{$yl.ar_title}"> <img src="__UPLOADS__/{$yl.ar_thumb}" width=250 height=150 border=0> <br><br>{$yl.ar_title} </a> </td> </tr> </table> </td> <td id=marquePic2 valign=top bgcolor=#F4F4F4> </td> </tr> </table> </div>
js代码 <script> var speed=50 marquePic2.innerHTML=marquePic1.innerHTML function Marquee(){ if(demo.scrollLeft>=marquePic1.scrollWidth){ demo.scrollLeft=0 }else{ demo.scrollLeft++ } } var MyMar=setInterval(Marquee,speed) demo.onmouseover=function() {clearInterval(MyMar)} demo.onmouseout=function() {MyMar=setInterval(Marquee,speed)} </script>

2018-4-27

登录页面的改写:忘记密码功能,通过发送邮件找回重置密码。
思路:
1、用户必须要有邮箱
2、输入邮箱,验证码等,通过后,查询是否有这个用户
3、没有:提示无此用户
4、有:向此邮箱发送一封邮件,这里使用了phpmailper类库,放到项目的extend文件夹下,新建phpmailper文件下。然后在common.php写一个发送邮件的公共方法。 (根据用户的邮箱查询用户的信息,把用户的user_id,user_name,login_password用md5加密封装,把用的邮箱和加密字符串封装成url例子:http://localhost:8118/bicycle/public/index.php/admin/login/resetpasswd.html?email=".$data['email']."&token=".$token。再传递一些参数给发送邮件的方法,比如:收件人的邮箱,操作时间,名称,url等)根据发送邮件返回回来的结果判定是否成功,成功跳转登录页面(成功把gepasstime时间更新一下),失败提示原因。用户根据收到的地址点击进行跳转,后台判断token和email,时间是否超时等,通过验证跳转到重置密码页面 控制器验证: $valid = $this->validate($res, [ 'login_password' => 'require|min:3|confirm' ], ['login_password.require'=>'密码不允许为空', 'login_password.min'=>'密码长度最小为3位', 'login_password.confirm'=>'两次密码输入不一致' ]); if(true !== $valid){ // 验证失败 输出错误信息 $this->error($valid); } 第一个参数为要验证的数据,第二个为验证规则,第三个为验证不通过的信息。

Comments ( 0 )

Sign in for post a comment

About

学习Thinkphp5的项目。增删改查、文件上传等 spread retract
PHP
Cancel

Releases

No release

Contributors

All

Activities

load more
can not load any more