WebSocket在ASP.NET MVC4中的简单实现 - 小白哥哥 - 博客园

mikel阅读(906)

来源: WebSocket在ASP.NET MVC4中的简单实现 – 小白哥哥 – 博客园

WebSocket 规范的目标是在浏览器中实现和服务器端双向通信。双向通信可以拓展浏览器上的应用类型,例如实时的数据推送、游戏、聊天等。有了WebSocket,我们就可以通过持久的浏览器和服务器的连接实现实时的数据通信,再也不用傻傻地使用连绵不绝的请求和常轮询的机制了,费时费力,当然WebSocket也不是完美的,当然,WebSocket还需要浏览器的支持,目前IE的版本必须在10以上才支持WebSocket,Chrome Safari的最新版本当然也都支持。本节简单介绍一个在服务器端和浏览器端实现WebSocket通信的简单示例。

1.服务器端

我们需要在MVC4的项目中添加一个WSChatController并继承自ApiController,这也是ASP.NET MVC4种提供的WEB API新特性。

在Get方法中,我们使用HttpContext.AcceptWebSocketRequest方法来创建WebSocket连接:

namespace WebSocketSample.Controllers
{
    public class WSChatController : ApiController
    {
        public HttpResponseMessage Get()
        {
            if (HttpContext.Current.IsWebSocketRequest)
            {
                HttpContext.Current.AcceptWebSocketRequest(ProcessWSChat);
            }
            return new HttpResponseMessage(HttpStatusCode.SwitchingProtocols);
        }

        private async Task ProcessWSChat(AspNetWebSocketContext arg)
        {
            WebSocket socket = arg.WebSocket;
            while (true)
            {
                ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1024]);
                WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, CancellationToken.None);
                if (socket.State == WebSocketState.Open)
                {
                    string message = Encoding.UTF8.GetString(buffer.Array, 0, result.Count);
                    string returnMessage = "You send :" + message + ". at" + DateTime.Now.ToLongTimeString();
                    buffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(returnMessage));
                    await socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
                }
                else
                {
                    break;
                }
            }
        }
    }
}

在这段代码中,只是简单的检查当前连接的状态,如果是打开的,那么拼接了接收到的信息和时间返回给浏览器端。

2.浏览器端

在另外一个视图中,我们使用了原生的WebSocket创建连接,并进行发送数据和关闭连接的操作

@{
    ViewBag.Title = "Index";
}
@Scripts.Render("~/Scripts/jquery-1.8.2.js")

<script type="text/javascript">
    var ws;
    $(
        function () {
            $("#btnConnect").click(function () {
                $("#messageSpan").text("Connection...");
                ws = new WebSocket("ws://" + window.location.hostname +":"+window.location.port+ "/api/WSChat");
                ws.onopen = function () {
                    $("#messageSpan").text("Connected!");
                };
                ws.onmessage = function (result) {
                    $("#messageSpan").text(result.data);
                };
                ws.onerror = function (error) {
                    $("#messageSpan").text(error.data);
                };
                ws.onclose = function () {
                    $("#messageSpan").text("Disconnected!");
                };
            });
            $("#btnSend").click(function () {
                if (ws.readyState == WebSocket.OPEN) {
                    ws.send($("#txtInput").val());
                }
                else {
                    $("messageSpan").text("Connection is Closed!");
                }
            });
            $("#btnDisconnect").click(function () {
                ws.close();
            });
        }
    );
</script>

<fieldset>
    <input type="button" value="Connect" id="btnConnect"/>
    <input type="button" value="DisConnect" id="btnDisConnect"/>
    <hr/>
    <input type="text" id="txtInput"/>
    <input type="button" value="Send" id="btnSend"/>
    <br/>
    <span id="messageSpan" style="color:red;"></span>
</fieldset>

3.测试结果

image

英文原文链接

C#使用VS2019打包安装程序(图标修改和默认安装路径修改) - qq_41487299的博客 - CSDN博客

mikel阅读(2013)

来源: C#使用VS2019打包安装程序(图标修改和默认安装路径修改) – qq_41487299的博客 – CSDN博客

这次主要是记录一下我在C#打包时遇到的一些坑。
环境:Vs2019+C#
要打包安装程序,第一件事就是去扩展——》管理扩展 里面下载installer Projects,

