来源: VS2017打开低版本的VS MVC架构的项目的时候需要修改的地方 – ConverAttuting – 博客园
1、需要修改的是.sln文件,即将里面的 Version改为12,其中的VS的版本改为2017

2、项目中后缀名为 .csproj中的代码改一下:

来源: VS2017打开低版本的VS MVC架构的项目的时候需要修改的地方 – ConverAttuting – 博客园
1、需要修改的是.sln文件,即将里面的 Version改为12,其中的VS的版本改为2017

2、项目中后缀名为 .csproj中的代码改一下:

来源: 无法打开物理文件mdf,操作系统错误 5:”5(拒绝访问。)” – Senior Instructor – NetSuite Consulting – CSDN博客
无法打开物理文件mdf,操作系统错误 5:”5(拒绝访问。)”
环境: SQL Server 2008 R2
问题: 附加数据库时报错“无法打开物理文件mdf。操作系统错误5:5(拒绝访问)。
解决方案:
找到要附加的mdf文件-》右键-》属性-》安全-》选择当前用户-》编辑,勾选完全控制权限,确定。
对log文件相同操作。
————————————————
版权声明:本文为CSDN博主「Crazygolf」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/crazygolf/article/details/40296729
来源: 菜鸟程序员之Asp.net MVC Session过期异常的处理 – JustRun – 博客园
小赵是刚毕业的计算机专业方面的大学生,4年的大学时间里面,他读过了很多编程方面的数据,也动手也了很多代码。现在毕业了,他如愿的加入了T公司,开始了自己的程序员生涯。他信心满满,相信自己4年的学习到的东西,一定能够在工作派上用场,帮助自己很快的胜任现在的工作。
阅读目录:
一、Session引发的异常
二、使用MVC中的Filter来对Session进行验证
三、对于Ajax请求的中,Session失效的处理
四、处理Session过期异常的重要性
小赵刚进公司,就参与到了一个实际的项目中了,项目使用的是ASP.NET MVC。花了大概2个周的时间,小赵就完成了所有功能,提交给QA测试了。
过了一天,QA发回了测试结果,小赵过了一遍,发现原来自己做的东西,里面问题这么多。
其中一个bug是这样的:
使用Firefox登录进入系统后,再打开一个Tab,进入系统页面,点击logout. 在回到前一个tab页面,点击Save按钮,出现了js错误。这个时候应当将用户转到登陆页。
小赵看到这个bug,有些目瞪口呆,没想到QA用这么”暴力”的方式来测试自己的程序。在另一个Tab上点击logout, 会导致session清空的,这样再点击第一个tab上的Save按钮,调用的Ajax方法会出现异常的。
但是如何处理这种”非正常”操作引发的异常呢?
小赵查了查资料,发现MVC中的AuthorizationFilter能够在实际访问Controller前,拦截请求,这个时候在这里可以对Session的有效性进行检查,如果发现Session失效了,就把用户转向登陆页。(关于MVC filter可以点这里)
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class MyAuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
var loginUser = filterContext.HttpContext.Session["User"];
//When user has not login yet
if (loginUser == null)
{
var redirectUrl = ConstantProvider.LoginURL + "?RedirectPath=" + filterContext.HttpContext.Request.Url;
filterContext.Result = new RedirectResult(redirectUrl);
return;
}
}
}
Ajax请求中,如果遇到session过期,使用上面的方法是不能够达到效果的。实现的思路是,如果发现是Ajax请求,就返回特定格式的Json数据,客户端对于这个数据进行处理,发现有Session失效的情况,就跳转到登录页面。
首先,扩展我们的MyAuthorizeAttribute
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class MyAuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
var loginUser = filterContext.HttpContext.Session["User"];
//When user has not login yet
if (loginUser == null)
{
var redirectUrl = ConstantProvider.LoginURL + "?RedirectPath=" + filterContext.HttpContext.Request.Url;
if(!filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new RedirectResult(redirectUrl);
}
else
{
filterContext.Result = new JsonResult
{
Data = new
{
Success = false,
Message = string.Empty,
Redirect = redirectUrl
}
};
}
return;
}
}
上面判断如果请求是来自于Ajax, 就返回一个Json Result,客户端处理的代码如下:
$.ajax({
type: "POST",
url: "@Url.ContactInfoAjax()",
success: function (msg) {
if (msg.Success) {
…….
}
if (msg.Redirect) {
window.location = msg.Redirect;
}
}
});
说实话,开发人员开始项目的时候,往往关注在代码实现的功能上面,也就是程序”正常”工作时候的状态关注的更多,而对于”非正常”情况下,考虑的很少。而对于这些方面的考虑,才能让我们成为更加专业的程序员,摆脱菜鸟的处境。
来源: 使用 CefSharp 在 C# App 中嵌入 Chrome 浏览器 – 码农网
以前曾试过在app中整合一个可靠又快速的web浏览器吗?
在本文中,你会学到如何轻松地将奇妙的CefSharp网页浏览器组件(基于Chromium)集成到你的C# app中。
然后,你可以使用此web浏览器:
CefSharp可靠,快速,完全开源,不需要任何额外的依赖就可以安装到最终用户(除VC ++ Runtime 2013以外)。
在本指南中,我们将使用WinForms项目,但CefSharp同样可工作于WPF项目。
按照以下步骤快速开始CefSharp。
项目
1.用.NET 4.5.2创建一个Windows窗体应用程序(C#)项目
2.对项目命名(如“CefTest”)

DLL文件(NuGet方法)
3A)如果你使用的是NuGet,那么你可以从NuGet代码仓库抓取CefSharp.WinForms,跳过下面的手动方法。
3B)如果你已经使用了NuGet,那么导航SOLUTION > Configuration Manager,并将你的项目设置为x86或x64,因为目前不支持AnyCPU。

