群控系统服务端开发模式-应用开发-菜单功能开发

news2024/11/4 23:14:58

        为什么优先开发菜单,而不是优先开发管理员?查看一下程序草图就明白,还有一个重点就是,管理员需要添加图片,而我还没有封装上传工具及上传目标。

一、添加路由

        在根目录下route文件夹下的app.php文件里面,添加如下代码

Route::post('menu/get_all','permission.Menu/getAll');// 获取所有菜单数据
Route::post('menu/get_info','permission.Menu/getInfo');// 获取单个菜单数据
Route::post('menu/save_info','permission.Menu/saveInfo');// 保存菜单数据
Route::post('menu/status_info','permission.Menu/statusInfo');// 启禁用菜单数据
Route::post('menu/delete_info','permission.Menu/deleteInfo');// 删除菜单数据

二、添加控制层管理

        在根目录下app文件夹下controller文件夹中创建文件夹并命名为permission,然后在permission文件夹中创建控制器并命名为Menu,然后让Menu继承Base总控制,最后优先开发菜单数据层管理,也就是本文中写到的《添加数据层管理》。代码如下:

<?php
/**
 * 菜单控制管理
 * User: 龙哥·三年风水
 * Date: 2024/10/31
 * Time: 9:36
 */
namespace app\controller\permission;
use app\controller\Base;
use app\model\permission\Menu as MenuModel;
class Menu extends Base
{

}

        1、获取所有数据方法

public function getAll(){
    $list = MenuModel::getAll([],'id,menuname,pid,title,path,component,icon,redirect,always_show,is_hidden,is_cache,is_icon,is_menu,button_type,status','sort DESC,id DESC');
    return succ(Tree::list_to_tree($list, 0, 'id', 'pid', 'children'));
}

        2、单个菜单数据方法

public function getInfo(){
    $id = $this->request->param('id', 0);
    if(empty($id))return err('主键参数必须上传');
    $data = MenuModel::dataFind(['id' => $id], 'id,menuname,pid,title,path,component,icon,redirect,always_show,is_hidden,is_cache,is_icon,is_menu,button_type,sort,status', true);
    return succ($data);
}

        3、保存菜单数据方法

                优先开发验证层管理,也就是本文中第四节所说的《添加验证层管理》。

    //保存菜单数据
    public function saveInfo(){
        $param = $this->request->param();
        $validate = new \app\validate\permission\Menu;
        if (!$validate->check($param)) return err($validate->getError());
        $data['menuname'] = $param['menuname'];
        $data['title'] = $param['title'];
        $data['path'] = $param['path'];
        $data['component'] = $param['component'];
        $data['icon'] = $param['icon'];
        $data['redirect'] = $param['redirect'];
        $data['always_show'] = (int)$param['always_show'];
        $data['is_hidden'] = (int)$param['is_hidden'];
        $data['is_cache'] = (int)$param['is_menu'] === 1 ? (int)$param['is_cache'] : 0;
        $data['is_icon'] = (int)$param['is_menu'] === 1 ? (int)$param['is_icon'] : 0;
        $data['is_menu'] = (int)$param['is_menu'];
        $data['button_type'] = (int)$param['button_type'];
        $data['sort'] = (int)$param['sort'];
        $data['status'] = (int)$param['status'];
        $data['update_time'] = date('Y-m-d H:i:s', time());
        if (empty($param['id']))$data['create_time'] = date('Y-m-d H:i:s', time());
        if (is_array($param['pid'])) {
            $data['pid'] = $param['pid'][count($param['pid']) - 1];
        } else {
            $data['pid'] = $param['pid'];
        }
        MenuModel::dataSave($data, empty($param['id']) ? [] : ['id' => $param['id']]);
        return succ('操作成功');
    }

        4、启禁用数据方法

    public function statusInfo(){
        $param = $this->request->param();
        if (!is_array($param['id']) || count($param['id']) === 0) return err('唯一编号必须是数组且至少需要一个');
        if (!in_array($param['status'],[0,1])) return err('状态必须选择一种');
        MenuModel::toStatus($param['id'],$param['status']);
        return succ('操作成功');
    }

        5、删除数据方法

    public function deleteInfo(){
        $id = $this->request->param('id');
        if (!is_array($id) || count($id) === 0) return err('请上传参数');
        MenuModel::dataDetele($id);
        return succ('操作成功');
    }

