登录  /  注册
博主信息
博文 70
粉丝 1
评论 0
访问量 50885
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
thinkphp多数据库访问 - 创建博客页面路由 - 多应用配置系统和博客两个应用
葡萄枝子
原创
681人浏览过

多数据库访问 - 创建博客页面路由 - 多应用配置系统和博客两个应用

1、访问多少个数据库,切换多个数据库 2、创建博客页面的路由 3、生成多应用,配置管理系统和博客,2个应用

1. 访问多个数据库,切换多个数据库

  • config\database.php 默认数据库切换
  1. // 默认使用的数据库连接配置
  2. 'default' => env('database.driver', 'mysql'),
  • 更多的数据库配置信息下添加
  1. // 更多的数据库配置信息
  2. 'laravel' => [
  3. // 数据库类型
  4. 'type' => env('database.type', 'mysql'),
  5. // 服务器地址
  6. 'hostname' => env('database.hostname', '127.0.0.1'),
  7. // 数据库名
  8. 'database' => 'laravel',
  9. // 用户名
  10. 'username' => env('database.username', 'root'),
  11. // 密码
  12. 'password' => '123456',
  13. // 端口
  14. 'hostport' => env('database.hostport', '3306'),
  15. // 数据库连接参数
  16. 'params' => [],
  17. // 数据库编码默认采用utf8
  18. 'charset' => env('database.charset', 'utf8'),
  19. // 数据库表前缀
  20. 'prefix' => env('database.prefix', ''),
  21. // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
  22. 'deploy' => 0,
  23. // 数据库读写是否分离 主从式有效
  24. 'rw_separate' => false,
  25. // 读写分离后 主服务器数量
  26. 'master_num' => 1,
  27. // 指定从服务器序号
  28. 'slave_no' => '',
  29. // 是否严格检查字段是否存在
  30. 'fields_strict' => true,
  31. // 是否需要断线重连
  32. 'break_reconnect' => false,
  33. // 监听SQL
  34. 'trigger_sql' => env('app_debug', true),
  35. // 开启字段缓存
  36. 'fields_cache' => false,
  37. ],
  • app\index\controller\index.php 访问 laravel 数据库的 cat 前 3 个分类
  1. public function demo()
  2. {
  3. //
  4. $res[] = Db::connect('laravel')->table('cat')->field(['id', 'name'])->where('id', '<=', 3)->select();
  5. halt($res[0]->toArray());
  6. }

多数据库访问切换

2. 创建博客前端页面的路由

  • route\app.php 添加
  1. use think\facade\Route;
  2. Route::get('/', 'Index/index'); // 首页
  3. Route::get('/cat/<id>', 'Index/cat')->ext('html'); // 分类页
  4. Route::get('/search', 'Index/search'); // 搜索页
  5. Route::get('/detail/<id>', 'Index/detail')->ext('html'); // 详情页

3. 生成多应用,配置管理系统和博客,2个应用

3.1 多应用已生成,已生成

  1. composer require topthink/think-multi-app