就是这搜索列表里面的第一个。
如果不能安装,自己就去网上找一下来安装。
首先这个installer好像版本有些老了,所以只支持.net Framework 4…6.1。所以请把你本身的代码框架修改成net Framework 4…6.1。如果你一开始使用的其他框架,可以右键项目,点击属性,弹出下面这个对话框。

在这个目标框架里面选择.net Framework 4.6.1 就可以了。
如果下拉菜单里面没有这个选项的话,那你就点击下拉菜单里的安装其他框架,下载一个就可以了。还有就是安装的时候要选择 developer pack 版本,安装,否则没用。

注意如果没有修改框架为.net Framework 4.6.1版本,它会提示要你安装,可是不论你怎么安装,安装什么版本都没有,只能修改目标框架,这都是血的教训啊!

还有就是如果你要修改图标,可以左键你的setup project,在左下角里面有个这种菜单栏

其中的AddRemoveProgramIcon就是设置图标的。
不过还有一点要注意,你如果直接在网上下载,或者是自己修改后缀名的图片是没有办法使用的。
你需要先在网上下载相应的icon文件,然后先设置下方对话框中的图标,然后才能去设置AddRemoveProgramIcon中的icon文件。
并且还要注意 将这个icon文件写入到application Folder,只有这样才能安装到别人电脑上也能使用。

还有就是设置这个安装文件的默认安装位置。
你需要做的就是左键点击 你的setup project文件——》view——》文件系统

出现这样一个界面
左键点击第一个文件夹 application Folder,然后找到右下角属性面板

在DefaultLocation里面设置你想要设置的文件夹路径。
————————————————
版权声明:本文为CSDN博主「永远的小白虾」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41487299/article/details/98482421

winform 项目获取app.config 中appSettings节点数据 - 承影剑 - 博客园

mikel阅读(1202)

来源: winform 项目获取app.config 中appSettings节点数据 – 承影剑 – 博客园

< ?xml version="1.0" encoding="utf-8" ?>






















http://192.168.1.155:8013/DataService/WebService/Interface/UpgradeFile.asmx




然后在winform中cs文件里这样调用:

///

/// 获取配置文件里appsettings的数据
///

/// ///
public string GetAppsettingStr(string str)
{
AppSettingsReader appReader = new AppSettingsReader();
return appReader.GetValue(str, typeof(string)).ToString();
}

SQL Server未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序 - 踏雪有迹的博客 - CSDN博客

mikel阅读(5408)

来源: SQL Server未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序 – 踏雪有迹的博客 – CSDN博客

转载自其他博主,仅技术交流,如有冒犯侵删
本人实测SQL Server2017,win10下office2016解决该问题,下载了2007 Office System后可以正常使用SQL数据导入。
因某些问题请点击阅读更多,可见文章内容

其实,这种错误的可能性有几种,比如:

1.没有安装数据访问组件,需要安装相应版本的数据访问组件;

2.没有安装相应版本的Office客户端,需要安装相应版本的Office客户端;

3.Microsoft.Jet.OLEDB.4.0在64位系统上不支持,需要修改架构,从x64改为x86,无论是WinForm还是ASP.NET;或者修改连接字符串为Microsoft.ACE.OLEDB.12.0并且安装AccessDatabaseEngine x64数据访问组件;

4.没有在IIS应用程序池配置默认属性,需要在相应的IIS应用程序池启用32位应用程序;

下面是我收集整理的一些解决方案。

 

 

【错误】:未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序。

说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.InvalidOperationException: 未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序。

下载Microsoft 2007 Office System 驱动程序:数据连接组件安装

http://download.microsoft.com/download/7/0/3/703ffbcb-dc0c-4e19-b0da-1463960fdcdb/AccessDatabaseEngine.exe

概述

此下载将安装一组组件,非 Microsoft Office 应用程序可以使用它们从 2007 Office system 文件中读取数据,例如从 Microsoft Office Access 2007(mdb 和 accdb)文件以及 Microsoft Office Excel 2007(xls、xlsx 和 xlsb)文件中读取数据。这些组件还支持与 Microsoft Windows SharePoint Services 和文本文件建立连接。
此外,还会安装 ODBC 和 OLEDB 驱动程序,供应用程序开发人员在开发与 Office 文件格式连接的应用程序时使用。

系统要求

