.NET之Hangfire快速入门和使用 - 追逐时光 - 博客园

mikel阅读(1378)

来源: .NET之Hangfire快速入门和使用 – 追逐时光 – 博客园

 

文章正文:

前言:

定时任务调度问题,是一个老生常谈的问题。网上有许多定时任务调度的解决方案,对于我而言很早以前主要是使用Window计划和Window服务来做任务定时执行,然后就开始使用定时任务调度框架Quartz.Net。但是却一直没有上手过Hangfire这个自带后台任务调度面板,可以在后台手动执行任务的神奇的任务调度框架。前段时间终于开始对他下手了,通过在网上查阅了一些资料和查看了Hangfire在Github中的demo,终于在我自己的项目中用上了Hangfire。在该篇文章中主要简单介绍一下什么是Hangfire,Hangfire的基本特征与优点和分别使用MySQL,MS SQL Server作为存储使用。

一、Hangfire是什么:

Hangfire是一个开源的.NET任务调度框架,提供了内置集成化的控制台,可以直观明了的查看作业调度情况,并且Hangfire不需要依赖于单独的应用程序执行(如:windows服务,window计划)。并且支持持久性存储。

二、Hangfire使用条件:

Hangfire与特定的.NET应用程序类型无关。您可以在ASP.NET Web应用程序,非ASP.NET Web应用程序,控制台应用程序或Windows服务中使用它。以下是要求:

1.NET Framework 4.5

2.永久存储(Hangfire将后台作业和其他与处理有关的信息保留在永久性存储器中,所以需要存储库来存储如:MS SQL Server,Redis,MySQL,PostgreSql等)

3.Newtonsoft.Json库≥5.0.1

三、Hangfire的基本特征与优点:

通过官网中的一张图片便可知道它是一个多么优秀的任务调度框架,如下图所示:

 

 

四、Hangfire安装和使用:

在NuGet上有关于Hangfire的 一系列软件包:

详情地址: https://www.nuget.org/packages?q=Hangfire

通过在程序包管理控制台中输入安装命令安装Hangfire所需NuGet包:

使用MS SQL Server作为存储时我们需要安装的NuGet:

ASP.NET 应用程序下使用Hangfire安装:

1
Install-Package Hangfire

在控制台应用程序或者window server中处理作业:

1
2
Install-Package Hangfire.Core
Install-Package Hangfire.SQLServer

注意,在控制台应用程序或者window server中不推荐直接安装:Install-Package Hangfire ,因为它只是一个快速启动软件包,并包含您可能不需要的依赖项(例如,Microsoft.Owin.Host.SystemWeb等无关依赖项)。

使用MySQL作为存储时我们需要安装的NuGet:

在ASP.NET 应用程序下使用Hangfire安装:

1
Install-Package Hangfire.Core

我们还需要安装一个MySql存储(Hangfire.MySqlStorage)的拓展,注意因为Hangfire本身是不支持MySQL存储的,这是名为:Arnoldas Gudas作者拓展的:

Nuget地址:https://www.nuget.org/packages/Hangfire.MySqlStorage/

安装命令:

注意:因为我的项目是.NET Framework,Version=v4.5.1版本的,所以只能安装1.0.7版本的,大家看需求而定

1
Install-Package Hangfire.MySqlStorage -Version 1.0.7

当我们要使用(宿主)IIS托管ASP.NET应用程序时,我们还需要安装:

1
Install-Package Microsoft.Owin.Host.SystemWeb -Version 4.0.1

 

添加和配置OWIN Startup.cs,及其连接对应的存储数据库:

添加OWIN Startup.cs

这里是当你的项目中不存在Startup.cs时才需要执行添加的操作!

什么是OWIN Startup.cs:

简单概述:是.NET 平台开放的web接口,Startup则是.Net与web通讯管道,起到转发,沟通的作用。

详情介绍:https://www.cnblogs.com/wj033/p/6065145.html

在Startup.cs中连接需要使用的存储库:

