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,则转发到Selectpageif ($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>

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

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

相关文章

企业如何做好 SQL 质量管理?

研发人员写 SQL 操作数据库想必一定是一类基础且常见的工作内容。如何避免 “问题” SQL 流转到生产环境&#xff0c;保证数据质量&#xff1f;这值得被研发/DBA/运维所重视。 什么是 SQL 问题&#xff1f; 对于研发人员来说&#xff0c;在日常工作中&#xff0c;大部分都需要…

Jenkins - Pipeline Retry

Jenkins - Pipeline Retry 引言retryretry 实例 引言 日常运行自动化测试用例&#xff0c;通常是晚上定时启动 pipeline job&#xff0c;一个 pipeline 脚本可能会涉及到多个 Job, 最后 post 发邮件汇总测试 report。有时会遇到 Jenkins 环境问题导致某 Job 失败&#xff0c;第…

代码随想录算法训练营第三十六天 | 1005.K次取反后最大化的数组和、134.加油站、135.分发糖果

目录 1005.K次取反后最大化的数组和 思路 代码 代码 134.加油站 思路 代码 135.分发糖果 思路 代码 1005.K次取反后最大化的数组和 本题简单一些&#xff0c;估计大家不用想着贪心 &#xff0c;用自己直觉也会有思路。 代码随想录 思路 直觉&#xff0c;直接写&…

7. C++通过select的方式实现高性能网络服务器

什么是异步IO 异步IO指的是用户程序将IO请求提交后,无需等待IO操作的完成,而是可以继续处理别的事情。 所谓异步IO&#xff0c;是指以事件触发的机制来对IO操作进行处理。 与多进程和多线程技术相比&#xff0c;异步I/O技术的最大优势是系统开销小&#xff0c;系统不必创建进程…

R语言数据处理(四)

R语言数据处理&#xff08;四&#xff09; 1. 表格合并 1. 表格合并 &#x1f680;&#x1f680;&#x1f680;代码功能&#xff1a; 从指定文件夹中读取所有 .xlsx 文件&#xff0c;并提取每个文件中特定行和列的数据&#xff0c;然后将这些数据合并到一个最终的数据框中&…

在Nano上部署yolov5

确认镜像版本为JetPack4.4.1(L4T 32.4.4)以上版本 下载链接下载pytorch+nvidia docker镜像(pytorch1.6+torchvision0.7.0)yolov5opencv4.4.0 1. 在已经部署了镜像的机器上获取镜像   1.1 获取镜像名

《Ai学习笔记》-模型集成部署

后续大多数模型提升速度和精度&#xff1a; 提升速度&#xff1a; -知识蒸馏&#xff0c;以distillBert和tinyBert为代表 -神经网络优化技巧。prune来剪裁多余的网络节点&#xff0c;混合精度&#xff08;fp32和fp26混合来降低计算精度从从而实现速度的提升&#xff09; 提…

【教学类-58-04】黑白三角拼图04(2-10宫格,每个宫格随机1张-6张,带空格纸,1页6张黑白,1张6张白卡)

背景需求&#xff1a; 前期制作了黑白三角拼图2*2、3*3、4*4&#xff0c;确定了基本模板&#xff0c;就可以批量制作更多格子数 【教学类-58-01】黑白三角拼图01&#xff08;2*2宫格&#xff09;固定256种随机抽取10张-CSDN博客文章浏览阅读522次&#xff0c;点赞13次&#x…

零基础学Java(全170集)

课程概述 本课程旨在全面深化对 Java 语言的核心技术理解&#xff0c;并提升编程实践能力。课程内容涵盖以下关键领域&#xff1a; 掌握Java核心语法&#xff0c;为后续学习打下扎实的基础。熟练运用Java常用的类库与开发工具&#xff0c;提高开发效率与质量。解决面向对象编…

卡码网笔试 | 118 小y删数字、119 小红的字符串切割、120 小红的数字匹配

118 小y删数字 逐个数字循环除10&#xff0c;并且用一个变量记录非0位数&#xff0c;最后加起来即可。 代码如下&#xff1a; #include <iostream>using namespace std;int main() {int n;cin >> n;int a[n];int sum 0;for (int i 0; i < n; i) cin >&g…

高中数学:平面向量-题型总结及解题思路梳理

一、知识点及解题思路梳理 高中&#xff0c;2/3的向量题目是坐标向量题&#xff0c;1/3是几何向量题。但是&#xff0c;这1/3的几何向量题可以转换成坐标向量题。 二、练习 例题1 几何型向量题 例题2

【机器学习300问】100、怎么理解卷积神经网络CNN中的池化操作?

一、什么是池化&#xff1f; 卷积神经网络&#xff08;CNN&#xff09;中的池化&#xff08;Pooling&#xff09;操作是一种下采样技术&#xff0c;其目的是减少数据的空间维度&#xff08;宽度和高度&#xff09;&#xff0c;同时保持最重要的特征并降低计算复杂度。池化操作不…

【LeetCode 151】反转字符串中的单词

1. 题目 2. 分析 这题要是用Python写&#xff0c;就非常简单了。 3. 代码 class Solution:def reverseWords(self, s: str) -> str:s " ".join(reversed(s.strip().split()))return s

池的概念以及数据库连接池 Druid

1.池的概述 池就相当于一个共享资源&#xff0c;是对资源的整合和调配&#xff0c;节省存储空间&#xff0c;当需要的时候可以直接在池中取&#xff0c;用完之后再还回去。 为什么需要连接池 假如没有连接池&#xff0c;我们操作数据库的流程如下&#xff1a; 应用程序使用…

若依 Ruoyi-Vue PageHelper 分页失效 total为记录数

分页插件PageHelper返回记录总数total竟然出错了 执行控制台的SQL&#xff0c;查询出来的total数量是对的&#xff0c;很奇怪分页的total设置为查询到的记录数。 怀疑对list.stream操作&#xff0c;影响了分页&#xff0c;代码发现确实是这样&#xff0c;debug&#xff0c;居然…

firewalld 防火墙

firewalld概述 Linux系统防火墙从CentOS7开始的默认防火墙工作在网络层&#xff0c;属于包过滤防火墙 Firewalld和iptables的关系 netfilter 位于Linux内核中的包过滤功能体系称为Linux防火墙的“内核态” firewalld Centos默认的管理防火墙规则的工具称为防火墙的“用…

Gradient-checkpointing的原理

原文&#xff1a; 将更大的网络安装到内存中。|by 雅罗斯拉夫布拉托夫 |张量流 |中等 (medium.com) 前向传播时&#xff0c;隔几层就保留一层activation数据&#xff0c;其余层的activation都释放掉&#xff1b; 反向传播时&#xff0c;从最近的checkpoint去重新跑forward&…

React 如何自定义 Hooks

自定义 Hooks React 内部自带了很多 Hooks 例如 useState、useEffect 等等&#xff0c;那么我们为什么还要自定义 Hooks&#xff1f;使用 Hooks 的好处之一就是重用&#xff0c;可以将代码从组件中抽离出来定义为 Hooks&#xff0c;而不用每个组件中重复去写相同的代码。首先是…

Ps:消失点滤镜 - 测量工具

Ps菜单&#xff1a;滤镜/消失点 Filter/Vanishing Point 快捷键&#xff1a;Ctrl Alt V “消失点”滤镜中的测量工具 Measure Tool用于在透视平面内测量图像中对象的大小&#xff0c;适用于建筑师、设计师、法医和木工等需要精确测量的用户。 快捷键&#xff1a;R ◆ ◆ ◆…

基于springboot+vue的4S店车辆管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…