rabin 4 years ago
parent
commit
02cecd7c97

+ 9 - 2
assets/layadmin/html/project/database/list.html

@@ -110,11 +110,11 @@
 </div>
 
   <script class="include" system="" path="inc/" file="script">include()</script>
-  <script ids="list-thead">
+  <script id="list-thead-data">
     config.table = {};
     config.table.cols = [];
   </script>
-  <script ids="list-tbody">
+  <script id="list-tbody-data">
     config.table.data = [];
   </script>
   <script>
@@ -139,6 +139,13 @@
     */
 
     init();
+
+    if ($('.dever-manage').length) {
+      $('.dever-manage').click(function()
+      {
+        showMsg('数据结构', $(this), '#struct');
+      })
+    }
   });
   </script>
 </body>

+ 31 - 0
config/base.php

@@ -27,6 +27,37 @@ $config['base'] = array
 
 	# 后台管理的数据执行权限的设置
 	'manageAuthData' => '',
+
+	# 后台左侧主菜单,定义了这个之后,所有deverapp中的project建立主菜单功能将失效
+	/*
+	'menu' => array
+	(
+		# 菜单名
+		'demand' => array
+		(
+			# 菜单名称
+			'name' => '需求管理',
+			# 哪些项目包含进来,多个用逗号隔开,直接把该项目中的database放到该菜单下
+			'project' => 'demand,service',
+			# 菜单图标 直接使用哪个project的图标
+			'icon' => 'demand',
+			# 排序
+			'order' => 100,
+		),
+
+		'main' => array
+		(
+			# 菜单名称
+			'name' => '系统设置',
+			# 哪些项目包含进来,多个用逗号隔开,直接把该项目中的database放到该菜单下
+			'project' => 'main,score,attr,category',
+			# 菜单图标 直接使用哪个project的图标
+			'icon' => 'main',
+			# 排序
+			'order' => 99,
+		),
+	)
+	*/
 );
 
 # 模板配置

+ 10 - 0
database/admin.php

@@ -71,6 +71,16 @@ return array
 	# 显示给用户看的名称
 	'lang' => '管理账户设置',
 	'desc' => $desc,