三、添加数据层管理

        在根目录下app文件夹下的model文件夹中创建管理层文件夹并命名为permission,然后在permission文件夹下创建角色数据控制器并命名为Menu,然后继承Tools验证工具集。代码如下:

<?php
/**
 * 菜单数据管理
 * User: 龙哥·三年风水
 * Date: 2024/10/31
 * Time: 9:43
 */
namespace app\model\permission;
use app\model\Tools;
class Menu extends Tools
{
    protected static $name = 'permission_menu';
    protected static $connection = 'mysql';
    protected $pk = 'id';

    //获取所有列表
    public static function getAll($where = [], $field = '*', $order = 'id DESC')
    {
        return self::dataAlls(self::$name, $where, $field, $order, [], self::$connection);
    }

    //获取单条数据
    public static function dataFind($where = [], $field, $findType = true)
    {
        return self::dataFinds(self::$name, $where, $field, $findType, self::$connection);
    }

    //保存数据
    public static function dataSave($data, $where = [])
    {
        return self::dataSaves(self::$name, $data, $where, self::$connection);
    }

    //启禁用数据
    public static function toStatus($ids,$status){
        foreach($ids as $k => $v){
            self::recursions(self::$name,['id' => $v],'pid', self::$connection,$ids);
        }
        return self::dataSaves(self::$name, ['status' => $status], [['id','in',$ids]], self::$connection);
    }

    //删除数据
    public static function dataDetele($where)
    {
        return self::recursionDeteles(self::$name, $where, 'pid', self::$connection); // TODO: Change the autogenerated stub
    }
}

四、添加验证层管理

        在根目录下app文件夹下的validate文件夹中创建管理层文件夹并命名为permission,然后在permission文件夹下创建菜单验证控制器并命名为Menu,然后继承Tools验证工具集。代码如下:

<?php
/**
 * 菜单验证管理
 * User: 龙哥·三年风水
 * Date: 2024/10/31
 * Time: 10:16
 */
namespace app\validate\permission;
use app\validate\Tools;
class Menu extends Tools
{
    protected $rule = [
        'id' => 'require|number',
        'menuname' => 'requireIf:is_menu,1|length:1,40|alpha|unique:permission_menu',
        'pid' => 'require',
        'title' => 'require|length:1,30',
        'path' => 'requireIf:is_menu,1|length:1,100',
        'component' => 'requireIf:is_menu,1|length:1,100',
        'icon' => 'requireIf:is_menu,1|length:1,100',
        'redirect'  =>  'length:1,100',
        'button_type' => 'require|checkButtonType'
    ];
    protected $message = [
        'id.require' => '编号必须填写',
        'id.number' => '编号必须是数字类型',
        'menuname.requireIf' => '规则唯一标识必须填写',
        'menuname.length' => '规则唯一标识必须是1到40位',
        'menuname.alpha' => '规则唯一标识必须是纯字母',
        'menuname.unique' => '路由名称必须唯一',
        'pid.require' => '父类必须选择',
        'title.require' => '路由名称必须填写',
        'title.length' => '路由名称必须是1到30位',
        'path.requireIf' => '路径必须填写',
        'path.length' => '路径的长度必须是1到30位',
        'component.requireIf' => '组件地址必须填写',
        'component.length' => '组件地址必须是1到100位',
        'icon.requireIf' => '图标必须填写',
        'icon.length' => '图标必须是1到100位',
        'redirect.length' => '重定向地址必须是1到100位',
        'button_type.require' => '按钮类型必须选择',
    ];
    

    /**
     * 按钮类型验证
     * @ param $value
     * @ param string $rule
     * @ param string $data
     * @ param string $field
     * @ return bool|string
     */

    protected function checkButtonType($value, $rule = '', $data = '', $field = ''){
        if ($data['is_menu'] === 0) {
            if (in_array($value, [1, 2, 3, 4, 5, 6, 7, 8, 9])) {
                return true;
            } else {
                return '按钮类型必须是1到9之间';
            }
        } else {
            return true;
        }
    }
}

五、树形结构工具开发

        在根目录下extend文件夹下Other文件夹中创建树形结构工具并命名为Tree。代码如下:

<?php
/**
 * 树形结构工具
 * User: 龙哥·三年风水
 * Date: 2024/10/31
 * Time: 9:53
 */
namespace Other;
class Tree
{

