后台内核(Admin)

2020-11-05  by  

业务介绍

后台内核,为后台业务提供底层策略,写法支持.(导航菜单,基础页面,导入,导出等功能)

源码地址

phpzlc/admin

安装

composer require phpzlc/admin

服务引入

后台控制器需要按照下列来实现基类

class AdminController extends SystemBaseController
{
          /**
           * @var AdminStrategy
           */
          private $adminStrategy;
      
          /**
           * @var string
           */
          private $pageTag;
          
          public function inlet($returnType = SystemBaseController::RETURN_HIDE_RESOURCE, $isLogin = true)
          {
              $this->adminStrategy = new AdminStrategy($this->container);
              $this->adminStrategy->setPageTag($this->pageTag);
              
              return parent::inlet($returnType, $isLogin);
          }
}

AdminStrategy

是后台核心机制类,主要用于设置后台系统的基本属性和动作

 //菜单配置
$menus = [
    new Menu($title, $ico, $tag, $url, $url_target, [
    new Menu($title, $ico, $tag, $url, $url_target, $childs = array())
    ])
];           
    
$this->adminStrategy = new AdminStrategy($this->container);
    
//设置管理端基本信息(名称,页面标记,菜单......)
$this->adminStrategy
    // 设置后台标题
    ->setTitle('admin')
    // 设置后台入口URL
    ->setEntranceUrl($this->generateUrl('admin_manage_index'))
    // 设置后台退出登录URL
    ->setEndUrl($this->generateUrl('admin_manage_logout'))
    // 设置修改密码页面URL
    ->setSettingPwdUrl($this->generateUrl('admin_manage_edit_password'))
    // 设置后台页面模式
    ->setMenuModel(AdminStrategy::menu_model_simple)
    // 设置页面标记
    ->setPageTag($this->page_tag)
    // 设置清除缓存API地址url
    ->setClearCacheApiUrl($this->generateUrl('admin_manage_clearCache'))
    // 设置后台favicon_ico图标
    ->setFaviconIco('public/image/100.png')
    // 设置后台logo
    ->setLogo('public/image/200.png')
    // 设置后台导航菜单
    ->setMenus($menus)
    // 设置登陆页面背景图片
    ->setLoginLackGroundImg('public/image/200.png');
  1. 设置锚点url

    用于设置表单提交,取消等需要返回到某个控制器层的action中时,我们可以使用该方法,将action设为锚点,一般在列表中设置。

      public function setUrlAnchor()
    
  2. 设置页面标记

    页面标记配置,需要在菜单相对应配置,用于菜单选项选中后高亮显示。

     public function setPageTag($tag)
    
  3. 设置后台标题

     public function setTitle($title)
    
  4. 设置后台favicon_ico图标

     public function setFaviconIco($favicon_ico)
    
  5. 设置后台logo

     public function setLogo($logo)
    
  6. 设置后台入口URL,一般用于返回首页功能

     public function setEntranceUrl($entrance_url)
    
  7. 设置退出登录URL

     public function setEndUrl($end_url)
    
  8. 设置密码修改页面url

     public function setSettingPwdUrl($setting_pwd_url)
    
  9. 设置清除缓存API地址url

     public function setClearCacheApiUrl(string $clear_cache_api_url)
    
  10. 设置管理员角色名称

    public function setAdminRoleName($admin_role_name)
    
  11. 设置登陆页面背景图片

    public function setLoginLackGroundImg(string $login_lack_ground_img)
    
  12. 设置管理员登录头像

    public function setAdminAvatar(string $admin_avatar)
    
  13. 设置head自定义代码

    public function setHendCode(string $head_code)
    

面包线配置

  1. 设置面包线

    $this->adminStrategy->setNavigations(array $navigations)
    
  2. 在原有的面包线上添加面包线

    $this->adminStrategy->addNavigation(new Navigation($title, $url = ''));
    

模式切换

本框架提供两种后台页面模式.这两种模式可以进行切换,适合不同量级的后台.

  1. 简单模式(三级菜单,后期业务升级可便捷地切换到复杂模式)

    简单模式

  2. 复杂模式(四级菜单,增加头部菜单,功能划分更精确直观)

    复杂模式

  3. 代码配置

     $this->adminStrategy = new AdminStrategy(ContainerInterface $container);
     $this->adminStrategy->setMenuModel(AdminStrategy::menu_model_simple) // 简单模式 menu_model_simple; 复杂模式 menu_model_all; 
    

设置导航菜单

  1. 我们将要显示的导航菜单根据它的层级设置一个多维数组$menus,然后调用

     $this->adminStrategy->setMenus(array $menus);
    
  2. 比较常用三级层级的导航菜单

     new Menu('博客管理系统', null, null, null, null, [
           new Menu('博客管理', 'fa fa-clone', null, null, null, [
               new Menu('文章管理', null, 'admin_article_index', $this->generateUrl('admin_blog_manage_article_index'), null),
           ]),
     ]);
    