支持的操作系统: Windows Server 2003 Service Pack 1, Windows Vista, Windows XP Service Pack 2

    • 此下载适用于以下 Office 程序:
      • 2007 Microsoft Office system
使用此下载:

  1. 如果您是应用程序用户,请查阅应用程序文档以获得有关如何使用相应的驱动程序的详细信息。
  2. 如果您是使用 OLEDB 的应用程序开发人员,请将 ConnectionString 属性的 Provider 参数设置为“Microsoft.ACE.OLEDB.12.0”如果您是使用 ODBC 连接到 Microsoft Office Access 数据的应用程序开发人员,请将连接字符串设置为“Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=path to mdb/accdb file”
    • 如果要连接到 Microsoft Office Excel 数据,请将“Excel 12.0”添加到 OLEDB 连接字符串的扩展属性中。
  3. 如果您是使用 ODBC 连接到 Microsoft Office Excel 数据的应用程序开发人员,请将连接字符串设置为“Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=path to xls/xlsx/xlsm/xlsb file”

详情与下载:

Microsoft Access Database Engine 2007 Office system 驱动程序:数据连接组件
Microsoft Access Database Engine 2010 Redistributable

 

 
【错误】:访问Excel 2007 出错,未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序。
 
场景描述:windows 2008 r2 x64版本的操作系统中通过oledb提供程序连接访问Excel2007/2003时,程序会报如下错误:

System.InvalidOperationException: The ‘Microsoft.ACE.OLEDB.12.0’ provider is not registered on the local machine.

此查找资料认为产生此种错误的原因有两种:

1、在Windows2008r2 x64 OS,在没有装Office2007客户端时,或没有安装“数据连接组件”

2、当前Web应用程序的应用程序池是64位的Sharepoint应用程序池下时,因为提供连接Excelprovider不支持当前64版本的操作系统

解决方案:

方案1:

安装MS的数据连接组件AccessDatabaseEngine(或安装office 2007客户端),并将当前承载通过oledb提供程序去访问Excel2007Web application对应的应用程序池“启用兼容32位应用程序”,

在对应的 IIS 应用程序池中,“设置应用程序池默认属性”右击/“高级设置”/”启用32位应用程序,设置为 true

方案2:

安装AccessDatabaseEngine_64版并且要安装64位版的office 2010客户端

方案3:

若目标应用程序不能将应用程序池启用兼容32位应用程序,只能在64位应用程序池下运行,且又想有上传Excel的功能,可按如下方式:

a、创建ASP.NET WebService application 程序,并通过WebService来连接访问Excel

b、将此webservice application的应用程序池按方案1方式设置“启用兼容32位应用程序”。

c、在目标应用程序中添加此webservice

 

本文来自cnblogs:http://www.cnblogs.com/q149072205/archive/2012/03/29/2423323.html

SharpBrowser,使用 C# 和CefSharp构建的全功能网页浏览器,下载SharpBrowser的源码_GitHub_帮酷

mikel阅读(2622)

来源: SharpBrowser,使用 C# 和CefSharp构建的全功能网页浏览器,下载SharpBrowser的源码_GitHub_帮酷

SharpBrowser源代码下载

  • Git URL:
    git://www.github.com/sharpbrowser/SharpBrowser.git
  • Git Clone代码到本地:
    git clone http://www.github.com/sharpbrowser/SharpBrowser
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/sharpbrowser/SharpBrowser
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    

SharpBrowser

SharpBrowser是最快的开放源码 C# 网络浏览器 ! 在渲染网页时比 Google Chrome 稍快一些,因为它是轻量级的CEF渲染器。 我们比较了每个可用的.NET 浏览浏览引擎,最终确定了高性能的 CefSharp。 许可许可许可许可许可。

特性

  • HTML5,CSS3,JS,HTML5视频,3,等等
  • 标签式浏览
  • 地址栏( 也打开 Google )
  • 后退,前进,停止,刷新
  • 开发工具开发工具
  • 搜索栏( 也高亮显示所有实例)
  • 下载管理器
  • 自定义错误页
  • 自定义上下文菜单
  • 轻松添加厂商特定品牌,按钮或者热键
  • 查看联机&脱机网页

热键

热键函数

Ctrl+T 添加新标签
Ctrl+N 添加新窗口
Ctrl+W 关闭活动选项卡
F5 刷新活动选项卡
F12 开发人员工具
Ctrl+Tab 切换到下一个标签
Ctrl+Shift+Tab 切换到前一选项卡
Ctrl+F 打开搜索栏( 输入查找下一个,Esc关闭)