    /**
     * 格式化分类,生成多维数组的树
     * @ param $list 数组
     * @ param int $root 指定根节点
     * @ param string $pk 主键标识
     * @ param string $pid 父级标识
     * @ param string $child 子级标识
     * @ return array 返回整理后的树形结构数组
     */

    public static function list_to_tree($list, $root = 0, $pk = 'id', $pid = 'parentId', $child = 'child'){
        // 创建Tree
        $tree = array();
        if (is_array($list)) {
            // 创建基于主键的数组引用
            $refer = array();
            foreach ($list as $key => $data) {
                $refer[$data[$pk]] =& $list[$key];
            }
            foreach ($list as $key => $data) {
                // 判断是否存在parent
                $parentId = $data[$pid];
                if ($root == $parentId) {
                    $tree[] =& $list[$key];
                } else {
                    if (isset($refer[$parentId])) {
                        $parent =& $refer[$parentId];
                        $parent[$child][] =& $list[$key];
                    }
                }
            }
        }
        return $tree;
    }
}

六、提前说明 

        到处,整个菜单api控制已经开发完毕。下一步采用apipost测试及开发角色控制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2232151.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务器新建用户

文章目录 前言一、步骤二、问题三、赋予管理员权限总结 前言 环境&#xff1a; 一、步骤 创建用户需要管理员权限sudo sudo useradd tang为用户设置密码 sudo passwd tang设置密码后&#xff0c;可以尝试使用 su 切换到 tang 用户&#xff0c;确保该用户可以正常使用&#…

AI产品独立开发变现实战营

亮点&#xff1a; 1、三大真实商业项目&#xff0c;商业盈利、AI产品开发综合能力提升 2、掌握一人公司、副业产品设计-开发-运营-盈利落地全流程 3、大牛私藏AI盈利工具倾囊相授 4、借势增加睡后收入&#xff0c;从容应对裁员大环境与年龄危机 大纲&#xff1a; 第1章 独立…

Spring Boot技术:校园社团信息管理的高效路径

5系统详细实现 5.1 管理员模块的实现 5.1.1 学生管理 校园社团信息管理系统的系统管理员可以管理学生&#xff0c;可以对学生信息修改删除以及查询操作。具体界面的展示如图5.1所示。 图5.1 学生信息管理界面 5.1.2 社长管理 系统管理员可以查看对社长信息进行修改&#xff0…

Python小游戏20——超级玛丽

首先&#xff0c;你需要确保你的Python环境中安装了pygame库。如果还没有安装&#xff0c;可以使用以下命令进行安装&#xff1a; bash pip install pygame 运行效果展示 代码展示 python import pygame import sys # 初始化pygame pygame.init() # 设置屏幕尺寸 screen_width …

我也谈AI

“随着人工智能技术的不断发展&#xff0c;我们已经看到了它在各行业带来的巨大变革。在医疗行业中&#xff0c;人工智能技术正在被应用于病例诊断、药物研发等方面&#xff0c;为医学研究和临床治疗提供了新的思路和方法&#xff1b;在企业中&#xff0c;人工智能技术可以通过…

【论文复现】语言模型中的多模态链式推理

&#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐、摄影的一位博主。 &#x1f4d7;本文收录于论文复现系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏C语言初阶、C…

ios Framework版本号的问题。

自己创建的framework和普通的app的版本号设置的地方是有所有不同的。 framework 的版本号是在 TARGETS -> Build Settings -> current Project Version 这个地方设置的&#xff0c; 在创建framework的时候xcode 会自动创建一个framework.h的文件名&#xff0c;framewo…

使用Nginx作为反向代理和负载均衡器

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Nginx作为反向代理和负载均衡器 引言 Nginx 简介 安装 Nginx Ubuntu CentOS 配置 Nginx 作为反向代理 配置 Nginx 作为负载…

JeecgBoot集成工作流实战教程

Activiti是一个轻量级的工作流程和业务流程管理&#xff08;BPM&#xff09;平台&#xff0c;它主要面向业务人员、开发人员和系统管理员。这个平台的核心是一个快速且可靠的Java BPMN 2流程引擎。Activiti是开源的&#xff0c;并且基于Apache许可证进行分发。它可以运行在任何…

【Python3】【力扣题】409. 最长回文串