设置后台环境

我们提供全局变量参数,来改变后台环境显示.例如,内测;开发;样品;正式环境

  1. 内测环境(配置地址.env.local)

    ADMIN_ENV=beta
    

    效果

  2. 开发模式环境(配置地址.env.local)

    ADMIN_ENV=dev
    

    效果

  3. 样品环境(配置地址.env.local)

    ADMIN_ENV=demo
    

    效果

  4. 正式环境(配置地址.env.local)

    ADMIN_ENV=prod
    

    效果

页面技术栈

Vue.js

ElementUI

Twig

Font图标库

仪表盘基本写法

  1. 我们提供可复制的仪表盘页面代码参考模板

  2. 页面效果

    效果

列表页面基本写法

  1. 我们提供可复制的列表页面代码参考模板

  2. 页面效果

    效果

  3. 控制器层

     /**
     * 用户管理首页
     *
     * @param Request|null $request
     * @return bool|JsonResponse|RedirectResponse|Response
     */
     public function index(Request $request = null)
     {
         $r = $this->inlet(self::RETURN_SHOW_RESOURCE, true);
         if($r !== true){    
             return $r;
         }
    
         // 设置当前页面为锚点
         $this->adminStrategy->setUrlAnchor();
    
         // 获取搜索框数据
         $user_name = $request->get('user_name');
            
         // 添加需要搜索字段的规则
         $rules = [
           'user_name' . Rule::RA_LIKE => '%' . $user_name . '%',
         ];
            
         // 页面页码配置(必须在控制器配置) 
         $page = $request->get('page', 1);
    
         // 页面展示数据的行数(必须在控制器配置, 默认展示20行数据)    
         $rows = $request->get('rows', 20);
            
         // 页面展示的数据    
         $data = $this->userRepository->findLimitAll($rows, $page, $rules);
    
         // 数据库数据的数量(必须在控制器配置)
         $count = $this->userRepository->findCount($rules);
            
         // 返回数据和页面
         return $this->render('admin/user/index.html.twig', array(
             'page' => $page,
             'rows' => $rows,
             'count' => $count,
             'users' => $data
         ));
     }
    

新建/编辑页面基本写法

  1. 我们提供可复制的新建/编辑页面代码参考模板

  2. 页面效果

    效果

  3. 主要页面控件请进入主要控件参考模板

  4. 更多页面控件请进入ElementUI

导入功能基本写法

  1. 安装组件phpoffice/phpspreadsheet

    composer require phpoffice/phpspreadsheet
    
  2. 页面层

    
     //  该功能控件常见于在列表页中,位置处于搜索框和数据列表页中间部分跟新建按钮存在一个标签中(特殊情况根据需求可以编写在任何你想要的页面)
    
     // 下载导入模板
     <el-button size="mini" @click="handleImportTemplate">下载导入模板</el-button>
    
     // 导入按钮
     <el-upload
        class="upload-demo"
        action="导入地址"
        :limit="1"
        :on-success="handleImport"
        :on-error = "handleImport"
        :file-list="fileList">
        <el-button size="small" type="primary">点击上传</el-button>
        <div slot="tip" class="el-upload__tip">只能上传xls/xlsx文件</div>
     </el-upload>
        
     <script>
        export default {
            methods: {
                handleImport(result){
                    const that = this;
                    resultPreprocess(that, result, "admin_url_anchor()");
                },
            }
        }
     </script>
    
  3. 效果图

    效果

  4. 控制器层

     /**
     * 导入模板下载
     *
     * @param Request $request
     * @return bool|JsonResponse|RedirectResponse|Response|void
     */
     public function importTemplate(Request $request)
     {
            $r = $this->inlet(self::RETURN_HIDE_RESOURCE, true);
            if($r !== true){
                return $r;
            }
            // 根据业务所设置的Business层
            $driverImportBusiness  = new DriverImportBusiness($this->container);
            return $driverImportBusiness->goUrl($driverImportBusiness->downloadImportTemplate($request));
     }
       
     /**
     * 导入功能
     *
     * @return bool|JsonResponse|RedirectResponse|Response
     * @throws \Doctrine\DBAL\ConnectionException
     */
     public function import()
     {
        // phpzlc框架控制器的入口方法
        $r = $this->inlet(self::RETURN_HIDE_RESOURCE, true);
        if($r !== true){
            return $r;
        }
        
        set_time_limit(0);
        ob_start();
        // 该Business层封装导入方法(该Business层根据业务需求所编写,但是必须继承Business/ExcelBusiness/ImportBusiness类)
        $ImportBusiness  = new ImportBusiness($this->container);
        
        /**
        * @var Connection $conn
        */
        $conn = $this->getDoctrine()->getConnection();
        $conn->beginTransaction();
        
        try {
            // 通过Excel组件的Import获取上传导入的数据
            $data = $ImportBusiness->importData();
            // 循环data数据
            foreach ($data as $k => $v) {
                //将数据导入数据库当中
            }
            $conn->commit();
        
            return Responses::success('导入成功');
        
        }catch (PhpZlcApiException $exception){
            $conn->rollBack();
            return Responses::error($exception->getMessage());
        }
        
     }
    
  5. Business层

    // 命名空间
    namespace App\Business\DriverBusiness;
       
    //引用的文件
    use App\Business\ExcelBusiness\ImportBusiness;
    use PHPZlc\PHPZlc\Bundle\EventListener\ApiExceptionListener\PhpZlcApiException;
       
    class DriverImportBusiness extends ImportBusiness
    {
        public function importTemplateFilePath()
        {   
            // 导入模板的名称
            return '司机导入模板.xlsx';
        }
           
        // 序列化导入的数据
        public function format($data)
        {
            if(empty($data)){
                throw new PhpZlcApiException('导入数据不能为空');
            }
       
            $info = [];
            $drivers = [];
               
            // 数据的循环与判断
            foreach ($data as $index => $value){
                $name = $this->getValue($value, 0);
                $sex = $this->getValue($value, 1);
                $phone = $this->getValue($value, 2);
                $password = $this->getValue($value, 3);
                $id_card_no = $this->getValue($value, 4);
       
                $rows = $index + 1;
       
                if(empty($phone)){
                    throw new PhpZlcApiException('第' . $rows . '行手机号不能为空');
                }
       
                if(empty($sex)){
                    throw new PhpZlcApiException('第' . $rows . '行性别不能为空');
                }else{
                    if($sex == '男'){
                        $sex = 1;
                    }elseif ($sex == '女'){
                        $sex = 2;
                    }else{
                        throw new PhpZlcApiException('第' . $rows . '行请输入正确的性别');
                    }
                }
       
       
                $info[] = array(
                    'name' => $name,
                    'sex' => $sex,
                    'phone' => $phone,
                    'password' => $password,
                    'id_card_no' => $id_card_no
                );
       
            }
            return $info;
        }
    }
    

