用abp vNext快速开发Quartz.NET定时任务管理界面

依乐祝 2019-02-28 01:14:00 阅读数:150 评论数:0 收藏数:0

今天这篇文章我将通过实例代码带着大家一步一步通过abp vNext这个asp.net core的快速开发框架来进行Quartz.net定时任务调度的管理界面的开发。大伙最好跟着一起敲一下代码,当然源码我会上传到github上,有兴趣的小伙伴可以在文章底部查看源码链接。

作者:依乐祝
原文链接:https://www.cnblogs.com/yilezhu/p/10444060.html

写在前面

有几天没更新博客了,一方面因为比较忙,另一方面是因为最近在准备组织我们霸都合肥的.NET技术社区首次非正式的线下聚会,忙着联系人啊,这里欢迎有兴趣的小伙伴加我wx:jkingzhu进行详细的了解,当然也欢迎同行加我微信,然后我拉你进入我们合肥.NET技术社区微信群跟大伙进行交流。

概念

开始之前还有必要跟大伙说一下abp vNext以及Quartz.net是什么,防止有小白。如果对这两个概念非常熟悉的话可以直接阅读下一节。项目最终实现的效果如下图所示:

1551252591337

abp vNext是什么

说起abp vNext就要从另一个概念开始说起了,那就是大名鼎鼎的ABP了。
ABP 官方的介绍是:ASP.NET Boilerplate 是一个用最佳实践和流行技术开发现代 WEB 应用程序的新起点,它旨在成为一个通用的 WEB 应用程序基础框架和项目模板。基于 DDD 的经典分层架构思想,实现了众多 DDD 的概念(但没有实现所有 DDD 的概念)。
而ABPVNext的出现是为了抛弃掉.net framework 版本下的包袱,重新启动的 abp 框架,目的是为了放弃对传统技术的支持,让 asp.net core 能够自身做到更加的模块化,目前这块的内容还不够成熟。原因是缺少组件信息和内容。
如果你想用于生产环境建议你可以使用ABP,如果你敢于尝试,勇于创新的话可以直接使用abp vNext进行开发的。
abp vNext官网:https://abp.io/
github:https://github.com/abpframework/abp
文档:https://abp.io/documents

Quartz.NET是什么

Quartz.NET是一个强大、开源、轻量的作业调度框架,你能够用它来为执行一个作业而创建简单的或复杂的作业调度。它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等。目前已经正式支持了.NET Core 和async/await。
说白了就是你可以使用Quartz.NET可以很方便的开发定时任务诸如平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等。

实例演练

这一节我们通过实例进行操作,相信跟着做的你也能够把代码跑起来。

ABP vNext代码

既然我们此次演练的项目是使用的abp vNext这个asp.net core的快速开发框架来完成的,所以首先在项目开始之前,你需要到ABP vNext的官网上去下载项目代码。英文站打开慢的话,可以访问中文子域名进行访问:https://cn.abp.io/Templates 。下面给出具体步骤:

  1. 打开https://cn.abp.io/Templates 然后如图填写对应的项目名称,这里我用的Czar.AbpDemo 项目类型选择ASP.NET Core MVC应用程序,因为这个是带有UI界面的web项目,数据库提供程序选择EFCore这个大家都比较熟悉,然后点击创建就可以了。

    1551248124416

  2. 下载后,解压到一个文件夹下面,然后用vs打开解决方案,看到如下图所示的项目结构

    1551248279486

  3. 这里简单介绍下,每个项目的作用,具体的就不过多介绍了,在下面的实战代码中慢慢体会吧

    • .Domain 为领域层.
    • .Application 为应用层.
    • .Web 为是表示层.
    • .EntityFrameworkCore 是EF Core集成.

    解决方案还包含配置好的的单元&集成测试项目, 以便与于EF CoreSQLite 数据库配合使用.

  4. 查看.Web项目下appsettings.json文件中的 连接字符串并进行相应的修改,怎么改不要问我:

    {
      "ConnectionStrings": {
        "Default": "Server=localhost;Database=CzarAbpDemo;Trusted_Connection=True;MultipleActiveResultSets=true"
      }
    }
  5. 右键单击.Web项目并将其设为启动项目

    1551248539374

  6. 打开包管理器控制台(Package Manager Console), 选择.EntityFrameworkCore项目作为默认项目并运行Update-Database命令:

    1551248591831

  7. 现在可以运行应用程序,它将会打开home页面:

    1551248689114

  8. 点击“Login” 输入用户名admin, 密码1q2w3E*, 登录应用程序.

    启动模板包括 身份管理(identity management) 模块. 登录后将提供身份管理菜单,你可以在其中管理角色,用户及其权限. 这个不过多讲解了,自己去动手操作一番吧

集成Quartz.NET管理功能