3.2 博客前端页面应用

  1. 创建公共模型
  • 公共模型 app\common\model\Boke.php
  1. namespace app\common\model;
  2. use think\Model;
  3. use app\common\model\Cat;
  4. class Boke extends Model
  5. {
  6. protected $pk = 'id';
  7. protected $name = 'boke';
  8. // 模型字段
  9. protected $schema = [
  10. 'id' => 'int',
  11. 'title' => 'string',
  12. 'img' => 'string',
  13. 'content' => 'string',
  14. 'date' => 'date',
  15. 'cat' => 'int',
  16. 'num' => 'int',
  17. 'hot' => 'int',
  18. 'status' => 'int'
  19. ];
  20. // 获取器
  21. public function getStatusAttr($value)
  22. {
  23. $status = [-1 => '删除', 0 => '禁用', 1 => '正常', 2 => '待审核'];
  24. return $status[$value];
  25. }
  26. // 图片
  27. public function getImgAttr($value)
  28. {
  29. if (preg_match('/\/.+?\.(gif|jpg|jpeg|png|bmp|webp|psd|svg|tiff)$/i', $value)) {
  30. $value = '<img src="' . $value . '" style="width:50px;height:30px;" />';
  31. }
  32. return $value;
  33. }
  34. // 分类
  35. public function getCatAttr($value) {
  36. return Cat::where('id', $value)->value('name');
  37. }
  38. // 修改器
  39. public function setDateAttr($value, $data) {
  40. $this->set('date', date('Y-m-d'));
  41. }
  42. // 浏览量
  43. public function setNumAttr($value, $data) {
  44. $this->set('num', (int)$value);
  45. }
  46. }
  • app\common\model\Cat.php
  1. namespace app\common\model;
  2. use think\Model;
  3. class Cat extends Model
  4. {
  5. protected $pk = 'id';
  6. protected $name = 'cat';
  7. // 模型字段
  8. protected $schema = [
  9. 'id' => 'int',
  10. 'name' => 'string',
  11. 'sort' => 'int',
  12. 'status' => 'int'
  13. ];
  14. // 获取器
  15. public function getStatusAttr($value)
  16. {
  17. $status = [0 => '禁用', 1 => '正常'];
  18. return $status[$value];
  19. }
  20. }
  1. 创建公共控制器
  • app\common\controller\Base.php
  1. namespace app\common\controller;
  2. use app\BaseController;
  3. class Base extends BaseController
  4. {
  5. // 初始化
  6. protected function initialize()
  7. {
  8. }
  9. }
  1. 创建应用继承公共控制器和模型
  • 博客控制器 app\controller\Index.php
  1. namespace app\controller;
  2. use app\common\controller\Base;
  3. use app\common\model\Boke;
  4. use app\common\model\Cat;
  5. use think\facade\Db;
  6. use think\facade\View;
  7. use think\facade\Request;
  8. class Index extends Base
  9. {
  10. // 首页
  11. public function index()
  12. {
  13. $map[] = ['status', '=', 1];
  14. $archive = '最新文章';
  15. // 导航
  16. $catList = Cat::where($map)->select();
  17. view::assign('CatList', $catList);
  18. // 分类列表
  19. view::assign('cat', 0);
  20. // 搜索列表
  21. view::assign('search', '');
  22. // 详情页
  23. view::assign('p', 0);
  24. view::assign('archive', $archive);
  25. // 热门文章
  26. $hotList = Boke::where('status', 1)->order('num', 'desc')->limit(5)->select();
  27. view::assign('hotList', $hotList);
  28. // 渲染输出
  29. $artList = Boke::where($map)->order('id', 'desc')->paginate([
  30. 'list_rows' => 2, // 分页2条每页
  31. // 'query' => Request::param()
  32. ]);
  33. view::assign('artList', $artList);
  34. return view::fetch('index/index');
  35. }
  36. // 分类页
  37. public function cat($id)
  38. {
  39. $map[] = ['status', '=', 1];
  40. $archive = '最新文章';
  41. // 导航
  42. $catList = Cat::where($map)->select();
  43. view::assign('CatList', $catList);
  44. // 分类列表
  45. view::assign('cat', $id);
  46. if ($id) {
  47. $map[] = ['cat', '=', $id];
  48. $archive = Cat::where('id', $id)->value('name');
  49. }
  50. // 搜索列表
  51. view::assign('search', '');
  52. // 详情页
  53. view::assign('p', 0);
  54. view::assign('archive', $archive);
  55. // 热门文章
  56. $hotList = Boke::where('status', 1)->order('num', 'desc')->limit(5)->select();
  57. view::assign('hotList', $hotList);
  58. // 渲染输出
  59. $artList = Boke::where($map)->order('id', 'desc')->paginate([
  60. 'list_rows' => 2, // 分页2条每页
  61. // 'query' => Request::param()
  62. ]);
  63. view::assign('artList', $artList);
  64. return view::fetch('index/index');
  65. }
  66. // 搜索页
  67. public function search()
  68. {
  69. $map[] = ['status', '=', 1];
  70. $archive = '最新文章';
  71. // 导航
  72. $catList = Cat::where($map)->select();
  73. view::assign('CatList', $catList);
  74. // 分类列表
  75. view::assign('cat', 0);
  76. // 搜索列表
  77. $search = Request::param('search');
  78. view::assign('search', $search);
  79. if ($search) {
  80. $map[] = ['title|content', 'like', "%{$search}%"];
  81. $archive = '搜索结果';
  82. }
  83. // 详情页
  84. view::assign('p', 0);
  85. view::assign('archive', $archive);
  86. // 热门文章
  87. $hotList = Boke::where('status', 1)->order('num', 'desc')->limit(5)->select();
  88. view::assign('hotList', $hotList);
  89. // 渲染输出
  90. $artList = Boke::where($map)->order('id', 'desc')->paginate([
  91. 'list_rows' => 2, // 分页2条每页
  92. 'query' => Request::param()
  93. ]);
  94. view::assign('artList', $artList);
  95. return view::fetch('index/index');
  96. }
  97. // 详情页
  98. public function detail($id)
  99. {
  100. $map[] = ['status', '=', 1];
  101. $archive = '最新文章';
  102. // 导航
  103. $catList = Cat::where($map)->select();
  104. view::assign('CatList', $catList);
  105. // 分类列表
  106. view::assign('cat', 0);
  107. // 搜索列表
  108. view::assign('search', '');
  109. // 详情页
  110. view::assign('p', $id);
  111. if ($id) {
  112. $map[] = ['id', '=', $id];
  113. $archive = '';
  114. // 阅读数自增
  115. Boke::where('id', $id)->inc('num')->update();
  116. }
  117. view::assign('archive', $archive);
  118. // 热门文章
  119. $hotList = Boke::where('status', 1)->order('num', 'desc')->limit(5)->select();
  120. view::assign('hotList', $hotList);
  121. // 渲染输出
  122. $artList = Boke::where($map)->order('id', 'desc')->paginate([
  123. 'list_rows' => 2, // 分页2条每页
  124. 'query' => Request::param()
  125. ]);
  126. view::assign('artList', $artList);
  127. return view::fetch('index/index');
  128. }
  129. }
  1. 创建博客视图
  • 创建静态模板 app\view\public\base.html
  1. {include file='public/header'/}
  2. <div class="container">
  3. <div class="row">
  4. <!-- 左侧列表 -->
  5. <div class="col-md-8">
  6. <div class="panel panel-default">
  7. {block name='archive'}
  8. <div class="panel-heading">Panel heading without title</div>
  9. {/block}
  10. <div class="panel-body">
  11. <!-- 列表 -->
  12. {block name='list'}
  13. <div class="row">
  14. <div class="col-md-12">
  15. <div class="panel panel-default">
  16. <div class="panel-body">
  17. <div class="row">
  18. <div class="col-sm-3 col-md-3">
  19. <a href="#" class="thumbnail">
  20. <img style="width:100%;max-height:110px;"
  21. src=""
  22. alt="...">
  23. </a>
  24. </div>
  25. <div class="col-sm-9 col-md-9">
  26. <h3 style="margin-top: 0;">Thumbnail label</h3>
  27. <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id
  28. elit non mi porta gravida at eget metus. Nullam id dolor id nibh
  29. ultricies.</p>
  30. <p><a href="#" class="btn btn-primary" role="button">Button</a></p>
  31. </div>
  32. </div>
  33. </div>
  34. </div>
  35. </div>
  36. </div>
  37. {/block}
  38. <!-- 分页 -->
  39. {block name='pages'}
  40. <div class="row">
  41. <div class="col-md-12 text-center">
  42. <nav aria-label="Page navigation">
  43. <ul class="pagination">
  44. <li>
  45. <a href="#" aria-label="Previous">
  46. <span aria-hidden="true">&laquo;</span>
  47. </a>
  48. </li>
  49. <li><a href="#">1</a></li>
  50. <li><a href="#">2</a></li>
  51. <li><a href="#">3</a></li>
  52. <li><a href="#">4</a></li>
  53. <li><a href="#">5</a></li>
  54. <li>
  55. <a href="#" aria-label="Next">
  56. <span aria-hidden="true">&raquo;</span>
  57. </a>
  58. </li>
  59. </ul>
  60. </nav>
  61. </div>
  62. </div>
  63. {/block}
  64. </div>
  65. </div>
  66. </div>
  67. <!-- 右侧侧栏 -->
  68. <div class="col-md-4">
  69. {block name='side'}
  70. <div class="panel panel-default">
  71. <div class="panel-heading">
  72. <h3 class="panel-title">Panel title</h3>
  73. </div>
  74. <div class="panel-body">
  75. <!-- Panel content -->
  76. <div class="list-group">
  77. <a href="#" class="list-group-item active">Cras justo odio<span class="badge"></span></a>
  78. <a href="#" class="list-group-item">Dapibus ac facilisis in<span class="badge"></span></a>
  79. <a href="#" class="list-group-item">Morbi leo risus<span class="badge"></span></a>
  80. <a href="#" class="list-group-item">Porta ac consectetur ac<span class="badge"></span></a>
  81. <a href="#" class="list-group-item">Vestibulum at eros<span class="badge"></span></a>
  82. </div>
  83. </div>
  84. </div>
  85. {/block}
  86. </div>
  87. </div>
  88. </div>
  89. {include file='public/footer'/}
  • 模板头部 app\view\public\header.html
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>{$title|default="tpboke bootstrap"}</title>
  8. <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
  9. <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap-theme.min.css" integrity="sha384-6pzBo3FDv/PJ8r2KRkGHifhEocL+1X2rVCTTkUfGk7/0pbek5mMa1upzvWbrUbOZ" crossorigin="anonymous">
  10. <script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js" integrity="sha384-nvAa0+6Qg9clwYCGGPpDQLVpLNn0fRaROjHqs13t4Ggj3Ez50XnGQqc/r8MhnRDZ" crossorigin="anonymous"></script>
  11. <script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>
  12. </head>
  13. <body>
  14. <!-- 导航 -->
  15. <nav class="navbar navbar-default navbar-static-top">
  16. <div class="container">
  17. <!-- Brand and toggle get grouped for better mobile display -->
  18. <div class="navbar-header">
  19. <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
  20. <span class="sr-only">Toggle navigation</span>
  21. <span class="icon-bar"></span>
  22. <span class="icon-bar"></span>
  23. <span class="icon-bar"></span>
  24. </button>
  25. <a class="navbar-brand" href="/">Brand</a>
  26. </div>
  27. <!-- Collect the nav links, forms, and other content for toggling -->
  28. <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
  29. <!-- 导航 -->
  30. <ul class="nav navbar-nav">
  31. <li{if $cat === 0} class="active"{/if}><a href="/">首页</a></li>
  32. {volist name='CatList' id='vo' key='k'}
  33. <li{if $vo.id === (int)$cat} class="active"{/if}><a href="/cat/{$vo.id}.html">{$vo.name}</a></li>
  34. {/volist}
  35. <li class="dropdown">
  36. <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>
  37. <ul class="dropdown-menu">
  38. <li><a href="#">Action</a></li>
  39. <li><a href="#">Another action</a></li>
  40. <li><a href="#">Something else here</a></li>
  41. <li role="separator" class="divider"></li>
  42. <li><a href="#">Separated link</a></li>
  43. <li role="separator" class="divider"></li>
  44. <li><a href="#">One more separated link</a></li>
  45. </ul>
  46. </li>
  47. </ul>
  48. <!-- 搜索 -->
  49. <form class="navbar-form navbar-right" action="/search">
  50. <div class="form-group">
  51. <div class="input-group">
  52. <input type="text" class="form-control" placeholder="Search" name="search" value="{$search}" required="required" />
  53. <span class="input-group-btn"><button type="submit" class="btn btn-default"><i class="glyphicon glyphicon-search"></i></button>
  54. </span>
  55. </div>
  56. </div>
  57. </form>
  58. </div>
  59. <!-- /.navbar-collapse -->
  60. </div>
  61. <!-- /.container-fluid -->
  62. </nav>
  63. <!-- 面包屑 -->
  64. <div class="container">
  65. <div class="row">
  66. <div class="col-md-12">
  67. <ol class="breadcrumb">
  68. <li><a href="#">Home</a></li>
  69. <li><a href="#">Library</a></li>
  70. <li class="active">Data</li>
  71. </ol>
  72. </div>
  73. </div>
  74. </div>
  • 模板底部 app\view\public\footer.html
  1. <div class="container">
  2. <div class="row">
  3. <div class="col-md-12">
  4. <p>&copy 2021 Company, Inc.</p>
  5. </div>
  6. </div>
  7. </div>
  8. </body>
  9. </html>
  1. 创建博客继承视图 app\view\index\index.html
  1. {extend name='public/base'/}
  2. {block name='archive'}
  3. {if $archive}
  4. <div class="panel-heading">{$archive}</div>
  5. {/if}
  6. {/block}
  7. <!-- 列表 -->
  8. {block name='list'}
  9. {volist name='artList' id='vo' empty="暂无数据"}
  10. <div class="row">
  11. <div class="col-md-12">
  12. {if $p}
  13. <h1>{$vo.title}</h1>
  14. <p><span class="glyphicon glyphicon-time" aria-hidden="true"></span> {$vo.date} &nbsp; <span
  15. class="glyphicon glyphicon-eye-open" aria-hidden="true"></span> {$vo.num}</p>
  16. <p>{$vo.content|raw}</p>
  17. {else /}
  18. <div class="panel panel-default">
  19. <div class="panel-body">
  20. <div class="row">
  21. {if $vo.img}
  22. <div class="col-sm-3 col-md-3">
  23. <a href="/detail/{$vo.id}.html" title="{$vo.title}" class="thumbnail">
  24. <img alt="{$vo.title}" style="width:100%;max-height:110px;" src="{$vo.img}"
  25. alt="{$vo.title}">
  26. </a>
  27. </div>
  28. {/if}
  29. <div{if $vo.img} class="col-sm-9 col-md-9" {else/} class="col-sm-12 col-md-12" {/if}>
  30. <h3 style="margin-top: 0;"><a href="/detail/{$vo.id}.html"
  31. title="{$vo.title}">{$vo.title}</a></h3>
  32. <p>{$vo.content|mb_strimwidth=0,110,'...','utf-8'}</p>
  33. <p><a href="/detail/{$vo.id}.html" rel="nofollow" title="Reamd more"
  34. class="btn btn-primary" role="button">Read more...</a></p>
  35. </div>
  36. </div>
  37. </div>
  38. </div>
  39. {/if}
  40. </div>
  41. </div>
  42. {/volist}
  43. {/block}
  44. <!-- 分页 -->
  45. {block name='pages'}
  46. {empty name='p'}
  47. <div class="row">
  48. <div class="col-md-12 text-center">
  49. <nav aria-label="Page navigation">
  50. {$artList|raw}
  51. </nav>
  52. </div>
  53. </div>
  54. {/empty}
  55. {/block}
  56. <!-- 侧栏模块 -->
  57. {block name='side'}
  58. <div class="panel panel-default">
  59. <div class="panel-heading">
  60. <h3 class="panel-title">热门文章</h3>
  61. </div>
  62. <div class="panel-body">
  63. <!-- Panel content -->
  64. <div class="list-group">
  65. {volist name='hotList' id='vo' empty='暂无记录'}
  66. <a href="/detail/{$vo.id}.html"
  67. class="list-group-item{if $p === $vo.id} active{/if}">{$vo.title}<span
  68. class="badge">{$vo.num}</span></a>
  69. {/volist}
  70. </div>
  71. </div>
  72. </div>
  73. {/block}
  • 运行博客前端