DLL文件(手动方法)
如果你使用的是NuGet,那么请跳过此章节!
3A)下载CefSharp二进制文件并解压它们。
CefSharp v51 x86(32位app)
CefSharp v51 x64(64位app)
3B)右击你的项目,点击“Add Reference”,然后选择“Browse”。

3C)选择这些DLL文件:
CefSharp.dll
CefSharp.Core.dll
CefSharp.WinForms.dll

3D)用ZIP选择所有文件:

3E)复制那些文件到项目的Debug文件夹(在Bin之中)

4.右击你的主窗体,并选择“View Code”。

5.添加以下代码:
复制到import 部分:
using CefSharp;
using CefSharp.WinForms;
复制到代码段:
public ChromiumWebBrowser browser;
public void InitBrowser(){
Cef.Initialize(new CefSettings());
browser = new ChromiumWebBrowser ("www.google.com");
this.Controls.Add(browser);
browser.Dock = DockStyle.Fill;
}
在调用 InitializeComponent()之后就调用InitBrowser():
InitBrowser()
你的代码最后应该是这样的:

运行吧!
6.按F5键,你会看到谷歌主页!

一个类型为’System.IO.FileNotFoundException’未处理的异常出现在browser.exe中
其他信息:无法加载文件或’CefSharp.Core.dll’程序集或它的一个依赖。
如果你收到此错误,请确保你安装了Visual C ++ 2013 Redistributable。
一个类型为’System.BadImageFormatException’未处理的异常出现在browser.exe中
其他信息:无法加载文件或’CefSharp.Core, Version=43.0.0.0, Culture=neutral,程序集
如果你得到这个错误,它意味着你在64位的PC上,而你的app用AnyCPU模式构建。你需要改变为x86或x64模式:
如果你正在寻找一个全功能浏览器项目,那么检查这些用C# CefSharp构建的开源浏览器。
WPF。带有建议、多个标签、下载、书签、历史记录的地址栏。
<作者未提供截图>
Windows Forms。地址栏,多标签,下载。

来源: C#使用CefSharp开源库开发Chrome 浏览器 – 可均可可 – 博客园
一、介绍
这个东西我以前没有接触过,但是公司项目里面有用到这个东西,所以就顺便研究一下。今天只是做了 WinForm 的测试,有时间了在试试 WPF 是如何实现的。刚开始一塌糊涂,有点麻烦,慢慢的理清了,其实也不是很难。
二、开发步骤
1、下载和安装程序集
当前程序集最新的版本是69.0.0,如果想直接下载程序集的 DLL ,可以通过该地址进行下载 https://www.nuget.org/packages/CefSharp.WinForms/69.0.0。说明一下,以后的版本有可能会变,具体的地址也有可能会变。可以通过nuget轻松获得所有的依赖库。如果的你的网络不好,可以先下载,然后再在项目中添加引用。 效果如图:

