## 知识点
1、后台common控制器设置
2、权限设置
3、分离列表显示和排序处理
4、后台首页权限判断
5、分离配置列表和编辑
6、前台首页注册登录权限
7、自定义弹窗提示信息
8、获取配置信息
[TOC]
## 一、后台common控制器设置
### (一)思路分析
首先,对common.php设置权限(登录才能访问)
其次,其它控制器必须继承common.php
~~~
public function _initialize() {
// 用户未登录则跳转前台登录页面
if(session('uid') == null){
session(null);
$this->redirect('index/user/login');
}
}
~~~
### (二)相关代码修改
#### 1、后台控制器继承common.php
#### 2、common.php控制器delete函数修改
~~~
public function _initialize() {
// 用户未登录则跳转前台登录页面
if(session('uid') == null){
session(null);
$this->redirect('index/user/login');
}
}
~~~
#### 3、安全退出
~~~
public function loginout(){
session(null);
$this->redirect('index/user/login');
}
~~~
#### 4、模板里面输出session变量
~~~
{:session('username')}
~~~
## 二、权限设置
### (一)判断是够超级管理员
#### 1、配置文件
这里今后需要变动文件路径
位置:\application\admin\config.php
~~~
return [
'auth_superadmin' => '37', //Auth权限认证超管ID
];
~~~
#### 2、引入文件
文件:common.php
~~~
use util\Auth;
class Common extends Controller {
public function _initialize() {
// 用户未登录则跳转前台登录页面
if(session('uid') == null){
session(null);
$this->redirect('index/user/login');
}
// 判断权限
if(!in_array(session('uid'), explode(',',config('auth_superadmin')))){
$auth = new Auth();
$rule = strtolower(request()->module().'/'.request()->controller().'/'.request()->action());
if(!$auth->check($rule, session('uid'))){
return error('您没有相应操作权限!');
}
}
}
}
~~~
备注:TP5中_initialize()函数是不支持return方法的
### (二)判断权限函数
#### 1、引入类库
use util\Auth;
#### 2、设置权限
文件:\application\common.php
~~~
function checkAuth() {
if(!in_array(session('uid'), explode(',',config('auth_superadmin')))){
$auth = new Auth();
$rule = strtolower(request()->module().'/'.request()->controller().'/'.request()->action());
return $auth->check($rule, session('uid'));
}else{
return true;
}
}
~~~
#### 3、权限调用
~~~
// 判断权限
if(!checkAuth()){
return error('您没有相应的操作权限!');
}
~~~
## 三、分离列表显示和排序处理
### (一)原来代码
~~~
public function index($tab = 1, $id = 0){
// 1个分类(从表) 属于 1个模型(主表) 属于[belongsTo]
// 1个模型 有 多个分类
if(request()->isPost()){
foreach (input('post.listorder/a') as $key => $value) {
Db::name('menu')->where('id',$key)->update(['listorder'=>$value]);
}
return success('排序更新成功!',url('index',['tab'=>$tab]));
}else{
$menuArray = MenuModel::order('listorder')->select();
foreach ($menuArray as $key => $value) {
$menuList[] = $value->toArray(); //对象转数组
}
$tree = new Tree();
$tree->tree($menuList,'id','parentid','name');
$menu = $tree->getArray();
$this->assign('menu',$menu);
// 编辑菜单,默认加载
if( 3 == $tab ){
// 获取所要编辑菜单的信息
$info = Db::name('menu')->where('id',$id)->find();
if($info!=null && is_array($info)){
$this->assign('info',$info);
}
}
}
return view();
}
~~~
### (二)现在代码
#### 1、列表显示
~~~
public function index($tab = 1, $id = 0){
// 判断权限
if(!checkAuth()){
echo "<script>parent.window.location.href='/admin/index/index';</script>";
exit;
}
$menuArray = MenuModel::order('listorder')->select();
foreach ($menuArray as $key => $value) {
$menuList[] = $value->toArray(); //对象转数组
}
$tree = new Tree();
$tree->tree($menuList,'id','parentid','name');
$menu = $tree->getArray();
$this->assign('menu',$menu);
// 编辑菜单,默认加载
if( 3 == $tab ){
// 获取所要编辑菜单的信息
$info = Db::name('menu')->where('id',$id)->find();
if($info!=null && is_array($info)){
$this->assign('info',$info);
}
}
return view();
}
~~~
#### 2、排序功能
~~~
public function sort() {
if(request()->isPost()){
// 判断权限
if(!checkAuth()){
return error('您没有相应的操作权限!');
}
foreach (input('post.listorder/a') as $key => $value) {
Db::name('menu')->where('id',$key)->update(['listorder'=>$value]);
}
return success('排序更新成功!',url('index',['tab'=>$tab]));
}
}
~~~
#### 3、模板修改
主要涉及排序模板提交处理地址,列表不存在修改
#### 4、权限调用
~~~
if(!checkAuth()){
return error('您没有相应的操作权限!');
}
~~~
#### 5、列表权限调用特别
~~~
// 判断权限
if(!checkAuth()){
echo "<script>parent.window.location.href='/admin/index/index';</script>";
exit;
}
~~~
## 四、后台首页权限判断
### (一)思路分析
标识:admin/index/index
思路:前台登录时判断权限,即有没有机会进入后台首页。
我个人认为,完全不必要这样判断,只需判断该账户是不是指定管理员,是就进入后台首页,否则进入个人会员中心。
这个有个缺陷,就是管理员必须手动指定,缺乏灵活性。如果是正式CMS系统,还是按上面的思路进行权限判断。
### (二)具体实现
需要改动两个地方
首先,修改超管配置文件
原来配置文件路径是:\application\admin\config.php
这里只适合后台调用该配置文件内容
~~~
return [
'auth_superadmin' => '37', //Auth权限认证超管ID
];
~~~
现在配置文件路径:\application\config.php
这里配置文件的内容前后台都可以调用
就是这个道理
其次,修改前台登录操作
原来代码
~~~
public function login(){
if(request()->isPost()){
$data = input('post.');//p($data);die;
//判断用户名是否存在
//$map['username'] = $data['username'];
//$user = Db::name('user')->where($map)->find();
//判断用户名或手机号是否存在
$user = Db::name('user')->where('username|mobile',$data['username'])->find();
if($user){
if($user['password'] == md5($data['password'])){
//写入Session
session('uid',$user['id']);
session('username',$user['username']);
// 临时安全设置
$url = $user['username'] == 'manage' ? url('/manage') : url('/');
//返回成功信息
$data['status'] = 200;
//$data['url'] = url('/manage');
$data['url'] = $url;
return json($data);
}else{
//返回错误信息
$data['status'] = 202;
$data['msg'] = '登录密码错误!';
return json($data);
}
}else{
//返回错误信息
$data['status'] = 202;
$data['msg'] = '用户名不存在!';
return json($data);
}
}else{
return view('../application/index/view/default/user/login.html');
}
}
~~~
现在代码
~~~
public function login(){
if(request()->isPost()){
$data = input('post.');
//判断用户名或手机号是否存在
$user = Db::name('user')->where('username|mobile',$data['username'])->find();
if($user){
if($user['password'] == md5($data['password'])){
//写入Session
session('uid',$user['id']);
// 判断权限
if(!checkAuth()){
session(null);
//返回错误信息
$data['status'] = 202;
$data['msg'] = '您没有权限登录系统后台!';
return json($data);
}else{
//返回成功信息
$data['status'] = 200;
$data['url'] = url('/admin');
return json($data);
}
}else{
//返回错误信息
$data['status'] = 202;
$data['msg'] = '登录密码错误!';
return json($data);
}
}else{
//返回错误信息
$data['status'] = 202;
$data['msg'] = '用户不存在!';
return json($data);
}
}else{
return view('../application/index/view/default/user/login.html');
}
}
~~~
同样,注册时也需要进行权限判断
还有,就是后台凡是需要权限判断的,都加相关代码,无非两种
第一,post提交的权限判断,很简单,代码如下:
~~~
if(!checkAuth()){
return error('您没有相应的操作权限!');
}
~~~
第二,不是post提交权限判断,即列表权限判断
~~~
if(!checkAuth()){
echo "<script>parent.window.location.href='/admin/index/index';</script>";
exit;
}
~~~
## 五、分离配置列表和编辑
原来代码
~~~
public function index($tab=1){
if(request()->isPost()){
// 判断权限
if(!checkAuth()){
return error('您没有相应的操作权限!');
}
$config = new ConfigModel;
if ($config->saveConfig(input('post.'))) {
return success('配置更新成功',url('index',['tab'=>$tab]));
}else{
return error('配置更新失败',url('index',['tab'=>$tab]));
}
}else{
$config = ConfigModel::column('varname,value');
$this->assign('site',$config);
return view();
}
}
~~~
现在代码
~~~
public function index()
{
$configList = ConfigModel::column('varname,value');
$this->assign('site',$configList);
return view();
}
public function edit($tab = "1") {
if(request()->isPost()){
// 判断权限
if(!checkAuth()){
return error('您没有相应的操作权限!');
}
$config = new ConfigModel;
if($config->saveConfig(input('post.'))){
return success('配置更新成功!',url('index',['tab'=>$tab]));
}else{
return error('配置更新失败!',url('index',['tab'=>$tab]));
}
}
}
~~~
## 六、前台首页注册登录权限
~~~
public function login(){
if(request()->isPost()){
$data = input('post.');
//判断用户名或手机号是否存在
$user = Db::name('user')->where('username|mobile',$data['username'])->find();
if($user){
if($user['password'] == md5($data['password'])){
//写入Session
session('uid',$user['id']);
// 判断权限
if(!in_array(session('uid'), explode(',',config('auth_superadmin')))){
$auth = new Auth();
$rule = 'manage/index/content';
if($auth->check($rule, session('uid'))){
//返回成功信息
$data['status'] = 200;
$data['url'] = url('/manage');
return json($data);
}else{
session(null);
//返回错误信息
$data['status'] = 202;
$data['msg'] = '您没有权限登录系统后台!';
return json($data);
}
}else{
//返回成功信息
$data['status'] = 200;
$data['url'] = url('/manage');
return json($data);
}
}else{
//返回错误信息
$data['status'] = 202;
$data['msg'] = '登录密码错误!';
return json($data);
}
}else{
//返回错误信息
$data['status'] = 202;
$data['msg'] = '用户不存在!';
return json($data);
}
}else{
return view('../application/index/view/default/user/login.html');
}
}
~~~
## 七、自定义弹窗提示信息
之前事件响应是post方式的submit,现在如果是get方式如何实现自定义弹窗提示?
### (一)后台处理
~~~
public function content($id = 0)
{
if($id){
// 判断权限
if(!checkAuth()){
$id = 0;
echo "<script src='/static/admin/js/jquery.min.js?v=2.1.4'></script>".
"<script>$(document).ready(function(){ layer.open({content: '您没有相应的操作权限!',btn: ['确定'],icon: 2,shade: 0.1}); });</script>";
}
$catname = getCatInfoById($id, 'catname');
$this->assign('catname',$catname);
$this->assign('id',$id);
}
return view();
}
~~~
判断权限也可以换成
~~~
// 判断权限
if(!checkAuth()){
return $this->error('您没有相应的操作权限!');
}
~~~
备注:函数中是不能模板变量的
### (二)模板
~~~
"url": "{:url('getDataTables',['id'=>input('id')])}",
换成
"url": "{:url('getDataTables',['id'=>$id])}",
<script>
$(document).ready(function() {
$("#dataTables-example").dataTable({
"serverSide": true,
"ajax": {
"url": "{:url('getDataTables',['id'=>$id])}",
"data": function(d) {
d.extra_search = "title|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_ 条记录 ",
"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: "title"
}, {
data: "username"
}, {
data: "inputtime"
}, {
data: "views"
}, {
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='添加' target='_parent' href='{:url('add',['id'=>input('id',0)])}'>" +
"<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 _initialize() {
// 用户未登录则跳转前台登录页面
if(session('uid') == null){
session(null);
$this->redirect('index/user/login');
}
// 获取配置信息
if(!cache('config')){
$config = db('config')->column('varname,value');
cache('config',$config);
}
$this->assign('config',cache('config'));
}
~~~
### 2、模板调用
~~~
<title>{$config.sitename} - 后台主页</title>
~~~
- Layer无刷新不跳转弹框提示信息
- 整合ThinkPHP+实用代码
- TP整合Layer插件实现无刷新
- 自定义助手函数
- 添加信息失败后不跳转
- 三种无限级分类
- TP常用代码
- 自定义公共函数
- TP模型管理专题
- TP模型管理之添加模型
- sfox_newmodel.sql
- TP模型管理之删除模型
- TP模型管理之编辑模型
- TP模型管理之字段添加
- sfox_newmodel.sql_edit
- layer_hplus.js_edit
- TP模型管理之字段删除
- TP模型管理之字段编辑
- TP模型管理之预览模型
- TP模型管理之公共函数
- layer_hplus.js_修订一
- TP模型管理之预览模型静态页
- 后台内容管理系统
- 分类树显示
- 内容列表显示
- 信息发布
- 编辑信息
- layer_hplus.js
- myJs第一版
- myJs第二版
- myJs第三版
- myJs第四版
- TP5插件用法
- Datatables
- WebUploader
- bootstrap-fileinput
- UEditor
- 简单调用
- 路径问题
- 跨域多图上传
- 跨域单图上传
- UEditor图片跨域上传解决方案
- 定制工具栏图标
- ajaxFileUpload
- LayUI
- 图片上传
- layui分页
- 搜索页
- 搜索优化及删除
- Uploadify
- TP5前端应用
- 静态首页
- 前台首页功能实现
- 自定义标签库
- 前台模板继承应用
- 首页自定义标签改进
- 文章内容页
- 自定义标签改进
- 自定义标签修正
- 图片等比例自动缩放
- 后台权限管理
- 角色管理
- 规则管理
- 权限设置
- 会员管理
- 权限管理
- 前台登录注册功能
- 注册登录
- 阿里大于手机注册
- 阿里大于升级阿里云短信服务
- 自动登录完成
- PHP异位或加密实现自动登陆
- 微信开发
- 分享接口
- 静态页面实现微信分享
- 动态页微信分享
- 页面静态化
- 1-全站静态化前期配置
- 2-链接地址静态化
- TP5常用片段代码
- 加载静态资源路径与常量
- thinkphp5预定义常量
- 删除某文件夹的内容
- 解压插件包
- 异步提交插件
- 其他功能
- 背景音乐
- 手机访问PC网站自动跳转到手机网站代码
- 手机微信音乐MP3播放器
- 后盾之网页背景音乐
- 播放器宽度自适应
- 前台首页数据调用
- 视频列表
- 搜索分页
- H5解决苹果(IOS)不能自动播放音乐
- 清空缓存
- 文件处理常识
- 删除路径下的所有文件夹和文件
- 一键清空缓存
- 评论留言
- 格式化时间
- 替换微博内容的URL地址@用户与表情
- PHP正则理解
- jQuery评论插件
- TP空操作
- TP路由
- 跨域访问
- 设置请其头允许跨域请求
- 模板前台判断手机访问跳转手机网址代码
- PHP遍历一个文件夹下所有文件和子文件夹
- PHP获取视频的第一帧与时长
- TP5数据库
- 链式操作原理
- update替换字段部分内容
- 后台开发
- 后台登录页居中显示
- TP5自带验证码
- JS & JQuery专题
- 二级城市联动菜单
- 模板引擎
- 混合模板编译
- 黄永成TP微博开发
- 消息推送
- memcache安装
- 插件开发
- 插件介绍
- 插件钩子
- 浅谈初步理解钩子
- 插件钩子(hooks)分析
- 插件钩子简单理解
- 控制器调用插件
- 钩子通用处理函数
- 插件基类代码
- 插件测试代码
- 浅谈钩子与插件
- 技术综合
- 常用代码
- PHP
- 56个PHP开发常用代码片段(上)
- 56个PHP 开发常用代码片段(中)
- 56个PHP 开发常用代码片段(下)
- sublime text安装自动补全注释的插件
- 影音视频开发
- 视频
- H5视频直播扫盲
- 音乐
- 语音
- PHP实现语音播报功能
- MUI
- 窗体操作