分类运行

详情页运行

3.3 配置博客管理系统应用

  1. 创建公用继承模板文件
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  6. <title>layout 管理界面大布局示例 - Layui</title>
  7. <meta name="renderer" content="webkit">
  8. <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  9. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  10. <meta name="apple-mobile-web-app-status-bar-style" content="black">
  11. <meta name="apple-mobile-web-app-capable" content="yes">
  12. <meta name="format-detection" content="telephone=no">
  13. <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/layui@2.6.8/dist/css/layui.css" media="all">
  14. <style>
  15. /* 移动端 */
  16. @media screen and (max-width: 768px) {
  17. .layui-layout-admin .layui-layout-left,
  18. .layui-layout-admin .layui-body,
  19. .layui-layout-admin .layui-footer {
  20. left: 0;
  21. }
  22. .layui-layout-admin .layui-side {
  23. left: -300px;
  24. }
  25. }
  26. </style>
  27. </head>
  28. <body>
  29. <div class="layui-layout layui-layout-admin">
  30. <div class="layui-header">
  31. <div class="layui-logo layui-hide-xs layui-bg-black">layout demo</div>
  32. <!-- 头部区域(可配合layui 已有的水平导航) -->
  33. <ul class="layui-nav layui-layout-left">
  34. <!-- 移动端显示 -->
  35. <li class="layui-nav-item layui-show-xs-inline-block layui-hide-sm" lay-header-event="menuLeft">
  36. <i class="layui-icon layui-icon-spread-left"></i>
  37. </li>
  38. <li class="layui-nav-item layui-hide-xs"><a href="">nav 1</a></li>
  39. <li class="layui-nav-item layui-hide-xs"><a href="">nav 2</a></li>
  40. <li class="layui-nav-item layui-hide-xs"><a href="">nav 3</a></li>
  41. <li class="layui-nav-item">
  42. <a href="javascript:;">nav groups</a>
  43. <dl class="layui-nav-child">
  44. <dd><a href="">menu 11</a></dd>
  45. <dd><a href="">menu 22</a></dd>
  46. <dd><a href="">menu 33</a></dd>
  47. </dl>
  48. </li>
  49. </ul>
  50. <ul class="layui-nav layui-layout-right">
  51. <li class="layui-nav-item layui-hide layui-show-md-inline-block">
  52. <a href="javascript:;">
  53. <img src="//tva1.sinaimg.cn/crop.0.0.118.118.180/5db11ff4gw1e77d3nqrv8j203b03cweg.jpg"
  54. class="layui-nav-img">
  55. tester
  56. </a>
  57. <dl class="layui-nav-child">
  58. <dd><a href="">Your Profile</a></dd>
  59. <dd><a href="">Settings</a></dd>
  60. <dd><a href="">Sign out</a></dd>
  61. </dl>
  62. </li>
  63. <li class="layui-nav-item" lay-header-event="menuRight" lay-unselect>
  64. <a href="javascript:;">
  65. <i class="layui-icon layui-icon-more-vertical"></i>
  66. </a>
  67. </li>
  68. </ul>
  69. </div>
  70. <div class="layui-side layui-bg-black">
  71. <div class="layui-side-scroll">
  72. <!-- 左侧导航区域(可配合layui已有的垂直导航) -->
  73. <ul class="layui-nav layui-nav-tree" lay-filter="test">
  74. <li class="layui-nav-item layui-nav-itemed">
  75. <a class="" href="javascript:;">menu group 1</a>
  76. <dl class="layui-nav-child">
  77. <dd><a href="/admin/cat/" target="main">博客分类</a></dd>
  78. <dd><a href="/admin/boke/" target="main">博客文章</a></dd>
  79. <dd><a href="javascript:;">menu 3</a></dd>
  80. <dd><a href="">the links</a></dd>
  81. </dl>
  82. </li>
  83. <li class="layui-nav-item">
  84. <a href="javascript:;">menu group 2</a>
  85. <dl class="layui-nav-child">
  86. <dd><a href="javascript:;">list 1</a></dd>
  87. <dd><a href="javascript:;">list 2</a></dd>
  88. <dd><a href="">超链接</a></dd>
  89. </dl>
  90. </li>
  91. <li class="layui-nav-item"><a href="javascript:;">click menu item</a></li>
  92. <li class="layui-nav-item"><a href="">the links</a></li>
  93. </ul>
  94. </div>
  95. </div>
  96. <div class="layui-body">
  97. <!-- 内容主体区域 -->
  98. <iframe name="main" srcdoc="内容主体区域" scrolling="yes" style="width:100%;height:100%;border:none"></iframe>
  99. </div>
  100. <div class="layui-footer">
  101. <!-- 底部固定区域 -->
  102. 底部固定区域
  103. </div>
  104. </div>
  105. <script src="//cdn.jsdelivr.net/npm/layui@2.6.8/dist/layui.js" charset="utf-8"></script>
  106. <script>
  107. //JS
  108. layui.use(['element', 'layer', 'util'], function () {
  109. var element = layui.element
  110. , layer = layui.layer
  111. , util = layui.util
  112. , $ = layui.$;
  113. //头部事件
  114. util.event('lay-header-event', {
  115. //左侧菜单事件
  116. menuLeft: function (othis) {
  117. console.log(othis);
  118. layer.msg('展开左侧菜单的操作', { icon: 0 });
  119. }
  120. , menuRight: function () {
  121. layer.open({
  122. type: 1
  123. , title: '更多'
  124. , content: '<div style="padding: 15px;">处理右侧面板的操作</div>'
  125. , area: ['260px', '100%']
  126. , offset: 'rt' //右上角
  127. , anim: 5
  128. , shadeClose: true
  129. , scrollbar: false
  130. });
  131. }
  132. });
  133. });
  134. </script>
  135. </body>
  136. </html>
  • layui 供继承的列表页 app\view\public\list.html
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  6. <title>layout 管理界面大布局示例 - Layui</title>
  7. <meta name="renderer" content="webkit">
  8. <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  9. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  10. <meta name="apple-mobile-web-app-status-bar-style" content="black">
  11. <meta name="apple-mobile-web-app-capable" content="yes">
  12. <meta name="format-detection" content="telephone=no">
  13. <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/layui@2.6.8/dist/css/layui.css" media="all">
  14. </head>
  15. <body>
  16. <div style="padding: 15px;">
  17. <!-- 搜索框 -->
  18. {block name='search-form'}
  19. <div class="layui-form">
  20. <div class="layui-form-item" style="margin-bottom: 0;">
  21. <!-- 搜索字段 -->
  22. {block name='search-fields'}
  23. <div class="layui-inline">
  24. <label class="layui-form-label">ID</label>
  25. <div class="layui-input-block">
  26. <input type="text" name="id" value="" placeholder="请输入" class="layui-input">
  27. </div>
  28. </div>
  29. {/block}
  30. <div class="layui-inline"><button type="submit" lay-submit lay-filter="search" class="layui-btn"><i
  31. class="layui-icon layui-icon-search"></i></button></div>
  32. </div>
  33. </div>
  34. {/block}
  35. <!-- 数据表格 -->
  36. {block name='datatable'}
  37. <table id="dataTable" lay-filter="dataTable"></table>
  38. {/block}
  39. <!-- 头工具栏 -->
  40. {block name='toolbar'}
  41. <script type="text/html" id="toolbar">
  42. <div class="layui-btn-container">
  43. <button class="layui-btn layui-btn-sm" lay-event="delAll">批量删除</button>
  44. <button class="layui-btn layui-btn-sm" lay-event="add">添加</button>
  45. <button class="layui-btn layui-btn-sm" lay-event="refresh"><i class="layui-icon layui-icon-refresh"></i></button>
  46. </div>
  47. </script>
  48. {/block}
  49. <!-- 行工具 -->
  50. {block name='databar'}
  51. <script type="text/html" id="databar">
  52. <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">查看</a>
  53. <a class="layui-btn layui-btn layui-btn-xs" lay-event="edit">编辑</a>
  54. <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
  55. </script>
  56. {/block}
  57. </div>
  58. <script src="//cdn.jsdelivr.net/npm/layui@2.6.8/dist/layui.js" charset="utf-8"></script>
  59. <!-- js -->
  60. {block name='js'}
  61. <script>
  62. var url = "/module/controller/index", //请求路径
  63. page = true, //是否分页
  64. cols = [ //表头字段
  65. [{
  66. checkbox: true,
  67. fixed: 'left'
  68. }, {
  69. field: 'id',
  70. title: 'ID',
  71. width: 80,
  72. sort: true
  73. }, {
  74. title: '操作',
  75. align: 'center',
  76. width: 170,
  77. toolbar: '#databar'
  78. }]
  79. ];
  80. </script>
  81. {/block}
  82. <script>
  83. layui.use(['table', 'form', 'upload', 'layedit'], function () {
  84. var $ = layui.jquery,
  85. table = layui.table,
  86. form = layui.form;
  87. var controller = url.substring(0, url.lastIndexOf('/'));
  88. //渲染表格
  89. table.render({
  90. elem: '#dataTable',
  91. toolbar: '#toolbar',
  92. defaultToolbar: ['filter', 'print', 'exports'],
  93. cellMinWidth: 80,
  94. height: $('button[lay-filter="search"]').length ? 'full-95' : 'full-50',
  95. title: $(document).title,
  96. //数据接口
  97. url: url,
  98. //搜索
  99. where: {
  100. search: ""
  101. },
  102. //开启分页
  103. page: page,
  104. //表头
  105. cols: cols
  106. });
  107. // 搜索框事件
  108. form.on('submit(search)', function (data) {
  109. var field = data.field;
  110. //执行重载
  111. table.reload('dataTable', {
  112. where: {
  113. search: field
  114. }
  115. });
  116. });
  117. //头工具栏事件
  118. table.on('toolbar(dataTable)', function (obj) {
  119. var checkStatus = table.checkStatus(obj.config.id);
  120. var data = checkStatus.data;
  121. //批量删除
  122. if (obj.event === 'delAll') {
  123. if (data.length === 0) {
  124. return layer.msg('请选择数据');
  125. }
  126. layer.confirm('确定删除吗?', {
  127. icon: 3
  128. }, function (index) {
  129. var id = [];
  130. data.forEach(elem => {
  131. id.push(elem.id);
  132. });
  133. $.get(controller + '/del', {
  134. id
  135. }, function (res) {
  136. if (res.code) {
  137. return layer.msg(res.msg, {
  138. icon: 2
  139. });
  140. }
  141. layer.msg(res.msg);
  142. table.reload('dataTable');
  143. }, 'json');
  144. });
  145. }
  146. //添加
  147. if (obj.event === 'add') {
  148. layer.open({
  149. type: 2,
  150. maxmin: true,
  151. title: '添加',
  152. shadeClose: true,
  153. shade: 0.3,
  154. area: ["420px", "450px"],
  155. content: controller + '/add',
  156. });
  157. }
  158. //刷新
  159. if (obj.event === 'refresh') {
  160. table.reload('dataTable');
  161. }
  162. });
  163. //监听行工具事件
  164. table.on('tool(dataTable)', function (obj) {
  165. var data = obj.data;
  166. //删除行
  167. if (obj.event === 'del') {
  168. layer.confirm('真的删除行么?', {
  169. icon: 3
  170. }, function (index) {
  171. layer.close(index);
  172. $.get(controller + '/del', {
  173. id: data.id
  174. }, function (res) {
  175. if (res.code) {
  176. return layer.msg(res.msg, {
  177. icon: 2
  178. });
  179. }
  180. obj.del();
  181. layer.msg(res.msg);
  182. }, 'json');
  183. });
  184. }
  185. //编辑行
  186. if (obj.event === 'edit') {
  187. layer.open({
  188. type: 2,
  189. maxmin: true,
  190. title: '编辑',
  191. shadeClose: true,
  192. shade: 0.3,
  193. area: ["420px", "450px"],
  194. content: controller + '/edit?id=' + data.id,
  195. success: function (layero, index) {
  196. form.on('submit(submit)', function (res) {
  197. var field = res.field;
  198. field.id = data.id;
  199. $.post(controller + '/save_edit', field, function (res) {
  200. if (res.code) {
  201. return layer.msg(res.msg, {
  202. icon: 2
  203. });
  204. }
  205. layer.msg(res.msg);
  206. obj.update(field);
  207. layer.close(index);
  208. }, 'json');
  209. });
  210. }
  211. });
  212. }
  213. //详情页
  214. if (obj.event === 'detail') {
  215. window.open(controller.substring(controller.indexOf('/', 2)) + '/' + data.id + '.html', '_blank');
  216. }
  217. });
  218. });
  219. </script>
  220. </body>
  221. </html>
  • layui 供继承的表单页 app\view\public\form.html
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  6. <title>layout 管理界面大布局示例 - Layui</title>
  7. <meta name="renderer" content="webkit">
  8. <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  9. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  10. <meta name="apple-mobile-web-app-status-bar-style" content="black">
  11. <meta name="apple-mobile-web-app-capable" content="yes">
  12. <meta name="format-detection" content="telephone=no">
  13. <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/layui@2.6.8/dist/css/layui.css" media="all">
  14. </head>
  15. <body>
  16. <div style="padding: 15px;">
  17. {block name='form'}
  18. <form class="layui-form" action="">
  19. {block name='fields'}
  20. <div class="layui-form-item">
  21. <label class="layui-form-label">输入框</label>
  22. <div class="layui-input-block">
  23. <input type="text" name="title" value="" lay-verify="required" placeholder="请输入" class="layui-input">
  24. </div>
  25. </div>
  26. {/block}
  27. {block name='submit'}
  28. <div class="layui-form-item">
  29. <div class="layui-input-block">
  30. <button type="submit" class="layui-btn" lay-submit="" lay-filter="submit">提交</button>
  31. <button type="reset" class="layui-btn layui-btn-primary">重置</button>
  32. </div>
  33. </div>
  34. {/block}
  35. </form>
  36. {/block}
  37. </div>
  38. <script src="//cdn.jsdelivr.net/npm/layui@2.6.8/dist/layui.js" charset="utf-8"></script>
  39. <!-- js -->
  40. {block name='js'}
  41. <script>
  42. //请求路径
  43. var url = "/module/controller/save";
  44. </script>
  45. {/block}
  46. <script>
  47. layui.use(['form', 'upload', 'laydate'], function () {
  48. var $ = layui.jquery,
  49. form = layui.form,
  50. upload = layui.upload,
  51. laydate = layui.laydate;
  52. //监听提交
  53. form.on("submit(submit)", function (data) {
  54. $.post(url, data.field, function (res) {
  55. if (res.code) {
  56. return layer.alert(res.msg, {
  57. icon: 2
  58. });
  59. }
  60. layer.alert(res.msg, {
  61. icon: 1
  62. });
  63. setTimeout(function () {
  64. parent.location.reload();
  65. }, 1000);
  66. }, "json");
  67. return false;
  68. });
  69. });
  70. </script>
  71. </body>
  72. </html>
  1. 管理系统控制器
  • 分类控制器 app\admin\controller\Cat.php
  1. namespace app\admin\controller;
  2. use app\common\controller\Base;
  3. use app\common\model\Cat as CatModel;
  4. use think\facade\View;
  5. use think\facade\Request;
  6. class Cat extends Base
  7. {
  8. // 列表
  9. public function index()
  10. {
  11. if (Request::isAjax()) {
  12. $db = CatModel::order('sort', 'desc');
  13. $data['count'] = $db->count();
  14. if ($data['count']) {
  15. $data['code'] = 0;
  16. } else {
  17. $data['code'] = 1;
  18. $data['msg'] = '暂无记录';
  19. }
  20. $data['data'] = $db->select();
  21. return json($data);
  22. }
  23. return view::fetch('/cat/index');
  24. }
  25. // 添加
  26. public function add()
  27. {
  28. return view::fetch('/cat/add');
  29. }
  30. // 保存
  31. public function save()
  32. {
  33. $data = Request::param();
  34. // 验证
  35. try {
  36. $this->validate($data, [
  37. 'name|分类' => 'require|chsAlpha|unique:cat', // 验证名称唯一
  38. 'sort|排序' => 'require|number',
  39. 'status|状态' => 'require|in:0,1',
  40. ]);
  41. } catch (\Exception $th) {
  42. return json(['code' => 1, 'msg' => $th->getMessage()]);
  43. }
  44. // 操作
  45. CatModel::create($data);
  46. return json(['code' => 0, 'msg' => '添加成功']);
  47. }
  48. // 编辑
  49. public function edit()
  50. {
  51. $data = Request::param();
  52. // 验证
  53. try {
  54. $this->validate($data, [
  55. 'id|分类ID' => 'require|number|unique:cat', // 验证ID唯一
  56. ]);
  57. } catch (\Exception $th) {
  58. return json(['code' => 1, 'msg' => $th->getMessage()]);
  59. }
  60. view::assign('data', CatModel::where('id', $data['id'])->find());
  61. return view::fetch('/cat/edit');
  62. }
  63. // 保存编辑
  64. public function save_edit()
  65. {
  66. $data = Request::param();
  67. // 验证
  68. try {
  69. $this->validate($data, [
  70. 'id|分类ID' => 'require|number|unique:cat', // 验证ID唯一
  71. 'name|分类' => 'require|chsAlpha|unique:cat', // 验证名称唯一
  72. 'sort|排序' => 'require|number',
  73. 'status|状态' => 'require|in:0,1',
  74. ]);
  75. } catch (\Exception $th) {
  76. return json(['code' => 1, 'msg' => $th->getMessage()]);
  77. }
  78. // 操作
  79. CatModel::where('id', $data['id'])->update($data);
  80. return json(['code' => 0, 'msg' => '修改成功']);
  81. }
  82. // 删除
  83. public function del() {
  84. $data = Request::param();
  85. // 操作
  86. CatModel::whereIn('id', (array)$data['id'])->delete();
  87. return json(['code' => 0, 'msg' => '删除成功']);
  88. }
  89. }
  • 内容控制器 app\admin\controller\Boke.php
  1. namespace app\admin\controller;
  2. use app\common\controller\Base;
  3. use app\common\model\Boke as BokeModel;
  4. use app\common\model\Cat as CatModel;
  5. use think\facade\View;
  6. use think\facade\Request;
  7. class Boke extends Base
  8. {
  9. // 列表
  10. public function index()
  11. {
  12. if (Request::isAjax()) {
  13. $req = Request::param();
  14. $map = [];
  15. // 搜索
  16. if ($req['search']) {
  17. foreach((array)$req['search'] as $k => $v) {
  18. if ($v) $map[] = [$k, 'like', "%{$v}%"];
  19. }
  20. }
  21. // 查询
  22. $db = BokeModel::where($map)->order('id', 'desc');
  23. $data['count'] = $db->count();
  24. if ($data['count']) {
  25. $data['code'] = 0;
  26. } else {
  27. $data['code'] = 1;
  28. $data['msg'] = '暂无记录';
  29. }
  30. // 分页
  31. $data['data'] = $db->page($req['page'], $req['limit'])->select();
  32. return json($data);
  33. }
  34. return view::fetch('/boke/index');
  35. }
  36. // 添加
  37. public function add()
  38. {
  39. $cats = CatModel::where('status', 1)->order('sort', 'desc')->select();
  40. view::assign('cats', $cats);
  41. return view::fetch('/boke/add');
  42. }
  43. // 保存
  44. public function save()
  45. {
  46. $data = Request::param();
  47. // 验证
  48. try {
  49. $this->validate($data, [
  50. 'title|标题' => 'require|unique:boke', // 验证标题唯一
  51. 'content|内容' => 'require',
  52. 'cat|分类' => 'require|number',
  53. 'status|状态' => 'require|in:0,1',
  54. ]);
  55. } catch (\Exception $th) {
  56. return json(['code' => 1, 'msg' => $th->getMessage()]);
  57. }
  58. // 操作
  59. CatModel::create($data);
  60. return json(['code' => 0, 'msg' => '添加成功']);
  61. }
  62. // 编辑
  63. public function edit()
  64. {
  65. $data = Request::param();
  66. // 验证
  67. try {
  68. $this->validate($data, [
  69. 'id|文章ID' => 'require|number|unique:cat', // 验证ID唯一
  70. ]);
  71. } catch (\Exception $th) {
  72. return json(['code' => 1, 'msg' => $th->getMessage()]);
  73. }
  74. $cats = CatModel::where('status', 1)->order('sort', 'desc')->select();
  75. view::assign('cats', $cats);
  76. view::assign('data', BokeModel::where('id', $data['id'])->find());
  77. return view::fetch('/boke/edit');
  78. }
  79. // 保存编辑
  80. public function save_edit()
  81. {
  82. $data = Request::param();
  83. // 验证
  84. try {
  85. $this->validate($data, [
  86. 'id|文章ID' => 'require|number|unique:cat', // 验证ID唯一
  87. 'title|标题' => 'require|unique:boke', // 验证标题唯一
  88. 'content|内容' => 'require',
  89. 'cat|分类' => 'require|number',
  90. 'status|状态' => 'require|in:0,1',
  91. ]);
  92. } catch (\Exception $th) {
  93. return json(['code' => 1, 'msg' => $th->getMessage()]);
  94. }
  95. // 操作
  96. BokeModel::where('id', $data['id'])->update($data);
  97. return json(['code' => 0, 'msg' => '修改成功']);
  98. }
  99. // 删除
  100. public function del() {
  101. $data = Request::param();
  102. // 操作
  103. BokeModel::whereIn('id', (array)$data['id'])->delete();
  104. return json(['code' => 0, 'msg' => '删除成功']);
  105. }
  106. }
  1. 管理系统视图