+
+	/* 设置上级菜单,当config里设置menu后,这里将失效
+	'parent' => array
+	(
+		'key' => 'kefu',
+		'order' => 1,
+		'name' => '客服设置',
+	),
+	*/
+
 	# 这个表不使用cache功能
 	//'cache' => false,
 	/*

+ 39 - 6
database/menu.php

@@ -88,11 +88,24 @@ return array
 			'default' 	=> -1,
 			'desc' 		=> '请选择上级菜单',
 			'match' 	=> 'is_numeric',
-			'update'	=> 'select',
-			'search'	=> 'order,select',
+			//'update'	=> 'select',
+			//'search'	=> 'order,select',
+			'value'		=> Dever::input('option_menu_id', -1),
 			'list'		=> '{menu_id} > 0 ? Dever::load("manage/menu-one#name", {menu_id}) : "父级菜单"',
 			'option' 	=> $menu,
 		),
+
+		'menu'		=> array
+		(
+			'type' 		=> 'varchar-800',
+			'name' 		=> '上级菜单',
+			'default' 	=> Dever::input('option_menu', -1),
+			'desc' 		=> '请选择上级菜单',
+			'match' 	=> 'is_string',
+			'update'	=> 'linkage',
+			'linkage' 	=> 'id=' . Dever::input('where_id'),
+			'option'	=> Dever::url('menu.getCate', 'manage'),
+		),
 		
 		'key'		=> array
 		(
@@ -103,7 +116,7 @@ return array
 			'match' 	=> 'option',
 			'update'	=> 'text',
 			'search'	=> 'fulltext',
-			'list'		=> true,
+			//'list'		=> true,
 			//'modal'		=> 'test',
 		),
 
@@ -141,8 +154,8 @@ return array
 			'desc' 		=> '请选择开启子菜单',
 			'match' 	=> 'is_numeric',
 			'option' 	=> $type,
-			'update'	=> 'radio',
-			'list'		=> true,
+			//'update'	=> 'radio',
+			//'list'		=> true,
 		),
 
 		'icon'		=> array
@@ -192,7 +205,14 @@ return array
 	
 	'manage' => array
 	(
-		'list_button' => array('delete' => '删除'),
+		# 列表页的类型
+		'list_type' => 'tree',
+		'list_button' => array
+		(
+			'update' => '编辑',
+			'add' => array('新增子菜单', '"{menu}" == -1 ? "menu&option_menu={id}" : "menu&option_menu={menu},{id}"'),
+			'delete' => '删除',
+		),
 		'button' => array
 		(
 			'更新菜单' => 'manage/menu.update',
@@ -205,6 +225,19 @@ return array
 	# request 请求接口定义
 	'request' => array
 	(
+		'getAll' => array
+		(
+			# 匹配的正则或函数 选填项
+			'option' => array
+			(
+				'menu_id' => 'yes',
+				'id' => array('yes', '!='),
+				'state' => 1,
+			),
+			'type' => 'all',
+			'order' => array('reorder' => 'desc', 'id' => 'asc'),
+			'col' => 'id as value, name',
+		),
 		# info 取一条正常的数据
 		'info' => array
 		(

+ 1 - 1
src/Database.php

@@ -1385,7 +1385,7 @@ class Database
                         );
                         $result[] = $layui;
                     } else {
-                        $result[] = '<th data-priority="1">' . $config['manage']['_list']['name'] . '</th>';
+                        $result[] = '<th data-priority="1" class="dever-manage">' . $config['manage']['_list']['name'] . '</th>';
                     }
                 }
             }

+ 229 - 30
src/Menu.php

@@ -19,6 +19,18 @@ class Menu
      */
     private $data = array();
 