如果是使用 Windows 操作系统,开发 WinForm 应用,我们可以使用 NuGet 程序包进行安装:
1 PM> Install-Package CefSharp.WinForms -Version 69.0.0 2 3 NET CLI: 4 5 >dotnet add package CefSharp.WinForms --version 69.0.0 6 7 Paket CLI: 8 9 >paket add CefSharp.WinForms --version 69.0.0
2、代码实现
1)主窗体实现:
主窗体如图:

主窗体代码:
1 using CefSharp.WinForms;
2 using System.Windows.Forms;
3
4 namespace ChromiumWebBrowserForWindowsForms
5 {
6 public partial class frmBrower : Form
7 {
8 private ChromiumWebBrowser webBrowser;
9
10 public frmBrower()
11 {
12 InitializeComponent();
13 this.Load += Form1_Load;
14 }
15
16 private void Form1_Load(object sender, System.EventArgs e)
17 {
18 webBrowser = new ChromiumWebBrowser("www.cnblog.com");
19 webBrowser.Dock = DockStyle.Fill;
20 this.pnlContainer.Controls.Add(webBrowser);
21 webBrowser.Load("www.cnblogs.com");
22 }
23
24 private void btnEnter_Click(object sender, System.EventArgs e)
25 {
26 ChildForm child = new ChildForm(txtUrl.Text);
27 child.Show();
28 }
29 }
30 }
2)子窗体实现:
子窗体如图:

