ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
## 知识点: 1、功能描述 2、插件datatables 3、新增字段 4、获取插入ID 5、前台注册修改 6、关联模型另类实现 7、问题解决 8、常见代码 [TOC] ## 一、功能描述 会员管理,实现分页显示,参照内容列表 datatables插件请求地址 ## 二、插件datatables ### (一)文件引入 ~~~ <link href="__ADMIN__/css/plugins/dataTables/dataTables.bootstrap.css" rel="stylesheet"> <script src="__ADMIN__/js/jquery.min.js?v=2.1.4"></script> <script src="__ADMIN__/js/bootstrap.min.js?v=3.3.6"></script> <script src="__ADMIN__/js/plugins/dataTables/jquery.dataTables.js"></script> <script src="__ADMIN__/js/plugins/dataTables/dataTables.bootstrap.js"></script> <script src="__ADMIN__/js/content.min.js?v=1.0.0"></script> <script src="__ADMIN__/js/plugins/iCheck/icheck.min.js"></script> ~~~ ### (二)表单 ~~~ <form method="post" class="form-horizontal" action="{:url('deleteAll')}" data-type="ajax"> <div class="table-responsive"> <table id="dataTables-example" class="table table-striped"> <thead> <tr> <th><input id="isCheckAll" type="checkbox" class="i-checks"></th> <th>ID</th> <th>用户名</th> <th>手机号</th> <th>注册时间</th> <th>状态</th> <th>操作</th> </tr> </thead> </table> </div> </form> ~~~ ### (三)事件响应 ~~~ <script> $(document).ready(function() { $("#dataTables-example").dataTable({ "serverSide": true, "ajax": { "url": "{:url('getDataTables')}", "data": function(d) { d.extra_search = "mobile|username"; } }, "ordering": false, //禁用全局排序 "order": [0, '`listorder` desc'], "lengthMenu": [5, 10, 20, 50, 100], // "dom": '<l <"#normalToos">f>t<ip>', "dom": "<'row'<'#normalToos.col-xs-4'><'col-xs-8'f>>" + "<'row'<'col-xs-12't>>" + "<'row'<'col-xs-6'li><'col-xs-6'p>>", "language": { "zeroRecords": "没有检索到数据", "lengthMenu": "每页 _MENU_ 条记录&nbsp;&nbsp;", "search": "搜索 ", "info": "共 _PAGES_ 页,_TOTAL_ 条记录,当前显示 _START_ 到 _END_ 条", "paginate": { "previous": "上一页", "next": "下一页", } }, "columns": [{ render: function(data, type, row, meta) { return '<input type="checkbox" class="i-checks" name="ids[' + row.id + ']">'; } }, { data: "id" }, { data: "username" }, { data: "auth_group_title" }, { data: "mobile" }, { data: "register_time" }, { data: "status" }, { data: "operate" }, ], "drawCallback": function() { normal_init(); }, "initComplete": function() { $("#normalToos").append("<div class='m-b-xs'>" + "<div class='btn-group' id='exampleTableEventsToolbar' role='group'>" + "<a class='btn btn-sm btn-outline btn-default' title='添加' href='{:url('index',['tab'=>2])}'>" + "<i class='glyphicon glyphicon-plus' aria-hidden='true'></i></a>" + "<button type='submit' class='btn btn-sm btn-outline btn-default' title='删除'>" + "<i class='glyphicon glyphicon-trash' aria-hidden='true'></i></button></div></div>"); } }); }); </script> ~~~ ### (四)功能实现 #### 1、获取数据 ~~~ public function getDataTables() { // 请求数据 // draw:1 请求次数 // columns[0][data]:0 设置列的数据源,即如何从整个Table的数据源(object / array)中获得 // columns[0][name]: 为列设定一个别名 // columns[0][searchable]:true 在该列上允许或者禁止过滤搜索记录 // columns[0][orderable]:true 在该列上允许或者禁止排序功能 // columns[0][search][value]: 该列的搜索条件 // columns[0][search][regex]:false 允许或者禁止对在搜索字符串中出现的正则表达式字符强制编码 // listorder[0][column]:0 指定排序的列 // listorder[0][dir]:asc 指定排序列的方式:升序或降序 // start:0 起始下标 // length:10 每页记录数 // search[value]: 全局搜索条件 // search[regex]:false 允许或者禁止对在搜索字符串中出现的正则表达式字符强制编码 // 返回数据 // "draw": 请求次数 // "recordsTotal": 数据总数 // "recordsFiltered": 过滤之后的记录总数 // "data": 返回数据 //获取请求过来的数据 $getParam = request()->param(); $draw = $getParam['draw']; //排序 $orderSql = 'id desc'; //自定义查询参数 $extra_search = $getParam['extra_search']; // 获取表名 $tablename = 'user'; // 总记录数 $recordsTotal = Db::name($tablename)->count(); //过滤条件后的总记录数 $search = $getParam['search']['value']; $recordsFiltered = strlen($search) ? Db::name($tablename)->where($extra_search,'like','%'.$search.'%')->count() : $recordsTotal; //分页 $start = $getParam['start']; //起始下标 $length = $getParam['length']; //每页显示记录数 //根据开始下标计算出当前页 $page = intval($start/$length) + 1; $config = ['page'=>$page, 'list_rows'=>$length]; $list = Db::name($tablename)->where($extra_search,'like','%'.$search.'%')->order($orderSql)->paginate(null,false,$config); $lists = []; if(!empty($list)){ foreach ($list as $key => $value) { $lists[$key] = $value; $lists[$key]['status'] = $value['status'] ? '√' : '✖'; $lists[$key]['auth_group_title'] = Db::name('auth_group')->cache(true)->where('id',$value['auth_group_id'])->value('title'); $lists[$key]['operate'] = "<a href='". url('index',['id'=>$value['id'],'tab'=>3]) ."' title='编辑'><i class='fa fa-edit text-navy'></i></a>&nbsp;&nbsp; <a name='delete' href='". url('delete',['id'=>$value['id']]) ."' title='删除'><i class='fa fa-trash-o text-navy'></i></a>"; } } $data = array( "draw"=>$draw, "recordsTotal"=>$recordsTotal, //数据总数 "recordsFiltered"=>$recordsFiltered, //过滤之后的记录总数 "data"=>$lists ); echo json_encode($data); } ~~~ #### 2、批量删除 ~~~ public function deleteAll(){ if (empty(input('post.ids/a'))) { return error('请选中需要删除的数据!'); } foreach (input('post.ids/a') as $id => $value) { Db::name('user')->where('id',$id)->delete(); db('auth_group_access')->where('uid',$id)->delete(); } return success('删除成功!',url('index')); } ~~~ #### 3、添加新用户 ~~~ public function add() { if(request()->isPost()) { $data = input('post.'); $id = Db::name('user')->strict(false)->insertGetId($data); //添加角色 $group_access = ['uid' => $id, 'group_id' => $data['auth_group_id']]; Db::name('auth_group_access')->insert($group_access); return success('新用户添加成功!',url('index',['tab'=>1])); } } ~~~ #### 4、删除单用户 ~~~ public function delete($id = 0) { if(Db::name('user')->where('id',$id)->delete()){ // 删除相应角色 db('auth_group_access')->where('uid',$id)->delete(); return success('用户删除成功!',url('index',['tab'=>1])); }else{ return error('删除失败!'); } } ~~~ #### 5、编辑用户 信息未做任何改变,TP5返回0;编辑成功返回true,严格检查,是bool值,而不是0 if($result !== false){……} ~~~ public function index( $id = 0, $tab = 0 ){ $infoList = Db::name('user')->order('id desc')->select(); $auth_group = Db::name('auth_group')->column('id,title'); $this->assign('infoList',$infoList); $this->assign('auth_group',$auth_group); // 编辑 if( 3 == $tab ) { $info = db('user')->where('id',$id)->find(); $this->assign('info',$info); } return view(); } // 编辑用户 public function edit( $id = 0) { if(request()->isPost()) { $data = input('post.'); // 判断密码是否为空 if(trim($data['password']=='')){ unset($data['password']); }else{ $data['password']=md5($data['password']); } $result = db('user')->where('id',$id)->strict(false)->update($data); if($result !== false){ // 如果用户角色有变化做相应修改 if($data['authGroupId'] != $data['auth_group_id']){ db('auth_group_access')->where('uid',$id)->setField('group_id',$data['auth_group_id']); } return success('用户信息编辑成功!',url('index')); }else{ return error('用户信息编辑失败!'); } } } ~~~ ## 三、新增字段 ~~~ ALTER TABLE `x_user` ADD `auth_group_id` SMALLINT UNSIGNED NOT NULL DEFAULT '4' AFTER `username` ~~~ ## 四、获取插入ID ~~~ $id = Db::name('user')->strict(false)->insertGetId($data); 获取某些字段值 $auth_group = Db::name('auth_group')->column('id,title'); 删除相应角色(两种方法) db('auth_group_access')->where('uid',$id)->delete(); Db::name('auth_group_access')->where('uid',$id)->delete(); ~~~ ## 五、前台注册修改 ### (一)用户注册 #### 1、功能处理 ~~~ public function register(){ if(request()->isPost()){ //判断用户名是否存在 $count = Db::name('user')->where('username',input('post.username'))->count(); if($count){ $data['status'] = 202; $data['msg'] = '用户名已存在!'; return json($data); }else{ //用户注册 $data = input('post.'); $data['password'] = md5($data['password']); $id = Db::name('user')->strict(false)->insertGetId($data); //插入新数据后执行触发器 //添加角色 $group_access = ['uid' => $id, 'group_id' => 4]; Db::name('auth_group_access')->insert($group_access); //写入Session session('uid',$id); //返回成功信息 $data['status'] = 200; $data['url'] = url('/admin'); return json($data); } }else{ return view('../application/index/view/default/user/register.html'); } } ~~~ ### (二)手机注册 #### 1、功能处理 ~~~ public function regmobile(){ if(request()->isPost()){ $data = input('post.'); //判断手机号是否存在 $count = Db::name('user')->where('mobile', $data['mobile'])->count(); if($count){ $data['status'] = 202; $data['msg'] = '手机号已存在!'; return json($data); }else{ //判断手机号和验证码是否正确 if($data['mobile']==session('mobile') && $data['code']==session('smscode')){ //用户注册 $data['password'] = md5($data['password']); $id = Db::name('user')->strict(false)->insertGetId($data); //插入新数据后执行触发器 //添加角色 $group_access = ['uid' => $id, 'group_id' => 4]; Db::name('auth_group_access')->insert($group_access); //写入Session session('uid',$id); //返回成功信息 $data['status'] = 200; $data['url'] = url('/admin'); return json($data); }else{ $data['status'] = 202; $data['msg'] = '验证码错误!'; return json($data); } } }else{ return view('../application/index/view/default/user/regmobile.html'); } } ~~~ ## 六、关联模型另类实现 ~~~ $lists[$key]['auth_group_title'] = Db::name('auth_group')->cache(true)->where('id',$value['auth_group_id'])->value('title'); $list = Db::name($tablename)->where()->order()->select(); $lists = []; if(!empty($list)){ foreach ($list as $key => $value) { $lists[$key] = $value; $lists[$key]['auth_group_title'] = Db::name('auth_group')->cache(true)->where('id',$value['auth_group_id'])->value('title'); $lists[$key]['operate'] = "<a href='". url('index',['id'=>$value['id'],'tab'=>3]) ."' title='编辑'><i class='fa fa-edit text-navy'></i></a>&nbsp;&nbsp; <a name='delete' href='". url('delete',['id'=>$value['id']]) ."' title='删除'><i class='fa fa-trash-o text-navy'></i></a>"; } } ~~~ ## 七、问题解决 ### (一)is_array和empty函数传值 问题描述:Can't use function return value in write context 解决方法: 今天使用thinphp框架is_array函数的时候,碰到这个错误。意思是不能使用函数返回值做参数 百度解决方案说是thinkphp的bug ,比较靠谱的说法感觉是php版本的问题,5.4不行,5.6就ok,可我用的是5.6的版本。 >解决方法,is_array,empty中的参数尽量传变量就好了。 ~~~ if (empty(input('post.ids/a'))) { return error('请选中需要删除的数据!'); } 改成 $ids = input('post.ids/a'); if (empty($ids)) { return error('请选中需要删除的数据!'); } ~~~ https://blog.csdn.net/fjnjxr/article/details/74931800 ### (二)编辑信息无修改时提示失败 信息未做任何改变,TP5返回0;编辑成功返回true,严格检查,是bool值,而不是0 解决方法:if($result !== false){……} 具体代码: ~~~ public function edit( $id = 0) { if(request()->isPost()) { $data = input('post.'); // 判断密码是否为空 if(trim($data['password']=='')){ unset($data['password']); }else{ $data['password']=md5($data['password']); } $result = db('user')->where('id',$id)->strict(false)->update($data); if($result !== false){ // 如果用户角色有变化做相应修改 if($data['authGroupId'] != $data['auth_group_id']){ db('auth_group_access')->where('uid',$id)->setField('group_id',$data['auth_group_id']); } return success('用户信息编辑成功!',url('index')); }else{ return error('用户信息编辑失败!'); } } } ~~~ ## 八、常见代码 ~~~ 1、设置字段值 db('auth_group_access')->where('uid',$id)->setField('group_id',$data['auth_group_id']); 2、获取插入ID $id = Db::name('user')->strict(false)->insertGetId($data); 3、获取某些字段值 $auth_group = Db::name('auth_group')->column('id,title'); 3、删除相应角色(两种方法) db('auth_group_access')->where('uid',$id)->delete(); //助手函数 Db::name('auth_group_access')->where('uid',$id)->delete(); //静态函数 ~~~