fastadmin 树状菜单展开,合并;简要文件管理系统界面设计与实现

一,菜单合并效果图

源文件参考:fastadmin 子级菜单展开合并、分类父级归纳 - FastAdmin问答社区

php服务端:

public function _initialize()
{
    parent::_initialize();
    $this->model = new \app\admin\model\auth\Filetype;
    $this->adminModel = model('Admin');
    
    //重点:转成树状结构
    $tree = Tree::instance();
    $tree->init(collection($this->model->order('weigh desc,id desc')->select())->toArray(), 'pid');
    $this->categorylist = $tree->getTreeList($tree->getTreeArray(0), 'type_name');
    $categorydata = [0 => ['id' => '0', 'type_name' => __('None')]];
    foreach ($this->categorylist as $k => $v) {
        $categorydata[$v['id']] = $v;
    }

    $this->view->assign("parentList", $categorydata);

    $auth_group_id = $this->auth->getGroupIds();
    $this->view->assign("auth_group_id", $auth_group_id[0]);

}

public function index()
{
    //当前是否为关联查询
    $this->relationSearch = true;
    //设置过滤方法
    $this->request->filter(['strip_tags', 'trim']);
    if ($this->request->isAjax()) {
        //如果发送的来源是Selectpage,则转发到Selectpage
        if ($this->request->request('keyField')) {
            return $this->selectpage();
        }

        $list = $this->categorylist;
        $total = count($list);

        foreach ($list as $key=>$row) {
            $list[$key]['admin'] = $this->adminModel->field('username,nickname,email,mobile')->where('id',$row['create_admin_id'])->find();
        }

        $result = array("total" => $total, "rows" => $list);

        return json($result);
    }
    return $this->view->fetch();
}

js文件:backend 文件夹下找到该模块下的文件

