使用laravel一分钟搭建CURD后台页面

配置即一切

一切皆于需求,后台从0开始搭建,但是写了一两个页面后发现太多的是对单表的增删改查操作,于是就想到了,能不能做一个快速搭建的后台。想到一句话,配置即一切。如果一个CURD后台能只进行配置就自动生成,该是多么美妙的事情,那么就开始搭建这么个结构。

首先配置文件应该怎么设计

起初想到将配置文件放到config目录下,但是想想还是放弃了这个想法,那样子可能会导致有一个“万能”文件,又臭又长。那么,其次,这个功能只针对单表,所以,是不是可以将配置文件放置在Model中,后来也觉得这个想法不大好,这个配置文件是承担页面展示的功能的,如果放在Model中就算是入侵了Model层了。所以最后决定放在了Controller中。

最后的效果大概是什么样子的?

后台大概会有几个页面:

列表页:

列表页中有查询操作,编辑,删除按钮,新建按钮。

新建页面:

编辑页面:

好了,对应这几个页面,我们可以设置配置项了。

基本想法是搭建一个FormController,所有以后需要配置生成后台的controller就继承这个FormController就好了。在FormController中定义属性:

class FormController extends BaseController {

     // 对应的模型
     protected $model;

     // 所有的字段
     protected $fields_all;

     // 列表页显示的字段
     protected $fields_show;

     // 编辑页面显示的字段
     protected $fields_edit;

     // 创建页面显示的字段
     protected $fields_create;
}

定义了Model,来表示这个Controller是对那个Model进行单表操作的。

定义了fields_all属性,来将所有的字段来进行一个说明和定义。这个定义和说明就包括字段显示名字,字段是否要进行搜索,字段类型是什么。

对于列表页,不是所有属性都显示出来,所以定义一个$fields_show,这个数组存放的是$fields_all中的一些字段,用来显示的字段。

对于编辑页面,要显示的字段就放在$field_edit中

对于创建页面,要显示的字段就放在$field_create中

好了,现在继承FormController的类就只需要这么配置就好;

<?php

// 账号管理系统
class BadminController extends FormController
{

     public function __construct()
     {
          $this->model = ‘\Badmin‘;
          $this->fields_all = [
               ‘id‘ => [
                    ‘show‘ => ‘序号‘,
               ],
               ‘nickname‘ => [
                    ‘show‘ => ‘昵称‘,
                    ‘search‘ => "nickname like CONCAT(‘%‘, ?, ‘%‘)"
               ],
               ‘username‘ => [
                    ‘show‘ => ‘用户名‘,
               ],
               ‘email‘ => [
                    ‘show‘ => ‘邮箱‘,
               ],
               ‘password‘ => [
                    ‘show‘ => ‘密码‘,
               ],
               ‘created_at‘ => [
                    ‘show‘ => ‘创建时间‘,
               ],
               ‘updated_at‘ => [
                    ‘show‘ => ‘更新时间‘,
               ],
          ];

          $this->fields_show = [‘id‘ ,‘nickname‘, ‘username‘, ‘email‘, ‘created_at‘];
          $this->fields_edit = [‘nickname‘, ‘username‘];
          $this->fields_create = [‘nickname‘, ‘username‘, ‘email‘, ‘password‘];
          parent::__construct();
     }
} 

在构造函数中定义model,$fields_all, $fields_show, $fields_edit, $fields_create。

对于fields_all,key为数据库对应的字段名,value为一个数组,show是显示名,如果你在列表页希望这个字段能进行搜索,就设置下search属性。

路由

下面是路由,laravel中路由基本有三种:

Route::get(‘order/{id}‘,[‘as‘=>‘order.detail‘,‘uses‘=>‘[email protected]‘]);
Route::controller(‘preview‘, ‘PreviewController‘);
Route::resource(‘badmin‘, ‘BadminController‘);

第三种已经完全定义好了增删改查操作,看起来能省我不少的事情,好吧,我就使用这个resource来做了。

