>[info] tpAdmin v1.2 正式发布,请前往 github 更新
> >[warning] tpadmin已升级为 1.1,之前 1.0 版本废弃,不再维护,也不再提供文档,此文档仅适用于 v1.1 及以上版本
## tpAdmin 是什么?
tpAdmin 是一个基于 ThinkPHP5.0 正式版和 Hui.admin v2.5 的管理后台,简化管理后台的开发流程,简化代码的编写,提高代码复用率,同时集成完整的权限管理和其他管理后台中常用的功能
## tpAdmin能做什么?
tpAdmin 是一个通用管理后台,不涉及任何死板的前端框架,或许它没有像 easyUI 这样的框架那么强大,却给了你非常灵活的开发模式,允许你加入任何你喜欢的插件、前端组件到框架中去,开发前也不需要看大量篇幅的前端文档。
**因为它非常灵活,所以你可以利用它开发任何 B/S 架构的管理后台**
## 特性
### 后端
* 模板、控制器、模型、验证器、数据表自动生成
* RBAC 权限管理
* 完美支持多级控制器及多级控制器权限管理
* 支持前置方法 before
* 支持方法拦截器,实现请求拦截
* 支持过滤器
* 支持模板主题(需自己按照文档修改官方源码使用)
* 节点自动扫描与添加
* 七牛上传及与百度编辑器 (Ueditor) 结合使用
* Excel 一键导出和一键导入
* 邮件发送( Fsock 和 phpMailer 两种驱动)
* ID 加密解密
* 网站操作日志记录(自动水平分表)
* 图片上传管理及回调
### 前端
* 表单校验
* 无限层级菜单,完美与后端多级控制器兼容
* 自动面包屑导航
* 基于 layer 的丰富弹层
* 支持 H5 + iframe 自动切换的无刷新上传
* ajax 请求处理封装,直接后台返回数据控制前端页面处理
* 多窗口办公
* 随机字符串生成
* 表格溢出处理
* 图片预览
* 二维码生成
## 本平台使用了如下框架或插件、源码:
* ThinkPHP 5.0.2 正式版
* Hui.admin v2.5
* layer
* jQuery Validform
* 七牛
* ...
> 非常感谢这些框架、插件的支持
## tpadmin官方交流 QQ 群
>[danger] tpadmin官方交流群:518162472
请打广告的朋友绕道,见一个踢一个,永久拉黑
![](https://box.kancloud.cn/36441b567943e31a2e4150535c4c7487_240x329.jpg)
##注意
tpadmin 使用了大量的 ajax 请求,本人实测过程中经常遇到 php.ini 文件报警告,导致返回的 json 数据出错,警告如下:
>[warning] Deprecated: Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version. To avoid this warning set 'always_populate_raw_post_data' to '-1' in php.ini and use the php://input stream instead. in Unknown on line 0
请修改 php.ini 文件里的 always_populate_raw_post_data ,将其值设为 -1 ,一般存在该配置项,直接删掉前面注释
PS:不会改谷歌或百度去
**ThinkPHP5.0 正式版有一些不适合管理后台需求,做了如下修改,请务必修改下面所示,以后升级必须检查此两处是否有做修复**
>[info] **为了支持 include 标签引入文件模板自动定位,修改了文件 `thinkphp/library/think/Template.php` 的 `parseTemplateName` 方法:**
```
/**
* 分析加载的模板文件并读取内容 支持多个模板文件读取
* @access private
* @param string $templateName 模板文件名
* @return string
*/
private function parseTemplateName($templateName)
{
$array = explode(',', $templateName);
$parseStr = '';
foreach ($array as $templateName) {
if (empty($templateName)) {
continue;
}
if (0 === strpos($templateName, '$')) {
//支持加载变量文件名
$templateName = $this->get(substr($templateName, 1));
}
/****************** 修改开始 ********************/
// 解决模板 include 标签不支持自动定位当前控制器的问题
if (!preg_match("/(\/|\:)/", $templateName)) {
$templateName = str_replace(".", DS, \think\Loader::parseName(\think\Request::instance()->controller())) . DS . $templateName;
}
/****************** 修改结束 ********************/
$template = $this->parseTemplateFile($templateName);
if ($template) {
// 获取模板文件内容
$parseStr .= file_get_contents($template);
}
}
return $parseStr;
}
```
>[info] **为了支持多级控制器,`\think\Url::build` 方法有bug,`\think\Url::build("one.two.Three")` 会生成 `one.two._three` 的链接,正确的应该是 `one.two.three`,修改了文件 `thinkphp/library/think/Loader.php` 的 `parseName` 方法:**
**ThinkPHP 5.0.4及以上版本请按此修改:**
```
/**
* 字符串命名风格转换
* type 0 将Java风格转换为C的风格 1 将C风格转换为Java的风格
* @param string $name 字符串
* @param integer $type 转换类型
* @param bool $ucfirst 首字母是否大写(驼峰规则)
* @return string
*/
public static function parseName($name, $type = 0, $ucfirst = true)
{
/****************** 修改开始 ********************/
if ($type) {
return preg_replace_callback(['/\_([a-zA-Z])/', '/([^.][a-zA-Z]*$)/'], function ($match) use ($ucfirst) {
return $ucfirst ? ucfirst($match[1]) : lcfirst($match[1]);
}, $name);
} else {
return strtolower(preg_replace('/((?<=[a-z])(?=[A-Z]))/', '_', $name));
}
/****************** 修改结束 ********************/
/* if ($type) {
$name = preg_replace_callback('/_([a-zA-Z])/', function ($match) {
return strtoupper($match[1]);
}, $name);
return $ucfirst ? ucfirst($name) : lcfirst($name);
} else {
return strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $name), "_"));
}*/
}
```
**ThinkPHP 5.0.3及以下版本请按此修改:**
```
/**
* 字符串命名风格转换
* type 0 将Java风格转换为C的风格 1 将C风格转换为Java的风格
* @param string $name 字符串
* @param integer $type 转换类型
* @return string
*/
public static function parseName($name, $type = 0)
{
/****************** 修改开始 ********************/
if ($type) {
return preg_replace_callback(['/\_([a-zA-Z])/', '/([^.][a-zA-Z]*$)/'], function ($match) {
return ucfirst($match[1]);
}, $name);
} else {
return strtolower(preg_replace('/((?<=[a-z])(?=[A-Z]))/', '_', $name));
}
/****************** 修改结束 ********************/
}
```
>[info]请使用框架使用的源码,不要自己随便更新或替换源码
- 概要
- 开始使用
- 写在前面
- 目录结构
- 模板主题支持
- 前置方法before支持
- 数据返回
- 异常接管
- Rbac 权限管理
- 开始使用
- 用户管理
- 分组管理
- 节点管理
- 角色管理
- 使用流程
- 其他
- 代码自动生成 v1.2
- 示例一 - 一级控制器
- 示例二 - 多级控制器
- 示例三 - 从数据表生成
- 示例四 - 指定生成的文件
- 示例五 - 命令行模式
- 示例六 - 模拟命令行模式
- 代码自动生成
- 示例一 - 一级控制器
- 示例二 - 多级控制器
- 控制器
- 公共控制器
- traits 多继承 Controller
- 公开不授权控制器
- 其他控制器
- 标签扩展
- 模板
- 网站操作日志
- 节点图
- 行为驱动
- 其他后端方法
- Excel一键导出
- Excel一键导入
- 文件下载
- 邮件发送
- 七牛文件上传
- id加密
- 前端
- ajax请求
- 表单校验
- 丰富弹层
- 异步操作
- 表格溢出
- 随机字符串
- 自动面包屑导航
- 动态加载文件
- 文件上传
- Tab 切换
- 图片预览
- 二维码生成
- 日历组件
- 升级指导
- 更新日志
- FAQ