快速上手
项目简介
WaitAdmin是一款ThinkPHP + Layui的极速后台开发框架。
实现了后台系统常见的RBAC
权限管理,并且内置了诸多好用的工具。
注意
程序后台支持两种菜单模式,分别是 『树型的菜单』 和 『呼出型菜单』
注意: 两种菜单不能随意切换,由安装时决定使用那种类型的菜单。
原因: 不能随意切换是为了不用维护两套代码,减少不必要的工作。
主要特性
- 基于RBAC的权限管理系统
- 强大的代码构建功能 (包含控制器、模型、视图、菜单等)
- 支持多主题颜色的自由切换和菜单标签记忆等。
- 对常用JS插件进行二次封装,使JS代码变得更简洁,更加易维护。
- 支持国际化多语言的支持 (需要自定去翻译)。
- 完善的日志记录系统无需您额外编写代码自动记录。
- 支持插件化的开发,解耦您的代码,更易于维护和扩展。
- 支持自定义后台访问路径,防止别人找到对应后台地址。
- 内置文件附件管理系统,静态资源管理一目了然。
- 内置了很多常用的组件和工具 (后面介绍)
内置功能
- 用户管理:该功能主要完成系统用户配置。
- 部门管理:配置系统组织机构(公司、部门、小组)
- 岗位管理:配置系统用户所属担任职务。
- 菜单管理:配置系统菜单操作权限访问路径等。
- 角色管理:配置角色菜单权限分配
- 水印配置:配置上传图片增加水印
- 邮件配置:配置电子邮件发送功能
- 操作日志:系统操作日志记录和查询
- 定时任务:管理定时任务的(新增、修改、删除)
- 系统缓存:管理系统产生的缓存(可自行清理)
- 附件管理:管理用户上传的图片和视频
- 文章管理:管理文章的(新增、修改、删除)
- 插件管理:管理额外的代码包
- 文件存储:管理文件的存储(本地存储、阿里云OSS、腾讯云OSS、七牛云OSS)
- Excel操作: 导入导出的方法封装
- Uniapp端: 提供uniapp端(小程序,H5)的基础代码
目录结构
├─📂 server
│ ├─📂 addons // 插件目录
│ │ ├─📂 curd // CURD插件
│ │ ├─📂 ... // 其它插件
│ │
│ ├─📂 app // 应用目录
│ │ ├─📂 api // 接口应用
│ │ │ ├─📂 controller // 控制器
│ │ │ ├─📂 service // 服务层
│ │ │ ├─📂 validate // 验证层
│ │ │ ├─📂 view // 视图层
│ │ ├─📂 backend // 后台应用
│ │ ├─📂 common // 公共应用
│ │ ├─📂 frontend // 前端应用
│ │
│ ├─📂 public // WEB入口
│ │ ├─📂 install // 安装程序目录
│ │ ├─📂 locals // 本地存储目录
│ │ ├─📂 static // 静态文件目录
│ │ ├─📂 storage // 资源存储目录
│ │ ├─📄 index.php // PHP入口文件
│ │
│ ├─📂 extend // 扩展目录
│ ├─📂 route // 路由目录
│ ├─📂 runtime // 运行目录
│ ├─📂 vendor // 第三方依赖
│ ├─📄 .env // 项目环境配置文件
│ ├─📄 .example.env // 环境配置模板文件
按钮权限
注意
1、1.3.1
版本后,后台端支持了按钮级别
的权限控制.
2、可以控制没有权限的按钮 是否隐藏 或者 禁用不可点击。
3、用于控制权限的函数如下: {:check_perms('edit', false)}
方法说明:
check_perms(string $url, bool $hide = true)
- $url:
- 该参数传入一个权限标识,【比如:
add
或edit
等操作标识】 - 如果权限标识与本页面路径不是一致的,那你应该传完整的标识,比如:
upload/permanent
- 因为这里的判断原理是,与 auth_menu菜单表 的 perms 字段的内容进行比较的
- 该参数传入一个权限标识,【比如:
- $hide:
- 是否要隐藏没有权限的元素,默认是隐藏的, 如果为
false
则返回禁用- 为true时返回:
layui-hide no-permission
- 为false时返回:
layui-btn-forbid layui-btn-disabled
- 为true时返回:
- 是否要隐藏没有权限的元素,默认是隐藏的, 如果为
- $url:
使用示例:
<!-- 因为是通过 css 的 class进行控制的, 所以方法你要写在元素的class上面, 如下: -->
<!-- 拿我们后台的 【内容->文章管理】来做示例, {:check_perms('add')} -->
<!-- 这里只传了一个 add 的权限标识, 实际上会自动补全成 content.article/add -->
<!-- 那问题来了: content.article 是哪里来的呢? 答案是: 当前访问的url解析出来的 -->
<!-- 所以我上面说如果 不是当前页面的权限 就要输入完成的权限路径 -->
<div class="layui-btn-container">
<a class="layui-btn {:check_perms('add')}" lay-event="add">
<i class="layui-icon icon-add"></i>
<span>新增</span>
</a>
<a class="layui-btn {:check_perms('del')}" lay-event="leave">
<i class="layui-icon icon-del"></i>
<span>删除</span>
</a>
</div>
<!-- 示例2: 无权限显示按钮, 但是按钮不可操作 -->
<!-- 其实就是多传一个参数, 值为false即可 如 {:check_perms('save', false)} -->
<button class="layui-btn {:check_perms('save', false)}">保存配置</button>
多语言
- 在WaitAdmin中可以在任何位置使用
__('语言标识')
调用语言包,如果语言标识不存在,则直接输出该语言标识。
语言定义
- 在对应的模块中创建
lang
目录 在里面放您的语言包即可,如:- 公共语言包
app/common/lang/zh-cn.php
- 后台语言包
app/backend/lang/zh-cn.php
- 前台语言包
app/frontend/lang/zh-cn.php
- 接口语言包
app/api/lang/zh-cn.php
- 公共语言包
使用方法
- 1、Waitadmin中的 __函数 和 ThinkPHP中 的lang函数在传参上有些许区别
// 比如:
__('My name is %s', "WaitAdmin");
// 将会返回:
My name is WaitAdmin
// 而如果采用ThinkPHP中的lang中的写法则是
lang('My name is %s', ["WaitAdmin"]);
- 2、语言包如何编写
return [
'View' => '查看',
'Add' => '新增',
'Edit' => '编辑',
'Del' => '删除',
'Delete' => '删除',
'Login Success' => '登录成功'
]
// 如何你是在后台模块的语言包,你可以在 backend模块下创建 lang目录并且创建语言包如 zh-cn.php
// zh-cn.php代表的是中文语言包,如果你是要英文的可以是 zh-en.php
// 为了更方便管理我们可以这个规划语言包
├─📂 lang
│ ├─📂 zh-cn // 中文语言包目录
│ │ ├─📂 auth // 对应模块下的目录
│ │ ├─📄 admin.php // 对应的控制器 (里面就是上面那样的数组语言包了)
│ │ ├─📄 dept.php // 对应的控制器
│ │ ├─📂 content
│ ├─📂 zh-en // 英文语言包(同上)
│ │ ├─📂 auth
│ │ ├─📂 content
│ ├─📄 zh-cn.php // 中文语言
│ ├─📄 zh-en.php // 英文语言
// 特别说明:
// 语言包的查找查询,是让最近原则的,就是按照你访问的路径去读取,没有就往外面那层找
// 比如说你访问的路径是 /backend/auth/admin/index
// 那么就会先去找 backend/lang/zh-cn/auth/admin.php 这个语言包
// 如果找不到 那就去找 /backend/lang/zh-cn.php
// 如果也找不到 那就去找 /common/lang/zh-cn.php
// 如果还是还不到 那就原样输出 你填的啥就返回啥
- 3、在php代码中使用
- 使用此方法进多语言进行输出
__(' 语言的键名 ')
public function check(): Json
{
if ($this->isAjaxPost()) {
(new LoginValidate())->goCheck();
LoginService::login($this->request->post());
// 这里的 __('Login Success') 最终就是输出 "登录成功"
return AjaxUtils::success(__('Login Success'));
}
return AjaxUtils::error();
}
- 4、页面JS中使用
- 使用此方法进行多语言输出
{:__(" 语言的键名 ")}
- PS: 不支持独立文件的js,只支持在页面中的js代码使用
// 使用此方法进行多语言输出 {:__(" ?? ")}
let table = waitUtil.table({
elem: '#wait-table-list'
,url: '{:route("auth.admin/index")}'
,cols: [[
{type:'checkbox', width:48},
{field:'id', title:'ID', width:60, align:'center', event:'id'},
{field:'nickname', title:'{:__("View")}', width:100, align:'center'},
{field:'username', title:'{:__("Edit")}', width:100, align:'center'},
]]
});
- 5、HTML页面使用
- 依然是使用
{:__(" 语言的键名 ")}
- 依然是使用
<form class="layui-form layui-search">
<div class="layui-form-item">
<div class="layui-inline">
<label for="username" class="layui-form-label">{:__("Username")}:</label>
<div class="layui-input-inline">
<input type="text" id="username">
</div>
</div>
</div>
</form>