导出功能基本写法

  1. 页面层

     // 该控件的编写位置跟上面的下载导入模板和导入的位置相同(具体位置具体分析)
     <el-button size="mini" type="success" @click="export_data()">导出</el-button>
    
     <script>
        export default {
            methods: {
                export_data(){
                    window.location.href = urlParamWrite(getSelfUrl(), 'ex', '1');
                },
            }
        }
     </script>
    
  2. 效果图

    效果

  3. 控制器层

     /**
     * 导出
     *
     */
     public function info(Request $request)
     {
        $r = $this->inlet();
        if($r !== true){
            return $r;
        }
        
        $this->adminStrategy->setUrlAnchor();
        
        $rows = $request->get('rows', 20);
        $page = $request->get('page', 1);
           
        // 获取数据的规则
        $rules = [
            'feedDayDaily' => $request->get('id')
        ];
               
        $daily = $this->getDoctrine()->getRepository('App:FeedDayDaily')->find($request->get('id'));
           
        // 通过ex判断是否是导出数据, 如若ex的值为1,则导出数据,如若不是,则显示页面
        if($request->get('ex') != 1){
       
        }else{
            // 调用phpzlcExport组件
            $ex = new Export();
       
            // 设置导出Excel表头(一维数组)
            $head = [];
        
            // 获取需要导出的数据
            $list = $this->getDoctrine()->getRepository('App:FeedDayDailyInfo')->findAll($rules);
        
            $data = [];
               
            // 对需要导出的数据进行循环处理,放入data数组中(二维数组)
            foreach ($list as $value){
                $data[] = array(
                   $value->getId(),
                   $value->getName
                
            }
               
            // 调用Excel组件的export方法
            $ex->export($daily->getTitle(), $head, $data, true);
        }
     }
    

后台实战(更多写法)

具体写法,更多特性可通过demo项目了解。

找到错别字了?本文档有什么问题么?分叉并编辑 它 !

CJayhe

谢谢您的赞赏~

使用微信扫描二维码完成支付

抱歉弹框打扰,系统检测到您今日累计浏览时长已达120秒。如果我们的项目对您有帮助,在 关闭窗口之前,希望能够阅读弹框内容,帮助我们变得更好。

一个成功的项目,实现功能只是基础,合理的架构,对资源的调度能力才是灵魂。 PHPZlc, 致力于在Symfony的基础上提供“知行合一”的项目开发方案。

如果您有关切问题和好的想法:

提交

如果您想帮助我们,可以为我们点亮星星,也可以提供资金支持。

您还可以通过以下渠道,关注我们,获取最新的框架动态,帮助项目获取人气,扩大影响力。

开源伙伴招募:https://phpzlc.com/blog/11.html

由于我们无法获取您是否已经是我们的会员了,所以此弹框每日都会弹出一次,关闭