所以在route.php中我只需要定义这么一条就ok了

// 管理员账号管理
Route::resource(‘badmin‘, ‘BadminController‘);

Controller

下面写FromController中的resource方法

按照laravel的resource定义的,需要填充的方法有:

我习惯在构造函数中把一些诸如Input,全局定义的东西都share到模版中,代码如下:

     public function __construct()
     {

          // TODO:做一些基础的判断,如果没有的话就抛出异常

          $route = Route::currentRouteAction();
          list($this->controller, $action) = explode(‘@‘, $route);
          View::share(‘controller‘, $this->controller);

          $fields_show = array();
          foreach ($this->fields_show as $field) {
               $fields_show[$field] = $this->fields_all[$field];
          }
          View::share(‘fields_show‘, $fields_show);

          $fields_edit = array();
          foreach ($this->fields_edit as $field) {
               $fields_edit[$field] = $this->fields_all[$field];
          }
          View::share(‘fields_edit‘, $fields_edit);

          $fields_create = array();
          foreach ($this->fields_create as $field) {
               $fields_create[$field] = $this->fields_all[$field];
          }
          View::share(‘fields_create‘, $fields_create);

          View::share(‘input‘, Input::all());
     }

这里把controller放到外面是为了在view中可以使用诸如:

action($controller . ‘@destroy‘, $model->id),

的路径定义

index函数:

     public function index()
     {
          $model = new $this->model;
          $builder = $model->orderBy(‘id‘, ‘desc‘);

          $input = Input::all();
          foreach ($input as $field => $value) {
               if (empty($value)) {
                    continue;
               }
               if (!isset($this->fields_all[$field])) {
                    continue;
               }
               $search = $this->fields_all[$field];
               $builder->whereRaw($search[‘search‘], [$value]);
          }
          $models = $builder->paginate(20);

          return View::make(‘form.index‘, [
               ‘models‘ => $models,
          ]);
     }
 

$builder在laravel中真是太TMD好用了,对于这里的搜索,我使用whereRaw进行prepare查询。这里还有一个点,之前在fields_all设计的时候,我定义的直接是一个 ‘search‘ => "nickname like CONCAT(‘%‘, ?, ‘%‘)"  这里定义搜索字段的时候其实有很多种设计方法,比如定义为

‘search’ => [
     ‘type‘ => ‘like‘,
     ‘value‘ => ‘%?%‘
]

但是考虑到使用这个FromController的都是程序员,所以这里的search直接使用预处理的语句,然后在index中直接使用whereRaw,这样使得配置文件的易读性增加了。

下面是

create函数:

     public function create()
     {
          return View::make(‘form.create‘, []);
     }
 

store函数:

     public function store()
     {
          $model = new $this->model;
          $model->fill(Input::all());
          $model->save();
          return Redirect::to(action($this->controller . ‘@index‘));
     }
 

这里的model的fill是不是很简单,爽到爆。当然model中还是需要定义fillable字段

edit,update,destory函数

如法炮制就好

     public function edit($id)
     {
          $model = new $this->model;
          $model = $model->find($id);
          return View::make(‘form.edit‘, compact(‘model‘));
     }

     public function update($id)
     {
          $model = new $this->model;
          $model = $model->find($id);
          $model->fill(Input::all());
          $model->save();

          return Redirect::to(action($this->controller . ‘@index‘));
     }

     public function destroy($id)
     {
          $model = new $this->model;
          $model->destroy($id);

          return Redirect::to(action($this->controller . ‘@index‘));
     }
 

View

下面就是view的编写。

view大概就只要三个页面,列表页面,编辑页面,创建页面

列表页面注意事项:

1 使用laravel自带分页,注意记得带上本页的输入参数,这个时候,构造函数中share的Input就很有用了

{{$models->appends($input)->links()}}