1
2
3
4
5
6
7
8
9
10
11
12
13
public void Configuration(IAppBuilder app)
{
    //运用SQLServer存储,对应web.config中的connectionStrings中的name
    GlobalConfiguration.Configuration.UseSqlServerStorage("sqlserver_connection");<br>           
    //注意,当你使用的是MySql作为存储时,需要如下配置
    //运用MySql存储,对应web.config中的connectionStrings中的name
    GlobalConfiguration.Configuration.UseStorage(new MySqlStorage("mysql_connection"));
    app.UseHangfireDashboard();//配置后台仪表盘
    app.UseHangfireServer();//开始使用Hangfire服务
}

Web.config数据库配置:

1.MS SQL Server中:

1
2
<connectionStrings>
    <add name="sqlserver_connection" connectionString="Data Source=.;Initial Catalog=MyFirstDb;Integrated Security=True" providerName="System.Data.SqlClient" /><br>  </connectionStrings>

2.MySQL中:

1
2
<connectionStrings>
   <add name="mysql_connection" providerName="System.Data.MySqlClient" connectionString="Server=123.xxx.xxx.xx;Port=3306;Database=MyFirstDb;Uid=root;<br>     Pwd=youpassword;charset=utf8;SslMode=none;Allow User Variables=True" /><br>  </connectionStrings>

运行程序,访问调度控制面板:

当我们已经完成了上面的相关配置后,且程序能够正常无bug的运行时,我们的Hangfire Dashboard(仪表盘)在我们的本地就可以正常访问了(Hangfire仪表盘默认只支持本地访问),假如需要远程可访问的话我们还需要做对应的配置授权操作!

运行成功,查看数据库中是否生成了与Hangfire相关的表:

首次运行成功后,打开数据库可以看到Hangfire已经自动为我们创建了定时任务的一些定时任务列表,定时队列,服务,状态等相关的数据表(展现了Hangfire作用的持久化特性),如下图所示:

a.MS SQL Server中生成的表:

 

 b.MySQL中生成的表:

 

 访问调度控制面板:

本地访问方式:https://localhost:端口号/hangfire/

调度控制面板效果图:

 

 后台常用任务调度创建和使用:

复制代码
//支持基于队列的任务处理:任务执行不是同步的,而是放到一个持久化队列中,以便马上把请求控制权返回给调用者。
var jobId = BackgroundJob.Enqueue(() => WriteLog("队列任务"));

//延迟任务执行:不是马上调用方法,而是设定一个未来时间点再来执行,延迟作业仅执行一次
var jobId = BackgroundJob .Schedule(()=> Console .WriteLine(""),TimeSpan .FromDays(1));//一天后执行该任务

//循环任务执行:一行代码添加重复执行的任务,其内置了常见的时间循环模式,也可基于CRON表达式来设定复杂的模式。【用的比较的多】
RecurringJob.AddOrUpdate(() => WriteLog("每分钟执行任务"), Cron.Minutely); //注意最小单位是分钟

//延续性任务执行:类似于.NET中的Task,可以在第一个任务执行完之后紧接着再次执行另外的任务
BackgroundJob.ContinueWith(jobId, () => WriteLog("连续任务"));
复制代码

总结:

通过本次项目实践的确让我感受到了Hangfire的魅力所在,真的可以说是上手简单,开箱即用的一个任务调度框架。并且该框架做的最好的是,官方文档详细,并且还提供了完整的demo示例。最后要为Hangfire的作者点赞!

Hangfire相关使用学习资料:

官网地址:https://www.hangfire.io/

GitHub源码:https://github.com/HangfireIO/Hangfire

中文文档:https://www.bookstack.cn/read/Hangfire-zh-official/README.md

GitHub使用示例源码:https://github.com/HangfireIO/Hangfire.Samples(包括控制台应用程序,window服务,ASP.NET MVC,WebForm)

Hangfire使用文章汇总:https://www.bbsmax.com/R/xl56E0nrJr/

MSDTC不可用怎么办(轉) - maanshancss - 博客园

mikel阅读(1007)

来源: MSDTC不可用怎么办(轉) – maanshancss – 博客园

