【JPress】Menu_jpress defaultmenu_森哥0708的博客-程序员宅基地

技术标签: 2021SC@SDUSC  c++  linq  wpf  

2021SC@SDUSC

目录

一、MenuItem

1.MenuItem

2.MenuGroup

二、MenuManager

1.MenuArrayList

2.MenuManager


一、MenuItem

1.MenuItem

MenuItem为JPress的菜单项类,是JPress 的一个module。其包含了菜单项的基本属性。

private String id;
private String text;
private String icon;
private String groupId;
private String url;
private int order = 100;
private String target;

其构造函数中实现了用户菜单项构造和管理员菜单项构造。MenuItem还重写了equals方法,虽然不难,但是可供积累:

@Override
public boolean equals(Object obj) {
    if (obj == null || obj instanceof MenuItem == false) {
        return false;
    }
    return ((MenuItem) obj).getId().equals(id);
}

MenuItem的equals()先实判断obj是否和MenuItem同一类或者是否是空值,然后再通过MenuItem的id来比较,若它们的id相同,则说明它们相同。

2.MenuGroup

MenuGroup是JPress的菜单组项,包含了菜单组项的基本属性。

private int order = 100;
private String text;
private String icon;
private String id;
private List<MenuItem> items;

可以通过private List<MenuItem> items,很容易看出JPress的带单是二级菜单结构,而不是多级菜单结构。

其items属性不是静态的,那么在初始化类的时候不会初始化items属性。其items属性的创建模式是懒汉式的单例模式。

public void addItem(MenuItem item) {
    if (items == null) {
        items = new ArrayList<>();
    }
​
    if (items.contains(item)) {
        return;
    }
​
    items.add(item);
    items.sort(Comparator.comparingInt(MenuItem::getOrder));
}

可以看到,只有在需要添加MenuItem的时候,才会初始化items属性。这样的好处是延迟创建new ArrayList<>()对象,节约资源。但是这样有一个缺点。没有考虑线程安全问题,它是线程不安全的,多个线程处理时可能不能获得同一个实例items。但是考虑到添加MenuItem的操作不是频繁的,且难以出现多线程添加MenuItem的场景,所以这样的缺点可以忽略。

二、MenuManager

1.MenuArrayList

MenuArrayList是JPress中专门用于存储管理菜单组的List,其继承了ArrayList,重写了add方法,实现了sort方法。其add方法中,若

    @Override
    public boolean add(MenuGroup menuGroup) {
        if (contains(menuGroup)) {
            throw new RuntimeException("menuGroup:" + menuGroup + " has exits.");
        }
        return sort(super.add(menuGroup));
    }
​
​
​
    private boolean  sort(boolean success){
        if (success) {
            sort(Comparator.comparingInt(MenuGroup::getOrder));
        }
        return success;
    }

当遇到一些比较重要的类时,可以考虑写一个专门的List来管理该类。

2.MenuManager

MenuManager是JPress管理菜单组的类,其继承了JbootEventListener,会在JPress项目运行的时候启动。其所有属性都使用了懒汉式的构建方式。类加载时就在静态区创建了MenuManager实例。

同时,该类被创建时,就自带了系统菜单列表,模板菜单列表,用户财务菜单等私有属性。在类初始化阶段就会初始化后台的固定菜单、初始化后台的 module菜单、初始化用户中心菜单。

假设要初始化系统菜单组,具体的初始化方式如下:

if (JPressMenuConfig.me.isWechatEnable()) {
    MenuGroup wechatMenuGroup = new MenuGroup();
    wechatMenuGroup.setId(JPressConsts.SYSTEM_MENU_WECHAT_PUBULIC_ACCOUNT);
    wechatMenuGroup.setText("微信");
    wechatMenuGroup.setIcon("<i class=\"fab fa-weixin\"></i>");
    systemMenus.add(wechatMenuGroup);
}

可以看到,系统会先判断菜单配置,查看微信菜单项是否可用,然后会实例化一个菜单组。菜单组的ID为一个字符串常量,用JPressConsts类保存。setIcon设置了h5的代码。最后把这个菜单组放到systemMenus列表中存储。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42430054/article/details/121845808

智能推荐

python one hot编码_机器学习:数据预处理之独热编码(One-Hot)-程序员宅基地