+    private $default = array
+    (
+        'value' => -1,
+        'name' => '不选择',
+    );
+
+    private $search_default = array
+    (
+        'value' => -1,
+        'name' => '菜单',
+    );
+
     /**
      * __construct
      *
@@ -53,6 +65,61 @@ class Menu
         }
     }
 
+    # 菜单无限分类
+    public function getCate()
+    {
+        # 联动总数
+        $level_total = 100;
+
+        # 当前联动级别
+        $level_num = Dever::input('level_num', 1);
+
+        # 一般为id
+        $level_id = Dever::input('level_id');
+
+        # 传入的参数
+        $level_param = Dever::input('level_param');
+        if ($level_param) {
+            parse_str($level_param, $param);
+            $where['id'] = $param['id'];
+        }
+
+        # 是否是搜索列表页
+        $level_search = Dever::input('level_search');
+        if ($level_search) {
+            $default = $this->search_default;
+            $default['name'] = $level_num . '级' . $default['name'];
+        } else {
+            $default = $this->default;
+        }
+
+        $data = array();
+
+        # 三级联动
+        if ($level_num == 1) {
+            $where['menu_id'] = -1;
+        } elseif($level_id > 0) {
+            $where['menu_id'] = $level_id;
+        }
+
+        if (isset($where['menu_id'])) {
+            $data = Dever::db('manage/menu')->getAll($where);
+        }
+
+        if ($data || $level_num == 1) {
+            array_unshift($data, $default);
+        }
+
+        if (!$data) {
+            Dever::alert('error');
+        }
+
+        $result['level_total'] = $level_total;
+        $result['list'] = $data;
+
+        return $result;
+    }
+
     /**
      * menu 从数据库中得到所有菜单,如果为空,则从项目中读取一次
      *
@@ -99,26 +166,10 @@ class Menu
                     continue;
                 }
 
-                if (isset($child[$v['id']])) {
-                    foreach ($child[$v['id']] as $i => $j) {
-                        if ($auth && strpos($auth, $i) === false) {
-                            //unset($child[$parent][$i]);
-                            //continue;
-                        } else {
-                            if ($j['link'] && $i != 'console.index') {
-                                $j['link'] = Dever::url($j['link'] . '&menu_id=' . $j['id']);
-                            }
-                            $menu[$k]['child'][$i] = $j;
+                $menu[$k] = $this->getChild($menu[$k], $child, $v, $auth);
 
-                            if ($j['fast'] == 1) {
-                                $this->fast[$i] = $j;
-                            }
-                        }
-                    }
-
-                    if (!isset($menu[$k]['child'])) {
-                        unset($menu[$k]);
-                    }
+                if (!isset($menu[$k]['child'])) {
+                    unset($menu[$k]);
                 }
             }
         } elseif (!$ms && $state == 2) {
@@ -131,6 +182,31 @@ class Menu
         return $menu;
     }
 
+    public function getChild($menu, $child, $v, $auth)
+    {
+        if (isset($child[$v['id']])) {
+            foreach ($child[$v['id']] as $i => $j) {
+                if ($auth && strpos($auth, $i) === false) {
+                    //unset($child[$parent][$i]);
+                    //continue;
+                } else {
+                    if ($j['link'] && $i != 'console.index') {
+                        $j['link'] = Dever::url($j['link'] . '&menu_id=' . $j['id']);
+                    }
+                    $menu['child'][$i] = $j;
+
+                    $menu['child'][$i] = $this->getChild($menu['child'][$i], $child, $j, $auth);
+
+                    if ($j['fast'] == 1) {
+                        $this->fast[$i] = $j;
+                    }
+                }
+            }
+        }
+
+        return $menu;
+    }
+
     /**
      * 清空所有菜单
      *
@@ -157,6 +233,23 @@ class Menu
         Dever::out('yes');
     }
 
+    private function getKey($k, $i, $j)
+    {
+        if (is_string($j['menu'])) {
+            $m = $j['menu'];
+        } else {
+            $m = $k;
+        }
+
+        if ($m == $k) {
+            $key = $k . '.' . $i;
+        } else {
+            $key = $m . '.' . $k . '.' . $i;
+        }
+
+        return array($m, $key);
+    }
+
     /**
      * 载入从项目中定义好的菜单
      *
@@ -189,6 +282,7 @@ class Menu
         $top = Dever::load('manage/top');
         $auth = Dever::load('manage/auth');
 
+        $child = array();
         foreach ($project as $k => $v) {
 
             if (!isset($v['url'])) {
@@ -209,22 +303,27 @@ class Menu
                         $j['menu'] = true;
                     }
                     if (isset($j['manage']) && $j['menu'] != false) {
-                        if (is_string($j['menu'])) {
-                            $m = $j['menu'];
-                        } else {
-                            $m = $k;
-                        }
+                        list($m, $key) = $this->getKey($k, $i, $j);
 
-                        if ($m == $k) {
-                            $key = $k . '.' . $i;
-                        } else {
-                            $key = $m . '.' . $k . '.' . $i;
-                        }
                         $project[$m]['child'][$i]['key'] = $key;
                         $project[$m]['child'][$i]['name'] = $j['lang'];
                         $project[$m]['child'][$i]['link'] = 'project/database/list?project=' . $k . '&table=' . $i . '&menu=' . $m . '&search_option_state=1';
                         $project[$m]['child'][$i]['order'] = isset($j['order']) ? $j['order'] : 1;
                         $project[$m]['child'][$i]['fast'] = isset($j['fast']) ? $j['fast'] : 2;
+
+                        if (isset($j['parent'])) {
+                            $parent = $j['parent'];
+                            $parent['menu'] = $parent['key'];
+                            list($parent_menu, $parent_key) = $this->getKey($k, $parent['name'], $parent);
+
+                            $project[$m]['child'][$i]['parent'] = array();
+                            $project[$m]['child'][$i]['parent']['key'] = $parent_key;
+                            $project[$m]['child'][$i]['parent']['name'] = $parent['name'];
+                            $project[$m]['child'][$i]['parent']['link'] = '';
+                            $project[$m]['child'][$i]['parent']['order'] = isset($parent['order']) ? $parent['order'] : 1;
+                            $project[$m]['child'][$i]['parent']['fast'] = isset($parent['fast']) ? $parent['fast'] : 2;
+
+                        }
                     }
                 }
             } else {
@@ -236,6 +335,33 @@ class Menu
 
         # 将所有数据都记录到菜单中
         if ($project) {
+            $menu = Dever::config('base', 'manage')->menu;
+
+            if ($menu) {
+                $old = $project;
+                $project = array();
+                if (!isset($menu['console']) && isset($old['console'])) {
+                    $project['console'] = $old['console'];
+                }
+                foreach ($menu as $k => $v) {
+                    $project[$k] = $v;
+                    $project[$k]['key'] = $v['project'];
+                    $project[$k]['lang'] = $v['name'];
+                    $project[$k]['path'] = $k;
+                    $project[$k]['icon'] = $old[$v['icon']]['icon'];
+                    $child = explode(',', $v['project']);
+                    foreach ($child as $k1 => $v1) {
+                        $project[$k]['child'][$v1] = $old[$v1];
+                        $project[$k]['child'][$v1]['key'] = $v1;
+                        $project[$k]['child'][$v1]['link'] = $old[$v1]['url'];
+                        $project[$k]['child'][$v1]['fast'] = 2;
+                    }
+                }
+                if (!isset($project['manage']) && isset($old['manage'])) {
+                    $project['manage'] = $old['manage'];
+                }
+            }
+
             foreach ($project as $k => $v) {
                 if (!isset($v['child'])) {
                     unset($project[$k]);
@@ -246,7 +372,20 @@ class Menu
                     $id = $this->updateMenu($k, $v['lang'], $v['path'] . ':' . $v['name'], -1, $v['order'], 2, (isset($v['icon']) ? $v['icon'] : ''));
                     if ($id > 0) {
                         foreach ($v['child'] as $i => $j) {
-                            $this->updateMenu($j['key'], $j['name'], $j['link'], $id, $j['order'], $j['fast']);
+                            if (isset($j['child']) && $j['child']) {
+                                $parent = $this->updateMenu($j['key'], $j['name'], $j['link'], $id, $j['order'], $j['fast']);
+                                foreach ($j['child'] as $i1 => $j1) {
+                                    $this->updateMenu($j1['key'], $j1['name'], $j1['link'], $parent, $j1['order'], $j1['fast']);
+                                }
+                            } elseif (isset($j['parent']) && $j['parent']) {
+                                $p = $j['parent'];
+                                $parent = $this->updateMenu($p['key'], $p['name'], $p['link'], $id, $p['order'], $p['fast']);
+                                if ($parent) {
+                                    $this->updateMenu($j['key'], $j['name'], $j['link'], $parent, $j['order'], $j['fast']);
+                                }
+                            } else {
+                                $this->updateMenu($j['key'], $j['name'], $j['link'], $id, $j['order'], $j['fast']);
+                            }
                         }
                     }
                 }
@@ -354,6 +493,7 @@ class Menu
             $update['add_name'] = $name;
             $update['add_link'] = $link;
             $update['add_menu_id'] = $menu;
+            $update['add_menu'] = $menu;
             $update['add_reorder'] = $order;
             $update['add_fast'] = $fast;
             $update['add_state'] = 1;
@@ -375,6 +515,65 @@ class Menu
         return $info['id'];
     }
 
+    /**
+     * menu 生成左侧的菜单 此处应加上权限来显示是否管理员有该菜单的权限
+     *
+     * @return array
+     */
+    public function getHtml($state = false)
+    {
+        $data = $this->all();
+
+        $html = '';
+        if (layadmin()) {
+            foreach ($data as $k => $v) {
+                $v['icon'] = $v['icon'] ? "layui-icon " . $v['icon'] : "layui-icon layui-icon-home";
+                $html .= '<li data-name="'.$v['key'].'" class="layui-nav-item">';
+
+                if (isset($v['child']) && $v['child']) {
+                    $link = 'href="javascript:;"';
+                } else {
+                    $link = 'lay-href="'.$v1['link'].'"';
+                }
+                $html .= '<a '.$link.' lay-tips="'.$v['name'].'" lay-direction="2">';
+                $html .= '<i class="'.$v['icon'].'"></i><cite>'.$v['name'].'</cite></a>';
+
+                $html .= $this->getHtmlChild($v);
+
+                $html .= '</li>';
+            }
+            $html .= '';
+        }
+
+        return $html;
+    }
+
+    public function getHtmlChild($v)
+    {
+        $html = '';
+
+        if (isset($v['child']) && $v['child']) {
+            $html .= '<dl class="layui-nav-child">';
+            foreach ($v['child'] as $k1 => $v1) {
+                $html .= '<dd data-name="'.$v1['key'].'">';
+                if (isset($v1['child']) && $v1['child']) {
+                    $html .= '<a href="javascript:;">'.$v1['name'].'</a><dl class="layui-nav-child">';
+                    foreach ($v1['child'] as $k2 => $v2) {
+                        $html .= '<dd data-name="'.$v2['key'].'"><a lay-href="'.$v2['link'].'">'.$v2['name'].'</a></dd>';
+                    }
+                    $html .= '</dl>';
+                } else {
+                    $html .= '<a lay-href="'.$v1['link'].'">'.$v1['name'].'</a>';
+                }
+
+                $html .= '</dd>';
+            }
+            $html .= '</dl>';
+        }
+
+        return $html;
+    }
+
     /**
      * menu 生成左侧的菜单 此处应加上权限来显示是否管理员有该菜单的权限
      *

+ 1 - 1
template/layadmin/home.php

@@ -17,7 +17,7 @@ $view
 
 ->fetch('#LAY_app_tabsheader li@lay-id', 'manage/menu.link#console')
 ->fetch('#LAY_app_tabsheader li@lay-attr', 'manage/menu.link#console')
-
+     
 /*
 
 

+ 4 - 0
template/layadmin/inc/menu.php

@@ -11,6 +11,9 @@ $view
 ->fetch('#console-url@lay-href', 'manage/menu.link#console')   
 
 # 项目列表
+
+->fetch('#LAY-system-side-menu', 'manage/menu.getHtml')
+/*
 ->loop
 (
     '#LAY-system-side-menu li',
@@ -55,6 +58,7 @@ $view
         ),
     )
 )
+*/
 
 # display
 ->display();

+ 5 - 4
template/layadmin/project/database/list.php

@@ -32,10 +32,10 @@ $view
  
 # 数据列表的标题 
 /*
-->loop('#list-thead', 'manage/database.list_thead_layui')      
+->loop('#list-thead-data', 'manage/database.list_thead_layui')      
 
 # 数据列表 
-->loop('#list-tbody','manage/database.list_tbody_layui')  
+->loop('#list-tbody-data','manage/database.list_tbody_layui')  
 */
 
 # 数据列表的标题 
@@ -73,8 +73,6 @@ $view
 # 总数据 加在头部里吧
 //->fetch('#list-desc', '<{Dever::load("manage/database.info#list_desc")}>(共<{Dever::total("current")}>条)')
 
-# 数据结构
-//->fetch('#struct', 'manage/database.info#struct')
    
 #banner
 /*
@@ -112,5 +110,8 @@ $view
 	)
 )
 
+
+# 数据结构
+->fetch('#struct', 'manage/database.info#struct')
 # 将上边fetch的都显示出来
 ->display();