问题:安装完金蝶KIS商贸版产品后,在新建账套的过程中,系统显示以下提示信息“数据库升级失败!SQL文件不全或SQL语句有误!”
错误描述:number:-2147217900
Source:Microsoft OLE DB Provider for SQL Server
Description:服务器’PC-200906041643’上的MSDTC不可用。
如下图:

导致新建账套不成功。
【分析】:
msdtc.exe是微软分布式传输协调程序,该进程用于调用Windows系统的Microsoft Personal Web Server和Microsoft SQL Server。MSDTC服务是一个系统服务,它是金蝶商贸版软件运行不可缺少的系统服务组件。如果MSDTC服务不能正常运行,则新建账套将遇到错误。出现这种情况,一般是发生在使用了某些电脑城装机版的Ghost系统,在这些系统中,MSDTC服务默认没有启动或没有安装,需要手工设置它的启动或安装。
【处理】:
1、检查服务器上的MSDTC是否正常启动
以管理员身份登录操作系统,通过控制面板–》管理工具–》服务,找到MSDTC服务,检查它是否处于自动运行状态:

如果没有,则设置为自动启动状态。
2、重新安装并重置MSDTC服务
如果上述设置无法使用MSDTC服务正常运行,则需要重新安装MSDTC服务。一般情况下,安装并重置MSDTC服务,可以按以下过程进行:
1)先用“msdtc -uninstall”卸了它,
2)再用“msdtc -install”重新装上,
3)然后用“msdtc -resetlog”创建日志文件,
4)最后用“net start msdtc”启动服务
其中,上述命令可以通过在运行中输入后,确定即可,如:

确定后,系统显示这样的类似信息:

在上述设置过程中,根据系统提示,如果需要重启操作系统,请按提示操作。
3、说明事项
1、出现这种情况,一般是发生在使用了某些电脑城装机版的Ghost系统,在这些系统中,MSDTC服务默认没有启动或没有安装,需要手工设置它的启动或安装。正常安装的系统中较少出现这样的问题。
2、导致MSDTC服务不可用的原因有很多(如病毒、木马等等),解决方法也有很多种。上述方法只是其中最常用的方法之一。而且这涉及到对系统服务的一些操作,对问题处理者的要求相对要高一些,因此在遇到相似的问题时,可以多参考网上的资料,如:msdtc不可用MSDTC等等。因此出现此类错误,需要仔细分析原因,针对性地进行处理。
3、如果在金蝶KIS专业版、金蝶K/3或其他需要涉及到MSDTC服务的应用中,遇到此类错误也可参考此方法处理。

下面的链接:http://tangjun141.blog.163.com/blog/static/56462350200963073824318/

问题:商贸版2.0新建帐套时出现错误,提示如下图:
图片失效

解决
电脑公司装机用的Ghost版的XP系统由于进行过优化,会关闭系统的一些服务!启动服务软件能够正常使用了!!上面所述问题,主要和Windows的Distributed Transaction Coordinator服务没有启动有关。下面来启动Distributed Transaction Coordinator(msdtc)服务:
控制面板—管理工具—服务—Distributed Transaction Coordinator—-右键启动,如果启动失败
请尝试开始菜单—运行—输入CMD—在弹出的窗体输入如下命令:
Msdct –resetlog回车
Net Start msdtc
如果启动失败,请检查C:\WINDOWS\system32\MsDtc目录下是否有MSDTC.LOG文件!!如果没有请通过记事本手工建立该文件,重新执行上述命令!!
此时应该可以启动Distributed Transaction Coordinator服务了,如若还启动不了,我们需要重新安装来修复Distributed Transaction Coordinator服务,在命令行输入如下命令:
Net stop msdtc
Msdtc –uninstal
Msdtc –instal
net start msdtc
此时服务能够正常启动了!!

收藏
关注
评论
作者:王思明
出处:http://www.cnblogs.com/maanshancss/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

layui自定义js模块(实例) - UglyCode - CSDN博客

mikel阅读(819)