代码实现:
1 using CefSharp.WinForms;
2 using System;
3 using System.Windows.Forms;
4
5 namespace ChromiumWebBrowserForWindowsForms
6 {
7 public partial class ChildForm : Form
8 {
9 private ChromiumWebBrowser webBrowser;
10 private string url;
11 public ChildForm()
12 {
13 InitializeComponent();
14 this.Load += ChildForm_Load;
15 }
16
17 public ChildForm(string text):this()
18 {
19 url = text;
20 }
21
22 private void ChildForm_Load(object sender, EventArgs e)
23 {
24 webBrowser = new ChromiumWebBrowser(null);
25 webBrowser.Dock = DockStyle.Fill;
26 this.Controls.Add(webBrowser);
27 webBrowser.Load(url);
28 }
29 }
30 }
3、解决问题
1)、增加 AnyCPU 支持(CefSharp.Common does not work correctly on ‘AnyCPU’ platform. You need to specify platform (x86 / x64)。 这个错误其实是cefsharp的一个缺陷。cefsharpPic的项目团队说以后会把这个bug修补。我们暂时现在把这个问题解决。 )
[1]、您必须将<CefSharpAnyCpuSupport> true </ CefSharpAnyCpuSupport>添加到项目中的第一个<PropertyGroup>配置节(例如.csproj文件)
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\CefSharp.WinForms.69.0.0\build\CefSharp.WinForms.props" Condition="Exists('..\packages\CefSharp.WinForms.69.0.0\build\CefSharp.WinForms.props')" />
<Import Project="..\packages\CefSharp.Common.69.0.0\build\CefSharp.Common.props" Condition="Exists('..\packages\CefSharp.Common.69.0.0\build\CefSharp.Common.props')" />
<Import Project="..\packages\cef.redist.x86.3.3497.1841\build\cef.redist.x86.props" Condition="Exists('..\packages\cef.redist.x86.3.3497.1841\build\cef.redist.x86.props')" />
<Import Project="..\packages\cef.redist.x64.3.3497.1841\build\cef.redist.x64.props" Condition="Exists('..\packages\cef.redist.x64.3.3497.1841\build\cef.redist.x64.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<CefSharpAnyCpuSupport>true</CefSharpAnyCpuSupport>
[2]、增加 <probing privatePath=”x86″/> 去你的 app.config 配置文件。
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="x86"/>
</assemblyBinding>
</runtime>
[3]、修改应用程序根目录下的 Program.cs 文件。
1 [STAThread]
2 public static void Main()
3 {
4 var settings = new CefSettings();
5 settings.BrowserSubprocessPath = @"x86\CefSharp.BrowserSubprocess.exe";
6
7 Cef.Initialize(settings, performDependencyCheck: false, browserProcessHandler: null);
8
9 var browser = new BrowserForm();
10 Application.Run(browser);
11 }
2)、没有在程序启动的时候初始化 CefSharp 导致添加ChromiumWebBrowser控件显示一片灰色。
[1]、要初始化 CefSharp 对象,否则就是什么都没有。
1 [STAThread]
2 public static void Main()
3 {
4 var settings = new CefSettings();
5 settings.BrowserSubprocessPath = @"x86\CefSharp.BrowserSubprocess.exe";
6
7 Cef.Initialize(settings, performDependencyCheck: false, browserProcessHandler: null);
8
9 var browser = new BrowserForm();
10 Application.Run(browser);
11 }
3)、bin目录下没有包含CefSharp.BrowserSubprocess.Core.dll、CefSharp.BrowserSubprocess.exe。关于这两个资源文件的作用,有兴趣可以了解浏览器的多进程架构机制原理。打开多个ChromiumWebBrowser控件显示网页就加载多个CefSharp.BrowserSubprocess.exe进程。
三、总结
这算是一个一个小的进步吧,以前没有遇过的东西,现在懂了就是进步。如有需要在深入了解。不忘初心,继续努力。
SQL Server日期区间查询Between存在的问题
select * from order where orderdate between ‘2019-8-29’ and ‘2019-8-31’
这句只查询到2019-8-29到2019-8-30的数据,查询不到2019-8-31的数据
于是利用datediff函数又加入了一条查询当天的条件就解决了这个问题
select * from order where orderdate between ‘2019-8-29’ and ‘2019-8-31′ or datediff(day,orderdate,’2019-8-31’)=0
来源: Jquery 中使用String.Format – 云之星海 – 博客园
第一种方法:
String.format = function() {
if (arguments.length == 0)
return null;
var str = arguments[0];
for ( var i = 1; i < arguments.length; i++) {
var re = new RegExp('\\{' + (i - 1) + '\\}', 'gm');
str = str.replace(re, arguments[i]);
}
return str;
};
// var a = "我喜欢吃{0},也喜欢吃{1},但是最喜欢的还是{0},偶尔再买点{2}";
// alert(String.format(a, "苹果","香蕉","香梨"));
// 结果:我喜欢吃苹果,也喜欢吃香蕉,但是最喜欢的还是苹果,偶尔再买点香梨
第二种方法:
String.prototype.format = function(args) {
var result = this;
if (arguments.length > 0) {
if (arguments.length == 1 && typeof (args) == "object") {
for (var key in args) {
if(args[key]!=undefined){
var reg = new RegExp("({" + key + "})", "g");
result = result.replace(reg, args[key]);
}
}
}
else {
for (var i = 0; i < arguments.length; i++) {
if (arguments[i] != undefined) {
var reg = new RegExp("({[" + i + "]})", "g");
result = result.replace(reg, arguments[i]);
}
}
}
}
return result;
}
复制代码
//两种调用方式
var template1="我是{0},今年{1}了";
var template2="我是{name},今年{age}了";
var result1=template1.format("loogn",22);
var result2=template2.format({name:"loogn",age:22});
//两个结果都是"我是loogn,今年22了"
第三中方法:
function stringFormat() {
if (arguments.length == 0)
return null;
var str = arguments[0];
for (var i = 1; i < arguments.length; i++) {
var re = new RegExp('\\{' + (i - 1) + '\\}', 'gm');
str = str.replace(re, arguments[i]);
}
return str;
}
StringFormat("&Type={0}&Ro={1}&lPlan={2}&Plan={3}&={4}&Id={5}&Id={6}", data1, data2, data3,data4, data5,data6,data7);
最后一种方法:相信做前端开发的朋友都受过这个折磨:连接HTML的时候被可恶的单引号、双引号搞得头昏脑胀。比如:
element.innerHTML = ‘<a href=”‘ + url + ‘” onclick=”alert(\” + msg + ‘\’);”>’ + text + ‘</a>’;
这里介绍一个字符串格式化函数:
String.format = function(str) {
var args = arguments, re = new RegExp(”%([1-" + args.length + "])”, “g”);
return String(str).replace(
re,
function($1, $2) {
return args[$2];
}
);
};
调用方法很简单:
element.innerHTML = String.format(’<a href=”%1″ onclick=”alert(\’%2\’);”>%3</a>’, url, msg, text);
意思就是用第n个参数把%n替换掉。这样一来清晰多了吧。
来源: Lodop 动态加载模板,动态加载数据 – qq_33103243的博客 – CSDN博客
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33103243/article/details/78105152
最近需要使用Lodop打印控件,所以就研究了一下,期间从网上找了诸多的东西,基本全是对HTML进行打印的,没有找到我想要的,就只好自己动手,丰衣足食。
这篇文章主要讲述的是Lodop与数据的结合使用,官网和网上能找到的东西本文不在复述,只是记录在使用过程中自己遇到的问题和相应解决方法,本人笔拙,有不足之处希望大家多提意见;
————————————————————————————————————————————————————————————
开发环境:
Myeclipse 10.7 + Oracle11g Windows 10;
主要技术:
Spring MVC + Mybatis + JQuery;
参考文档:Lodop技术手册6.2.1.5;
Lodop相应程序及技术文档请到官网下载:http://www.lodop.net/index.html
对于Lodop有简单了解之后观看本文效果更佳;
————————————————————————————————————————————————————————————
再次声明:本文针对的是Lodop的模板打印,相关基础问题只提到部分,其余自行去官网或者其他渠道获得;
————————————————————————————————————————————————————————————
需要解决的问题:
一:新增模板并把Lodop生成的模板存到Oracle数据库;
1.1:自主添加模板名称;
1.2:关闭打印设计之后自动返回模板内容代码;
1.4:对返回的数据进行存储;
二::对已创建的模板进行修改(包括打印设计和打印设置),动态从Oracle数据库加载;
2.1:单独修改模板名称;
2.2:动态加载已有模板属性;
三:调用已创建模板,并将数据库查询到的数据进行动态加载;
3.1:参数值传递;
相关问题解决思路:
一:新增模板并保存到数据库:
1.1:新增模板并自定义模板名称
在进行模板新增之前先进行模板名称输入,使用LODOP.PRINT_INIT(modelName); modelName 为自定义变量值进行接收输入的模板名称,然后可以设置一些插件的基本属性
如:LODOP.SET_PRINT_MODE(“PROGRAM_CONTENT_BYVAR”,true);//生成程序时,内容参数有变量用变量,无变量用具体值
然后进行调用 Lodop 打印设计 LODOP.PRINT_DESIGN(); 方法,即可进行新增模板;
1.2:关闭打印设计之后自动返回模板
在Lodop 打印设计页面有相应生成程序代码按钮
当我们在打印设计页面有内容时点击这个会弹出一个包含这个模板所有内容代码的框
这里面包含:模板名称、内容具体项、内容项的位置、内容项的属性等内容,Lodop原本的做法是将模板保存在安装目录的一个以模板名称命名的.ini文件中,然后现在要做的就是
在打印设计关闭的时候将上面代码返回到后台,然后丢进数据库进行保存起来;
下面先说下数据库结构:printModelName VARCHAR2(20)–模板名称; printModelContent CLOB–模板内容 ; printModelContentField VARCHAR2(500)–模板需传值字段;
在进行数据库存储的时候,我是将内容代码的第一行LODOP.PRINT_INIT(modelName);与其他内容进行了分割,单独提取出了模板名称,这个是为了方便模板的维护,然后模板其他所有内容全
部存在printModelContent 字段中,然后又对内容进行提取,得出这个模板中所有需要进行打印的字段,以“,”分割存进printModelContentField 里面(为什么这么做后面会提到),
然后说下打印设计关闭获得上述代码的方法 (官网案例35):
if (LODOP.CVERSION) {
CLODOP.On_Return=function(TaskID,Value){
var code = Value;
console.log(Value);
LODOP.PRINT_DESIGN();
}
这个Value 就是我们需要的数据,传到后台之后使用.spit();进行两次分割,第一次分割是为了分割出模板名称,所以用的是.spit(“;”,2); 第二次分割是为了得到模板需要打印的字段名称,
所以用的是.split(“;”); 那么至此我们就得出了上述三个我们需要的字段,然后将他们丢进数据库就行了;
二::对已创建的模板进行修改
2.1:维护模板名称
因为上面我们在数据库对模板名称是单独存储的,所以在需要更改模板名称时直接进行printModelName 字段进行Update 就OK了;
2.2:修改已创建模板
首先我们需要先将已经保存的模板加载出来,这里我是依据模板管理表的主键ID来进行调用的,从数据库查出该条记录之后,首先进行加载模板名称,然后将模板剩余内容动态进行拼接到名称
之后,方法如下
var aaa = JSON.parse(data);//—-对查询出的数据进行JSON转换
LODOP.PRINT_INIT(aaa[0].printModelName); //—-加载模板名称
var datas = aaa[0].printModelContent;//—-剩余模板内容
//—-对剩余模板内容进行动态拼接
var script = document.createElement(‘script’);
script.type = ‘text/JavaScript’;
script.appendChild(document.createTextNode(datas));
document.body.appendChild(script);
然后调用 打印关闭获得程序代码方法,确保我们在进行修改之后修改的内容可以保存到数据库。至此就是对已有模板的修改;
三:调用已创建模板,打印测试
通过以上两步,完成了模板新增、存储、修改,下面就是要进行调用了。
首先,生成的程序代码是LODOP.ADD_PRINT_TEXTA(“userName”,213,389,100,20,”userName”); 这样的,经过测试发现LODOP.ADD_PRINT_TEXTA(“userName”,213,389,100,20,obj.userName);
这样的可以动态加载,但是这样肯定是不行的,然后从Lodop官网找到了LODOP.SET_PRINT_STYLEA(varItemNameID, strStyleName,varStyleValue);//—-varItemNameID,需要替换的项目名称;
strStyleName,打印风格名称;varStyleValue,需要替换的项目值(与前面项目名称对应),就比如,此时我需要给userName进行赋值,就需要将LODOP.SET_PRINT_STYLEA的属性值写成如下格式:
LODOP.SET_PRINT_STYLEA(“userName”, “CONTENT”,obj.userName);//—-注意双引号, obj为数据库查询出的值;那么我们怎么获取需要替换的项目名称呢,此时上面我在进行模板存储的时候分割出
的内容项打印字段就派上用场了,此时对printModelContentField 进行分割, 然后使用for循环进行遍历就可以动态的对模板进行赋值,相应语句为:
var str = aaa[0].printModelContentField.split(“,”);
for(var i=0;i<str.length;i++){
LODOP.SET_PRINT_STYLEA(str[i],”CONTENT”,printObj[str[i]]);
}
此时,我们在进行调用LODOP.PREVIEW();//打印预览 方法,就可以看到我们取到的数据库的值;
以上,就是在下对于Lodop的一点个人的浅显的理解,如有不足之处请多多指教。
如果需要转载请注明出处。
————————————————
版权声明:本文为CSDN博主「qq_33103243」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_33103243/article/details/78105152
来源: 开源题材征集 + MVC&EF Core 完整教程小结 – 编程小纸条 – 博客园
到目前为止,我们的MVC+EF Core 完整教程的理论部分就全部结束了,共20篇,覆盖了核心的主要知识点。
下一阶段是实战部分,我们将会把这些知识点串联起来,用10篇(天)来完成一个开源项目。
现向园友征集题材,你提需求我来实现。
请在评论中提出你的需求,并加以简明扼要的描述。
题材最好是有趣的、有一定应用价值的,例如像Trello这样的效率管理系统。
我将会在选取一个相对适合的题材,通过敏捷开发,快速迭代,将详细开发过程记录下来,抛砖引玉,供大家参考。
前面已完成的20篇我们以技术为主导,后面的10篇我们将会以产品为主导。
开发完之后,博主可以提供个云服务器将程序放上去给大家使用,我们可以一边玩一边改进。
主要开发环境:
1、.net core 3 最新版
2、js & JQuery(如果时间允许,我们尽量多用原生js), bootstrap
3、MS SQL 2016
我们尽量只选用必要的工具,剥离表象,直达问题本质,降低大家学习成本。
让大家学会,只凭一把菜刀如何做出满汉全席。
最终的开源项目将会具有:
1、详细的使用说明书(直接放在系统中,点击帮助就能看到)
2、详细的代码说明,v1.0版本后将会托管到github上
3、详细的开发说明(代码演进),以博客园系列文章发布,了解代码演讲过程比最终的代码更有价值。
感谢写作过程中各位园友的鼓励和支持,授人以鱼不如授人以渔,希望能给你们带来一点帮助。
欢迎大家多提建议,祝学习进步 :)
P.S. 历史文章回顾与总结说明