代码

  • SharpBrowser使用 CefSharp 51,NET框架 4.5.2
  • MainForm.cs – 主网页浏览器用户界面和相关功能
  • Handlers – 我们注册在CefSharp中的各种处理程序,使我们能够更深入地集成我们的CefSharp和
  • Data/JSON.cs – 快速JSON序列化器/解串器
  • bin – 由于需要复杂的CefSharp设置,bin 文件夹中包含二进制文件。 不清空这里文件夹。
  • 下载管理器和自定义错误页面需要 bin/storage – HTML和 JS

Credits

Winform 自定义TabControl实现浏览器标签 - InkGenius - 博客园

mikel阅读(1765)

来源: Winform 自定义TabControl实现浏览器标签 – InkGenius – 博客园

实现效果
作者:Gavin(daisong.michelangelo@gmail.com)
时间: Nov, 2015
封面图片为Gavin原创,请勿未经允许私自引

最近因为工作需要,要做一个桌面浏览器,和大多数浏览器一样,我的这个浏览器也需要有标签栏,效果就像这样:目标效果图
在网上查了很多资料,大多数做法都是自定义Winform中TabControl控件,具体的做法有多种。
首先让我们来见识一下winform原生的TabControl是什么样子的:这里写图片描述
怎么样,有没有让你有种思考人生的冲动?
下面我们来分析怎么将它改造成我们想要的模样这里写图片描述
TabControl有由一个个TabPage组成,每个TabPage有一个TabItem(也就是页签)
让我们从这个页签开始,它由以下三部分组成:

  1. 标签页左边是一个图标
  2. 中间是网页的Title
  3. 右边是标签的关闭按钮

要实现这三个部分,我们可以重写TabControl.DrawItem 事件,在这之前我们当然要继承Winform 的TabControl 组件:
public partial class TabControl1 : TabControl
然后还要记得将DrawMode 设置成 TabDrawMode.OwnerDrawFixed,这样我们就可以自己画TabItem了,否则你在DrawItem里面干的事可就白干了。
然后,我们就可以重写DrawItem事件,开始画也签了

this.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.MainTab_DrawItem);

首先,我们可以先设置标签页的背景,而且标签在选中和未选中的时候背景是不一样的。

// 获取当前选项卡区域
 Rectangle bounds = GetTabRect(e.Index); 
 Brush br = SystemBrushes.ActiveCaptionText;
 if (e.Index == this.SelectedIndex)    //当前选中的Tab页,设置不同的样式以示选中  
 {
   e.Graphics.FillRectangle(Brushes.White, bounds); //改变选中选项卡标签的背景色   
 }
 else
  {
e.Graphics.FillRectangle(Brushes.DarkRed, bounds); //改变非选中的选项卡标签的背景色
    br = SystemBrushes.GrayText;    //置灰非选中项
}

注意,一定要先画背景,在画其他的东西,不然后画背景会将之前画的东西擦除掉。
接着我们就可以来画图标了,TabControl 有一个ImageList可以存放图片,可以通过key和index获取到。原生的TabControl已经实现了这个功能,但是我们重写了整个TabItem的绘制方法,所以我们还是要自己实现。

 //绘制图标  
 if (this.ImageList != null)
 {
     int index = this.TabPages[e.Index].ImageIndex;
     string key = this.TabPages[e.Index].ImageKey;
     Image icon = new Bitmap(icoSize, icoSize);
     if (index > -1)
     {
         icon = this.ImageList.Images[index];
     }
     if (!string.IsNullOrEmpty(key))
     {
         icon = this.ImageList.Images[key];
     }
     e.Graphics.DrawImage(icon, bounds.X + startX, bounds.Top + 2);
}

好了,我们快要完成了,Graphics有绘制各种形状的方法,参数大多含有坐标,坐标控制就不多说了,MSDN里的方法说的很清楚了。
接下来,我们要画文字了,很简单,TabPages[i].Text就是我们的Title

 e.Graphics.DrawString(this.TabPages[i].Text, font, br, bounds.X + startX, bounds.Y + 6);

最后,我们还是一样的方法画出关闭按钮。closeImage可以先导入到资源文件