这部分我们将实现Quartz.NET定时任务的管理功能,为了进行Quartz.NET定时任务的管理,我们还需要定义一个表来进行Quartz.NET定时任务的信息的承载,并完成这个表的增删改查功能,这样我们在对这个表的数据进行操作的同时来进行Quartz.NET定时任务的操作即可实现我们的需求。话不多说,开始吧。这部分我们再分成两个小节:JobInfo的增删改查功能的实现,Quartz.NET调度任务功能的增删改查的实现。

JobInfo的增删改查功能的实现

这个部分你将体会到我为什么使用abp vNext框架来进行开发了,就是因为快~~~~

  1. 创建领域实体对象JobInfo,这个在领域层代码如下:

    1551249480050

  2. 将我们的JobInfo实体添加到DBContext中,这样应该在EF层

    1551249406105

  3. 添加新的Migration并更新到数据库中,这个应该算EFCore的基础了吧,两个步骤,一个“Add-Migration” 然后“Update-Database”更新到数据库即可

    Add-Migration "Add_JobInfo_Entity"
    Update-Database
  4. 应用层创建页面显示实体BookDto 用来在 基础设施层 和 应用层 传递数据

    1551249983515

  5. 同样的你还需要在应用层创建一个用来传递增改的Dto对象
    1551250041669

  6. 万事俱备,只欠服务了,接下来我们创建一下JobInfo的服务接口以及服务接口的实现了,这里有个约定,就是所有的服务AppService结尾,就跟控制器都以Controller结尾的概念差不多。

    1551250166378

    服务实现:

    1551250189323

    注释还算清真,相信你应该能看懂。

  7. 这里abp vNext框架就会自动为我们实现增删改查的API Controllers接口的实现(可以通过swagger进行查看),还会自动 为所有的API接口创建了JavaScript 代理.因此,你可以像调用 JavaScript function一样调用任何接口.

    如下图所示

    1551250400532
    是不是,感觉什么都还没做,所有接口都已经实现的感觉。

  8. 新增一个菜单任务调度的菜单,如下代码所示:

    1551250546971

  9. 对应的,我们需要在Pages/JobSchedule 这个路径下面创建对应的Index.cshtml页面,以及新增,编辑的页面。由于内容太多,这里就不贴代码了,只给大家贴下图:

    Index.cshtml

    1551250659492

    CreateModal.cshtml代码如下:

    1551250688733

  10. 然后我们运行起来查看下:

    1551250773502

  11. 点击,右上角的新增,会弹出新增界面,点击每一行的操作,会弹出删除(删除,这里只做了一个假功能),编辑的两个选项。

  12. 到此,JobInfo的增删改查就做好了,是不是很简单,这就是abp vNext赋予我们的高效之处。

Quartz.NET调度任务功能的增删改的实现

