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

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

一、添加路由

        在根目录下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测试及开发角色控制。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年,Rust开发语言,现在怎么样了?

Rust开发语言有着一些其他语言明显的优势&#xff0c;但也充满着争议&#xff0c;难上手、学习陡峭等。 Rust 是由 Mozilla 主导开发的通用、编译型编程语言&#xff0c;2010年首次公开。 在 Stack Overflow 的年度开发者调查报告中&#xff0c;Rust 连续多年被评为“最受喜爱…

c# 值类型

目录 1、c#类型2、值类型2.1 结构体2.2 枚举 1、c#类型 类型&#xff08;Type&#xff09;又叫数据类型&#xff08;Data Type&#xff09;。 A data type is a homogeneous collection of values,effectively prensented,equipped with a set of operations which manipulate…

怒刷666条提示词后,终于总结出终结 AI 味儿的3种方法(强烈建议收藏)

大家好&#xff0c;我是凡人。 最近一个朋友给我发了几张他知乎的评论&#xff0c;是这样的&#xff1a; 这样的&#xff1a; 还有这样的&#xff1a; 无奈他就问我 “ AI 怎么能生成没有 AI味儿 的回答&#xff1f;” &#xff0c;说实话这真是个神奇的问题。 老话儿讲 “ 耳…

Angular实现gridview效果

说明&#xff1a;使用angular实现grid效果&#xff0c;支持文字图片多条数据展示 效果图: step1: <mat-grid-list cols"2" rowHeight"2:1"><mat-grid-tile *ngFor"let course of courses">{{ course }}</mat-grid-tile> &l…

2、顶点着色器之视图矩阵

1、作用&#xff1a;将物体从世界坐标系转换到相机坐标系&#xff0c;相当于从世界坐标系转换到相机的局部(本地)坐标系。 2、基于LookAt函数的视图矩阵&#xff1a; 相机位置eye&#xff1a;(ex,ey,ez)&#xff0c;世界坐标系下的位置 目标位置center&#xff1a;(cx,cy,cz…

react使用Fullcalendar 实战用法

使用步骤请参考&#xff1a;react使用Fullcalendar 卡片式的日历&#xff1a; 需求图&#xff1a; 卡片式的日历&#xff0c;其实我是推荐 antd的&#xff0c;我两个都写了一下都能实现。 antd 的代码&#xff1a; antd的我直接用的官网示例&#xff1a;antd 日历示例 i…

基于SpringBoot+Vue实现智能停车收费系统

作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参与学生毕业答辩指导&#xff0c;…

ApsaraMQ Serverless 能力再升级,事件驱动架构赋能 AI 应用

本文整理于 2024 年云栖大会阿里云智能集团高级技术专家金吉祥&#xff08;牟羽&#xff09;带来的主题演讲《ApsaraMQ Serverless 能力再升级&#xff0c;事件驱动架构赋能 AI 应用》 云消息队列 ApsaraMQ 全系列产品 Serverless 化&#xff0c;支持按量付费、自适应弹性、跨可…

基于SpringBoot+Vue实现高校毕业与学位资格审查系统

作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参与学生毕业答辩指导&#xff0c;…

0.STM32F1移植到F0的各种经验总结

1.结构体的声明需放在函数的最前面 源代码&#xff1a; /*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //开启USART1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructu…

RDT——清华开源的双臂机器人扩散大模型:先预训练后微调,支持语言、图像、动作多种输入

第一部分 清华开源全球最大双臂机器人扩散大模型RDT 2.1 什么是RDT 2.1.1 RDT推出的背景及其与以前工作的对比 受到最近在单手操作方面尝试的启发&#xff08;Brohan等&#xff0c;2023&#xff1b;Kim等&#xff0c;2024&#xff09;&#xff0c;清华一研究团队推出了RDT&a…

C++基础三(构造函数,形参默认值,函数重载,单例模式,析构函数,内联函数,拷贝构造函数)

C有六个默认函数&#xff0c;分别是&#xff1a; 1、默认构造函数; 2、默认拷贝构造函数; 3、默认析构函数; 4、赋值运算符; 5、取址运算符; 6、取址运算符const; 构造函数 构造函数(初始化类成员变量)&#xff1a; 1、属于类的成员函数之一 …

「DSA」C++排序算法 之 选择排序_Selection Sort_O(n²)

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

完美洗牌的秘密(十三)——(反)完美洗牌第二定理的应用(16张的Anti faro周期魔术)...

早点关注我&#xff0c;精彩不错过&#xff01; 在前面的文章中&#xff0c;我们介绍了&#xff08;反&#xff09;完美洗牌定理的应用的海量魔术&#xff0c;详情请戳&#xff1a; 完美洗牌的秘密&#xff08;十二&#xff09;——反完美洗牌定理的应用扩展&#xff08;三叠发…

TOEIC 词汇专题:旅游计划篇

TOEIC 词汇专题&#xff1a;旅游计划篇 制定旅行计划时&#xff0c;尤其是跨国旅游&#xff0c;会涉及到很多独特的英语词汇。以下是与“旅游计划”相关的托业词汇&#xff0c;帮助你更加自如地规划行程。 1. 旅行服务和优惠 出发前了解一下与服务和优惠相关的常用词汇&#…

PVE定时开启关闭虚拟机,实现PVE中群晖虚拟机的定时开机和关闭

如果在PVE中安装了群晖&#xff0c;又不想每天关闭PVE(不在家&#xff0c;怕服务器起不来)&#xff0c;因此想每天定时关闭开启黑群晖和其他虚拟机释放资源。 在网上查了很多&#xff0c;说在crontab添加命令 00 2 * * * pvesh create /nodes/pve/qemu/102/status/stop 00 6 …

JDBC/ODBC—数据库连接API概述

JDBC/ODBC概述 在数据库连接领域&#xff0c;有两种广泛使用的技术&#xff1a;ODBC&#xff08;Open Database Connectivity - 开放数据库连接&#xff09;和 JDBC&#xff08;Java Database Connectivity - Java 数据库连接&#xff09;。 一、什么是 ODBC&#xff1f; Ope…

2024年NSSCTF秋季招新赛-WEB

The Beginning F12看源码&#xff0c;有flag http标头 黑吗喽 题目说要在发售时的0点0分&#xff0c;所以添加标头data Date: Tue, 20 Aug 2024 00:00:00 GMT然后改浏览器头 User-Agent: BlackMonkey曲奇就是Cookie cookieBlackMonkey这个一般就是Referer Referer:wukon…

后台管理系统的通用权限解决方案(十一)SpringBoot的统一异常处理

文章目录 1 统一异常处理介绍2 统一异常处理案例 1 统一异常处理介绍 在实际项目中&#xff0c;不可避免需要处理各种异常。如果每个都单独处理&#xff0c;代码中则会出现大量的try {...} catch {...} finally {...}代码块&#xff0c;不仅有大量的冗余代码&#xff0c;而且还…

Axure使用动态面板制作新闻栏目高级交互

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;使用动态面板制作新闻栏目 主要内容&#xff1a;动态面板State切换、控制&#xff1b;动态面板滚动设置&#xff1b;设置选中 应用场景&#xff1a…