瀏覽代碼

增加菜单模块

sugangqiang 2 年之前
父節點
當前提交
e5e3ac96bf

+ 11 - 8
app/admin/controller/Menu.php

@@ -25,10 +25,8 @@ class Menu extends AdminController {
      * @return type
      */
     function list() {
-        if ($this->request->isPost()) {
-
-            return json([]);
-        }
+        $menus = MenuApi::getList($this->request->param());
+        return json($menus);
     }
 
     /**
@@ -56,10 +54,11 @@ class Menu extends AdminController {
      * @return type
      */
     function edit() {
+        $params = $this->request->param();
+        $id = $params["id"];
         if ($this->request->isPost()) {
             try {
-                $params = $this->request->param();
-                if (!$params["id"])
+                if (!$id)
                     return json(["msg" => "没有选择菜单"]);
                 validate(\app\admin\validate\Menu::class)->check($params);
                 if (MenuApi::save($this->request->param())) {
@@ -70,7 +69,8 @@ class Menu extends AdminController {
                 return json(["msg" => $e->getMessage()]);
             }
         }
-        return view();
+        $menu = MenuApi::getOne($id);
+        return view("", ["menu" => $menu]);
     }
 
     /**
@@ -79,7 +79,10 @@ class Menu extends AdminController {
      */
     function delete() {
         if ($this->request->isPost()) {
-            return json([]);
+            $id = $this->request->param("id");
+            if (MenuApi::delete($id))
+                return json(["msg" => "删除成功"]);
+            return json(["msg" => "删除失败"]);
         }
     }
 

+ 5 - 4
app/admin/validate/Menu.php

@@ -20,9 +20,9 @@ class Menu extends Validate {
     protected $rule = [
         'name' => 'require|max:255',
         'url' => 'require|max:255',
-        'code' => 'require|max:255',
-        'pcode' => 'require|max:255',
-        'num' => 'require'
+        'code' => 'require|max:255|unique:sys_menu',
+        'pcode' => 'max:255',
+        'num' => 'require|integer'
     ];
     protected $message = [
         'name.require' => '请填写菜单名称!',
@@ -31,9 +31,10 @@ class Menu extends Validate {
         'url.max' => '请求地址最多255个字符!',
         'code.require' => '请填写菜单编号!',
         'code.max' => '菜单编号最多255个字符!',
-        'pcode.require' => '请填写父级编号!',
+        'code.unique' => "菜单编号不能重复",
         'pcode.max' => '父级编号最多255个字符!',
         'num.require' => '请填写菜单排序!',
+        'num.number' => "菜单排序必须是整数",
     ];
 
 }

+ 59 - 19
app/admin/view/menu/edit.html

@@ -4,40 +4,80 @@
     <div class="ibox-content">
         <div class="form-horizontal" id="menuInfoForm">
 
-            <input type="hidden" id="id" value="${menu.id}">
-            <input type="hidden" id="ismenuValue" value="${menu.ismenu}">
+            <input type="hidden" id="id" value="{$menu.id}">
 
             <div class="row">
                 <div class="col-sm-6">
-                    <#input id="name" name="名称" value="${menu.name}" underline="false" />
-                    <#input id="code" name="菜单编号" value="${menu.code}" underline="false" />
-                    <#input id="pcodeName" name="父级编号" value="${menu.pcodeName}" underline="false"
-                            hidden="pcode" readonly="readonly" hiddenValue="${menu.pcode}"
-                            clickFun="MenuInfoDlg.showMenuSelectTree(); return false;"
-                            style="background-color: #ffffff !important;"
-                            selectFlag="true" selectId="pcodeTreeDiv" selectTreeId="pcodeTree" selectStyle="width:244px !important;"/>
-                    <#select id="ismenu" name="是否是菜单">
-                        <option value="1">是</option>
-                        <option value="0">不是</option>
-                    </#select>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">名称</label>
+                        <div class="col-sm-9">
+                            <input class="form-control" id="name" name="name" type="text" value="{$menu.name}">
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">菜单编号</label>
+                        <div class="col-sm-9">
+                            <input class="form-control" id="code" name="code" type="text" value="{$menu.code}">
+                        </div>
+                    </div>
+                    <div class="form-group has-feedback">
+                        <label class="col-sm-3 control-label">父级编号</label>
+                        <div class="col-sm-9">
+                            <input class="form-control" id="pcodeName" name="pcodeName" type="text" value="{$menu.pcodeName}" readonly="readonly" onclick="MenuInfoDlg.showMenuSelectTree(); return false;" style="background-color: #ffffff !important;">                            
+                            <input class="form-control" type="hidden" id="pcode" value="{$menu.pid}">
+                            <div id="pcodeTreeDiv" style="display: none; position: absolute; z-index: 200;">
+                                <ul id="pcodeTree" class="ztree tree-box" style="width:244px !important;"></ul>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">
+                            是否是菜单
+                        </label>
+                        <div class="col-sm-9">
+                            <select class="form-control" id="ismenu" name="ismenu">
+                                <option value="1" {eq name="menu.ismenu" value="1"}selected{/eq}>是</option>
+                                <option value="0" {eq name="menu.ismenu" value="0"}selected{/eq}>不是</option>
+                            </select>
+                        </div>
+                    </div>
 
                 </div>
                 <div class="col-sm-6">
-                    <#input id="url" name="请求地址" value="${menu.url}" underline="false" />
-                    <#input id="num" name="排序" value="${menu.num}" underline="false" />
-                    <#input id="icon" name="图标" underline="false" value="${menu.icon}"/>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">请求地址</label>
+                        <div class="col-sm-9">
+                            <input class="form-control" id="url" name="url" type="text" value="{$menu.new_url}">
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">排序</label>
+                        <div class="col-sm-9">
+                            <input class="form-control" id="num" name="num" type="text" value="{$menu.num}">
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-3 control-label">图标</label>
+                        <div class="col-sm-9">
+                            <input class="form-control" id="icon" name="icon" type="text" value="{$menu.icon}">
+                        </div>
+                    </div>
                 </div>
             </div>
 
             <div class="row btn-group-m-t">
                 <div class="col-sm-12" style="text-align: center">
-                    <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="MenuInfoDlg.editSubmit()"/>
-                    <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="MenuInfoDlg.close()"/>
+                    <button type="button" class="btn btn-sm btn-info" onclick="MenuInfoDlg.editSubmit()" id="ensure">
+                        <i class="fa fa-check"></i>&nbsp;提交
+                    </button>
+                    <button type="button" class="btn btn-sm btn-danger" onclick="MenuInfoDlg.close()" id="cancel">
+                        <i class="fa fa-eraser"></i>&nbsp;取消
+                    </button>
                 </div>
             </div>
         </div>
 
     </div>
 </div>
-<script src="${ctxPath}/static/modular/system/menu/menu_info.js"></script>
+<script src="/static/modular/system/menu/menu_info.js"></script>
 {/block}

+ 42 - 5
app/common/api/MenuApi.php

@@ -13,6 +13,35 @@ use app\admin\model\Menu;
  */
 class MenuApi {
 
+    public static function getOne($id) {
+        $where = [];
+        $where[] = ["t1.id", "=", $id];
+        $where[] = ["t1.delete", "=", 0];
+        $menu = Menu::alias("t1")->leftJoin("sys_menu t2", "t1.pcode=t2.code")->field("t1.*,if(t2.code is null,'顶级',t2.name) as pcodeName,t2.id as pid")->where($where)->findOrEmpty();
+        return $menu;
+    }
+
+    public static function getOneByCode($code) {
+        $where = [];
+        $where[] = ["code", "=", $code];
+        $where[] = ["delete", "=", 0];
+        $menu = Menu::where($where)->findOrEmpty();
+        return $menu;
+    }
+
+    public static function getList($params = []) {
+        $where = [];
+        $where[] = ["delete", "=", 0];
+        if ($params["menuName"]) {
+            $where[] = ["name", "like", "%" . $params["menuName"] . "%"];
+        }
+        if ($params["level"]) {
+            $where[] = ["levels", "=", $params["level"]];
+        }
+        $list = Menu::where($where)->order("num asc")->select()->toArray();
+        return $list;
+    }
+
     public static function getMenuIdsByNewUrls(array $urls) {
         $where = [];
         $where[] = ["new_url", "in", $urls];
@@ -25,15 +54,17 @@ class MenuApi {
         $data["name"] = $params["name"];
         $data["new_url"] = $params["url"];
         $data["code"] = $params["code"];
-        $data["pcode"] = $params["pcode"];
         $data["num"] = $params["num"];
         $data["icon"] = $params["icon"];
         $data["ismenu"] = $params["ismenu"];
-        $pcode =  $params["pcode"];
+        $data["status"] = $params["status"] ?: 1;
         $tmp = [];
-        while($pcode != "0"){
-            
-        }
+        $parent = self::getOne($params["pcode"]);
+        $data["pcode"] = $parent["code"] ?: 0;
+        $_pcodes = array_filter(explode(",", $parent["pcodes"]));
+        $_pcodes[] = "[" . $data["pcode"] . "]";
+        $data["pcodes"] = implode(",", $_pcodes);
+        $data["levels"] = count($_pcodes);
         if ($params["id"]) {
             $data["id"] = $params["id"];
             return Menu::update($data);
@@ -41,6 +72,12 @@ class MenuApi {
         return Menu::insert($data);
     }
 
+    public static function delete($id) {
+        $data["id"] = $id;
+        $data["delete"] = 1;
+        return Menu::update($data);
+    }
+
     public static function getAllMenus($fields = "*") {
         $where[] = ["status", "=", 1];
         $where[] = ["delete", "=", 0];

+ 1 - 0
public/static/js/plugins/bootstrap-treetable/bootstrap-treetable.js

@@ -69,6 +69,7 @@ function extracted($, item, target, globalCollapsedFlag, options) {
         target.formatData = function (data) {
             var _root = options.rootCodeValue ? options.rootCodeValue : null
             $.each(data, function (index, item) {
+                console.log(item)
                 // 添加一个默认属性,用来判断当前节点有没有被显示
                 item.isShow = false;
                 // 这里兼容几种常见Root节点写法

+ 19 - 4
public/static/modular/system/menu/menu.js

@@ -18,11 +18,26 @@ Menu.initColumn = function () {
         {title: '菜单名称', field: 'name', align: 'center', valign: 'middle', sortable: true},
         {title: '菜单编号', field: 'code', align: 'center', valign: 'middle', sortable: true},
         {title: '菜单父编号', field: 'pcode', align: 'center', valign: 'middle', sortable: true},
-        {title: '请求地址', field: 'url', align: 'center', valign: 'middle', sortable: true},
+        {title: '请求地址', field: 'new_url', align: 'center', valign: 'middle', sortable: true},
         {title: '排序', field: 'num', align: 'center', valign: 'middle', sortable: true},
         {title: '层级', field: 'levels', align: 'center', valign: 'middle', sortable: true},
-        {title: '是否是菜单', field: 'isMenuName', align: 'center', valign: 'middle', sortable: true},
-        {title: '状态', field: 'statusName', align: 'center', valign: 'middle', sortable: true}]
+        {title: '是否是菜单', field: 'ismenu', align: 'center', valign: 'middle', sortable: true,
+            formatter: function (value) {
+                if (value == 1) {
+                    return "是";
+                }
+                return "否";
+            }
+        },
+        {title: '状态', field: 'status', align: 'center', valign: 'middle', sortable: true,
+            formatter: function (value) {
+                if (value == 1) {
+                    return "正常";
+                }
+                return "停用";
+            }
+        }
+    ]
     return columns;
 };
 
@@ -86,7 +101,7 @@ Menu.delMenu = function () {
             }, function (data) {
                 Feng.error("删除失败!" + data.responseJSON.message + "!");
             });
-            ajax.set("menuId", Menu.seItem.id);
+            ajax.set("id", Menu.seItem.id);
             ajax.start();
         };
 

+ 0 - 7
public/static/modular/system/menu/menu_info.js

@@ -165,11 +165,4 @@ $(function () {
     ztree.bindOnClick(MenuInfoDlg.onClickDept);
     ztree.init();
     MenuInfoDlg.ztreeInstance = ztree;
-
-    //初始化是否是菜单
-    if ($("#ismenuValue").val() == undefined) {
-        $("#ismenu").val(0);
-    } else {
-        $("#ismenu").val($("#ismenuValue").val());
-    }
 });