3.1 分类视图

  • 分类列表视图 app\view\cat\index.html
  1. <!-- 继承列表 -->
  2. {extend name='public/list'/}
  3. <!-- 搜索框置空 -->
  4. {block name='search-form'}
  5. {/block}
  6. <!-- js -->
  7. {block name='js'}
  8. <script>
  9. var url = "/admin/cat/index", //请求路径
  10. page = false, //是否分页
  11. cols = [ //表头字段
  12. [{
  13. checkbox: true,
  14. fixed: 'left'
  15. }, {
  16. field: 'id',
  17. title: 'ID',
  18. width: 80,
  19. sort: true
  20. }, {
  21. field: 'name',
  22. title: '分类名称',
  23. }, {
  24. field: 'sort',
  25. title: '排序',
  26. sort: true
  27. }, {
  28. field: 'status',
  29. title: '状态',
  30. sort: true
  31. }, {
  32. title: '操作',
  33. align: 'center',
  34. width: 170,
  35. toolbar: '#databar'
  36. }]
  37. ];
  38. </script>
  39. {/block}
  • 添加表单视图 app\view\cat\add.html
  1. <!-- 继承表单 -->
  2. {extend name='public/form'/}
  3. {block name='fields'}
  4. <div class="layui-form-item">
  5. <label class="layui-form-label">分类名称</label>
  6. <div class="layui-input-block">
  7. <input type="text" name="name" value="" lay-verify="required" placeholder="请输入" class="layui-input">
  8. </div>
  9. </div>
  10. <div class="layui-form-item">
  11. <label class="layui-form-label">排序</label>
  12. <div class="layui-input-inline">
  13. <input type="number" name="sort" value="0" lay-verify="required" placeholder="请输入" class="layui-input">
  14. </div>
  15. </div>
  16. <div class="layui-form-item">
  17. <label class="layui-form-label">状态</label>
  18. <div class="layui-input-inline">
  19. <select name="status">
  20. <option value="1" selected>正常</option>
  21. <option value="0">禁用</option>
  22. </select>
  23. </div>
  24. </div>
  25. {/block}
  26. {block name='js'}
  27. <script>
  28. //请求路径
  29. var url = "/admin/cat/save";
  30. </script>
  31. {/block}
  • 编辑表单视图 app\view\cat\edit.html
  1. <!-- 继承表单 -->
  2. {extend name='public/form'/}
  3. {block name='fields'}
  4. <input type="hidden" name="id" value="{$data['id']}">
  5. <div class="layui-form-item">
  6. <label class="layui-form-label">分类名称</label>
  7. <div class="layui-input-block">
  8. <input type="text" name="name" value="{$data['name']}" lay-verify="required" placeholder="请输入" class="layui-input">
  9. </div>
  10. </div>
  11. <div class="layui-form-item">
  12. <label class="layui-form-label">排序</label>
  13. <div class="layui-input-inline">
  14. <input type="number" name="sort" value="{$data['sort']}" lay-verify="required" placeholder="请输入" class="layui-input">
  15. </div>
  16. </div>
  17. <div class="layui-form-item">
  18. <label class="layui-form-label">状态</label>
  19. <div class="layui-input-inline">
  20. <select name="status">
  21. <option value="1"{if $data->getData('status') == '1'} selected{/if}>正常</option>
  22. <option value="0"{if $data->getData('status') == '0'} selected{/if}>禁用</option>
  23. </select>
  24. </div>
  25. </div>
  26. {/block}
  27. {block name='js'}
  28. <script>
  29. //请求路径
  30. var url = "/admin/cat/save_edit";
  31. </script>
  32. {/block}