在使用Quartz.NET之前,你需要通过Nuget进行下安装,然后才能进行调用。这里我不会给你详细讲解Quartz.NET的使用,因为这将占用大量的篇幅,并偏离本文的主旨

  1. 安装Quartz.NET的Nuget包:

    1551251014507

  2. 新建一个ScheduleCenter 的任务调度中心,代码如下所示:

      /// <summary>
        /// 任务调度中心
        /// </summary>
        public class ScheduleCenter
        {
            private readonly ILogger _logger;
            public ScheduleCenter(ILogger<ScheduleCenter> logger)
            {
                _logger = logger;
            }
    
            /// <summary>
            /// 任务计划
            /// </summary>
            public IScheduler scheduler = null;
            public  async Task<IScheduler> GetSchedulerAsync()
            {
                if (scheduler != null)
                {
                    return scheduler;
                }
                else
                {
                    // 从Factory中获取Scheduler实例
                    NameValueCollection props = new NameValueCollection
                    {
                        { "quartz.serializer.type", "binary" },
                        //以下配置需要数据库表配合使用,表结构sql地址:https://github.com/quartznet/quartznet/tree/master/database/tables
                        //{ "quartz.jobStore.type","Quartz.Impl.AdoJobStore.JobStoreTX, Quartz"},
                        //{ "quartz.jobStore.driverDelegateType","Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz"},
                        //{ "quartz.jobStore.tablePrefix","QRTZ_"},
                        //{ "quartz.jobStore.dataSource","myDS"},
                        //{ "quartz.dataSource.myDS.connectionString",AppSettingHelper.MysqlConnection},//连接字符串
                        //{ "quartz.dataSource.myDS.provider","MySql"},
                        //{ "quartz.jobStore.usePropert ies","true"}
    
                    };
                    StdSchedulerFactory factory = new StdSchedulerFactory(props);
                    return await factory.GetScheduler();
    
                }
            }
    
            /// <summary>
            /// 添加调度任务
            /// </summary>
            /// <param name="jobName">任务名称</param>
            /// <param name="jobGroup">任务分组</param>
            /// <returns></returns>
            public async Task<bool> AddJobAsync(CreateUpdateJobInfoDto infoDto)
            {
                try
                {
                    if (infoDto!=null)
                    {
                        if (infoDto.StarTime == null)
                        {
                            infoDto.StarTime = DateTime.Now;
                        }
                        DateTimeOffset starRunTime = DateBuilder.NextGivenSecondDate(infoDto.StarTime, 1);
                        if (infoDto.EndTime == null)
                        {
                            infoDto.EndTime = DateTime.MaxValue.AddDays(-1);
                        }
                        DateTimeOffset endRunTime = DateBuilder.NextGivenSecondDate(infoDto.EndTime, 1);
                        scheduler = await GetSchedulerAsync();
                        JobKey jobKey = new JobKey(infoDto.JobName, infoDto.JobGroup);
                        if (await scheduler.CheckExists(jobKey))
                        {
                            await scheduler.PauseJob(jobKey);
                            await scheduler.DeleteJob(jobKey);
                        }
                        IJobDetail job = JobBuilder.Create<LogTestJob>()
                          .WithIdentity(jobKey)
                          .Build();
                        ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
                                                     .StartAt(starRunTime)
                                                     .EndAt(endRunTime)
                                                     .WithIdentity(infoDto.JobName, infoDto.JobGroup)
                                                     .WithCronSchedule(infoDto.CronExpress)
                                                     .Build();
                        await scheduler.ScheduleJob(job, trigger);
                        await scheduler.Start();
                        return true;
                    }
    
                    return false;//JobInfo为空
                }
                catch (Exception ex)
                {
                    _logger.LogException(ex);
                    return false;//出现异常
                }
            }
    
            /// <summary>
            /// 暂停指定任务计划
            /// </summary>
            /// <param name="jobName">任务名</param>
            /// <param name="jobGroup">任务分组</param>
            /// <returns></returns>
            public async Task<bool> StopJobAsync(string jobName, string jobGroup)
            {
                try
                {
                    JobKey jobKey = new JobKey(jobName, jobGroup);
                    scheduler = await GetSchedulerAsync();
                    if (await scheduler.CheckExists(jobKey))
                    {
                        await scheduler.PauseJob(new JobKey(jobName, jobGroup));
                        return true;
                    }
                    else
                    {
                        return false;//任务不存在
                    }
                }
                catch (Exception ex)
                {
                    _logger.LogException(ex);
                    return false;//出现异常
                }
            }
    
            /// <summary>
            /// 恢复指定的任务计划,如果是程序奔溃后 或者是进程杀死后的恢复,此方法无效
            /// </summary>
            /// <param name="jobName">任务名称</param>
            /// <param name="jobGroup">任务组</param>
            /// <returns></returns>
            public async Task<bool> ResumeJobAsync(string jobName, string jobGroup)
            {
                try
                {
                    JobKey jobKey = new JobKey(jobName, jobGroup);
                    scheduler = await GetSchedulerAsync();
                    if (await scheduler.CheckExists(jobKey))
                    {
                        //resumejob 恢复
                        await scheduler.ResumeJob(new JobKey(jobName, jobGroup));
                        return true;
                    }
                    else
                    {
                        return false;//不存在任务
                    }
    
                }
                catch (Exception ex)
                {
                    _logger.LogException(ex);
                    return false;//出现异常
                }
            }
    
            /// <summary>
            /// 恢复指定的任务计划,如果是程序奔溃后 或者是进程杀死后的恢复,此方法无效
            /// </summary>
            /// <param name="jobName">任务名称</param>
            /// <param name="jobGroup">任务组</param>
            /// <returns></returns>
            public async Task<bool> DeleteJobAsync(string jobName, string jobGroup)
            {
                try
                {
                    JobKey jobKey = new JobKey(jobName, jobGroup);
                    scheduler = await GetSchedulerAsync();
                    if (await scheduler.CheckExists(jobKey))
                    {
                        //DeleteJob 恢复
                        await scheduler.DeleteJob(jobKey);
                        return true;
                    }
                    else
                    {
                        return false;//不存在任务
                    }
    
                }
                catch (Exception ex)
                {
                    _logger.LogException(ex);
                    return false;//出现异常
                }
            }
        }
  3. 新建一个LogTestJob 的计划任务,代码如下所示,需要继承IJob接口:

    1551251169229

  4. 至此Quartz.NET调度任务功能完成

集成

这里我们按照之前的思路对JobInfo跟Quartz.NET任务进行集成

  1. 新增时,启动任务:

    1551251315532

  2. 编辑时,更新任务

    1551251351318

  3. 这里细心的网友,可能注意到任务的删除是在编辑里面进行实现的。而列表页面的删除功能并没有实现真正意义的功能的删除。