2 可以使用laravel自带的from操作,比如删除操作由于需要调用HTTP的DELETE 方法,可以这么写

                 {{ Form::open(array(
                  ‘id‘ => "delete_{$model->id}",
                  ‘url‘ => action($controller . ‘@destroy‘, $model->id),
                  ‘class‘ => ‘dropdown-toggle‘)) }}
                    {{ Form::hidden(‘_method‘, ‘DELETE‘) }}
                  {{ Form::close() }}

其实自己写DELETE也行,就是在From表单中多传递一个_method隐藏域

3 搜索直接使用一个form就可以搞定了

     <form class="form-inline" role="form" action="{{action($controller . ‘@index‘)}}">
          @foreach ($fields_show as $field => $field_info)
            @if (isset($field_info[‘search‘]))
            <div class="form-group">
              <label class="col-sm-3 control-label">{{$field_info[‘show‘]}}</label>
              <div class="col-md-3">
                <input name="{{$field}}" type="input" class="form-control" placeholder="" value="@if (isset($input[$field])){{$input[$field]}}@endif">
              </div>
            </div>
            @endif
          @endforeach
          <input type="submit" class="btn btn-success" value="查询" />
        </form>

编辑页面和创建页面

简单到只需要一个form就能搞定了

  <form class="form-horizontal"
          role="form"
          action="{{action($controller . "@update", $model->id)}}" method=‘POST‘>
          <input type="hidden" name="_method" value="PUT">
            @foreach ($fields_edit as $field => $field_info)
            <div class="form-group">
              <label class="col-sm-2 control-label">{{$field_info[‘show‘]}}</label>
              <div class="col-sm-10">
                <input name="{{$field}}" type="text" class="form-control" placeholder="" value="{{$model->$field}}">
              </div>
            </div>
            <div class="line line-dashed line-lg pull-in"></div>
            @endforeach
            <div class="col-sm-4 col-sm-offset-2">
              <button type="submit" class="btn btn-primary">提交</button>
            </div>
          </form>

记得resource中更新的操作是要使用PUT方式,删除的操作要使用DELETE方式。

至于view的模版,我这里使用的是一款叫notebook的模版,它是基于bootstrap的,你也可以使用其他更好看的模版来写。

好了,至此这么个快速搭建CURD的结构就完成了。现在可以在运营人员给需求的时候,很牛逼地说,等我一分钟,我就给你一个世界~~

后记

其实回想下,这整个结构不算复杂。配置即一切的思想能解决很多问题。但是依赖配置的路子最怕的是几个事情:

1 配置文件过于复杂。(如果你的配置文件过于复杂,已经超过了敲代码本身需要了解的东西,那么这个配置项的学习成本就太太太高了)

2 配置字段语意不清。(配置的字段名字和意思不对,字段名和变量名一样重要!)

当然这个就是个初步,改进的几个点还有

1 所有字段都使用input标签,需要在配置中加入其它标签类型

2 是不是考虑view中所有的东西都使用laravel自带的form对应字段?

时间: 2024-10-27 18:58:20

使用laravel一分钟搭建CURD后台页面的相关文章

五分钟搭建App设置页面

原文出处: 陈燕翔(@燕翔de专注)   欢迎分享原创到伯乐头条 本节主题(Storyboard/模型思想搭建设置页面) 设置(Setting)页面的搭建(实现效果) 开发方式(这里提供两种,个人感觉第二种重用性较高,推荐使用.但第一种较为简单,视开发需求选择) (1)纯代码 + StoryBoard混合 开发 (2)纯代码 + 模型 思想 设置页面的搭建 假设你已经搭建出了这个基本框架<十分钟搭建App主流框架>但这毕竟是个空壳,下面让我们把设置页面简单的搭建一下吧 注:本文仅仅提供简略的搭

基于laravel5.4 vue 和vue-element搭建的单页面后台CMS

介绍 该项目后台是基于vue和laravel搭建的单页面CMS系统,包含了文章管理,权限管理,用户管理等基本模块. 前台使用了传统web技术,laravel渲染搭建了个博客系统 github地址:https://github.com/zdpdp/lvCMS 喜欢的点个星星喔 搭建 npm install composer install npm run dev / npm run prod 修改根目录下的env文件 填写自己的数据库信息 php artisan migrate (也可使用目录下的