前言————————————————————————————————————————在机器学习算法中,我们经常会遇到分类特征,例如:人的性别有男女,祖国有中国,美国,法国等。这些特征值并不是连续的,而是离散的,无序的。通常我们需要对其进行特征数字化。那什么是特征数字化呢?例子如下:性别特征:["男","女"]祖国特征:["中国","美国,"法国"]运动特征:["足球","篮球","羽毛球","乒乓..._python中one-hot是什么

大学十年(一个程序员的路程) _西安电子科技大学 深圳 程序员-程序员宅基地

作者 :林锐(一)写此文使我很为难,一是担心读者误以为我轻浮得现在就开始写自传,二是担心朋友们误以为我得了绝症而早早留下遗作。   不论是落俗套还是不落俗套地评价,我在大学十年里都是出类拔萃的好学生。并且一直以来我对朋友们和一些低年级的学生们都有很大的正面影响。这十年是一个从幼稚到成熟的过程,交织着聪明与蠢笨、勤奋与懒散、狂热与怯懦、成功与失败。做对了的事可树立为榜样,做错的事可挂作为_西安电子科技大学 深圳 程序员

数据预处理第6讲:正态变换_matlab yeojohnson-程序员宅基地

论文合作、课题指导请联系QQ2279055353Box-Cox and Yeo-Johnson变换可以将来自不同分布的数据映射到正态分布。下面的例子将这两种变换应用到6种不同的概率分布数据:Lognormal, Chi-squared, Weibull, Gaussian, Uniform, and Bimodal. 通过PowerTransformer类,成功地将上述分布的数据映射到正态分..._matlab yeojohnson

单调栈求最大子矩阵的大小 python-程序员宅基地

题目:给定一个整型矩阵map, 其中的值只有0 和 1 两种, 求其中全是1 的所有矩形区域中, 最大的矩形区域为1的数量。例如:1 0 1 11 1 1 11 1 1 0其中,最大的矩形区域有6个1,所以返回6 。分析:如果矩阵的大小为 O(N * M) , 如何达到时间复杂度为O( N* M) ?1 : 矩阵的行数为 N, 以每一行做切割, 统计以当前行作为低的情况下,每个位置...

随便推点

我的第三个springboot项目,servlet实现一个转盘抽奖程序-程序员宅基地

继上面第二个springboot项目后,今晚应朋友需求帮忙写个抽奖程序,想着就用springboot+servlet去发布一个服务给前端直接调用或者后端直接调用。 下面来介绍一下: 1、不错,依然需要一个Application的启动springboot的入口 import org.s...

maven snapshot快照仓库和release公布仓库区别_snapshot仓库-程序员宅基地

在使用maven过程。我们经常会在不稳定的状态有很多公共图书馆在发展阶段。需要改变在任何时间和公布,你可能有一天一次发布。经验bug时间,甚至一天公布N次要。我们知道,。maven依赖管理是基于管理的版本号,对于发布状态artifact,假设相同的版本号,即使是我们内部的镜子server上的组件比本地新,maven也不会主动下载的。假设我们在开发阶段都是基于正式公布版本号来做依赖管_snapshot仓库

Go-动态类型与类型断言详解(含type-switch及全部代码)_lady_killer9的博客-程序员宅基地

目录动态类型类型断言与type-switch全部代码截图参考动态类型我们知道Go不像Python,变量可以没有类型。那么如果一个函数的参数需要兼容多个类型或是需要判断变量类型该如何做呢?我们可以使用接口,上一篇文章介绍了接口及接口的使用,知道了接口变量可以接收实现了它的类型的变量。我们就可以用接口做参数。结构体、接口与实现代码 type Cat struct { Name string}type Mouse struct { Name string}

Win10专业工作站版的Ghost备份与还原_win10工作站版gho镜像-程序员宅基地

在生产环境中经常会遇到系统故障无法使用,重新安装系统后计算机内的软件又得重新下载安装非常换繁琐。如提前做备份后,当操作系统出现故障时即可将系统还原到备份时的状态,并且在批量装机中也可广泛使用。操作环境:VMware Workstation Pro 15.5、微PE工具箱V2.0操作系统:windows10 专业工作站版操作步骤:首先,用已经安装好微PE工具箱的启动优盘进行进入PE模式;插入U盘后重启(或开机)后按F12进入Boot Manager 启动管理器界面,按键盘↑↓键选择USB Dev._win10工作站版gho镜像

基于微信小程序的购物平台设计与实现-计算机毕业设计源码+LW文档_微信小程序购物毕业设计-程序员宅基地

那么我们就可以通过网络上的东西来帮助致富,而比较适合农民的就无疑是微信小程序这种易于操作的网络工具,让他们可以通过这一类小程序来打开他们优质农产品的销路。研究目的:通过这次的课题研究希望使自己能够使用所学的相关软件技术和知识远见运用到农村脱贫致富的道路上,这对于提高自己的相关实践能力也是不小的提升,同时希望以此来提高自己对于当前知识的掌握有个大概的了解和提升自己的论文撰写能力。小程序管理模块,小程序的管理人员可以对于小程序的相关功能进行优化也可以对忘记密码的用户进行账号密码的重置等功能。_微信小程序购物毕业设计

android设置view透明度渐变,android中 怎么实现一张图片从左到右透明度改变渐变消失的动画效果 Android 动态渐变 泽.. - 贪吃蛇学院-专业IT技术平台..._Tstormatroc的博客-程序员宅基地

1.使用OpenGl实现,在片元着色器中针对不同的s(纹理坐标)值,设置不同的alpha值。2.利用Canvas绘制canvas.drawBitmap(mBitmap, 0, 0, new Paint());Paint p = new Paint();p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));canvas.saveL..._android 设置 view 透明渐变