功能演示

上面我们演示的任务是一个每5秒写入当前时间的一个任务,并实现了对这个任务的新增,删除,编辑的功能,这里大伙可以自行实现进行测试,也可以下载我的代码进行尝试。效果图如下所示:

1551251560062

功能扩展

目前只能对既定义好任务进行调度,后期可以根据任务的名称,如我们实例中的测试任务LogTestJob 的名字找到这个任务,然后动态的进行处理。这样就可以在界面实现对多个任务进行调度了!当然还有其他的扩展,本文只是作为引子。

源码地址

GitHub:https://github.com/yilezhu/AbpQuzatzDemo

总结

本文只是简单的利用abp vNext框架进行Quartz.NET任务调度进行UI的管理,实现的功能也比较简单,大家完全可以在此基础上进行扩展完善,最后感谢大伙的阅读。


版权声明:本文为[依乐祝]原创文章
转载请带上:http://copyfuture.com/blogs-details/eece5e2f732702d6ef977ecbb9fbcc66
或:https://www.cnblogs.com/yilezhu/p/10444060.html


  1. 西蒙尼的马竞要曲终人散了!与穆帅的崩盘原因如出一辙
  2. 澳洲太土,英硕太水?!原来留学英澳的差别这么大
  3. 比亚迪:将扩大产能,缩短订车用户等待时间,解决订车合同纠纷
  4. java基础(十三)-----详解内部类——Java高级开发必须懂的
  5. 国产工业机器人厂商抢占高地 向中高端挺进是必然
  6. 又一合资拼了!原价20.99万,下探至10.99万,销量一下翻了4倍!
  7. 阿泰斯特谈史上最强的4个球员!力挺杜兰特入选理由很简答
  8. 1.8T国六8AT,是否能逆袭呢?
  9. 中国禁止加拿大最大谷物加工商向华出口油菜籽
  10. 4月1日税率变更改如何应对呢?我以个人从事财务方面的角度剖析。
  11. 定义AI时代的基础设施,百度阳泉云计算中心撑起百度AI野心
  12. AT同时染指电子签名,蓝海变“钱海”的信号?
  13. Jenkins pipeline job 根据参数动态获取触发事件的分支
  14. 格列兹曼转会巴萨成定局,马竞想签入迪巴拉来顶替,西蒙尼已同意
  15. vmware中的linux虚拟机配置以nat模式上网,并用xshell连接该虚拟机
  16. 拼多多第四季度营收8.22亿美元 同比增长379%
  17. 输掉10亿赌约,身家跌至百名开外,手机生态链谁能拯救雷军?
  18. 蒙特-莫里斯:勇士球员太强 季后赛可能遇到他们
  19. 宋江死后无人报仇可以理解,这两位好汉吃官司时怎么也无人帮忙?
  20. JSP基础语法
  21. 《超级机器人大战T》第二话试玩演示及全DLC关卡预览图
  22. 亏损超42亿重走低价老路,不争气的国美零售何时能翻身?
  23. PHPStorm使用PHP7新特性出现红色波浪错误
  24. 《明日之后》有多逼真?玩家击落飞机,遇到了物理学的“常识”!
  25. 我国民航局叫停此机型,看看哪些航司很受伤!
  26. Dubbo 源码分析 - 服务调用过程
  27. 梦想装扮合成器复刻天7,一套需要多少钱呢?
  28. 已建1.5万个5G基站!韩国这家运营商厉害了,但中国将后来居上
  29. 军队作战不是街头斗殴,冷兵器时代军阵的重要性
  30. 不做诅咒的父母
  31. 父母的嘴,决定孩子的人生走向
  32. 哪一种是程序员最不喜欢的编程语言?初学编程者注意了!
  33. 福原爱挺9个月孕肚照全家福,穿细高跟网友表示好担心
  34. 印度陆军家大业大:有39个军队农场 一共养了3万头奶牛
  35. 6000字告诉你,孩子幼小衔接习惯养成攻略
  36. Python之父:为什么操作符很有用?
  37. 再次探讨企业级开发中的Try......Catch性能问题
  38. 当了将近十年的程序员,为什么从来没见过程序员带孩子
  39. 2018 世界人工智能大会(马云 马化腾 雷军 李彦宏)演讲录
  40. 厄尔尼诺持续到夏季?NOAA:60%概率,春季为80%,2019年或不好过
  41. 为什么我的对象被 IntelliJ IDEA 悄悄的修改了?
  42. 美国历史上最伟大的总统是谁
  43. 亲历创业富豪变成穷光蛋,马斯克的两位前妻经历了什么
  44. 毁掉下一代的不是抖音,而是毁灭体本身
  45. 三甲医院给孕妇发过期药,工作人员:就像吃剩的水果和饭菜
  46. java实现ftp连接池
  47. 五百健儿齐殉国,中华何止一田横——历时7天的宝山保卫战
  48. 华为企业业务2018年营收近100亿美元 未来目标是500亿美元
  49. 想让宝宝变得更聪明,一定不能缺了这个营养素!
  50. 新版厄加特报废还是重生?W变0CD机关枪,阵地坦克转向战士!
  51. 好员工,别以为裁员与你无关(上
  52. 女儿,感谢你让我一路随行!
  53. 佛说:不生气,才是做人最大的智慧
  54. 港媒曝许志安曾欲购出轨视频 黄心颖去国外躲避记者
  55. 腾讯的域名忘记续费,被阿里云拍了53.5万......
  56. 为啥程序会有bug?
  57. 机器学习算法原理与实践-朴素贝叶斯
  58. 人人车回应40亿资金支持:并不是说政府直接投资
  59. 喝酒,懂了这八句话,才算是喝明白了!
  60. mac系统vscode环境配置,以及iTerm2配置Zsh + on-my-zsh shell
  61. 区块链荒诞世界:我曾身家上亿 如今一无所有
  62. 程序员过关斩将--你的业务是可变的吗(福利你领了吗)
  63. Spring系列__02.ioc模块简介
  64. 贵人语迟?2019最新儿童语言发展规律,看看你家宝宝达标了吗?
  65. 抽象语法树(AST)
  66. 把原子放大到公交车那么大后刮原子壁,能刮出粉末一样的东西吗?
  67. “时间倒流”——典型的科学妄想
  68. 独自圈养43年,西班牙“世上最悲伤大象”被安乐死
  69. 什么时候买车更划算?
  70. 网站安装SSL证书已是大势所趋,到底什么是SSL?
  71. 分享数百个 HT 工业互联网 2D 3D 可视化应用案例
  72. 美国SpaceX公司的载人飞船的技术特点
  73. 国内辅助生育领域刚需未被全覆盖 港企如何分一杯羹?
  74. 小天鹅将阔别A股,留下25亿分红的佳话
  75. N+6 裁员裁出幸福感的背后
  76. 特斯拉们与小鹏汽车们的恩怨,是正常人员流动,还是商业偷窃?
  77. 节气养生 | 春天为何易上火?五脏“清火餐”怎么吃
  78. Uber司机提仲裁人数超6万:或需10年解决 耗资6亿美元
  79. 这部电影80年前上映,荣获9项奥斯卡,至今票房无人超越
  80. 搜索和其他机器学习问题有什么不同?
  81. 为对抗俄罗斯,这个国家不惜花费近500亿美元……
  82. 舵手图解:中国软件、中国卫星、中国核电、中科曙光、陕天然气
  83. 再等两天!哈弗全新SUV上市,换新变速箱+黑色LOGO,17万就能买
  84. 2018内蒙各市盟GDP:全国排名第21位的内蒙,GDP仍是蒙古国的20倍
  85. Win7终于也支持DirectX 12了!首个DX12支持游戏为《魔兽世界》
  86. 又一核心管理层高管离职!京东的末尾淘汰制已经上升到最高层了?
  87. 中国又一全球性超级工程!规模是美国的12倍,耗资上千亿
  88. 百度浏览器PC版4月30日起停止桌面百度等部分功能
  89. 大事记 - 安卓微信浏览器 video 标签层级过高
  90. 指点人生的金句子,句句良言,读读收获很多
  91. 日本爸爸靠拍娃走红ins,原来他的拍照方法这么简单
  92. 周总理弥留之际为何要见这个警卫
  93. 如何高效的学习WEB前端
  94. 比亚迪公布2月份销量数据,电动车销量竟涨了整整12倍
  95. 中东风云:1941年的盎格鲁-伊拉克战争
  96. oracle 遇到的bug总结(不定期更新)
  97. Java数据解析之JSON
  98. F16被美国限制 巴铁为何仍不买歼10?原来成飞亮出两款新隐形战机
  99. 史上最艰难续长居时期已经到来!居留卡连改革后的申根签都不如了吗?
  100. 哈佛商学院毕业,曾任法国驻日大使,她准老公比前夫好太多了吧?

  1. Python开发:部分第三方库无法在线安装解决方法(947)
  2. [Swift]LeetCode325. 最大子数组之和为k $ Maximum Size Subarray Sum Equals k(779)
  3. Matlab 2019a 安装包下载以及安装和激活(718)
  4. 仅限Edge和Chrome访问 全新网页端Skype应用上线(685)
  5. 前端笔记之NodeJS(一)初识NodeJS&内置模块&特点(683)
  6. C#读取excel文件提示未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序(663)
  7. 【预警通告】Weblogic反序列化远程代码执行漏洞(640)
  8. Visual Studio 2019 正式发布,重磅更新,支持live share(599)
  9. 【预警通告】Apache Tomcat远程代码执行漏洞CVE-2019-0232(573)
  10. 网上赌博平台维护审核提不了款怎么办?(535)
  11. React 与 React-Native 使用同一个 meteor 后台(527)
  12. Sublime Text3 最新版3207 安装及破解(458)
  13. Visual Studio 2019 正式发布(389)
  14. [翻译] Visual Studio 2019: 极速编码. 智能工作. 创造未来.(388)
  15. 刘强东身边的CXO还有谁“幸存”(373)
  16. 舍命生子产妇吴梦丈夫怒斥:没抢肺源不是精神分裂,网友断章取义(371)
  17. Confluence SSRF及远程代码执行漏洞处置手册(370)
  18. 机器学习 ML.NET 发布 1.0 RC(369)
  19. 阿里巴巴2018年纳税516亿元 同比增40%(368)
  20. K8s集群安装--最新版 Kubernetes 1.14.1(336)
  21. 雷军清华演讲实录:小米9年的创新、变革与未来(333)
  22. 小米手机卖不动了?(327)
  23. F#周报2019年第14期(317)
  24. 积分一样却选手下败将出战国际赛,《最强大脑》云队选手被坑了?(300)
  25. 《最强大脑》要垮?桑洁魏坤琳出轨细节被扒,戚薇才是神助攻(257)
  26. 华电教授孙玉兵被指与昔日同学共同学术造假,多所高校调查(250)
  27. F#周报2019年第15期(249)
  28. 日本明仁天皇退位,日本“平成”年代结束(246)
  29. linux系统安装cdcfordb2udb(241)
  30. Oracle甲骨文大规模裁员,你背离时代就会被淘汰(240)
  31. 他联系叙恐怖分子“卖军火”,称能搞到2000枚导弹,关键时刻中国警察出手(237)
  32. 魔兽世界:8.15搏击俱乐部坐骑获取流程 鳄鱼布鲁斯坐骑(236)
  33. 针对django2.2报错:UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 9737: ill....(235)
  34. 女友被曝插足许志安郑秀文婚姻 知情人透露马国明已下定决心分手(232)
  35. SQL简介及MySQL的安装目录详解(229)
  36. 视觉中国深夜道歉:全面配合监管部门彻底积极整改(228)
  37. 为什么国内汽车用沥青阻尼片,而欧洲主机厂却用树脂?(228)
  38. 谁是苏小明饭局爆粗偷拍者?知情人称另有其人(223)
  39. NodeJs之邮件(email)发送(222)
  40. 迪玛希好惨!昨晚《歌手》为声入人心男团帮帮唱,却再被指控侵权(222)
  41. 市值暴跌90%,世界零售巨头申请破产战胜了所有对手却输时代(221)
  42. 函数防抖,与函数节流(219)
  43. 机器学习基石笔记:01 The Learning Problem(217)
  44. 深度学习python的配置(Windows)(215)
  45. [深度应用]·实战掌握Dlib人脸识别开发教程(213)
  46. 许志安出轨视频系蓄谋偷拍?司机被曝收40万装红外摄像头(210)
  47. Google AI 系统 DeepMind 高中数学考试不及格(210)
  48. 干货!21部漫威电影观影顺序指南,在《复联4》之前赶紧补齐!(208)
  49. 赌命生子九个月后,吴梦离世:前半辈子任性了,我用生命买单(206)
  50. 威廉王子出轨凯特王妃闺蜜? 外媒称婚外情致兄弟反目(203)
  51. spring-cloud-sleuth+zipkin源码探究(203)
  52. WebGL three.js学习笔记 纹理贴图模拟太阳系运转(201)
  53. 新更新kb4493472导致无法正常开机(195)
  54. 杜敬谦死因疑曝光!或因他这一特殊的训练方式,泳迷高呼孙杨退役(190)
  55. AntDesign Form表单字段校验的三种方式(189)
  56. 韦杰落网,金诚集团终局(188)
  57. 华为推出方舟编译器 称可提升安卓系统效率(185)
  58. 山东庆云民企3000亩土地被贱卖 国企接盘拟转性(185)
  59. 《权力的游戏》龙妈有那么多爱她的人,为什么最终会选择琼恩雪诺(182)
  60. 张无忌为什么爱上她?陈钰琪版赵敏终于给答案了(181)
  61. “国防”靠美国? 韩国瑜=马英九2.0? 走着瞧(180)
  62. Python破解Wifi密码思路(180)
  63. 直认与老公感情淡了!27岁TVB上位女星:我们不是好熟(179)
  64. CUBA Studio 8.0 发布,企业级应用开发平台(179)
  65. 张丹峰出轨最新锤来了!毕滢的朋友圈简直刷新下限啊!(177)
  66. Github 上 Star 最多的个人 Spring Boot 开源学习项目(176)
  67. 使用 C 语言实现一个 HTTP GET 连接(175)
  68. 拿着普通员工超300倍的工资裁员800人,这家游戏公司CEO引发员工不满|一周新闻(175)
  69. AntD框架的upload组件上传图片时遇到的一些坑(175)
  70. 币安称 4000 万美元比特币被盗(174)
  71. 不要996!程序员创建955.WLB不加班公司名单,GitHub周榜第二(174)
  72. 《跃迁-成为高手的技术》之联机学习(173)
  73. Weblogic CVE-2019-2647等相关XXE漏洞分析(173)
  74. Codejam Qualification Round 2019(173)
  75. python爬虫重定向次数过多问题(172)
  76. simulink创建简单模型(172)
  77. 强大的jQGrid的傻瓜式使用方法。以及一些注意事项,备有相应的引入文件。(170)
  78. [NewLife.XCode]高级查询(168)
  79. Algolia使用教程 , 超详细傻子看都会(166)
  80. 核心算法缺位,人工智能发展面临“卡脖子”窘境(165)
  81. Delphi 开发微信公众平台 (二) 用户管理(164)
  82. 只需知道电话号码 即可监控任意一部手机,获取位置,太可怕(163)
  83. 范斯晶对祖母的称呼很意外,范志毅很心疼,缺少母爱的孩子不容易(162)
  84. 如何定位前端线上问题(如何排查前端生产问题)(162)
  85. 告诉你去越南芽庄必带回的好东西(161)
  86. 双双出轨!许志安劈腿马国明港姐女友,二人被拍16分钟激吻超20次(160)
  87. 数学家发现完美的乘法(160)
  88. 百度网盘下载神器 PanDownload v2.0.9(破解版、不限速)(159)
  89. 高管被警方带走背后:巧达科技操盘2亿人简历生意(159)
  90. 定义工作,解读自我——IT帮2019年2月线下活动回顾(159)
  91. 吹爆惠英红,《铁探》这位霸道总警司超带感!真乃港剧罕见大女主(156)
  92. vue生成图片验证码(155)
  93. 三国正史第一猛将:一人单挑数千人,不是吕布也不是关羽(154)
  94. 从0到1上线一个微信小程序(154)
  95. FreeSql 如何现实 Sqlite 跨库查询(154)
  96. 向佐的弟弟叫向佑,网友:那郭碧婷生的孩子叫什么?(153)
  97. spring-boot-2.0.3不一样系列之源码篇 - pageHelper分页,绝对有值得你看的地方(153)
  98. TensorFlow从1到2(十)带注意力机制的神经网络机器翻译(152)
  99. [Node.js] 3、搭建hexo博客(152)
  100. java基础(十五)----- Java 最全异常详解 ——Java高级开发必须懂的(152)

  1. [NOI2006] 网络收费
  2. 线性基的小证明...
  3. 从语言设计的角度探究Java中hashCode()和equals()的关系
  4. C# 多线程小试牛刀
  5. Python基础:输入与输出(I/O)
  6. link-1-STL 标准模板库
  7. mysql--浅谈多表查询1
  8. 进击JavaScript核心 --- (1)基本数据类型
  9. 大数据技术之_24_电影推荐系统项目_07_工具环境搭建(具体实操)
  10. 前端限制显示的文本字数的几种方法——不换行与换行
  11. 【实验吧】该题不简单——writeup
  12. 反向传播算法
  13. =、==、===、equals()的区别
  14. GitHub 推出开发者赞助项目
  15. 剑指Offer的学习笔记(C#篇)-- 从上往下打印二叉树
  16. argparse 在深度学习中的应用
  17. 张云雷复出?西城区文旅局:德云社在辖区内演出未发现违法违规问题
  18. Maven安装与配置
  19. acWing 825. 排队购物
  20. ajax&&jquery
  21. 苏联攻击机的悲壮行动,明知德军战机拦截,仍在无护航状态下出击
  22. 华为的5G技术,源于这种数学方法
  23. 一站式自动化测试平台 http://www.Autotestplat.com
  24. RabbitMQ总结
  25. 第九组 通信3班 063 自反ACL
  26. 短线还有最后一跌?大V们表示:反弹近了!(5月23日)
  27. 第九组 通信3班 063 OSPFv2与OSPFv3综合实验
  28. C# IE选项 - 重置IE
  29. Spring_数据校验和自定义检验规则
  30. 谈谈Java的string为什么是不可变的
  31. OFFICE 365 A1 Plus账号注册
  32. 初学python—做一个数组的增删改查操作
  33. oc工程中oc、swift混编代码打包成静态framework踩坑笔记
  34. 阿里云推“智能秒停系统”:50秒内短信通知 再不怕吃罚单
  35. 今天购买了一个云服务器
  36. 神奇!乌鸦竟然会传达悲观和怀疑情绪 还会对同伴“冷嘲热讽”
  37. 数字IC设计入门必备——VIM自定义模板调用与VCS基本仿真操作示例
  38. 点击事件的坐标计算(client || offset) +(X || Width || Left) 各种排列组合别绕晕
  39. windows下dubbo-admin2.6.x之后版本的安装
  40. linux 之基本命令学习总结
  41. 传祺难续“传奇”?销量暴跌超4成 加价卖车被“断裂门”尽毁
  42. 香港豪门后宫持续曝光:他用选美比赛“选妃”,与几万女星交往
  43. 小窥React360——用React创建360全景VR体验
  44. Spring Boot 2 快速教程:WebFlux 集成 Mongodb(四)
  45. .Net Core下使用RabbitMQ比较完备的两种方案(虽然代码有点惨淡,不过我会完善)
  46. “80后”女博士已任团中央书记处书记
  47. 杨元庆:现在是联想的最好时刻 我们四大战役全部打了胜仗
  48. Java开发环境的搭建(JDK和Eclipse的安装)
  49. oracle学习笔记(十四) 数据库对象 索引 视图 序列 同义词
  50. 机构风向标:外资出逃超500亿 美的集团等白马股表现欠佳
  51. 跟踪记录ABAP对外部系统的RFC通信
  52. c++11多线程详解(一)
  53. 小蓝杯,跌破发行价了
  54. [NewLife.XCode]百亿级性能
  55. 33岁何洁商场走穴被曝光,路人镜头下的她与精修图差别好大
  56. 途牛第一季度净亏损2240万美元 同比亏损幅度扩大
  57. 00 | Two Sum
  58. 智能威胁分析之图数据构建
  59. 快速掌握RabbitMQ(二)——四种Exchange介绍及代码演示
  60. Neo4j 第六篇:Cypher语法
  61. Java微信公众平台开发(三)--接收消息的分类及实体的创建
  62. Java8 中的 Optional
  63. 如何显示超大图像(3)
  64. 贵州检察机关依法对袁仁国决定逮捕
  65. 有关xerospolit运行报错问题的有效解决方案
  66. ADO学途 one day
  67. Linux 中 ip netns 命令
  68. Python爬虫之设置selenium webdriver等待
  69. BSOJ1040 -- 【练习题目】美元DOLLARS
  70. 外媒:稀土是中国手中的一张王牌
  71. sql server添加sa用户和密码
  72. 深入理解JVM的类加载
  73. querySelector和getElementById之间的区别
  74. 简说设计模式——观察者模式
  75. 扰动函数和拉链法模拟HashMap的存储结构
  76. 东芝中国:“上海东芝公司”不存在 未停止与华为的合作
  77. 彭于晏马思纯主演张爱玲这部小说,却被说更适合演《骆驼祥子》?
  78. 停止向华为供货?东芝辟谣回应
  79. 云米第一季度净利润5310万元 同比增长68%
  80. 贪吃的古蛙,古生物学家发现亿年前两栖动物之间战争
  81. APICloud发布低代码开发平台 效率提升30%至60%
  82. Golang 读写锁RWMutex 互斥锁Mutex 源码详解
  83. shell初级-----数据呈现方式
  84. 白玉兰入围名单公布!《知否》《都挺好》上榜,还有这部豆瓣3分剧
  85. 深网 | 京东618接入快手、抖音 实现“即看即买”
  86. 解决 APP启动白屏黑屏问题
  87. Spring Cloud Hystrix理解与实践(一):搭建简单监控集群
  88. 浏览器与服务器通信技术——jsonp
  89. 【刷题笔记】LeetCode 606. Construct String from Binary Tree
  90. 央行副行长刘国强:应对汇率波动经验丰富,政策工具储备充足
  91. 部署Azure Log Analytics
  92. 计算机基础--http的基础整理和巩固
  93. 章子怡:女人四十,不止表面风光
  94. 直击|对话杨元庆:希望今年创最好盈利 要震慑住谣言
  95. 微软通过合作为美国270万农村退伍军人提供高速宽带服务
  96. Java进程占用内存过高,排查解决方法
  97. Go语言中使用切片(slice)实现一个Vector容器
  98. 商务部回应美宣布对13个中国企业或个人实施制裁:反对“长臂管辖”
  99. 优酷土豆的Redis服务平台化之路
  100. shell初级-----处理用户输入