多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
>[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]请使用框架使用的源码,不要自己随便更新或替换源码