# bicycle **Repository Path**: wjp1024_admin/bicycle ## Basic Information - **Project Name**: bicycle - **Description**: 学习Thinkphp5的项目。增删改查、文件上传等 - **Primary Language**: PHP - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2018-03-15 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 演示地址: #### 后台:[http://118.24.109.243:8081/login.html](http://118.24.109.243:8081/login.html) 前台:[http://118.24.109.243:8081](http://118.24.109.243:8081) #### 账号:demo 密码:demo 学习ThinkPHP5记录 =============== #### 2018-3-15 + 初始化项目提交码云(Gitee) + 初步引入前后台模板 #### 2018-3-18 + 把后台各项静态模板的链接整理好了 + 新增管理员: 1、如果post提交没有指定url,则默认当前控制器的当前的方法 2、新增数据:可以使用Db类: 助手函数:助手函数没有获取插入表中主键id的方法 模型: ![](https://i.imgur.com/Wq5Dzit.png) + 查询管理员的多种方法 查询方法很多,可以查询手册。 分页:简洁分页只有上一页和下一页的按钮 + Thinkphp5中如何引用公共文件里面的函数 公共文件名称只能是:function.php 把function.php放到application\extra中,会自动引用。 + url带参数:{:url('shoplist',['id'=>1])} #### 2018-3-20 + 栏目无限极分类: 思路:首先创建一个静态数组,用于存在筛选出来的栏目;传入两个初始值:等级0和父id0,首次 把父id为0的赋值给数组,然后再if中调用自身。最后返回静态数组。 ![](https://i.imgur.com/texWcgF.png) + 新增栏目 如果是顶级栏目,则cate_level为1,如果是其他的,则根据cate_pid查询出cate_level,然后新增的cate_level为+1. + 删除栏目 首先查询出其下有没有子栏目及子孙栏目:查询出全部数据,传入要删除的cate_id,再根据cate_pid==cate_id找出cate_id,以此递归下去。 ![](https://i.imgur.com/q3K5A5W.png) + 前置操作 在执行控制器方法前的某个操作 ![](https://i.imgur.com/hDbkEWd.png) + 栏目排序 思路:用cate_id做为name,然后通过cate_id去更新cate_sort的值 #### 2018-3-21 + 上传图片 表单类型改为:enctype="multipart/form-data",应用Thinkphp5的上传功能: ![](https://i.imgur.com/p2aFwYd.png) + 模型事件 指在进行模型的写入操作的时候触发的操作行为,包括模型的save方法和delete 方法。 模型事件只可以在调用模型的方法才能生效,使用查询构造器通过Db类操作是无效的 ![](https://i.imgur.com/JWrYLBA.png) + 使用百度富文本编辑器记录 这当给富文本赋值时,点击输入域,所有的数据都会清空,解决办法,通过UE.getEditor得到editor对象,设置页面一加载就进行赋值 editor.ready(function(){ editor.setContent('{$arLists.ar_content}'); }) #### 2018-3-25 + 这里有一个问题:checkbox如果没有选中的话,提交表单不会传递值过来,甚至连name都不会传递过来。这里我的处理是:在后台查询出全部,然后再与之相比较 ![](https://i.imgur.com/TkZsslJ.png) #### 2018-3-26 + Duplicate entry 'test' for key 1 错误的解决 原因:由于数据库字段的惟一性约束,不允许重名的字段值存在。 + 根据当前id去查找所有的父id 比较当前id与所有数据的id,然后再调用自身,传递当前的id数据的上级id + 数组方式进行提交表单 name的值写成xxx[],形式 后台接收的形式: 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一个全局化的类! [原文链接](http://wangshengxian.com/index/backstage/details/details_id/88/pactive/backstage.html) + 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).val("0"); $(option).html("请选择"); 这里相当于 #### 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:表示没有上传任何文件 ![](https://i.imgur.com/LZVEn3w.png) + 用户头像 思路: 两者一开始的默认图像都是随机的,后续修改头像支持上传图片做头像 系统默认用户: 普通管理员: 已经实现(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; } 前台代码
主页 > {volist id="pArr" name="postArr"} {$pArr.cate_name} > {/volist}
#### 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,无数次】, 替换次数): `$where", $val['ar_title']); ?>` 图片滚动的代码(简洁版): __HTML代码__ `


{$yl.ar_title}
` __js代码__ ` ` #### 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); }` 第一个参数为要验证的数据,第二个为验证规则,第三个为验证不通过的信息。