来源: RDIFramework.NET敏捷开发框架通过SignalR技术整合即时通讯(IM) – .NET快速开发框架 – 博客园
即时通讯(IM)是RDIFramework.NET敏捷开发框架全新提供的一个基于Web的即时通讯、内部聊天沟通的工具。界面美观大方对于框架内部进行消息的沟通非常方便。基于RDIFramework.NET敏捷开发框架的即时通讯IM支持常规的用户对用户(点对点)聊天、工作流程流转的提醒、服务端消息的推送等。消息到达还有类似QQ的声音提醒,同时对消息进行了持久化处理,即时离线的用户,上线后也会收到消息,不会造成消息的丢失。还提供了很多扩展接口供用户实际扩展使用,非常的强大,方便。
通过“企业内部聊天IM”我们可以扩展很多应用出来。这儿特别说明的是我们的IM使用的是SignalR技术。.NET SignalR 是为.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程。实时 Web 功能是指这样一种功能:当所连接的客户端变得可用时服务器代码可以立即向其推送内容,而不是让服务器等待客户端请求新的数据。什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以互相通知消息及调用方法,当然这是实时操作的。SignalR提供了非常简单易用的高阶API,使服务器端可以单个或批量调用客户端上的JavaScript函数,并且非常方便地进行连接管理,例如客户端连接到服务器端,或断开连接,客户端分组,以及客户端授权,使用SignalR都非常 容易实现。
SignalR技术主要用途:它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送请求或使用轮询技术来获取消息。可以用在聊天室、看板、单点通讯、多点通讯,甚至可以结合其他技术用来做视频聊天,当然也有其他用途。
SignalR实现机制:SignalR 的实现机制与 .NET WCF是相似的,都是使用远程代理来实现。在具体使用上,有两种不同目的的接口:PersistentConnection 和 Hubs,其中 PersistentConnection 是实现了长时间的 JavaScript 轮询(类似于 Comet),Hub 是用来解决实时信息交换问题,它是利用 JavaScript 动态载入执行方法实现的。SignalR 将整个连接,信息交换过程封装得非常漂亮,客户端与服务器端全部使用 JSON 来交换数据。
基本流程图:

