# 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的方法 模型:  + 查询管理员的多种方法 查询方法很多,可以查询手册。 分页:简洁分页只有上一页和下一页的按钮 + 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[],形式 后台接收的形式: 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:表示没有上传任何文件  + 用户头像 思路: 两者一开始的默认图像都是随机的,后续修改头像支持上传图片做头像 系统默认用户: 普通管理员: 已经实现(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; } 前台代码