// 初始化表格
table.bootstrapTable({
    url: $.fn.bootstrapTable.defaults.extend.index_url,
    pk: 'id',
    sortName: 'weigh',
    escape: false,
    columns: [
        [
            {checkbox: true},
            {field: 'id', title: __('Id')},
            {field: 'type_name', title: __('Type_name'), align: 'left', formatter:function (value, row, index) { return value.toString().replace(/(&|&)nbsp;/g, ' '); } },
            {field: 'createtime', title: __('Createtime'), operate:'RANGE', addclass:'datetimerange', autocomplete:false, formatter: Table.api.formatter.datetime},
            {field: 'updatetime', title: __('Updatetime'), operate:'RANGE', addclass:'datetimerange', autocomplete:false, formatter: Table.api.formatter.datetime},
            {field: 'weigh', title: __('Weigh'), operate: false},
            {field: 'create_admin_id', title: __('Create_admin_id')},
            {field: 'admin.username', title: __('创建者用户名')},
            {field: 'admin.nickname', title: __('创建者昵称')},
            {field: 'admin.email', title: __('Admin.email')},
            {field: 'admin.mobile', title: __('Admin.mobile')},
            {field: 'id', title: '展开', operate: false, formatter: Controller.api.formatter.subnode},
            {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
        ]
    ],
    pagination: false,//隐藏分页
    search: false,//隐藏搜索框
    commonSearch: false,//隐藏搜索按钮
    showToggle: false,//表格视图两种模式
    showColumns: false,//隐藏列
    showExport: false,//隐藏导出
});

//核心三个地方
//{field: 'type_name', title: __('Type_name'), align: 'left', formatter:function (value, row, index) { return value.toString().replace(/(&|&)nbsp;/g, ' '); } },
//{field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
/*
pagination: false,//隐藏分页
search: false,//隐藏搜索框
commonSearch: false,//隐藏搜索按钮
showToggle: false,//表格视图两种模式
showColumns: false,//隐藏列
showExport: false,//隐藏导出
*/

同样在index方法里面:

// 为表格绑定事件:这个是原有的,下面的是全部新增的
Table.api.bindevent(table);  

//当内容渲染完成后
table.on('post-body.bs.table', function (e, settings, json, xhr) {
    //默认隐藏所有子节点
    $("a.btn[data-id][data-pid][data-pid!=0]").closest("tr").hide();
    // $(".btn-node-sub.disabled").closest("tr").hide();
    //显示隐藏子节点
    $(".btn-node-sub").off("click").on("click", function (e) {
        var status = $(this).data("shown") ? true : false;
        $("a.btn[data-pid='" + $(this).data("id") + "']").each(function () {
            $(this).closest("tr").toggle(!status);
        });
        $(this).data("shown", !status);
        return false;
    });
    //点击切换/排序/删除操作后刷新左侧菜单
    $(".btn-change[data-id],.btn-delone,.btn-dragsort").data("success", function (data, ret) {
        Fast.api.refreshmenu();
        return false;
    });

});
//批量删除后的回调
$(".toolbar > .btn-del,.toolbar .btn-more~ul>li>a").data("success", function (e) {
    Fast.api.refreshmenu();
});
//展开隐藏一级
$(document.body).on("click", ".btn-toggle", function (e) {
    $("a.btn[data-id][data-pid][data-pid!=0].disabled").closest("tr").hide();
    var that = this;
    var show = $("i", that).hasClass("fa-chevron-down");
    $("i", that).toggleClass("fa-chevron-down", !show);
    $("i", that).toggleClass("fa-chevron-up", show);
    $("a.btn[data-id][data-pid][data-pid!=0]").not('.disabled').closest("tr").toggle(show);
    $(".btn-node-sub[data-pid=0]").data("shown", show);
});
//展开隐藏全部
$(document.body).on("click", ".btn-toggle-all", function (e) {
    var that = this;
    var show = $("i", that).hasClass("fa-plus");
    $("i", that).toggleClass("fa-plus", !show);
    $("i", that).toggleClass("fa-minus", show);
    $(".btn-node-sub.disabled").closest("tr").toggle(show);
    $(".btn-node-sub").data("shown", show);
});

api下增加

api: {
    formatter: {
        subnode: function (value, row, index) {
            return '<a href="javascript:;" data-toggle="tooltip" title="' + __('展开/收起') + '" data-id="' + row.id + '" data-pid="' + row.pid + '" class="btn btn-xs '
                + (row.haschild == 1 || row.ismenu == 1 ? 'btn-success' : 'btn-default disabled') + ' btn-node-sub"><i class="fa fa-sitemap"></i></a>';
        }
    },
    bindevent: function () {
        Form.api.bindevent($("form[role=form]"));
    }
}

注意:上下级结构需要用pid进行关联

二,文件系统左右展示,点击左侧菜单右侧显示出对应文件

index: function () {
// 初始化表格参数配置
Table.api.init({
    extend: {
        index_url: 'auth/filelist/index' + location.search,
        multi_url: 'auth/filelist/multi',
        import_url: 'auth/filelist/import',
        add_url: 'auth/filelist/add',
        dragsort_url:'',
        table: 'filelist',
    }
});

var table = $("#table");

function dir_address($dir_id){
    //获取当前文件操作权限
    $.ajax({
        url: "auth/filelist/get_dir_child", //请求接口
        type: "post",
        dataType: "json",
        data: {"dir_id": $dir_id}, //请求参数
        success: function (effect) {
            if(effect.code == 1){
                var data = effect.data.child_list;
                var output_str = '';
                for(var i=0;i<data.length;i++){
                    output_str += '<li><a href="javascript:;" class="child_nav" dataid="'+data[i].id+'">';
                    output_str += '<img src="/assets/img/folder.svg">';
                    output_str += data[i].type_name;
                    output_str += '</a><span>'+data[i].updatetime_text+'</span></li>';
                }
                $(".jstree-default").html(output_str);

                //获取当前所在位置
                var parents = effect.data.parents;
                var address = '当前位置:<a href="">全部</a>';
                for(var i=0;i<parents.length;i++){
                    address += ' &gt; <a href="javascript:;" class="child_nav" dataid="'+parents[i].id+'">'+parents[i].type_name+'</a>'
                }
                $("#address").html(address);
            }
        }
    })
}

//联动主要靠下面这个,选左侧菜单后,将选中的值赋给右侧,并触发提交事件
$(function(){
    $('body').on('click','.child_nav',function(){
        $dir_id = $(this).attr('dataid');
        //这个根据实际表格的id进行赋值,不仅要赋值隐藏域,也需要赋值给下拉框
        $("#myTabContent .form-commonsearch input[name='type_id-operate']").val($dir_id);
        $("#myTabContent .form-commonsearch select[name='type_id']").val($dir_id);
        $(".form-commonsearch").submit();
        $("#dir_id").val($dir_id);
        dir_address($dir_id);
    });
})

$(function(){
    $('body').on('click','.add-dir-file',function(){
        $dir_id = $("#dir_id").val();
        Fast.api.open('auth/filelist/add?dir_id='+$dir_id, __('添加'),{
            end:function(){
                dir_address($dir_id); //获取当前位置
            }
        });
    });
});
<style>
    ul{
        margin:0;
        padding:0;
    }
    li{
        list-style: none;
    }
    li a{
        line-height: 24px;
        height: 24px;
        display: inline-block;
        color:#333;
    }
    .jstree-default li{
        display: block;
        text-align: left;
        margin:15px 0;
    }
    .jstree-default li img{
        width: 20px;
        margin-right:10px;
        vertical-align: middle;
    }
    .jstree-default li span{
        float:right;
    }
    #add_file_path{
        float:right;
    }
</style>
<div class="col-xs-12 col-sm-3 col-md-3 col-lg-3">
    <div class="panel panel-default panel-intro file-path-info">
        <p class="file-title">文件目录
            <a href="javascript:;" id="add_file_path">添加目录</a>
        </p>
        <input type="hidden" id="dir_id" value="0">
        <p id="address">当前位置:<a href="">全部</a></p>
        <ul class="jstree-default">
            {foreach name="parent_list" item="vo"}
                <li>
                    <a href="javascript:;" class="child_nav" dataid="{$vo.id}">
                        <img src="/assets/img/folder.svg">{$vo.type_name}
                    </a>
                    <span>{$vo.updatetime_text}</span>
                </li>
            {/foreach}
        </ul>
    </div>
</div>
<div class="col-xs-12 col-sm-9 col-md-9 col-lg-9">
</div>

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

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

相关文章

粤嵌—2024/5/21—打家劫舍(✔)

代码实现&#xff1a; int rob(int *nums, int numsSize) {if (numsSize 1) {return nums[0];}if (numsSize 2) {return fmax(nums[0], nums[1]);}int dp[numsSize];dp[0] nums[0];dp[1] fmax(nums[0], nums[1]);for (int i 2; i < numsSize; i) {dp[i] fmax(dp[i - 1…

东方通TongWeb结合Spring-Boot使用

一、概述 信创需要; 原状:原来的服务使用springboot框架,自带的web容器是tomcat,打成jar包启动; 需求:使用东方通tongweb来替换tomcat容器; 二、替换步骤 2.1 准备 获取到TongWeb7.0.E.6_P7嵌入版 这个文件,文件内容有相关对应的依赖包,可以根据需要来安装到本地…

vue/core源码中ref源码的js化

起源&#xff1a; 当看见reactivity文件中的ref.ts文件长达五百多的ts代码后&#xff0c;突发奇想想看下转化成js有多少行。 进行转化&#xff1a; let shouldTrack true; // Define shouldTrack variable let activeEffect null; // Define activeEffect variable// 定义…

Android9.0 MTK平台如何增加一个系统应用

在安卓定制化开发过程中&#xff0c;难免遇到要把自己的app预置到系统中&#xff0c;作为系统应用使用&#xff0c;其实方法有很多&#xff0c;过程很简单&#xff0c;今天分享一下我是怎么做的&#xff0c;共总分两步&#xff1a; 第一步&#xff1a;要找到当前系统应用apk存…

【数据结构与算法 经典例题】判断链表是否带环

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;数据结构与算法刷题系列&#xff08;C语言&#xff09; 期待您的关注 目录

互联网十万个为什么之 什么是Kubernetes(K8s)?

Kubernetes&#xff08;通常简称为K8s&#xff09;是一款用于自动部署、扩缩和管理容器化应用程序的开源容器编排平台。Kubernetes已发展为现代企业实现敏捷开发、快速迭代、资源优化及灵活扩展的关键技术组件之一。它拥有庞大的开源社区和丰富的生态系统。围绕Kubernetes已经形…

深度强化学习 Actor-Critic演员评论家 PPO

将策略(Policy Based)和价值(Value Based)相结合的方法&#xff1a;Actor-Critic算法&#xff0c;在强化学习领域最受欢迎的A3C算法&#xff0c;DDPG算法&#xff0c;PPO算法等都是AC框架。 一、Actor-Critic算法简介 Actor-Critic从名字上看包括两部分&#xff0c;演员(Actor…

《拯救大学生课设不挂科第四期之蓝桥杯是什么?我是否要参加蓝桥杯?选择何种语言?如何科学备赛?方法思维教程》【官方笔记】

背景&#xff1a; 有些同学在大一或者大二可能会被老师建议参加蓝桥杯&#xff0c;本视频和文章主要是以一个过来人的身份来给与大家一些思路。 比如蓝桥杯是什么&#xff1f;我是否要参加蓝桥杯&#xff1f;参加蓝桥杯该选择何种语言&#xff1f;如何科学备赛&#xff1f;等…

《最新出炉》系列入门篇-Python+Playwright自动化测试-41-录制视频

宏哥微信粉丝群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 上一篇讲解和分享了录制自动生成脚本&#xff0c;索性连带录制视频也一股脑的在这里就讲解和分享了。今天我们将学习如何使用Playwright和Python来录制浏览器操作的视频&#…

19 QinQ技术(Vlan两层封装)

1 什么是QinQ&#xff1f; QinQ&#xff08;802.1Q-in-802.1Q&#xff09;&#xff0c;也叫做VLAN Stacking或Double VLAN&#xff0c;由IEEE 802.1ad标准定义&#xff0c;**是一项扩展VLAN空间的技术&#xff0c;**通过在802.1Q标签报文的基础上再增加一层802.1Q的Tag来达到扩…

1738. 找出第 K 大的异或坐标值

题目&#xff1a; 给你一个二维矩阵 matrix 和一个整数 k &#xff0c;矩阵大小为 m x n 由非负整数组成。 矩阵中坐标 (a, b) 的 值 可由对所有满足 0 < i < a < m 且 0 < j < b < n 的元素 matrix[i][j]&#xff08;下标从 0 开始计数&#xff09;执行异…

架构师必考题--软件系统质量属性

软件系统质量属性 1.质量属性2.质量属性场景描述3.系统架构评估 这个知识点是系统架构师必考的题目&#xff0c;也是案例分析题第一题&#xff0c; 有时候会出现在选择题里面&#xff0c;考的分数也是非常高的。 1.质量属性 属性说明可用性错误检测/恢复/避免性能资源需求/管理…

链游:区块链技术的游戏新纪元

随着区块链技术的快速发展&#xff0c;越来越多的行业开始探索与其结合的可能性&#xff0c;其中&#xff0c;游戏行业与区块链的结合尤为引人注目。链游&#xff0c;即基于区块链技术的游戏&#xff0c;正以其独特的优势&#xff0c;为玩家带来全新的游戏体验。本文将对链游进…

AI数据面临枯竭

Alexandr Wang&#xff1a;前沿研究领域需要大量当前不存在的数据&#xff0c;未来会受到这个限制 Alexandr Wang 强调了 AI 领域面临的数据问题。 他指出&#xff0c;前沿研究领域&#xff08;如多模态、多语言、专家链式思维和企业工作流&#xff09;需要大量当前不存在的数…

java欢迪迈手机商城设计与实现源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的欢迪迈手机商城设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 欢迪迈手机商城…

【Python从入门到进阶】55、使用Python轻松操作Mysql数据库

一、引言 1、MySQL数据库简介 MySQL是一个开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它使用了一种名为Structured Query Language&#xff08;SQL&#xff09;的查询语言来管理数据。MySQL因其高性能、可扩展性、易用性和稳定性而广受欢迎&#x…

<商务世界>《75 微课堂<茶叶(1)-质量分级>》

1 中国茶叶分级 中国的10级标准是按照茶叶的外观、香气、滋味、汤色、叶底五个方面进行评分&#xff0c;分别用10分制进行评分&#xff0c;总分为50分&#xff0c;得分越高&#xff0c;茶叶的品质就越高。具体的分数和等级如下表所示&#xff1a; 2 每级的特点 茶叶的质量等级…

zabbix“专家坐诊”第240期问答

问题一 Q&#xff1a;zabbix6.0版本&#xff0c;配置报警媒介里的message 消息时&#xff0c;操作数据参数EVENT.OPDATA调用的参数是哪个&#xff1f; A&#xff1a;参考 问题二 Q&#xff1a;请问告警为什么只有关闭之前的告警&#xff0c;才会生成新的告警&#xff1f; A&a…

如何用ai打一场酣畅淋漓的数学建模比赛? 给考研加加分!

文章目录 数学建模比赛1. 数学建模是什么&#xff1f;2. 数学建模分工合作2.1 第一&#xff1a;组队和分工合作2.2 第二&#xff1a;充分的准备2.3 第三&#xff1a;比赛中写论文过程 3. 数学建模基本过程4. 2023全年数学建模竞赛时间轴5. 数学建模-资料大全6. 数学建模实战 数…

C++的类和对象

C面向对象的三大特性&#xff1a;封装&#xff0c;继承&#xff0c;多态 万事万物皆可为对象&#xff0c;有其相应的属性和行为 一、封装 1.1 封装的意义 将属性和行为作为一个整体&#xff0c;表现生活中的事物 将属性和行为加以权限控制 在设计类的时候&#xff0c;属性…