bounds.Offset(bounds.Width - (CLOSE_SIZE + 5), 2);
e.Graphics.DrawImage(closeImage, bounds.X, bounds.Y);

好了,页签的外观我们已经大工告成了,接下来我们要响应关闭按钮来关闭页签。
方法是监听鼠标点击事件,如果点击区域是在我们画关闭按钮的区域呢,我们就冲tabPages中将这个Page移除。

 //计算关闭区域  
 Rectangle bounds = this.GetTabRect(this.SelectedIndex);
 bounds.Offset(bounds.Width - (CLOSE_SIZE + 5), 2);
 bounds.Width = CLOSE_SIZE;
 bounds.Height = CLOSE_SIZE;
 //如果鼠标在区域内就关闭选项卡  
 bool isClose = x > bounds.X && x < bounds.Right
  && y > bounds.Y && y < bounds.Bottom;
 if (isClose == true)
 {
     int index = this.SelectedIndex;
     TabPage tab = this.SelectedTab;
     this.TabPages.Remove(tab);
     tab.Dispose();
 }

好了,看来我们已经完美地做出了一个美观的TabItem了,如果你没有别的需要的话,这样的组件就可以使用了。
但如我之前所说,实现方法有多种,因为需求总是在变,所以我们还是需要一种更全面的方法。
如果我需要改变整个TabControl 的背景色透明要怎么办呢?
仅仅重写DrawTabItem是远远不够的。

好了,下面进入今天的主题,怎么重写TabControl的OnPaint()方法来实现我们之前所实现的功能。
首先,我们当然要继承TabControl,还要设置几个属性

 this.SetStyle(
     ControlStyles.UserPaint |                      // 控件将自行绘制,而不是通过操作系统来绘制  
    ControlStyles.OptimizedDoubleBuffer |  // 该控件首先在缓冲区中绘制,而不是直接绘制到屏幕上,这样可以减少闪烁  
    ControlStyles.AllPaintingInWmPaint |           // 控件将忽略 WM_ERASEBKGND 窗口消息以减少闪烁  
    ControlStyles.ResizeRedraw |                   // 在调整控件大小时重绘控件  
    ControlStyles.SupportsTransparentBackColor,    // 控件接受 alpha 组件小于 255 的 BackColor 以模拟透明  
       true);                                         // 设置以上值为 true  
this.UpdateStyles();

最终要的一个就是要设置ControlStyles.UserPaint 为True,不然你就思考人生吧!但是设置了这个属性我们就要告别过去,从一张白纸开始了,当然这也意味着我们就可以尽情发挥了。
首先,我们就可以重写OnPaint方法了,这里我们绘制背景就很方便了,只要画一张图片就好了。

protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Rectangle rec = this.ClientRectangle;           // 获取TabControl主控件的工作区域
Image backImage = Properties.Resources.bgImage; //获取背景图片,我的背景图片在项目资源文件中。
e.Graphics.DrawImage(backImage, 0, 0, this.Width, this.Height);  //绘制主控件的背景
//绘制标签样式
for (int i = 0; i < this.TabPages.Count; i++)
{
  //....这里和绘制上面的标签页类似
}
}

好了,先写到这吧,一个简单的自定义TabControl就实现了。
参考资料:

一步一步玩控件:自定义TabControl——从山寨Safari开始

chrome升级后LODOP打印插件无法使用 - James.H.Fu - 博客园

mikel阅读(1241)

来源: chrome升级后LODOP打印插件无法使用 – James.H.Fu – 博客园

今天帮朋友使用LODOP实现一个套打程序时,发现LODOP打印插件在chrome下始终无法使用。分析后发现是自己才升级了chrome,chrome新版默认是禁用npapi的,因此需要手动启用一下,启用方法如下:

 在谷歌浏览器地址栏输入:
chrome://flags/#enable-npapi
然后找到“启用NPAPI”,点击启用,根据提示重启chrome即可。

C# ToShortDateString() ToString() 设置日期格式的区别 - wusir - 博客园

mikel阅读(1025)

来源: C# ToShortDateString() ToString() 设置日期格式的区别 – wusir – 博客园

C#中,ToShortDateString()是用于显示短日期格式的方法,如果使用下面的语句:

Label1.Text = DateTime.Now.ToShortDateString();

那么,在Label1中会显示什么样的短日期格式呢?

答案是:不确定。

可能是:2013-07-26

也可能是:2013/07/26