即时通讯(IM)包含SignalR服务端,我们内部聊天IM的服务端如下图所示,要使用IM,必须要先启动服务端。

登录框架后在主界面右下解会显示即时通讯(IM)的图标,不占用用户的界面空间。有新信息带来时图标会自动闪烁,同时会有声音提醒非常的方便,类似QQ一样。

单击图标会显示企业内部聊天IM主界面,如下图所示。在IM界面按部门对用户进行了分组的展示。

在线用户会高亮显示,如下图所示。

双击一个用户,即可给指定用户发送信息,聊天界面如下图所示:

在上图中,我们给“陈俊熙”发了一条消息,我们现在以”wikstone”陈俊熙用户登录框架,登录成功会自动提示消息,如下图所示:

在弹出的聊天窗口,我们也可以给发送消息的用户直接回复。
“企业内部聊天IM”不仅可以做为简单的聊天工具,同时在业务协同办公过程中也有很好的支持,如:当用户收到一个待办业务时,IM也会自动进行带声音的提示,如下图所示。

一路走来数个年头,感谢RDIFramework.NET框架的支持者与使用者,大家可以通过下面的地址了解详情。
RDIFramework.NET官方网站:http://www.rdiframework.net/
RDIFramework.NET官方博客:http://blog.rdiframework.net/
同时需要说明的,以后的所有技术文章以官方网站为准,欢迎大家收藏!
RDIFramework.NET框架由海南国思软件科技有限公司专业团队长期打造、一直在更新、一直在升级,请放心使用!
欢迎关注RDIFramework.net框架官方公众微信(微信号:guosisoft),及时了解最新动态。
扫描二维码立即关注