【力扣题】题目描述&#xff1a; &#xff08;题意理解&#xff09;统计如下&#xff1a; ① 字母个数本身是偶数。 ② 字母个数是奇数&#xff0c;统计奇数中的偶数部分&#xff0c;例如&#xff1a;字母个数为3&#xff0c;统计其中的2。 ③ 中间可以有一个奇数字母。即只要有…

链接分析与反向链接的重要性及最佳实践解析

内容概要 链接分析与反向链接是网络营销和搜索引擎优化的两个基本要素。了解这些概念的基础知识&#xff0c;能够帮助网站管理员和市场营销者更好地掌握搜索引擎的运作机制。链接分析主要是指评估网站之间的连接关系&#xff0c;通过研究不同网页之间的链接情况&#xff0c;找…

HTML 基础标签——链接标签 <a> 和 <iframe>

文章目录 1. `<a>` 标签属性详细说明示例2. `<iframe>` 标签属性详细说明示例注意事项总结链接标签在HTML中是实现网页导航的重要工具,允许用户从一个页面跳转到另一个页面或嵌入外部内容。主要的链接标签包括 <a> 标签和<iframe> 标签。本文将深入探…

分拣线番茄分级缺陷识别图像分割系统:创新探讨教学

分拣线番茄分级缺陷识别图像分割系统源码&#xff06;数据集分享 [yolov8-seg-timm&#xff06;yolov8-seg-dyhead-DCNV3等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源A…

RTP和RTCP的详细介绍及其C代码示例

RTP和RTCP的详细介绍及其C代码示例 RTP和RTCP简介RTP协议详解RTCP协议详解RTP和RTCP之间的关系C代码示例RTP和RTCP简介 RTP(Real-time Transport Protocol,实时传输协议)和RTCP(Real-time Transport Control Protocol,实时传输控制协议)是流媒体传输中常用的两个协议。R…

微服务系列三:微服务核心——网关路由

目录 前言 一、登录存在的问题归纳 二、*微服务网关整体方案 三、认识微服务网关 四、网关鉴权实现 五、OpenFeign微服务间用户标识信息传递实现 六、微服务网关知识追问巩固 前言 本篇文章具体讲解微服务中网关的实现逻辑、用于解决什么样的问题。其中标题中标注* 涉…

开源一个开发的聊天应用与AI开发框架,集成 ChatGPT,支持私有部署的源码

大家好&#xff0c;我是一颗甜苞谷&#xff0c;今天分享一个开发的聊天应用与AI开发框架&#xff0c;集成 ChatGPT&#xff0c;支持私有部署的源码。 介绍 当前系统集成了ChatGPT的聊天应用&#xff0c;不仅提供了基本的即时通讯功能&#xff0c;还引入了先进的AI技术&#x…

心觉:人每日60000念头,如何让你的时间精力只专注于核心目标?

Hi&#xff0c;我是心觉&#xff0c;带你用潜意识化解各种焦虑、内耗&#xff0c;建立无敌自信&#xff1b;教你财富精准显化的实操方法&#xff1b;关注我,伴你一路成长&#xff01; 每日一省写作220/1000天 据说一个人每天会产生60000个念头 有些我们的意识能察觉到&#x…

万宇科技闪耀创新舞台 荣膺潜在独角兽企业殊荣

2024年10月24日&#xff0c;在“2024东北亚(沈阳)人才交流大会暨中国潜在独角兽企业发展大会”上&#xff0c;长城战略咨询重磅发布《GEI中国潜在独角兽企业研究报告2024》&#xff0c;揭示了中国潜在独角兽企业群体的最新发展态势。其中&#xff0c;安徽万宇机械设备科技有限公…

论文阅读:Computational Long Exposure Mobile Photography (一)

这篇文章是谷歌发表在 2023 ACM transaction on Graphic 上的一篇文章&#xff0c;介绍如何在手机摄影中实现长曝光的一些拍摄效果。 Abstract 长曝光摄影能拍出令人惊叹的影像&#xff0c;用运动模糊来呈现场景中的移动元素。它通常有两种模式&#xff0c;分别产生前景模糊或…

数据结构与算法 - 基础

本文首发于 个人博客 程序 数据结构 算法 其实很多同学知道数据结构与算法很重要&#xff0c;但是却不明觉厉。 这里我们看一个简单的题&#xff1a; 对自然数从1到100的求和 最简单的设计无非是&#xff1a; void addNum () { int total 0; for (int i 1; i < 1…