精华内容
下载资源
问答
  • 前言 之前写了一些小程序博文只是看文档边看边写,...在这里我有问题,为什么微信小程序不支持css里面直接导入本地图片作为背景图呢? 内联式 <view class="img" style="background-image: url(/sta...

    前言

    之前写了一些小程序的博文只是看文档边看边写,了解下他,这次可是真枪真刀的做了!

    框架使用的是美团的mpvue,我也是一边学习,一边写的,如有错误之处,还望大家指出。

    在这里我有个问题,为什么微信小程序不支持css里面直接导入本地图片作为背景图呢?

     

    内联式

    <view class="img" style="background-image: url(/static/images/draw.png)"></view>

     

    外部引入

    如果css是内嵌的或者外部引入的,那么背景图片就不能直接写本地地址,我这里是转存到七牛云后然后将外链写入,还有一种方式是将图片转为base64写入url()中

    .img {
          position: relative;
          width: 340px;
          height: 170px;
          background-image: url("http://cache.wangyangyang.vip/draw.png");
          background-size: 100%;
          background-repeat: no-repeat;
          // left: 18px;
          top: -14px;
        }

     

    imgae标签

    <image src="/static/images/game_count@3x.png" alt="参与场次"></image>

     

    转载于:https://www.cnblogs.com/wangyang0210/p/10411468.html

    展开全文
  • 1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。 1:软件系统中耦合的对象 如果我们打开机械式手表...

    1. IoC理论的背景
    我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。

    图1:软件系统中耦合的对象

    如果我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分别带动时针、分针和秒针顺时针旋转,从而在表盘上产生正确的时间。图1中描述的就是这样的一个齿轮组,它拥有多个独立的齿轮,这些齿轮相互啮合在一起,协同工作,共同完成某项任务。我们可以看到,在这样的齿轮组中,如果有一个齿轮出了问题,就可能会影响到整个齿轮组的正常运转。
    齿轮组中齿轮之间的啮合关系,与软件系统中对象之间的耦合关系非常相似。对象之间的耦合关系是无法避免的,也是必要的,这是协同工作的基础。现在,伴随着工业级应用的规模越来越庞大,对象之间的依赖关系也越来越复杂,经常会出现对象之间的多重依赖性关系,因此,架构师和设计师对于系统的分析和设计,将面临更大的挑战。对象之间耦合度过高的系统,必然会出现牵一发而动全身的情形。

    图2:对象之间复杂的依赖关系

    耦合关系不仅会出现在对象与对象之间,也会出现在软件系统的各模块之间,以及软件系统和硬件系统之间。如何降低系统之间、模块之间和对象之间的耦合度,是软件工程永远追求的目标之一。为了解决对象之间的耦合度过高的问题,软件专家Michael Mattson提出了IOC理论,用来实现对象之间的“解耦”,目前这个理论已经被成功地应用到实践当中,很多的J2EE项目均采用了IOC框架产品Spring。

    2. 什么是控制反转(IoC)
    IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”,还有些书籍翻译成为“控制反向”或者“控制倒置”。
    1996年,Michael Mattson在一篇有关探讨面向对象框架的文章中,首先提出了IOC 这个概念。对于面向对象设计及编程的基本思想,前面我们已经讲了很多了,不再赘述,简单来说就是把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。IOC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦,如下图:

    图3:IOC解耦过程

    大家看到了吧,由于引进了中间位置的“第三方”,也就是IOC容器,使得A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全部依靠“第三方”了,全部对象的控制权全部上缴给“第三方”IOC容器,所以,IOC容器成了整个系统的关键核心,它起到了一种类似“粘合剂”的作用,把系统中的所有对象粘合在一起发挥作用,如果没有这个“粘合剂”,对象与对象之间会彼此失去联系,这就是有人把IOC容器比喻成“粘合剂”的由来。
    我们再来做个试验:把上图中间的IOC容器拿掉,然后再来看看这套系统:

    图4:拿掉IoC容器后的系统

    我们现在看到的画面,就是我们要实现整个系统所需要完成的全部内容。这时候,A、B、C、D这4个对象之间已经没有了耦合关系,彼此毫无联系,这样的话,当你在实现A的时候,根本无须再去考虑B、C和D了,对象之间的依赖关系已经降低到了最低程度。所以,如果真能实现IOC容器,对于系统开发而言,这将是一件多么美好的事情,参与开发的每一成员只要实现自己的类就可以了,跟别人没有任何关系!
    我们再来看看,控制反转(IOC)到底为什么要起这么个名字?我们来对比一下:
    软件系统在没有引入IOC容器之前,如图1所示,对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B。无论是创建还是使用对象B,控制权都在自己手上。
    软件系统在引入IOC容器之后,这种情形就完全改变了,如图3所示,由于IOC容器的加入,对象A与对象B之间失去了直接联系,所以,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方。
    通过前后的对比,我们不难看出来:对象A获得依赖对象B的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。

    3.  IOC的别名:依赖注入(DI)
    2004年,Martin Fowler探讨了同一个问题,既然IOC是控制反转,那么到底是“哪些方面的控制被反转了呢?”,经过详细地分析和论证后,他得出了答案:“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由自身管理变为了由IOC容器主动注入。于是,他给“控制反转”取了一个更合适的名字叫做“依赖注入(Dependency Injection)”。他的这个答案,实际上给出了实现IOC的方法:注入。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。

    所以,依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦
    我们举一个生活中的例子,来帮助理解依赖注入的过程。大家对USB接口和USB设备应该都很熟悉吧,USB为我们使用电脑提供了很大的方便,现在有很多的外部设备都支持USB接口。

    图5:USB接口和USB设备

    现在,我们利用电脑主机和USB接口来实现一个任务:从外部USB设备读取一个文件。
    电脑主机读取文件的时候,它一点也不会关心USB接口上连接的是什么外部设备,而且它确实也无须知道。它的任务就是读取USB接口,挂接的外部设备只要符合USB接口标准即可。所以,如果我给电脑主机连接上一个U盘,那么主机就从U盘上读取文件;如果我给电脑主机连接上一个外置硬盘,那么电脑主机就从外置硬盘上读取文件。挂接外部设备的权力由我作主,即控制权归我,至于USB接口挂接的是什么设备,电脑主机是决定不了,它只能被动的接受。电脑主机需要外部设备的时候,根本不用它告诉我,我就会主动帮它挂上它想要的外部设备,你看我的服务是多么的到位。这就是我们生活中常见的一个依赖注入的例子。在这个过程中,我就起到了IOC容器的作用
    通过这个例子,依赖注入的思路已经非常清楚:当电脑主机读取文件的时候,我就把它所要依赖的外部设备,帮他挂接上。整个外部设备注入的过程和一个被依赖的对象在系统运行时被注入另外一个对象内部的过程完全一样。
    我们把依赖注入应用到软件系统中,再来描述一下这个过程:
    对象A依赖于对象B,当对象 A需要用到对象B的时候,IOC容器就会立即创建一个对象B送给对象A。IOC容器就是一个对象制造工厂,你需要什么,它会给你送去,你直接使用就行了,而再也不用去关心你所用的东西是如何制成的,也不用关心最后是怎么被销毁的,这一切全部由IOC容器包办。
    在传统的实现中,由程序内部代码来控制组件之间的关系。我们经常使用new关键字来实现两个组件之间关系的组合,这种实现方式会造成组件之间耦合。IOC很好地解决了该问题,它将实现组件间关系从程序内部提到外部容器,也就是说由容器在运行期将组件间的某种依赖关系动态注入组件中。

    4.  IOC为我们带来了什么好处

    我们还是从USB的例子说起,使用USB外部设备比使用内置硬盘,到底带来什么好处?
    第一、USB设备作为电脑主机的外部设备,在插入主机之前,与电脑主机没有任何的关系,只有被我们连接在一起之后,两者才发生联系,具有相关性。所以,无论两者中的任何一方出现什么的问题,都不会影响另一方的运行。这种特性体现在软件工程中,就是可维护性比较好,非常便于进行单元测试,便于调试程序和诊断故障。代码中的每一个Class都可以单独测试,彼此之间互不影响,只要保证自身的功能无误即可,这就是组件之间低耦合或者无耦合带来的好处。
    第二、USB设备和电脑主机的之间无关性,还带来了另外一个好处,生产USB设备的厂商和生产电脑主机的厂商完全可以是互不相干的人,各干各事,他们之间唯一需要遵守的就是USB接口标准。这种特性体现在软件开发过程中,好处可是太大了。每个开发团队的成员都只需要关心实现自身的业务逻辑,完全不用去关心其它的人工作进展,因为你的任务跟别人没有任何关系,你的任务可以单独测试,你的任务也不用依赖于别人的组件,再也不用扯不清责任了。所以,在一个大中型项目中,团队成员分工明确、责任明晰,很容易将一个大的任务划分为细小的任务,开发效率和产品质量必将得到大幅度的提高。
    第三、同一个USB外部设备可以插接到任何支持USB的设备,可以插接到电脑主机,也可以插接到DV机,USB外部设备可以被反复利用。在软件工程中,这种特性就是可复用性好,我们可以把具有普遍性的常用组件独立出来,反复利用到项目中的其它部分,或者是其它项目,当然这也是面向对象的基本特征。显然,IOC不仅更好地贯彻了这个原则,提高了模块的可复用性。符合接口标准的实现,都可以插接到支持此标准的模块中。
    第四、同USB外部设备一样,模块具有热插拔特性。IOC生成对象的方式转为外置方式,也就是把对象生成放在配置文件里进行定义,这样,当我们更换一个实现子类将会变得很简单,只要修改配置文件就可以了,完全具有热插拨的特性。
    以上几点好处,难道还不足以打动我们,让我们在项目开发过程中使用IOC框架吗?

    5.  IOC容器的技术剖析
    IOC中最基本的技术就是“反射(Reflection)”编程,目前.Net C#、Java和PHP5等语言均支持,其中PHP5的技术书籍中,有时候也被翻译成“映射”。有关反射的概念和用法,大家应该都很清楚,通俗来讲就是根据给出的类名(字符串方式)来动态地生成对象。这种编程方式可以让对象在生成时才决定到底是哪一种对象。反射的应用是很广泛的,很多的成熟的框架,比如象Java中的Hibernate、Spring框架,.Net中 NHibernate、Spring.Net框架都是把“反射”做为最基本的技术手段。
    反射技术其实很早就出现了,但一直被忽略,没有被进一步的利用。当时的反射编程方式相对于正常的对象生成方式要慢至少得10倍。现在的反射技术经过改良优化,已经非常成熟,反射方式生成对象和通常对象生成方式,速度已经相差不大了,大约为1-2倍的差距。
    我们可以把IOC容器的工作模式看做是工厂模式的升华,可以把IOC容器看作是一个工厂,这个工厂里要生产的对象都在配置文件中给出定义,然后利用编程语言的的反射编程,根据配置文件中给出的类名生成相应的对象。从实现来看,IOC是把以前在工厂方法里写死的对象生成代码,改变为由配置文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。
    6.  IOC容器的一些产品
    Sun ONE技术体系下的IOC容器有:轻量级的有Spring、Guice、Pico Container、Avalon、HiveMind;重量级的有EJB;不轻不重的有JBoss,Jdon等等。Spring框架作为Java开发中SSH(Struts、Spring、Hibernate)三剑客之一,大中小项目中都有使用,非常成熟,应用广泛,EJB在关键性的工业级项目中也被使用,比如某些电信业务。
    .Net技术体系下的IOC容器有:Spring.Net、Castle等等。Spring.Net是从Java的Spring移植过来的IOC容器,Castle的IOC容器就是Windsor部分。它们均是轻量级的框架,比较成熟,其中Spring.Net已经被逐渐应用于各种项目中。
    7. 使用IOC框架应该注意什么
    使用IOC框架产品能够给我们的开发过程带来很大的好处,但是也要充分认识引入IOC框架的缺点,做到心中有数,杜绝滥用框架。
    第一、软件系统中由于引入了第三方IOC容器,生成对象的步骤变得有些复杂,本来是两者之间的事情,又凭空多出一道手续,所以,我们在刚开始使用IOC框架的时候,会感觉系统变得不太直观。所以,引入了一个全新的框架,就会增加团队成员学习和认识的培训成本,并且在以后的运行维护中,还得让新加入者具备同样的知识体系。
    第二、由于IOC容器生成对象是通过反射方式,在运行效率上有一定的损耗。如果你要追求运行效率的话,就必须对此进行权衡。
    第三、具体到IOC框架产品(比如:Spring)来讲,需要进行大量的配制工作,比较繁琐,对于一些小的项目而言,客观上也可能加大一些工作成本。
    第四、IOC框架产品本身的成熟度需要进行评估,如果引入一个不成熟的IOC框架产品,那么会影响到整个项目,所以这也是一个隐性的风险。
    我们大体可以得出这样的结论:一些工作量不大的项目或者产品,不太适合使用IOC框架产品。另外,如果团队成员的知识能力欠缺,对于IOC框架产品缺乏深入的理解,也不要贸然引入。最后,特别强调运行效率的项目或者产品,也不太适合引入IOC框架产品,象WEB2.0网站就是这种情况。

    转载:https://www.cnblogs.com/superjt/p/4311577.html

    展开全文
  • 前言 从本文开始逐渐学习iOS自带多媒体处理框架,例如AVFoundation,VideoToolbox,CoreMedia,CoreVideo实现多媒体处理,...上介绍了AVFoundation框架中关于合并音视频文件相关对象关系,可以看到使用A

    前言

    从本文开始逐渐学习iOS自带的多媒体处理框架,例如AVFoundation,VideoToolbox,CoreMedia,CoreVideo实现多媒体的处理,并且将实现方式以及效果和ffmpeg的方式做对比

    给一个视频添加音乐,将多段音视频文件合并为一个文件是很常见的需求,AVFoundation就提供了这样的接口。

    本文的目的:
    为一段视频添加背景音乐

    音视频合并相关流程

    image.png

    上图介绍了AVFoundation框架中关于合并音视频文件的相关的对象关系图,可以看到使用AVFoundation合并音视频还是相对比较简单的。

    相关对象及函数介绍

    • 1、AVURLAsset
      容器对象,代表了要操作的容器。封装,解封装,音视频播放,以及音视频合并等等操作的基础都涉及到这个对象。

    • 2、AVAssetTrack
      音视频轨道对象,代表了文件中的一路音频流或者一路视频流,它作为每一个要被合并的音频或者视频流被添加到组合对象中最终进行合并

    • 3、AVMutableCompositionTrack
      组合轨道对象,它作为音视频合并的基础,通过它添加要合并的音频流或者视频流,分为两种类型:音频组合轨道对象和视频组合轨道对象,音频组合轨道对象只能添加音频流,视频组合轨道对象只能添加视频流

    • 4、AVMutableComposition
      组合对象,通过它构建组合轨道对象

    • 5、AVAssetExportSession
      执行合并操作并导出为文件对象,该对象内部应该是封装了合并多个音频流或者视频流的操作和封装操作

    实现代码

    #import <Foundation/Foundation.h>
    
    @interface AVMYComposition : NSObject
    
    /** 实现音视频合并功能
     *  1、要合并的视频时长大于任何一个音频的时长,有可能小于两段音频的时长
     *  2、以视频的时长为基准,如果两段音频的时长之和大于视频时长,则截取掉第二个音频的部分时间
     */
    - (void)startMerge:(NSURL*)audioUrl audio2:(NSURL*)audioUrl2 videoUrl:(NSURL*)videoUrl dst:(NSURL*)dsturl;
    
    @end
    
    import "AVMYComposition.h"
    #import <AVFoundation/AVFoundation.h>
    
    @implementation AVMYComposition
    {
        dispatch_semaphore_t processSemaphore;
    }
    - (void)startMerge:(NSURL*)audioUrl1 audio2:(NSURL*)audioUrl2 videoUrl:(NSURL*)videoUrl dst:(NSURL*)dsturl
    {
        processSemaphore = dispatch_semaphore_create(0);
        
        /** AVMutableComposition对象
         * 组合对象,它是AVAsset的子类,通过它来实现音视频的合并。它就相当于一个编辑容器,每一个要被合并的
         * 音频或者视频轨道被组装为AVMutableCompositionTrack然后进行合并
         *
         *  AVMutableCompositionTrack组合对象轨道,他是AVAssetTrack的子类。代表了每一个要被合并的音频或者视频轨道
         */
        AVMutableComposition *mixComposition = [AVMutableComposition composition];
        
        // 添加一个组合对象轨道,用于添加视频轨道
        AVMutableCompositionTrack *videoCompostioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
        AVURLAsset *videoAsset = [[AVURLAsset alloc] initWithURL:videoUrl options:nil];
        CMTime videoDuration = videoAsset.duration;
        AVAssetTrack *vdeotrack = [[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
        CMTimeRange videoTiemRange = CMTimeRangeMake(kCMTimeZero, videoDuration);
        NSError *error = nil;
        [videoCompostioTrack insertTimeRange:videoTiemRange ofTrack:vdeotrack atTime:kCMTimeZero error:&error];
        if (error) {
            NSLog(@"video insert error %@",error);
            return;
        }
        
        // 添加一个组合对象轨道,第二个参数为kCMPersistentTrackID_Invalid代表由系统自动生成ID
        AVMutableCompositionTrack *audioComTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
        AVURLAsset *audioAsset1 = [AVURLAsset assetWithURL:audioUrl1];
        // 将同步解析,会阻塞当前线程
        CMTime duration1 = audioAsset1.duration;
        AVAssetTrack *audioTrack1 = [[audioAsset1 tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
        CMTimeRange firstTimeRange = CMTimeRangeMake(kCMTimeZero,duration1);
        // 往组合对象轨道中添加轨道对象
        [audioComTrack insertTimeRange:firstTimeRange ofTrack:audioTrack1 atTime:kCMTimeZero error:&error];
        if (error) {
            NSLog(@"audio track %@",error);
            return;
        }
       
        AVURLAsset *audioAsset2 = [AVURLAsset assetWithURL:audioUrl2];
        // 阻塞当前线程
        CMTime duration2 = audioAsset2.duration;
        CMTime newDuration2 = duration2;
        if (CMTimeGetSeconds(duration1)+CMTimeGetSeconds(duration2) > CMTimeGetSeconds(videoDuration) && CMTimeGetSeconds(duration1) < CMTimeGetSeconds(duration2)) {
            newDuration2 = CMTimeSubtract(videoDuration, duration1);
        }
        CMTimeRange secondTimeRange = CMTimeRangeMake(kCMTimeZero, newDuration2);
        NSLog(@" tt %f tt %f",CMTimeGetSeconds(duration1),CMTimeGetSeconds(newDuration2));
        AVAssetTrack *audioTrack2 = [[audioAsset2 tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
        /** 参数解释:
         *  timeRange:代表截取track的时间范围内容然后插入这个组合对象的轨道中
         *  startTime:代表将这段内容按组对象轨道时间轴的指定位置插入
         */
        [audioComTrack insertTimeRange:secondTimeRange ofTrack:audioTrack2 atTime:duration1 error:&error];
        
        // 执行合并
        if ([[NSFileManager defaultManager] fileExistsAtPath:dsturl.path]) {
            [[NSFileManager defaultManager] removeItemAtURL:dsturl error:nil];
        }
        
        // 合并导出会话
        AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality];
        exportSession.outputURL = dsturl;
        exportSession.outputFileType = AVFileTypeQuickTimeMovie;
        
        [exportSession exportAsynchronouslyWithCompletionHandler:^{
            NSLog(@"over");
            dispatch_semaphore_signal(self->processSemaphore);
        }];
        
        dispatch_semaphore_wait(processSemaphore, DISPATCH_TIME_FOREVER);
        
        NSLog(@"结束了");
    }
    @end
    

     

    项目地址

    https://github.com/nldzsz/ffmpeg-demo

    位于AVFoundation目录下文件AVMYComposition.h/AVMYComposition.m中

    展开全文
  • 1、 Struts是一为开发基于模型(Model)-视图(View)-控制器(Controller)(MVC)模式应用架构开源框架,是利用Servlet,JSP和custom tag library构建Web应用一项非常有用技术。由于Struts能充分满足应用开发...
  • 1、 Struts是一为开发基于模型(Model)-视图(View)-控制器(Controller)(MVC)模式应用架构开源框架,是利用Servlet,JSP和custom tag library构建Web应用一项非常有用技术。由于Struts能充分满足应用开发...
  • xms应用框架 - 基于.netcore

    千次阅读 2019-12-20 10:13:23
    xms应用框架 - 基于.netcore背景一、xms是什么二、能干什么三、目标四、框架介绍1、元数据管理2、组织架构3、授权体系4、高度可视化配置5、业务扩展6、流程7、二次开发五、多鉴赏、源码地址 背景 鄙人经过多年...

    背景

    鄙人经过多年开发,数百个项目“打磨(折磨)”,各种国内外框架平台都有涉及,没有一款称心顺手的,原因有三,一是设计反人类,二是不开源根本无法突破框架限制,三是即使开源也是阉割版,然后在14年xms就开始萌芽了,初始阶段利用个人业余时间出了个版本,自己先拿了个实际项目练练,交付效果不错,诸多项目顺势就上了这个框架,之前是.net framework4.5,现在已成功升级为.netcore,运行于linux上

    一、xms是什么

    一款基于.netcore的现代化跨平台基础框架,包含众多常用模块,易上手、易扩展,xms的意思是x(可扩展的/任意的)m(管理)s(系统)
    

    二、能干什么

    经过几十个真实项目检验,应用场景有企业管理类软件、APP后台、微信小程序后台、saas后台等,不管你是创业小团队,还是个人私单小能手,亦或是产品经理或实施顾问,通通有你想要的内容,强烈推荐深入了解
    

    三、目标

    释放生产力,专注你的业务,致力于.netcore开源生态发展
    

    四、框架介绍

    在这里插入图片描述

    1、元数据管理

    实体:表名、权限、日志

    在这里插入图片描述

    字段:类型、值、验证、权限、日志

    在这里插入图片描述

    关系:一对多、多对一、多对多;行为有父子、引用

    在这里插入图片描述

    选项:字段选项、公共选项

    在这里插入图片描述

    2、组织架构

    基础:组织、部门、职位、用户

    在这里插入图片描述

    异动:部门调动、工作交接

    3、授权体系

    角色:基于角色授权(RBAC)

    在这里插入图片描述

    团队:类似用户组

    功能:菜单、按钮、表单、视图、报表、流程等

    在这里插入图片描述

    数据:实体(按级别,本人、本部门、上下级部门、组织)、分派、共享

    在这里插入图片描述

    4、高度可视化配置

    表单:所见即所得,进行布局、控件、样式、事件等配置

    在这里插入图片描述

    视图:

    a.数据列表:过滤条件、排序、列显示等支持配置及用户个性化;

    在这里插入图片描述

    在这里插入图片描述

    b.看板视图

    在这里插入图片描述

    图表:数据可视化分析,常用的有柱形、饼形、线形、漏斗等,可向下钻取

    在这里插入图片描述

    在这里插入图片描述

    仪表板:个性化首页,配置各角色关心的内容

    在这里插入图片描述

    5、业务扩展

    数据重复检测:按字段组合判断数据重复,数据新增或更改时触发

    在这里插入图片描述

    单据转换:根据映射规则生成新的记录,可携带一对多关系的实体

    在这里插入图片描述

    拦截规则:进行增、删、改时触发规则,满足条件即提示

    在这里插入图片描述

    单据编号:按规则自动生成唯一的单据编号

    在这里插入图片描述

    导入导出:格式支持配置,数据通过权限体系监管

    在这里插入图片描述

    在这里插入图片描述

    6、流程

    审批流:节点信息、流转条件、处理者、附件、提醒等设置,支持撤消、分派,当前流程状态,审批历史

    在这里插入图片描述

    业务流:串连多个实体,配置业务阶段、实体流转、向前向后

    在这里插入图片描述

    7、二次开发

    web资源:JS、HTML

    在这里插入图片描述

    在这里插入图片描述

    插件:实体插件、表单插件、列表插件、事件插件

    在这里插入图片描述

    扩展模块:独立运行、快速集成

    五、多图鉴赏

    首页

    在这里插入图片描述

    配置中心

    在这里插入图片描述

    待办任务

    在这里插入图片描述

    数据日志

    在这里插入图片描述

    菜单编辑

    在这里插入图片描述

    六、源码地址

    基于.net core 3.1

    github地址:

    https://github.com/migomiddle/xms

    码云地址:

    https://gitee.com/migomiddle/xms

    一起玩耍口令:xms

    在这里插入图片描述

    展开全文
  • 在左边两个白色背景当中做出一个颜色不一样图形来区分开,在左边当中图片中做出来几个Logo,制作六个不同Logo,这六个不同Logo摆放距离相同,六个Logo放在一排,其中第上条因为是蓝色,...
  • 保形块是任何CFT中基本的,与理论无关的构造块,因此... 在相同的频谱分解方面,我们还提供了更紧凑的重新包装方法,以及关于p-adics的紧密相关但计​​算简单的框架的独立讨论,该框架允许对所有前述结果进行比较。
  • 之前公司项目用一直是MVP框架,我个人同时每月以前基于鸿神 WanAndroid API开发了一MVP版App ,使用MVP过程最深感受是开发效率极低,经常写一大堆早期了解了Jetpack模式下MVVM ,在LiveData、ViewModel...
  • vue 集成腾讯地图基础api Demo集合

    千次阅读 多人点赞 2021-01-13 16:57:33
    down下项目来会有个登录界面,随便输入六个字符就可以了(笔者很懒,懒得移除了,已经没救了) 项目预览 各位看官可以从这个地址直接拉取代码 然后复制粘贴就好了 项目说明 由于笔者时间仓促,目前只整理了四个...
  • 8.3.3 如何创建一非矩形的框架?在大多数应用程序中,框架都是矩形,因为矩形有一不错的规 则的形状,并且绘制和维护相对简单。...8.9显示了一非矩形的窗口,显示的背景是文本 编辑器中的代码
  • 第一章 背景和开发框架介绍 第二章 Node树和场景制作 第三章 UI、地图和关卡文本制作 第四章 摇杆、按键和角色spine动画制作 第五章 敌人和AI制作 第章 角色和敌人行为互动脚本制作 第七章 游戏打包、发布和调试 ...
  • 7.4.1 对象的图框精确剪裁 7.4.2编 辑框精确剪裁 7.5 典型实例——胶片效果 小结 过关练习七 第8章 位图处理 8.1 位图导入及矢量导出 8.1.1 位图导入 8.1.2 矢量导出为位图 8.2 矢量转换为位图 8.3 位图...
  • 首先利用主动形状模型(ASM)跟踪定位这55基准点,然后利用三角剖分获得相对位置信息,以及应用纹理映射技术将表情图像映射到标准人脸参考模型中,这样中性表情图像(不含表情信息人脸)和非中性表情(种...
  • 有ColumnType.Own,ColumnType.Child,两值可以设置,假设UserInfo 有属性是Family family对象,你想解析faily对象属性monther,father两属性,则需要设置Child,并在monther,father下添加相对应注解@...
  • 第一章 背景和开发框架介绍 第二章 Node树和场景制作 第三章 UI、地图和关卡文本制作 第四章 摇杆、按键和角色spine动画制作 第五章 敌人和AI制作 第章 角色和敌人行为互动脚本制作 第七章 游戏打包、发布和调试 ...
  • 其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持,Spring做管理,管理Struts和Hibernate。 WebStorage HTML新增的本地存储解决...
  • 图形对象类封装了所有六个图形对象。 下面表格列出了MFC图形对象类: MFC类 图形对象句柄 图形对象目的 CBitmap HBITMAP 内存中位图 CBrush HBRUSH 画刷特性—填充某个图形时所使用颜色和模式 CFont ...
  • 医院管理住院系统是当今大部分现代化医院所具备系统,它和医院紧密联系在一起。由于它实现,大大方便了医院管理,并且为医生和病人提供了很大便利,缩短了病人求医时间,为病人和医生之间快速...
  • 课程的背景 Qt是一1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程式,也可用于开发非GUI程式,比如控制台 工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 226
精华内容 90
关键字:

六个框架的背景图