• [技术干货] Java智慧校园系统源码springboot + vue智慧学校源码 微信小程序+电子班牌
    Java智慧校园系统源码springboot + vue智慧学校源码 微信小程序+电子班牌智慧校园的建设逐渐被师生、家长认可接受,智慧校园通过对在校师生、教务等所有人员的信息以及各种信息搜集与储存,进行数据优化与管理,为师生们提供更加智能化的校园服务。未来智慧校园将不再是一个陌生词,而会真正地应用在更多的校园管理中,让我们的校园生活变得更加美好智慧校园技术架构:后端:Java  框架:springboot 前端页面:vue 小程序:小程序原生开发智慧校园移动家长端应用:通知管理、图片管理、班级考勤、综合素质评价、视频管理、请假管理、成绩管理、个人信息、进离校管理、教师通讯录、家长留言、课堂点名、家长会签到、活动报名、放学管理、学生评价。智慧校园移动移动教师端应用:设备管理、通知管理、图片管理、班级考勤、综合素质评价、视频管理、请假管理、成绩管理、个人信息、进离校管理、家长通讯录、教师通讯录、教师课表、AI智能分析、课堂点名、课堂授课、家长会签到、活动报名、积分商城、倒计时、班级德育、体温检测、放学管理、学生评价。▷学校信息:学校信息自定义格式展示,可上传学校相册,自定义学校基础信息栏。支持管理员或教师对学校的基本学校信息进行编辑并浏览,通过编辑提交后全校可查看▷学科设置:学校学科展示,添加学科,双击修改学科、删除学科。▷组织架构:支持管理员单个创建以及批量创建部门,部门层级最少不低于四级架构;组织架构支持可视展示。▷教师数据:支持教师多部门多角色,支持粘贴复制简易化批量导入,批量导入支持字段错误检索,支持一键重置密码。▷学生数据:支持单个学生信息录入、修改、删除,支持粘贴复制简易化批量导入,支持一键重置密码▷教室管理:班级绑定教室,教室绑定设备,通过教室切换班级即可实现设备一键切换班级,支持添加、删除、修改教室信息。▷权限管理:数据权限、功能权限、角色管理、应用权限。▷课表管理:支持支持管理员课表模板设置,支持复制粘贴简易化批量导入,批量导入支持学科及任课教师错误检索。智慧校园系统框架技术参数要求(提供不少于3张的证明截图,并附上原厂公章,原件备查):1、系统后台采用Java开发语言,前端采用VUE开发框架2、★系统采用微服务springcloud架构的作为后台服务器架构3、★系统支持搭建开发具备服务注册发现、客户负载均衡、服务间通信的微服务架构4、系统支持使用SpringCloud Eurek、SpringCloud Ribbon、restTemplate 等组件进行开发5、注册中心:接受服务提供者的注册,提供服务注册者的存储信息(如:IP、端口号、服务名)与微服务保持心跳6、服务提供者:注册自己的服务到服务中心,服务提供者向注册中心发送自己的信息以及一些健康状态。7、服务消费者:定期向注册中心发送查询请求,以定期获得服务提供者的一些信息(如:IP,端口号,服务名)。8、使用Quartz框架实现任务调度(如:对不同的学校在不同的时间段执行上课提醒)9、使用Mina网络应用型框架(实时接收第三方进离校情况,闸机,人脸机等),后续可发展实时通信组件有:feing(实现服务对服务之间的调用)zuul(网关负载均衡,反向代理,隐藏真实ip地址)
  • [问题求助] 图片处理不生效且不返回Url
    官方文档上写的是返回处理后的图片Url,并且处理后的图片直接返回浏览器展示,不会保存在OBS中,也不会占用存储空间,不会产生存储费用。图片处理只收取处理的费用。然后我按照官方文档提供的示例操作,以为会将图片压缩,并且返回给我一个新的Url结果我发现这个是下载形式的,只是将文件给我读出来,于是我用文件流的方式将文件读出来(此刻我对前面所说的文件会以新的Url方式返回产生了疑惑)然后我把原图片下载下来和进行压缩操作的图片进行对比,发现大小一模一样,并且图片通过网页查看也是一样的大小所以我按照官方文档进行图片压缩,并且希望得到压缩后的图片新的url完全失败既不能压缩图片,也拿不到新的图片url,需要自己通过文件流读取。所以我想请求组一下各位大佬,是我哪儿写的不对,还是我看错文档了,该咋解决呢
  • [问题求助] 【MRS】【hetu查询】进入hetu命令行不管输入什么都报错:Error running command: java.net.
    【功能模块】进入hetu命令行不管输入什么都报错:Error running command: java.net.ConnectException: Failed to connect to /192.168.1.140:29884但是这个ip不是hetu的节点,不知道为什么会去连这个ip【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 请求编译构建中的Msbuild更新版本
    你好,编译构建中的Msbuild现在版本还是.net core3.0,能不能更新一下到.net6,.net6是长期支持版本,后续可能使用比较多
  • [技术干货] .Net结构型设计模式之享元模式(Flyweight)(转载)
    这篇文章介绍了.Net结构型设计模式之享元模式(Flyweight),文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五、享元模式的具体代码实现六、享元模式的实现要点:1、享元模式的优点2、享元模式的缺点3、在下面所有条件都满足时,可以考虑使用享元模式:七、.NET 中享元模式的实现一、动机(Motivate)在软件系统中,采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价——主要指内存需求方面的代价。如何在避免大量细粒度对象问题的同时,让外部客户程序仍然能够透明地使用面向对象的方式来进行操作?二、意图(Intent)运用共享技术有效地支持大量细粒度的对象。                                        ——《设计模式》GoF三、结构图(Structure)四、模式的组成(1)、抽象享元角色(Flyweight):此角色是所有的具体享元类的基类,为这些类规定出需要实现的公共接口。那些需要外部状态的操作可以通过调用方法以参数形式传入。(2)、具体享元角色(ConcreteFlyweight):实现抽象享元角色所规定的接口。如果有内部状态的话,可以在类内部定义。(3)、享元工厂角色(FlyweightFactory):本角色负责创建和管理享元角色。本角色必须保证享元对象可以被系统适当地共享,当一个客户端对象调用一个享元对象的时候,享元工厂角色检查系统中是否已经有一个符合要求的享元对象,如果已经存在,享元工厂角色就提供已存在的享元对象,如果系统中没有一个符合的享元对象的话,享元工厂角色就应当创建一个合适的享元对象。(4)、客户端角色(Client):本角色需要存储所有享元对象的外部状态。五、享元模式的具体代码实现1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162/// <summary>/// 享元的抽象类/// </summary>public abstract class Flyweight{    public abstract void Operation(int extrinsicState);}/// <summary>/// 需要共享的具体类/// </summary>public class ConceteFlyweight : Flyweight{    public override void Operation(int extrinsicState)    {        Console.WriteLine("需要共享的具体Flyweight类:" + extrinsicState);    }}/// <summary>/// 不需要共享的具体类/// </summary>public class UnsharedConcreteFlyeight : Flyweight{    public override void Operation(int extrinsicState)    {        Console.WriteLine("不需要共享的具体Flyweight类:" + extrinsicState);    }}/// <summary>/// 一个工厂类,用来合理创建对象/// </summary>public class FlyweightFactory{    private Dictionary<string, Flyweight> dic = new Dictionary<string, Flyweight>();    public Flyweight GetFlyweight(string key, bool type)    {        if (!dic.ContainsKey(key))        {            Flyweight flyweight = new UnsharedConcreteFlyeight();            if (type)                flyweight = new ConceteFlyweight();            dic.Add(key, flyweight);        }        return (Flyweight)dic[key];    }}/// <summary>/// 客户端调用/// </summary>public class App{    static void Main()    {        int extrinsicState = 26;        FlyweightFactory factory = new FlyweightFactory();        Flyweight f1 = factory.GetFlyweight("oec2003", true);        f1.Operation(++extrinsicState);        Flyweight f2 = factory.GetFlyweight("oec2003", true);        f2.Operation(++extrinsicState);        Flyweight f3 = factory.GetFlyweight("oec2004", false);        f3.Operation(++extrinsicState);    }}六、享元模式的实现要点:面向对象很好地解决了抽象性的问题,但是作为一个运行在机器中的程序实体,我们需要考虑对象的代价问题。Flyweight设计模式主要解决面向对象的代价问题,一般不触及面向对象的抽象性问题。Flyweight采用对象共享的做法来降低系统中对象的个数,从而降低细粒度对象给系统带来的内存压力。在具体实现方面,要注意对象状态的处理。对象的数量太大从而导致对象内存开销加大——什么样的数量才算大?这需要我们仔细的根据具体应用情况进行评估,而不能凭空臆断。1、享元模式的优点(1)、享元模式的优点在于它能够极大的减少系统中对象的个数。(2)、享元模式由于使用了外部状态,外部状态相对独立,不会影响到内部状态,所以享元模式使得享元对象能够在不同的环境被共享。2、享元模式的缺点(1)、由于享元模式需要区分外部状态和内部状态,使得应用程序在某种程度上来说更加复杂化了。(2)、为了使对象可以共享,享元模式需要将享元对象的状态外部化,而读取外部状态使得运行时间变化。3、在下面所有条件都满足时,可以考虑使用享元模式:(1)、一个系统中有大量的对象;(2)、这些对象耗费大量的内存;(3)、这些对象中的状态大部分都可以被外部化;(4)、这些对象可以按照内部状态分成很多的组,当把外部对象从对象中剔除时,每一个组都可以仅用一个对象代替软件系统不依赖这些对象的身份,满足上面的条件的系统可以使用享元模式。但是使用享元模式需要额外维护一个记录子系统已有的所有享元的表,而这也需要耗费资源,所以,应当在有足够多的享元实例可共享时才值得使用享元模式。七、.NET 中享元模式的实现.NET在C#中有一个Code Behind机制,它表面有一个aspx文件,背后又有一个cs文件,它的编译过程实际上会把aspx文件解析成C#文件,然后编译成dll,在这个过程中,我们在aspx中写的任何html代码都会转化为literal control,literal control是一个一般的文本控件,它就表示html标记。当这些标记有一样的时候,构建控件树的时候就会用到Flyweight模式。它的应用并不是那么平凡,只有在效率空间确实不高的时候我们才用它。到此这篇关于.Net结构型设计模式之享元模式(Flyweight)的文章就介绍到这了。转载自https://www.jb51.net/article/249324.htm
  • [技术干货] .Net行为型设计模式之模板方法模式(Template Method)(转载)
    这篇文章介绍了.Net行为型设计模式之模板方法模式(Template Method),文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下目录一、动机(Motivate)二、意图(Intent)三、结构图四、模式的组成五、模板方法模式的具体实现六、模板方法模式的实现要点:1、模板方法模式适用情形:2、模板方法模式特点:七、.NET 中模板模式的实现一、动机(Motivate)“模板方法”,就是有一个方法包含了一个模板,这个模板是一个算法。在我们的现实生活中有很多例子可以拿来说明这个模式,就拿吃饺子这个事情来说,要想吃到饺子必须经过三步,第一步是“和面”,第二步是“包馅”,第三步是“煮饺子”,这三步就是一个算法,我们要想吃到不同的面和馅的饺子,对这三步中的任意一步就行操作就可以,也可以完全定义这三步在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求?二、意图(Intent)定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。                                 ——《设计模式》GoF三、结构图四、模式的组成模板方法模式参与者:(1)、抽象类角色(AbstractClass):定义一个模板方法(TemplateMethod),在该方法中包含着一个算法的骨架,具体的算法步骤是PrimitiveOperation1方法和PrimitiveOperation2方法,该抽象类的子类将重定义PrimitiveOperation1和PrimitiveOperation2操作。(2)、具体类角色(ConcreteClass):实现PrimitiveOperation1方法和PrimitiveOperation2方法以完成算法中与特定子类(Client)相关的内容。在模板方法模式中,AbstractClass中的TemplateMethod提供了一个标准模板,该模板包含PrimitiveOperation1和PrimitiveOperation2两个方法,这两个方法的内容Client可以根据自己的需要重写。五、模板方法模式的具体实现下面以生活中吃饺子为例来实现模板方法模式。在现实生活中,做饺子的步骤都大致相同,如果我们针对每种饺子的做法都定义一个类,这样在每个类中都有很多相同的代码,为了解决这个问题,我们一般的思路肯定是把相同的部分抽象出来到抽象类中去定义,具体子类来实现具体的不同部分,这个思路也正式模板方法的实现精髓所在,具体实现代码如下:12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667static void Main(string[] args){    //现在想吃绿色面的,猪肉大葱馅的饺子    AbstractClass fan = new ConcreteClass1();    fan.EatDumplings();     Console.WriteLine();    //过了段时间,我开始想吃橙色面的,韭菜鸡蛋馅的饺子    fan = new ConcreteClass2();    fan.EatDumplings();}  //该类型就是抽象类角色--AbstractClass,定义做饺子的算法骨架,这里有三步骤,当然也可以有多个步骤,根据实际需要而定public abstract class AbstractClass{    //该方法就是模板方法,方法里面包含了做饺子的算法步骤,模板方法可以返回结果,也可以是void类型,视具体情况而定    public void EatDumplings()    {        MakingDough();//和面        MakeDumplings();//包馅        BoiledDumplings();  //煮饺子        Console.WriteLine("饺子真好吃!");    }     public abstract void MakingDough();//要想吃饺子第一步肯定是“和面”---该方法相当于算法中的某一步    public abstract void MakeDumplings();//要想吃饺子第二部是“包饺子”---该方法相当于算法中的某一步    public abstract void BoiledDumplings(); //要想吃饺子第三部是“煮饺子”---该方法相当于算法中的某一步} //该类型是具体类角色--ConcreteClass,我想吃绿色面皮,猪肉大葱馅的饺子public sealed class ConcreteClass1 : AbstractClass{    public override void MakingDough()  //要想吃饺子第一步肯定是“和面”---该方法相当于算法中的某一步    {        Console.WriteLine("在和面的时候加入芹菜汁,和好的面就是绿色的");//我想要面是绿色的,绿色健康嘛,就可以在此步定制了    }     public override void MakeDumplings()//要想吃饺子第二部是“包饺子”---该方法相当于算法中的某一步    {        Console.WriteLine("农家猪肉和农家大葱,制作成馅");//我想吃猪肉大葱馅的,在此步就可以定制了    }     public override void BoiledDumplings()//要想吃饺子第三部是“煮饺子”---该方法相当于算法中的某一步    {        Console.WriteLine("用我家的大铁锅和大木材煮饺子");//我想吃大铁锅煮的饺子,有家的味道,在此步就可以定制了    }} //该类型是具体类角色--ConcreteClass2,我想吃橙色面皮,韭菜鸡蛋馅的饺子public sealed class ConcreteClass2 : AbstractClass{    public override void MakingDough()//要想吃饺子第一步肯定是“和面”---该方法相当于算法中的某一步    {        Console.WriteLine("在和面的时候加入胡萝卜汁,和好的面就是橙色的");//我想要面是橙色的,加入胡萝卜汁就可以。在此步定制就可以了。    }     public override void MakeDumplings()    //要想吃饺子第二部是“包饺子”---该方法相当于算法中的某一步    {        Console.WriteLine("农家鸡蛋和农家韭菜,制作成馅");    //我想吃韭菜鸡蛋馅的,在此步就可以定制了    }     public override void BoiledDumplings()//要想吃饺子第三部是“煮饺子”---该方法相当于算法中的某一步    {        Console.WriteLine("可以用一般煤气和不粘锅煮就可以");   //此处没要求    }}六、模板方法模式的实现要点:Template Method模式是一种非常基础性的设计模式,在面向对象系统中有着大量的应用。它用最简洁的机制(虚函数的多态性)为很多应用程序框架提供了灵活的扩展,是代码复用方面的基本实现结构。除了可以灵活应对子步骤的变化外,“Don't call me, let me call you(不要调用我,让我来调用你)”的反向控制结构是Template Method的典型应用。1、模板方法模式适用情形:(1)、一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。(2)、各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。(3)、控制子类扩展。模板方法只允许在特定点进行扩展,而模板部分则是稳定的。2、模板方法模式特点:(1)、TemplateMethod模式是一种非常基础性的设计模式,在面向对象系统中大量应用。它用最简洁的机制(基础、多态)为很多应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构。(2)、在具体实现方面,被TemplateMethod调用的虚方法可以具有实现,也可以没有任何实现(抽象方法或虚方法)。但一般推荐将它们设置为protected方法使得只有子类可以访问它们。(3)、模板方法模式通过对子类的扩展增加新的行为,符合“开闭原则”。七、.NET 中模板模式的实现这种模式在控件设计中大量的用到,比如:控件有自己的生命周期,Page对象也有自己的生命周期,Application应用对象也有自己的生命周期,这个生命周期里面的每个阶段其实就是模板方法里面包含的每个步骤,这些阶段步骤会被一个方法包含着,这个方法就是“模板方法”。让我们再说说控件吧,因为写好的控件,可能需要被开发人员自定义,那么在控件里我们已经定义好了控件呈现、动作的骨架,但是有些自定义的需求,需要延迟到扩展控件的开发人员来决定。    当我们在做Windows应用程序的时候,就会使用Windows控件,那Windows控件是如何显示在Windows Form 上的呢,就需要一个OnPaint方法把控件画出来,这里OnPaint是一个虚方法的子步骤,这就是一个Template Method设计模式。如果我们不去重写这个OnPaint方法,它就有一个基本的默认实现,画一个空窗体。这里我们并没有调用OnPaint方法,而是Application的Run会进入Windows的消息循环结构,Paint就是一个消息。当我们移动一下窗口都会导致Paint事件的发生,并导致OnPaint函数的调用,这就是一种反向调用。当然,还有很多其他的子步骤可以提供扩展点,例如OnClose等,很多以On开头的全部都是Template Method模式的虚方法。 这个里面内容很复杂,它并不是用一个Template Method在里面调用所有的子步骤方法,它实际上是把整体的Template Method方法置于了一个消息循环的结构里面,我们可以把消息循环的结构看做模板方法里面的TemplateMethod公有非虚方法。到此这篇关于.Net行为型设计模式之模板方法模式(Template Method)的文章就介绍到这了。转载自https://www.jb51.net/article/249362.htm
  • [技术干货] .Net行为型设计模式之迭代器模式(Iterator)(转载)
    这篇文章介绍了.Net行为型设计模式之迭代器模式(Iterator),文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下目录一、动机(Motivate)二、意图(Intent)三、结构图四、模式的组成五、迭代器模式的代码实现六、迭代器模式的实现要点:迭代器模式的优点:迭代器模式的缺点:迭代器模式的使用场景:七、.NET 中迭代器模式的实现一、动机(Motivate)在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“同一种算法在多种集合对象上进行操作”提供了可能。使用面向对象技术将这种遍历机制抽象为“迭代器对象”为“应对变化中的集合对象”提供了一种优雅的方式。二、意图(Intent)提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。                                 ——《设计模式》GoF三、结构图四、模式的组成从迭代器模式的结构图可以看出,它涉及到四个角色,它们分别是:(1)、抽象迭代器(Iterator):抽象迭代器定义了访问和遍历元素的接口,一般声明如下方法:用于获取第一个元素的first(),用于访问下一个元素的next(),用于判断是否还有下一个元素的hasNext(),用于获取当前元素的currentItem(),在其子类中将实现这些方法。(2)、具体迭代器(ConcreteIterator):具体迭代器实现了抽象迭代器接口,完成对集合对象的遍历,同时在对聚合进行遍历时跟踪其当前位置。(3)、抽象聚合类(Aggregate):抽象聚合类用于存储对象,并定义创建相应迭代器对象的接口,声明一个createIterator()方法用于创建一个迭代器对象。(4)、具体聚合类(ConcreteAggregate):具体聚合类实现了创建相应迭代器的接口,实现了在抽象聚合类中声明的createIterator()方法,并返回一个与该具体聚合相对应的具体迭代器ConcreteIterator实例。五、迭代器模式的代码实现迭代器模式在现实生活中也有类似的例子,比如:在部队中,我们可以让某一队伍当中的某人出列,或者让队列里面的每个人依次报名,其实这个过程就是一个遍历的过程。123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899// 客户端(Client)static void Main(string[] args){    Iterator iterator;    ITroopQueue list = new ConcreteTroopQueue();    iterator = list.GetIterator();     while (iterator.MoveNext())    {        string ren = (string)iterator.GetCurrent();        Console.WriteLine(ren);        iterator.Next();    }     Console.Read();} // 部队队列的抽象聚合类--该类型相当于抽象聚合类Aggregatepublic interface ITroopQueue{    Iterator GetIterator();} // 迭代器抽象类public interface Iterator{    bool MoveNext();    Object GetCurrent();    void Next();    void Reset();} //部队队列具体聚合类--相当于具体聚合类ConcreteAggregatepublic sealed class ConcreteTroopQueue : ITroopQueue{    private string[] collection;     public ConcreteTroopQueue()    {        collection = new string[] { "黄飞鸿", "方世玉", "洪熙官", "严咏春" };    }     public Iterator GetIterator()    {        return new ConcreteIterator(this);    }     public int Length    {        get { return collection.Length; }    }     public string GetElement(int index)    {        return collection[index];    }} // 具体迭代器类public sealed class ConcreteIterator : Iterator{    // 迭代器要集合对象进行遍历操作,自然就需要引用集合对象    private ConcreteTroopQueue _list;    private int _index;     public ConcreteIterator(ConcreteTroopQueue list)    {        _list = list;        _index = 0;    }     public bool MoveNext()    {        if (_index < _list.Length)        {            return true;        }        return false;    }     public Object GetCurrent()    {        return _list.GetElement(_index);    }     public void Reset()    {        _index = 0;    }     public void Next()    {        if (_index < _list.Length)        {            _index++;        }     }}六、迭代器模式的实现要点:1、迭代抽象:访问一个聚合对象的内容而无需暴露它的内部表示。2、迭代多态:为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。3、迭代器的健壮性考虑:遍历的同时更改迭代器所在的集合结构,会导致问题。迭代器模式的优点:(1)、迭代器模式使得访问一个聚合对象的内容而无需暴露它的内部表示,即迭代抽象。(2)、迭代器模式为遍历不同的集合结构提供了一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。迭代器模式的缺点:迭代器模式在遍历的同时更改迭代器所在的集合结构会导致出现异常。所以使用foreach语句只能在对集合进行遍历,不能在遍历的同时更改集合中的元素。迭代器模式的使用场景:(1)、访问一个聚合对象的内容而无需暴露它的内部表示。(2)、支持对聚合对象的多种遍历。(3)、为遍历不同的聚合结构提供一个统一的接口(即, 支持多态迭代)。七、.NET 中迭代器模式的实现在mscorlib程序集里有这样一个命名空间,该命名空间就是:System.Collections,在该命名空间里面早已有了迭代器模式的实现。对于聚集接口和迭代器接口已经存在了,其中IEnumerator扮演的就是迭代器的角色,它的实现如下:1234567891011public interface IEnumerator {      object Current      {           get;      }      bool MoveNext();      void Reset(); }属性Current返回当前集合中的元素,Reset()方法恢复初始化指向的位置,MoveNext()方法返回值true表示迭代器成功前进到集合中的下一个元素,返回值false表示已经位于集合的末尾。能够提供元素遍历的集合对象,在.Net中都实现了IEnumerator接口。IEnumerable则扮演的就是抽象聚集的角色,只有一个GetEnumerator()方法,如果集合对象需要具备跌代遍历的功能,就必须实现该接口。1234public interface IEnumerable{    IEumerator GetEnumerator();}抽象聚合角色(Aggregate)和抽象迭代器角色(Iterator)分别是IEnumerable接口和IEnumerator接口,具体聚合角色(ConcreteAggregate)有Queue类型, BitArray等类型。到此这篇关于.Net行为型设计模式之迭代器模式(Iterator)的文章就介绍到这了。转载自https://www.jb51.net/article/249370.htm
  • [技术干货] 探索链路追踪在.NET6工业物联网项目的应用
    # ExploringIoTDistributedTracingNet6 > > 如果觉得有用,请留言**学到了.** > > 已经会了的老哥,请留言**就这?** > ![jaeger.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/7/1651938728506392735.png) ## 可能遇到的问题 > 工业物联网项目自上而下一般分为ERP、Mes、SCADA、WCS、边缘网关、设备等 > 一个生产订单从SAP发送到设备要经过上述多个系统,当某个环节出现问题,可能需要各个团队共同查找问题,最传统的做法是翻阅各个系统的日志文件,这无疑是非常糟糕和低效的。 > > **APM系统**既可以帮你查找问题,又可以定位整个系统的瓶颈。 ## 应用性能监控 > APM(Application Performance Monitor),用来监控你的软件性能及行为。通常包括: - ### Metrics 指标 > 如CPU、内存、磁盘I/O、网络I/O等 - ### Logs 日志 > 通常程序输出的不同等级日志Debug、Info、Error等 - ### Traces 分布式追踪 > 包含请求中每个子操作的调用链路、开始和结束时间、传递的参数、对数据库的操作等 # OpenTelemetry ![opentelemetry-logo.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/7/1651938740326690780.png) OpenTelemetry是谷歌和微软推出的一套平台无关、厂商无关的协议标准,是OpenTracing和OpenCensus的大统一,使得开发人员能够方便的添加或更换底层APM的实现。我们可以使用它的数据收集中间件: > 生成、收集数据(Metrics,Logs and traces) > 将数据推送到Jaeger(或Zipkin、SkyWalking等后端) > 支持.Net、C++、Go、Java、js、Python等**11种语言(平台)** ![opentelemetry.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/7/1651938752759661357.png) 可以采集.Net项目的AspNetCore、Http、EFCore、HttpClient、Grpc等诊断数据 ![opentelemetry.instrumentation.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/7/1651938764950739887.instrumentation) 官方代码段 ```csharp // Define some important constants and the activity source var serviceName = "MyCompany.MyProduct.MyService"; var serviceVersion = "1.0.0"; var builder = WebApplication.CreateBuilder(args); // Configure important OpenTelemetry settings, the console exporter, and automatic instrumentation builder.Services.AddOpenTelemetryTracing(b => { b .AddConsoleExporter() .AddSource(serviceName) .SetResourceBuilder( ResourceBuilder.CreateDefault() .AddService(serviceName: serviceName, serviceVersion: serviceVersion)) .AddHttpClientInstrumentation() .AddAspNetCoreInstrumentation(); }); var app = builder.Build(); var httpClient = new HttpClient(); app.MapGet("/hello", async () => { var html = await httpClient.GetStringAsync("https://example.com/"); if (string.IsNullOrWhiteSpace(html)) return "Hello, World!"; else return "Hello, World!"; }); app.Run(); ``` ## Jaeger [Jaeger](https://www.jaegertracing.io/)是开源的分布式追踪系统,OpenTelemetry可以将收集到的数据导入到这个里面进行存储和查询。 ## Seq 项目使用[seq](https://datalust.co/seq)作为日志平台,轻量且.Net友好,支持sql查询以及图表展示,你也可以使用**Nlog+Elasticsearch+Kibana**。 ## 项目目录 ```shell script . ├──WebApp //webapp ├──WebApi //webapi ├──IoTGatewayService //模拟网关 ├──Device //模拟设备 └──LogService //日志消费服务 ``` > 项目介绍 | 项目 | 项目类型 | 作用 | 说明 | | :---------------: | :-----------: | :--------------------: | :----------------------------------------------------------- | | Device | 控制台 | 模拟一个Modbus-TCP设备 | 当设定温度变化会输出日志 | | IoTGatewayService | Grpc服务 | 模拟数据采集的网关 | 开放设定温度的Grpc接口使用Modbus协议将温度下发给设备 | | WebApi | WebApi | 提供设定温度Api | 接收用户输入的温度使用Grpc调用网关服务操作日志写入数据库将操作日志发送到RabbitMq | | WebApp | Web应用 | 用户访问 | 接收用户输入的温度调用WebApi展示结果 | | LogService | WorkerService | 后台服务 | 消费RabbitMq日志消息 | ## 启动方式 1. 使用docker-compose运行jaeger、rabbitmq、postgres、seq ```shell docker-compose up -d ``` 2. VisualStudio启动多个项目 ![start-projects.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/7/1651938778220610133.png) 3. 访问[Web](http://localhost:5000/),输入设定温度,回车确认 ![setValue.gif](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/7/1651938792341760288.gif) 4. 访问[Jaeger](http://localhost:16686/),查看链路追踪 ![jaeger.gif](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/7/1651938803745800496.gif) 5. 访问[Seq](http://localhost:5555/),查看日志 ![seq.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/7/1651938809648779815.png) ## 采样率 > 项目中后期可使用过滤器或降低采样率来减小数据收集对系统性能的影响。 ## 源码 在这里[ExploringIoTDistributedTracingNet6](https://github.com/iioter/ExploringIoTDistributedTracingNet6) # 相关链接 [1] OpenTelemetry:*https://opentelemetry.io/docs/instrumentation/net/* [2] Jaeger:*https://www.jaegertracing.io/* [3] Seq:*https://datalust.co/seq* [4] 源码:*https://github.com/iioter/ExploringIoTDistributedTracingNet6* [5] IoTGateway:*https://github.com/iioter/iotgateway* [6] opentelemetry文章:*https://mp.weixin.qq.com/s?__biz=MzAwNTMxMzg1MA==&mid=2654082294&idx=7&sn=472afb8235cd1dee322641b8add3e77c&chksm=80d830a3b7afb9b5dbba5cabe072a310820c75acf2097ad138c07b0792eab91ffbf340b43741&token=348599805〈=zh_CN#rd* # 求关注 ![qrcode.jpg](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/7/1651938816404759636.jpg)
  • [技术干货] 由ansible-gen生成API并由ansible-playbook下发netconf会话到Huawei S5731的调试过程
    下面简单介绍下调试ansible_collections的community.network.ce的module的方法,每个module执行的时候都是从module的main函数开始执行。以定位ce_mlag_intterface模块执行返回错误为例,问题现象是执行playbook后,返回如下错误,看样子像是把netconf报文在设备上执行的报错一样,于是打开debug看下调试信息,原本以为debug只有-vvv,原来一共可以敲-vvvvvv,v越多debug越多,通过和执行通过的module进行比较,发现如下差异可以看到左边执行失败的debug信息里使用的connection插件是network_cli,即命令行注入的方式,而右边执行通过使用的connection插件是netconf,因此去community.network的action目录中代码中搜索该打印,发现有个全局变量将该module定义为命令行注入方式配置,而ce_mlag_interface.py文件中使用的是netconf方式下发配置,因此此处的定义是不合理的,ce_mlag_interface删除后,playbook执行通过。注意:如果调试的是NE系列的产品或者插件,由于NE插件的ansible_collections没有放到ansible_collections官方的community.network命名空间下,而是独立创建了一个huaweidatacom.ne的命名空间,在安装完成后,它与community.network都在ansible_collections目录下是平行关系,因此在hosts文件中要指明 ansible_network_os=huaweidatacom.ne.ne,以避免不必要的麻烦,否则会报模块找不到的其他错误。
  • [行业资讯] .NET Framework 4.5.2, 4.6 和 4.6.1 本月底结束支持
    微软官博发布公告称,.NET Framework 4.5.2、4.6和4.6.1 将于2022年4月26日终止支持。在此日期之后,微软将不再为这些版本提供更新,包括安全修复和技术支持。如果您当前使用的是 .NET Framework 4.5.2、4.6或4.6.1运行时,则需要将已部署的运行时更新到更新的版本(至少在2022年4月26日之前的 .NET Framework 4.6.2)才能继续接收更新和技术支持。您无需针对 .NET Framework 4.6.2重新定位或重新编译您的应用程序。转载于CSDN
  • [行业资讯] 基于.NET6的开源工业物联网网关
    什么是工业物联网网关工业物联网网关(IIoTGateway)是一种硬件设备或软件程序,作为 本地设备(如PLC、扫码枪、机器人、数控机床、非标上位机等)与 云端系统(如物联网平台、SCADA系统、MES系统等)之间的 桥梁,在设备和云端之间流动的所有数据都通过IoT网关,如下图所示:数据的流向设备 到 云端 的通信( 数据采集 )云端 到 设备 的通信( 反向控制 )设备 到 设备 的通信( M2M )基于.NET6的开源工业物联网网关受益于.NET在工控以及医疗等领域的长期积累,网上的确分散着很多通信相关的dll、源码和项目,但至今没有基于B/S架构的开源项目,这也是本项目的初衷。依托.NET6开源、跨平台、高性能的特点,以及WTM 框架的低代码开发方式,快速搭建起网关应用。目前已完成遥测和属性的上传,反向控制正在开发中。项目地址github:iotgateway: https://github.com/iioter/iotgateway/gitee:iotgateway: https://gitee.com/iioter/iotgateway/项目文档:http://42.193.160.84/在线体验:http://42.193.160.84:518/开源网关具有以下特点跨平台运行既可以是windows,也可以是linux系统;既可以是主机运行,也可以通过docker运行;既可以是x86主机,也可以是arm32、arm64嵌入式开发板。内置多种驱动驱动可以看做公司的一种无形资产。目前提供Modbus完整协议、西门子全系列PLC、三菱QPLC、欧姆龙PLC、ABPLC、MTConnect数控机床等驱动。当然你也可以通过驱动Demo实现自己的驱动,也可以集成业内流行的IoTClient(码农一生)、HSL(胡工)等提供的驱动进行整合。计算表达式类似于js等脚本语言,C#也可以作为脚本进行动态编译执行,你可以随时修改表达式对数据进行二次计算,不只是倍率的计算哦。MQTT服务OPCUA服务内置OPCUA Server,你的工控系统可以很方便的获取数据。注意,项目中OPCUA相关功能仅用作学习及测试, 若使用OPCUA协议请联系OPC基金会进行授权,产生一切纠纷与本项目无关。数字孪生3D可视化在线组态无缝集成在线组态项目,快速设计和部署你的可视化应用。为什么需要物联网网关协议转换面对不同年代、不同厂家、不同协议的设备多少会让人头疼,IoT网关会帮助你 屏蔽协议的差异,转换为常用的物联网协议(如MQTT、HTTP等)输出到平台端,让你有更多时间专注于平台端的业务建设。保证安全所有物联网设备都有被外部影响和攻击的可能,但IoT网关在互联网和设备本身之间增加了另外一层,大幅度减少了连接到互联网的设备的数量,网关变成了第一道防线,进而防止外部各方对物联网设备进行未经授权的控制。容易扩展在工业现场的高度分散性的前提下,随着连接的设备数量不断增加,不同协议设备的持续接入,只能通过网关来管理和控制这些复杂的变化,而不是以往牵一发而动全身的痛苦的升级。数据处理数据预处理如 倍率、 偏移量处理等,这有助于边缘计算的发展,因为他本身就是边缘智能的一种简单应用。数据过滤设备产生的海量数据中,全部发送到平台端肯定是不堪重负的,一方面传输、处理和存储都是有成本的;另一方面可能只有一部分是需要关注的,如 变化的产量,就需要变化才上传,一直推送不变的值是没有意义的。数据汇总和聚合有些场景下不同设备或相同设备的不同变量是需要聚合计算后发送到平台端的,有些原始数据没有特别大的价值,当然这也可以 分担一部分平台端的压力。数据缓存网络通信不是100%可靠的,断线时IoT网关既需要 暂存数据,当网络恢复后发送至云端;又需要 存储云端的控制策略,让控制流程及时执行。
  • [问题求助] 【弹性云服务器ECS】【yum安装.net】安装.net失败
    【功能模块】服务器yum安装.net失败【操作步骤&问题现象】1、yum安装.net【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [开发环境] SSH远程连接时,显示java.net.SocketTimeoutException: connect timed out错误
    【功能模块】开发环境【操作步骤&问题现象】1、创建notebook2、启动ssh远程链接【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 请教一下现在的版本是否支持.NET Framework4.6.1
    推荐使用的.NET版本:.NET Framework 3.5、4.0、4.5版本,.NET Core 2.0、3.1版本
  • [问题求助] 内容审核文档不是说有nodejs 的sdk吗,怎么查不到nodejs的 只有.net
    内容审核文档不是说有nodejs 的sdk吗,怎么查不到nodejs的  只有.net
总条数:56 到第
上滑加载中