3.2 内容视图

  • 内容列表视图 app\view\boke\index.html
  1. <!-- 继承列表 -->
  2. {extend name='public/list'/}
  3. <!-- 搜索框字段 -->
  4. {block name='search-fields'}
  5. <div class="layui-inline">
  6. <label class="layui-form-label">ID</label>
  7. <div class="layui-input-block">
  8. <input type="text" name="id" value="" placeholder="请输入" class="layui-input">
  9. </div>
  10. </div>
  11. <div class="layui-inline">
  12. <label class="layui-form-label">标题</label>
  13. <div class="layui-input-block">
  14. <input type="text" name="title" value="" placeholder="请输入" class="layui-input">
  15. </div>
  16. </div>
  17. <div class="layui-inline">
  18. <label class="layui-form-label">内容</label>
  19. <div class="layui-input-block">
  20. <input type="text" name="content" value="" placeholder="请输入" class="layui-input">
  21. </div>
  22. </div>
  23. {/block}
  24. <!-- js -->
  25. {block name='js'}
  26. <script>
  27. var url = "/admin/boke/index", //请求路径
  28. page = true, //是否分页
  29. cols = [ //表头字段
  30. [{
  31. checkbox: true,
  32. fixed: 'left'
  33. }, {
  34. field: 'id',
  35. title: 'ID',
  36. width: 80,
  37. sort: true
  38. }, {
  39. field: 'title',
  40. title: '标题',
  41. minWidth: 240
  42. }, {
  43. field: 'img',
  44. title: '图片',
  45. sort: true
  46. }, {
  47. field: 'cat',
  48. title: '分类'
  49. }, {
  50. field: 'num',
  51. title: '浏览量',
  52. sort: true,
  53. hide: true //隐藏列
  54. }, {
  55. field: 'hot',
  56. title: '热门',
  57. sort: true,
  58. hide: true //隐藏列
  59. }, {
  60. field: 'status',
  61. title: '状态',
  62. sort: true
  63. }, {
  64. title: '操作',
  65. align: 'center',
  66. width: 170,
  67. toolbar: '#databar'
  68. }]
  69. ];
  70. </script>
  71. {/block}
  • 添加表单视图 app\view\boke\add.html
  1. <!-- 继承表单 -->
  2. {extend name='public/form'/}
  3. {block name='fields'}
  4. <div class="layui-form-item">
  5. <label class="layui-form-label">标题</label>
  6. <div class="layui-input-block">
  7. <input type="text" name="title" value="" lay-verify="required" placeholder="请输入" class="layui-input">
  8. </div>
  9. </div>
  10. <div class="layui-form-item">
  11. <label class="layui-form-label">内容</label>
  12. <div class="layui-input-block">
  13. <textarea name="content" lay-verify="required" placeholder="请输入内容" class="layui-textarea"></textarea>
  14. </div>
  15. </div>
  16. <div class="layui-form-item">
  17. <label class="layui-form-label">图片</label>
  18. <div class="layui-input-block">
  19. <input type="text" name="img" value="" class="layui-input">
  20. </div>
  21. </div>
  22. <div class="layui-form-item">
  23. <label class="layui-form-label">分类</label>
  24. <div class="layui-input-inline">
  25. <select name="cat" lay-verify="required">
  26. <option value="" selected>&mdash; 请选择 &mdash;</option>
  27. {volist name='cats' id='vo'}
  28. <option value="{$vo.id}">{$vo.name}</option>
  29. {/volist}
  30. </select>
  31. </div>
  32. </div>
  33. <div class="layui-form-item">
  34. <label class="layui-form-label">浏览量</label>
  35. <div class="layui-input-inline">
  36. <input type="text" name="num" value="" class="layui-input">
  37. </div>
  38. </div>
  39. <div class="layui-form-item">
  40. <label class="layui-form-label">热门</label>
  41. <div class="layui-input-inline">
  42. <input type="hidden" name="hot" value="0">
  43. <input type="checkbox" name="hot" lay-skin="primary" value="1" title="热门文章">
  44. </div>
  45. </div>
  46. <div class="layui-form-item">
  47. <label class="layui-form-label">状态</label>
  48. <div class="layui-input-inline">
  49. <select name="status">
  50. <option value="1" selected>正常</option>
  51. <option value="0">禁用</option>
  52. </select>
  53. </div>
  54. </div>
  55. {/block}
  56. {block name='js'}
  57. <script>
  58. //请求路径
  59. var url = "/admin/boke/save";
  60. </script>
  61. {/block}
  • 编辑表单视图 app\view\boke\edit.html
  1. <!-- 继承表单 -->
  2. {extend name='public/form'/}
  3. {block name='fields'}
  4. <input type="hidden" name="id" value="{$data['id']}">
  5. <div class="layui-form-item">
  6. <label class="layui-form-label">标题</label>
  7. <div class="layui-input-block">
  8. <input type="text" name="title" value="{$data['title']}" lay-verify="required" placeholder="请输入" class="layui-input">
  9. </div>
  10. </div>
  11. <div class="layui-form-item">
  12. <label class="layui-form-label">内容</label>
  13. <div class="layui-input-block">
  14. <textarea name="content" lay-verify="required" placeholder="请输入内容" class="layui-textarea">{$data['content']}</textarea>
  15. </div>
  16. </div>
  17. <div class="layui-form-item">
  18. <label class="layui-form-label">图片</label>
  19. <div class="layui-input-block">
  20. <input type="text" name="img" value="{$data->getData('img')}" class="layui-input">
  21. </div>
  22. </div>
  23. <div class="layui-form-item">
  24. <label class="layui-form-label">分类</label>
  25. <div class="layui-input-inline">
  26. <select name="cat" lay-verify="required">
  27. <option value="">&mdash; 请选择 &mdash;</option>
  28. {volist name='cats' id='vo'}
  29. <option value="{$vo.id}"{if $data->getData('cat') == $vo.id} selected{/if}>{$vo.name}</option>
  30. {/volist}
  31. </select>
  32. </div>
  33. </div>
  34. <div class="layui-form-item">
  35. <label class="layui-form-label">浏览量</label>
  36. <div class="layui-input-inline">
  37. <input type="text" name="num" value="{$data['num']}" class="layui-input">
  38. </div>
  39. </div>
  40. <div class="layui-form-item">
  41. <label class="layui-form-label">热门</label>
  42. <div class="layui-input-inline">
  43. <input type="hidden" name="hot" value="0">
  44. <input type="checkbox" name="hot" lay-skin="primary" value="1" title="热门文章"{if ($data['hot'])} checked{/if}>
  45. </div>
  46. </div>
  47. <div class="layui-form-item">
  48. <label class="layui-form-label">状态</label>
  49. <div class="layui-input-inline">
  50. <select name="status">
  51. <option value="1"{if $data->getData('status') == '1'} selected{/if}>正常</option>
  52. <option value="0"{if $data->getData('status') == '0'} selected{/if}>禁用</option>
  53. </select>
  54. </div>
  55. </div>
  56. {/block}
  57. {block name='js'}
  58. <script>
  59. //请求路径
  60. var url = "/admin/boke/save_edit";
  61. </script>
  62. {/block}

3.3 运行管理系统布局

  • 分类管理,编辑一个分类测试

分类管理

  • 内容管理,搜索 linux 测试

内容管理

  • 内容编辑,修改状态测试

内容编辑

修改测试

批改老师:天蓬老师天蓬老师

批改状态:合格

老师批语:坚持不易,看好你
本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学