也可能是:2013.07.26

等等等等,虽然许多文章中认为应该是“2013-07-26”,实际上,ToShortDateString()方法所显示出的短日期字符串不是由它本身所能控制的,实际它是由所处区域及人为设置所影响的。

进入“控制面板”,打开“区域和语言”,在“格式”签下可以看到短日期的设置方式,比如上述ToShortDateString()所产生的三种可能的输入分别对应了:“yyyy-MM-dd”、“yyyy/MM/dd”、“yyyy.MM.dd”三种设置的短日期格式。

因此,电脑所处的区域不同,或者电脑用户的个人偏好不同,而设置了不同的短日期格式,那么在C#开发的Windows应用或者Web应用,短日期就会以不同的格式显示。

但在设计开发中,为了保持界面的统一性,往往希望短日期格式在任何情况下都是固定不变的,不使其受到用户对短日期格式设置的影响。这时候,需要使用ToString的方式,强行指定日期的显示格式,而不提取客户机上用户设定的格式。

具体使用方法是:

Label1.Text = DateTime.Now.ToString(“yyyy-MM-dd”);

这样做的结果,无论客户机是什么样的短日期格式设置,可以确定地说,这个日期的显示格式必然是:

“2013-07-26”

 

同样地,如果要在各种电脑上都显示出统一的长日期、时间等信息,都可以使用ToString方法。

 

总结:如果强调统一的界面,可以使用ToString的办法指定不变的日期或时间格式;如果考虑应用要灵活适应不同区域(比如可以全球访问的网站)的用户,则使用ToShortDateString办法。

利用echarts展示旅行足迹 - champyin - 博客园

mikel阅读(1365)

来源: 利用echarts展示旅行足迹 – champyin – 博客园

前言

一直有个环游世界的梦,周游列国,体验不同国家的人类文明,寻山访水,体验造物主大自然的伟大造化。毕竟人生不止眼前的苟且,还有诗和远方。这么多年以来,陆续走过了一些地方,每到一个地方,都让我离梦想又近了一些。虽然我知道这比起环游世界来说,还差不知道多少个山头,但是我一直在往这个梦努力,靠近。希望终有一天,我可以笑着对自己说,你做到了!

6年前,因为工作的原因,我接触过地图应用的开发,从那时起,我对地图的热爱就埋在了心底。今年年中我带爸妈旅了旅游,去了一些我没去过的地方,我好想有个地图可以让我点亮一下,记录一下我到过的新的“领土”。搜了下市面上已经存在的地图应用,都不是我想要的,唯一比较符合我的需求的是百度旅游里面的一个小功能,叫做足迹地图,但是似乎早就停止了维护,数据停留在2016年。。。

找不到趁手的工具,那就自己打造一把。是啊,为什么不自己开发一个呢?说干就干。

工程搭建

首先用 cyt-cli 快速搭建项目框架。cyt-cli地址

cyt-cli 是一款可以快速创建前端工程的脚手架,具有比较完善的webpack4配置,目前支持纯js、vue、react等语言版本。
如果没有安装 cyt-cli ,先全局安装一下:npm i -g cyt-cli

cyt-cli create footprint
✔ fetching template ...
? please choose a template to create roject (Use arrow keys)
❯ swan-template 
  swan-vue-template 
  swan-react-template 

因为想快速做出雏形来,所以使用最简单的模版就行,选择第一个 swan-template
等待一会,工程就搭建好了。
生成的工程目录:

|--build/ # webpack配置文件
|    |-- webpack.base.js
|    |-- webpack.dev.js
|    |-- webpack.prod.js
|--public/ # 首页模版
|    |-- index.html
|--src/
|    |-- assets/ # 静态资源,比如中国地图数据
|    |-- components/ # 项目组件
|    |       |--  foo.js
|    |       |--  bar.js
|    |-- icon/ # 字体图标
|    |-- images/ # 图片资源
|    |-- theme/ # 样式文件
|    |-- index.js # 项目入口
|--.babel.js # babel配置
|--.browserslistrc.json # 浏览器支持规则
|--.gitignore 
|--package.json
|--postcss.config.js # postcss插件配置
|--README.md

安装一下依赖包。

cd footprint
npm i

地图选型

地图展示我选择了 echarts。 echarts官网

npm i --save echarts

应用开发

