快速上手

项目简介

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:
      • 该参数传入一个权限标识,【比如: addedit等操作标识】
      • 如果权限标识与本页面路径不是一致的,那你应该传完整的标识,比如: upload/permanent
      • 因为这里的判断原理是,与 auth_menu菜单表 的 perms 字段的内容进行比较的
    • $hide:
      • 是否要隐藏没有权限的元素,默认是隐藏的, 如果为false则返回禁用
        • 为true时返回: layui-hide no-permission
        • 为false时返回: layui-btn-forbid layui-btn-disabled

使用示例:

<!-- 因为是通过 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>
上次更新:
贡献者: zero, windy, windy