【SSH项目实战03】使用EasyUI搭建后台页面框架

前面两节,我们整合了SSH并且抽取了service和action部分的接口,可以说基本开发环境已经搭建好了,这一节我们搭建一下后台的页面.我们讨论一下两种搭建方式:基于frameset和基于easyUI.最后我们会使用easyUI来开发. 1. 抽取公共JSP页面 我们先来看一下当前的jsp页面: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

5分钟搭建博客

5分钟搭建Java博客系统 为什么是 Blade ? Blade是无意间起的一个名字,始于 2015 年 9 月,目的为个人开发者提供一个除 Spring 系列框架的一个选择. 学习 Blade 搭建 Web 程序,只需要 1 小时,如果你是一个Web开发的老手,也许5分钟就够了. Blade 是什么? 一个高效的 MVC 开发框架 是一个自带WebServer的库 帮助开发者快速构建Web程序 源代码不到 500KB 的开源框架 简洁优雅的 API 总的来说 Blade 是一款帮助你快速搭建一

Visual C#两分钟搭建BHO IE钩子

微软在1997年正式推出Browser Helper Object (BHO), 使程序员能够更好的对IE进行二次开发和操作. 在通过编写BHO程序数月后, 我希望把我的一些经验告诉才开始的同志, 避免走一些弯路. 我本人是非常喜欢C++的. 因为C++对内存直接操作的方式可以节省非常多的内存损耗, 也更快一些. 但是在开发BHO的时候, 我的确也认识到, C#明显要比C++强大很多. 例如C#提供的FOREACH 循环就可以避免FOR循环产生的溢出. 另外C#的类型转换也明显要强于C++. 毕

ASP.NET MVC搭建项目后台UI框架—4、tab多页签支持

目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NET MVC搭建项目后台UI框架—4.tab多页签支持 ASP.NET MVC搭建项目后台UI框架—5.Demo演示Controller和View的交互 在点击左侧菜单中的选项时,我希望有Extjs.EasyUI等中类似的tab页签功能,因为这样可以支持多个页面的浏览,有时候我们可能需要同时打开多个页

在Linux系统中如何设置APACHE服务器里的后台页面只允许某个IP地址访问

补充资料 本网络中使用LINUX服务器,web服务器是由APACHE搭建,IP地址为192.168.1.5,后台页面为/admin/login.jsp . 如何设置后台页面LOGIN.JSP只允许192.168.1.10访问.而前台页面所有人都可以访问?请回答的详细点,比如在APACHE的哪个部分添加怎样的字段. 谢谢 我记得论坛有帖子说怎么设置访问权限的.搜索下.........  以下供参考,比较忙没有时间整理....... 1.修改http.conf 假设你想控制权限的目录的不同访问权限,

ASP.NET MVC搭建项目后台UI框架—1、后台主框架

目录 ASP.NET MVC搭建项目后台UI框架-1.后台主框架 ASP.NET MVC搭建项目后台UI框架-2.菜单特效 ASP.NET MVC搭建项目后台UI框架-3.面板折叠和展开 ASP.NET MVC搭建项目后台UI框架-4.tab多页签支持 ASP.NET MVC搭建项目后台UI框架-5.Demo演示Controller和View的交互 ASP.NET MVC搭建项目后台UI框架-6.客户管理(添加.修改.查询.分页) ASP.NET MVC搭建项目后台UI框架-7.统计报表 ASP

ASP.NET MVC搭建项目后台UI框架—8、将View中选择的数据行中的部分数据传入到Controller中

ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NET MVC搭建项目后台UI框架—4.tab多页签支持 ASP.NET MVC搭建项目后台UI框架—5.Demo演示Controller和View的交互 ASP.NET MVC搭建项目后台UI框架—6.客户管理(添加.修改.查询.分页) ASP.NET MVC搭建项目后台UI框架—7.统计报表 ASP.NE