我的核心需求很简单,就是可以把我去过的国家、省、市在地图上展示出来即可。
先实现国内的省,开发逻辑很简单:

1.引入echarts

按需引用

import echarts from 'echarts/lib/echarts';
import 'echarts/lib/chart/map';
import 'echarts/lib/component/tooltip';
import 'echarts/lib/component/title';
import 'echarts/lib/component/visualMap';
import 'echarts/lib/component/legend';
import 'echarts/lib/component/toolbox';

2.处理用户数据

seriesdata用。

let handleData = function(rawdata) {
    rowData.forEach(item => {
        item.value = FREQUENCY[item.value]
        if (item.value !== NEVER) {
            item.label = { show: true, color: LEBEL_COLOR }
        }
        if (item.value === NEVER) {
            never.push(item);
        } else if (item.value === ONECE) {
            onece.push(item);
        } else if (item.value === AFEWTIMES) {
            afewtimes.push(item);
        } else {
            usually.push(item);
        }
    });
    series = [usually, afewtimes, onece, never].map((item, index) => {
        let temp = {
            type: 'map',
            map: mapType,
            roam: true,
            itemStyle: {
                emphasis: { label: { show: true } },
                areaColor: '#fff'
            }
        };
        temp.name = legendData[index];
        temp.data = item;
        return temp;
    })
}

handleData(userData);

3.注册map

echarts有个registerMap方法,echarts.registerMap(mapName, geoJson, specialAreas).

- mapName:地图名称,一定要与option->series->map对应的值相同。
- geoJson:GeoJson格式的数据,具体格式见 http://geojson.org/。
- specialAreas:可选。将地图中的部分区域缩放到合适的位置,可以使得整个地图的显示更加好看。

geoJson是地理信息数据,一般都很大,当然通过异步获取。

util.get('assets/china.json').then(data => {
    let chinaJson = data;
    myChart.hideLoading();
    // 注册地图
    echarts.registerMap(mapName, chinaJson, {})
})

ECharts3提供的矢量地图数据,在4版本后已经不提供下载服务了。官网的解释是“由于部分数据不符合国家《测绘法》规定”。不过,只要不商用,这些矢量数据还是可以使用的。有需要可以到我这里获取 https://github.com/yc111/echarts3-geojson

4.配置option显示地图

注册地图后进行其他配置

// 指定图表的配置项和数据
let option = {
    color: _color,
    title: _title,
    tooltip: _tooltip,
    legend: _legend,
    visualMap: _visualMap,
    toolbox: _toolbox,
    series: series
};
// 使用刚指定的配置项和数据显示图表
myChart.setOption(option);

添加Travis CI持续集成

花了大概一天时间,雏形做好(感觉很大一部分时间在调地图颜色…)。我把项目部署在了github page上,但是每次build之后,都要手动部署,太麻烦。

于是我用 Travis CI 给项目做了持续集成,现在只要代码一提交,就会自动部署了。

具体关于Travis的详细配置,可以参考我的另一篇文章:利用Travis CI+GitHub实现持续集成和自动部署

效果预览

项目预览地址:http://champyin.com/footprint/
footprint.jpg

暂时还比较简陋,并且只支持省。以后我会把世界地图,和城市地图都加进来(毕竟也是出过境的人,哈哈),实现地图下钻,并且优化用户数据设置,不断完善下去。

项目源码地址:https://github.com/yc111/footprint
欢迎star。如果你喜欢,可以fork本项目,然后打造属于你自己的足迹应用。


欢迎转载,转载请注明出处:
https://champyin.com/2019/09/27/%E5%88%A9%E7%94%A8echarts%E5%B1%95%E7%A4%BA%E6%97%85%E8%A1%8C%E8%B6%B3%E8%BF%B9/

本文同步发表于:
利用echarts展示旅行足迹 | 掘金

处理程序 SafedogIISAuditor32 错误代码 0x80070003 - 加菲猫and大白 - 博客园

mikel阅读(960)

来源: 处理程序 SafedogIISAuditor32 错误代码 0x80070003 – 加菲猫and大白 – 博客园

卸载服务器安全狗 常会有卸载残留 如出现以下情况 可参考本人解决方法解决 仅是本人经验之谈 不一定全面 仅供参考

解决办法: 打开iis信息服务管理器 删除isapi筛选器 和 程序处理映射里面对应的带有安全狗的配置,然后重新启动网站