来源: layui自定义js模块(实例) – UglyCode – CSDN博客

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_36571185/article/details/78140969
注意:layui自定义模块,整个过程就两步,步骤虽少,但还是要多注意的细节问题,不然在定义模块上花费太多精力就不值得了。
第一步:定义模块
tablechecked.js

layui.define([‘layer’], function(exports) {
“use strict”;

var $ = layui.JQuery,
layer = layui.layer;

var table = {
/**
* 带有选择框的表格绑定多选事件
* @param tblId
*/
tableBindCheckClick: function (tblId) {
var tblObj = $(“#” + tblId);

tblObj.on(‘click’, ‘thead input[type=”checkbox”]’, function () {
var obj = $(“#” + tblId + ” tbody input[type=’checkbox’]:checkbox”);
if (this.checked) {
obj.prop(“checked”, true);
} else {
obj.prop(“checked”, false);
}
});

},
/**
* 获取带有选择框的表格选中的记录Ids
* @param tblId
* @returns {string}
*/
getTableCheckedRowIds: function (tblId) {
var ids = ”;
var tblObj = $(“#” + tblId);

tblObj.find(” tbody input[type=checkbox]:checked”).each(function(){
ids += $(this).val() + ‘,’;
});

// 去除最后一位逗号
ids = ids.substr(0, (ids.length-1));
return ids;
}

};
//expotts(“key”,value)
//key你懂吧? 待会在第二步就要用key值来获取var table这个对象。继而调用对象中函数
exports(‘tablechecked’, table);
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
截图:

第二步:在js中使用模块
<script th:src=”@{/layui/layui.js}”></script>
<script type=”text/JavaScript” th:inline=”JavaScript”>
//一般直接写在一个js文件中
layui.config({
base:’/selfjs/’
});
//这里先use,表示使用 base:’/selfjs/’目录下的tablechecked.js文件

layui.use([‘form’,’element’,’layer’,’tablechecked’], function(){
var $ = layui.JQuery,
//layui.key通过key来获取对象
tools=layui.tablechecked;

//顶部新增事件监听
console.log(“准备新增”);
$(‘#addBtn’).on(‘click’,function(){
top.layer.open({
type:2,
area:[‘450px’,’380px’],
resize:false,
title:’商品添加’,
content:’/sys_stuff/edit’
});
});
//更新事件
console.log(“准备更新”);

$(‘.smt-update’).on(‘click’,function(){
top.layer.open({
type:2,
area:[‘450px’,’400px’],
resize:false,
title:’用户编辑’,
content:’/sys_stuff/edit?id=’+$(this).data(‘id’)
});
});
//删除事件
console.log(“准备删除”);

$(‘#btnDelete’).on(‘click’, function(){
var ids = tools.getTableCheckedRowIds(“myTable”);
if(!ids) return layer.msg(‘请先选择需要删除的记录。’, {time:1500, icon:0});
layer.confirm(‘确定删除?’, {icon: 3, title:’提示’}, function(index){
$.ajax({
type: ‘POST’,

url: /*[[@{/sys_stuff/delete}]]*/”,
data: {ids: ids },
dataType: ‘json’,
success: function (result) {
if (result.code == 0) {
layer.msg(‘删除成功’, {icon: 1,time: 1000});
setTimeout(function(){
parent.refreshIframe();
},800);

}
else {
layer.msg(‘删除失败!’+result.msg, {time:1000,icon: 2});
}
},
error: function(result, type) {
layer.msg(‘删除失败!’, { time:1000,icon: 2 });
}
});

});
});

});
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
教程到此结束。
番外:
待注意事项:

exports(‘tablechecked’, tablechecked); //key你懂吧? 待会在第二步就要用key值来获取var table这个对象。继而调用对象中函数
layui.use([tablechecked])表示 ,使用这个模块,也就是咱自定义的js文件。
通过layui.key通过key来获取对象var tools=layui.tablechecked;
到此,番外也结束了,以上这些,基本上够用了。更多的我暂时不知道,如果你在阅读中遇见任何问题,欢迎你随时给我留言。
————————————————
版权声明:本文为CSDN博主「欧吃伞」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_36571185/article/details/78140969

Layui自定义模块的使用方式 - 张超博客 - CSDN博客

mikel阅读(874)

来源: Layui自定义模块的使用方式 – 张超博客 – CSDN博客

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_30036559/article/details/79120303
layui是一个极其不错的前端UI框架、是后端程序员的福音。总之如果你是一个后端开发者、如果你苦于你的界面“惨不忍睹”、选择layui来开发是个极好的选择。

之前的项目也有使用过layui、只是没有过多的关注其框架本身。对于项目上、拿来即用即可!

为什么要自定义模块呢?好处很多、比如可以大量重用代码……

我也是一个极其懒惰的人、总是想办法让代码可重用

根据layui官方的文档说明、首先第一步是要确定你要扩展的模块名称

我现在做的是登录功能、因此我的扩展模块名叫  login

使用layui.define()方法来扩展模块、当然模块中你也可以使用layui的其他方法、如下

layui.define(‘layer’, callback);
在定义扩展模块的时候、我需要使用layui的layer模块、然后在回调函数中定义自己的方法
layui.define([“layer”,”JQuery”],function (exports) {
var obj = {
login : function (url,data,$,targetUrl) {
$.post(url,{code:data.code},function (res) {
if (res.code&&res.code==400){
layer.msg(res.msg,{icon:1},function () {
window.location.href = targetUrl;
});
}else{
layer.msg(res.msg,{icon:1},function () {
window.location.href = targetUrl;
});
}
});
}
}
exports(“login”,obj);
});
上述代码中定义了一个login模块、以便在我登录的时候、不需要写过度的代码即可实现登录、让页面看起来更清爽【无任何杂质】
那么模块定义完了、怎么使用呢?

<script type=”text/JavaScript”>
layui.config({
base: ‘/static/admin/js/module/’//模块存放的目录
}).use([‘JQuery’,’element’,’form’,’login’],function () {
var $ = layui.JQuery,
form = layui.form,
element = layui.element,
login = layui.login;
form.on(“submit(subBtn)”,function (data) {
//获取表单的值
var field = data.field;
login.login(“{:url(‘Login/doLogin’)}”,field,$,”{:url(‘Index/index’)}”);
return false;
});
});
</script>
嗯、就这样、在登录的时候、直接将参数传递过去即可、在上述代码中url部分是使用TP的方法生成的、这里不用过多的研究【如果你是写前端的话】。
嗯、就这样、整个模块定义完成!!展示的效果如下

————————————————
版权声明:本文为CSDN博主「张超博客」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_30036559/article/details/79120303

layer.js源码分析 - 玉案轩窗的博客 - CSDN博客

mikel阅读(1072)

来源: layer.js源码分析 – 玉案轩窗的博客 – CSDN博客

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/s1879046/article/details/76034784
最近在看layer.js源码,从中得到了一些启发,对于一个框架的设计也有了一定的看法,现在对于这个框架的设计以及其他的问题来说明一下。

layer.js是一个专注于弹出层的框架,这个框架本身可以实现5种弹出层类型,其他的就不多说了,可以去看看它的官网,下面说一下它的主要组织形式:

首先,这个框架本身就是一个IIFE(立即执行函数表达式),保证了局部环境,避免了全局变量污染的问题
框架内部主要是三个对象构成,分别是Class构造函数、layer对象、ready对象
通过window来暴露对外api
以前看过一点JQuery的源码,layer.js的框架结构和JQuery是相同形式,框架内部主要是这三个对象来组成,对于这三个对象上具体的方法以及属性我列举了下,如下图所示:

整个框架的结构组织以及脉络还是很清晰的,框架整体的代码量大概1300多行左右,我对这个框架运行的具体流程做了个较为详细的流程,具体流程如下:

上面图片中是该框架初始化过程所做的工作,具体框架代码的详细注释在我的Github上,如果你感兴趣,可以看看。
致远行的你我
————————————————
版权声明:本文为CSDN博主「玉案轩窗」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/s1879046/article/details/76034784

layui框架详细分析系列之熟悉框架以及提供的页面元素 - 玉案轩窗的博客 - CSDN博客

mikel阅读(834)

来源: layui框架详细分析系列之熟悉框架以及提供的页面元素 – 玉案轩窗的博客 – CSDN博客

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/s1879046/article/details/76095467
前不久,阅读了layer.js的源码,实际上它是layui框架的内置模块,不过可以独立出去使用,主要是用于弹出层的,layui框架中内置了很多模块,在未来的一段时间内,我都会对于这个框架的各个内置模块代码以及整个逻辑进行详细的描述和说明,以此来提高自己的各个方面的能力。

layui是一个UI框架,它的官网对其的说明是经典模块化前端框架,该框架的内部提供了一些UI框架常有的功能点,例如按钮、表单等。

先说说为什么选择这个框架作为学习源码过程中的第一步,原因大概有如下几点:

该框架不依赖与其他的Js框架,虽然它有的模块需要JQuery
它是基于原生Js的,对于我来说我不需要去了解其他Js的框架或库,减少分析该框架的成本
就正式进入正题吧,看框架源码是要有目的性的,这句话确实不错啊。如果只是为看而看,当你看到一定程度后,你就不想看了,代码是枯燥的,特别是看别人的源码,有了目的性,就有所不同,你知道自己想要什么。
在正式进入框架代码阅读分析之前,我认为需要熟悉和使用该框架,这样你在分析其源码的过程中,会更加清晰具体的功能。下面主要介绍该框架中命名规范以及提供的页面元素。
该框架中关于css类的命名规范分为两种,一种是具体模块的css的命令,它遵循layui-模块-状态或类型,另一种是公共类(可以说是不具体属于哪一个模块的),它遵循layui-状态或类型。
该框架中关于js的命名规则:
变量基本采用小写
方法名采用驼峰法命名
逻辑相关的都以is开头
获取相关的方法是以get开头
文件名小写
该框架提供的页面元素有:
内置几种背景颜色,主要的css类:.layui-bg-red、.layui-bd-orange等
图标,使用的是iconfont
按钮以及按钮组,分为大小、状态等,主要的css类:.layui-btn、.layui-btn-primary、.layui-btn-big等
表单,主要的css类有:.layui-form等
导航,分为水平导航、垂直导航、侧边栏导航,主要css类有:.layui-nav、.layui-nav-tree、.layui-nav-side等
选项卡,分为卡片选项卡、简洁风格、可删除的,主要css类有:.layui-tab等
表格,主要css类有.layui-table等
进度条,主要css类有.layui-progress、.layui-progress-bar等
面板,手风琴风格,主要的css类有.layui-collapse等
上面提供的都是css类,用于呈现该框架UI风格,一些功能需要交互才可以完成,所以需要引入模块来保证完整功能的使用。
本文主要是描述下该框架的css命名规范以及熟悉该框架,不出意外,明天会分析该框架中自己提供的模块加载机制,该收拾下班了。
致远行的你我
————————————————
版权声明:本文为CSDN博主「玉案轩窗」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/s1879046/article/details/76095467

layui框架详细分析系列之框架主体组织结构 - 玉案轩窗的博客 - CSDN博客

mikel阅读(819)

来源: layui框架详细分析系列之框架主体组织结构 – 玉案轩窗的博客 – CSDN博客

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/s1879046/article/details/76162161
layui框架主体
今天正式的进入框架主体部分的学习与分析,该框架开源从GitHub上clone下来的源码主要的部分就是src部分,该部分主要的目录结构构成如下:

从上图可以看出css存储样式,font存储图标(iconfont), images存储图片,lay存储其他内置模块的js文件,layui.js文件就是主体部分。
layui.js还是采用IIFE的形式构成,如下面所示:

;!function(window, undefined) {
// 主要代码
}(window);
1
2
3
其中;号与!号的作用就不在啰嗦了,我之前的文章有对其进行解释,我分析了layui.js整体,绘制了思维导图,具体如下图所示:

从上图可以看出,主体文件的组织结构很清晰明了,主要分为:
1、需要用到的变量,比如内置的模块对象、获取layui.js文件路径的函数以及非常重要的config配置参数对象
2、Lay构造函数,面向对象编程,方法都定义在构造函数的原型对象上
3、通过Lay构造函数创建对象,并通过window对象将其暴露出去

主体结构清晰简洁,封装性感觉很好,没有不必要的属性暴露出去,框架提供的页面元素的相关都是通过定义的CSS类来实现,行为和样式分离开来,耦合性相对较小。

该框架实现了自己的模块加载机制以及自定义事件机制,实现方法也是定义在Lay的原型对象上,我是通过分析内置模块来分析相关联的主体函数的功能的,理解并给予详细的注释。

本篇文章主要分析主体文件的组织结构,相关注释的主体文件以及各个内置模块的注释源文件都会上传到我的Github上,下一篇将会分析该框架的模块加载机制。
远行的你我
————————————————
版权声明:本文为CSDN博主「玉案轩窗」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/s1879046/article/details/76162161

layui源码详细分析系列之element模块以及自定义事件机制 - 玉案轩窗的博客 - CSDN博客

mikel阅读(801)

来源: layui源码详细分析系列之element模块以及自定义事件机制 – 玉案轩窗的博客 – CSDN博客

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/s1879046/article/details/76216485
element内置模块时layui框架中页面元素的交互功能的实现,主要是选项卡、面板、导航等的交互的实现。

下面先分析element模块的组织结构,具体如下图所示:

从上图中可以看出,element模块使用该框架自己的模块加载机制来加载该模块。

该框架内置的模块都是采用面向对象的编程,该模块也是,定义了Element构造函数,对外的API接口都定义在Element的原型对象上,使用JQuery来绑定一些原生的事件。call对象中定义真正处理选项卡等交互以及初始状态的处理程序。

element模块中使用框架自己定义的事件处理机制,具体实际上使用layui主体文件中的onevent和event来进行事件的注册以及事件的执行。

因为该模块最后输出的是函数类型,所以在使用该模块时要求如下:

layui.use([‘element’], function() {
var element = layui.element();
});
1
2
3
上面实际会自动执行一些初始化的工作,具体就会选项卡、面板等的初始状态的设置。

下面讲解layui自定义的事件机制,该框架定义事件名的形式如下:

功能名(lay-filter属性名)
1
在该框架中有lay-filter属性,该属性就是用于事件标识的。

什么时候使用该框架内置的事件机制?当你想要执行其他的操作,例如获取相关数据等,就可以使用自定义的事件机制。

下面使用实例来讲解框架事件机制的具体的逻辑处理,假设选项卡有属性lay-filter=’demo’, 那么就可以使用该框架自定义的事件机制,具体如下:

使用该机制的代码:
layui.use([‘element’], function() {
var ele = layui.element();

// tab(demo)就是事件名
ele.on(‘tab(demo)’, function(data) {
cosnole.log(data);
});
});
1
2
3
4
5
6
7
8
9
具体的逻辑流程如下图:

具体如上图所示,实际上内部维持了config.event对象来保存事件,onevent实现事件注册以及监听,实际上就是存储在config.event对象中,具体存储形式如下:

config.event[modeName + ‘.’ + event] = [callback]
1
在本例中modeName为element,event为tab(demo), callback就是就是事件处理程序,本例中callback如下:

callback = functio(data) {
console.log(data);
};
1
2
3
详细的代码注释以及相关的逻辑图我会上传到我的Github上,通过今天对于现在这种代码学习,有些迷茫了。

总结下现在这种阅读代码的方式的缺点:

有点纸上谈兵的感觉,不充实很虚
有些为看而看的感觉,没有非常大的收获,反而有些疲惫,没有自己成长了的自豪感
所以以后的文章就不会是这种方式出现了,目前想到的很好提高自己同时最大程度的提高自己,以后的风格将会以事实为依据,来具体展开,具体的形式如下:

自己会动手编写一个简易版实现核心功能的demo,并给出自己的思路
查看框架作者实现的思路,比较自己的思路与作者思路的相同点以及不同点,进行分析总结,丰满自己的思路
今天就到此为止,走走停停,方能走得更远,明天会分析文件上传以及流加载模块。
致远行的你我
————————————————
版权声明:本文为CSDN博主「玉案轩窗」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/s1879046/article/details/76216485

git将本地项目托管到码云上(含git更换远程仓库步骤) - zhangzeshan的博客 - CSDN博客

mikel阅读(849)

来源: git将本地项目托管到码云上(含git更换远程仓库步骤) – zhangzeshan的博客 – CSDN博客

首先在码云上创建一个空项目

然后将自己本地的项目换成一个仓库,执行如下命令:(cd到自己的项目下)

git init
执行完毕后,本地项目就会生成.git的文件

下一步,添加远程仓库,也就是在码云上创建的空项目的链接

git remote add origin 码云项目的链接
下一步,将码云上的仓库pull到本地文件夹

git pull origin master
下一步,将自己的改动的数据进行提交:

git add .
然后添加提交的详细描述

git commit -m ‘新添加的文件内容描述’
然后推送到远程仓库:

git push origin master
如果这一步执行后,出现错误

那就执行一句命令:

git push -u origin master -f
就能完成托管了

 

下面说下更换代码仓库地址的具体步骤:

如果我刚刚添加的远程仓库不要了,需要更换到其他的仓库去,

首先,先把自己的原来的远程仓库删除:

git remote rm origin
然后,添加现在新的远程仓库地址

git remote add origin 新仓库地址
接下里,进行提交,测试看看自己是否更改成功:

git add .
git commit -m”#zhangzeshan#up”
git pull origin master
git push origin master
按照步骤,执行后完成后,就可以到码云上是否有自己提交的记录了

如果哪里说错,欢迎指出!
————————————————
版权声明:本文为CSDN博主「张芝山」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhangzeshan/article/details/82986434

VS2017中使用码云上传项目以及问题汇总 - 马儿不吃草 - CSDN博客

mikel阅读(1075)

来源: VS2017中使用码云上传项目以及问题汇总 – 马儿不吃草 – CSDN博客

方法一:个人项目和企业项目都可用此方法上传项目
1.下载码云在VS中的插件:下载地址

2.下载之后重启VS,然后打开团队资源管理器,也可以点击“团队”—>“管理连接”,在如下界面中点击连接,输入码云的账号密码

3.在码云的网站中进行新建项目(如果是公司项目归属选择公司即可)

4.项目新建完后在vs中点击克隆,选择刚刚新建的项目,然后选择项目的本地保存地址,点击克隆,克隆以后本地GIT存储库也会复制一份

5.然后将做好的项目拷贝到刚刚新建的目录下,如果是新项目,直接在该目录下进行新建项目即可

6.在本地GIT存储库中双击该项目,跳到该界面

7.如果是新项目第一次上传,点击更改,然后填写信息,点击全部提交并同步即可。在网站上就可以看到自己上传的项目啦,如果点击的只是全部提交,那么在提交后需要在同步中点一下同步按钮

8.如果是修改后项目要上传同步,点击更改,然后点击操作,修改上一个提交,然后再点击同步。一定要点击同步,不同步的话代码不会上传到云上面

方法二:上传个人项目比较推荐,不建议企业项目使用该方式上传
1.在VS中的Gitee中点击创建仓库,选择好必要的信息和路径,点击新建

2.然后和方法一一样将项目源码拷贝到刚才新建的目录中,之后的操作就和方法一一样了

利用这种方式的话,项目默认是为开源的,转移到企业里需要企业转移码。

 

注意点:
1.上传的单个文件不能大于100M

2.不要上传bin目录和obj目录下的文件,上传时将需要上传的文件加到暂存中,然后再点操作,提交上一个修改,同步,暂存中的文件就会上传上去,更改数中的文件就不会上传
————————————————
版权声明:本文为CSDN博主「马儿不吃草」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/horseroll/article/details/82499556