jCountdown使用 – 可乐吧

mikel阅读(1869)

来源: jCountdown使用 – 可乐吧

目前版本为:jCountdown JQuery Plugin – v1.5.2 – 2014-07-29
下载地址:https://github.com/tomgrohl/jCountdown/
这个插件使用比较简单,难得的是一个版本一个版本在不断做着升级优化。非常符合我选择插件的要求。
介绍下如何使用:
1、引用JQuery.jcountdown.js文件。
2、html里面添加给要显示倒计时的区域添加id名。例:

3、调用,填写相应参数。

$(document).ready(function() {
 
	$("#countdown").countdown({
		date: "August 15, 2014 09:59",
		omitZero: false,//省略0
		//minsOnly: true,
		leadingZero: false, //前导0
		//yearsAndMonths: true, //年月
		//weeks: true //周
	});
 
});

由于为外国人开发所显示的为日期名称为英文,还好有参数,方便修改。另一例调用方法,如下。

	// 倒计时
	var dateTo = "August 15, 2014 00:00"
	$("#time").countdown({
		yearText: '年',
		monthText: '月',
		weekText: '周',
		dayText: '天',
		hourText: '时',
		minText: '分',
		secText: '秒',
		yearSingularText: '年',
		monthSingularText: '月',
		weekSingularText: '周',
		daySingularText: '天',
		hourSingularText: '时',
		minSingularText: '分',
		secSingularText: '秒',
		date: dateTo,
		omitZero: false
	});

在这个过程中,产品有个需求是去掉“秒”的展示,通过简易模板配置可以完成。代码如下:

$(document).ready(function() {
 
	// Tokens available: %y = years, %m = months, %w = weeks, %d = days, %h = hours, %i = minutes, %s = seconds
 
	$("#countdown").countdown({
		date: "september 10, 2015 12:35",
        //yearsAndMonths: true,
		template: '%d %h %i'
	});
 
});

ps:此插件支持一个页面有多个倒计时存在。还包含了一些方法,请查看示例。

设置时间时不能设为24:00,否则在chrome下会出现:Uncought Error:Invalid Date passer to jCountdown

HiAR | HiAR SDK for Unity | 涂涂乐开发教程

mikel阅读(1560)

来源: HiAR | HiAR SDK for Unity | 涂涂乐开发教程

本文将向您介绍如何使用 HiAR SDK 创建一个简单的涂涂乐应用。


Step 1.基础开发及设置

请先按照“创建 Hello World”中的 Step1~Step4,完成以下工作:

  • 新建 Unity 工程并导入 SDK
  • 创建 HiARCamera
  • 设置 AppKey 和 Secret
  • 创建 ImageTarget

Step 2.设置 ImageTarget

在 Hierarchy 窗口中选中 ImageTarget,在其对应的 Inspector 窗口中找到 HiAR Target Mono Behaviour (Script),在 Data Set 选项中选择 color3D。此时,编辑窗口中将显示一张鱼的图片,这是刚刚设置的识别图片。

(说明:color3D 是 SDK 中内置的本地识别包,供教程使用)


Step 3.设置 3D 模型

本文中使用的是一个鱼的 3D 模型,您可以在 Assets/HiAR-Unity/3DModels 目录下找到名为 fish 的文件。将 fish 拖至 Hierarchy 窗口中并设置为 ImageTarget 的子项,适当调整位置和大小。

点击 ImageTarget 下的 fish,在其对应的 Inspector 窗口中点击 Add Component,依次选择 Scripts > HiAR Paint


Step 4.设置 Shader

在 3D 文件 fish 的同级目录下找到 Material 文件夹并打开,找到对应的材质文件 fish。点击 fish ,在对应的 Inspector 窗口中找到 Shader 选项,依次设置为 HiAR > HiARPaint


Step 5.调试运行

上述操作完成后,需要在 Unity 环境下运行以查看效果。在运行之前,请确保您的电脑已安装了摄像头。

点击运行按钮,摄像头将启动并采集画面;将摄像头对准鱼的图片(点击此获取原图),识别成功后将在图片上叠加显示鱼的模型,并且模型上会显示对应涂色的颜色与图案。

(说明:作者已经将图片打印出来,并且在一条鱼的空白处涂上了颜色)

Bootstrap 模态框 | 菜鸟教程

mikel阅读(1180)

来源: Bootstrap 模态框 | 菜鸟教程

描述

Bootstrap Modals(模态框)是使用定制的 JQuery 插件创建的。它可以用来创建模态窗口丰富用户体验,或者为用户添加实用功能。您可以在 Modals(模态框)中使用 Popover(弹出框)和 Tooltip(工具提示插件)。

在本教程中,将通过一些实例和解释来讨论如何使用 Bootstrap 创建模态窗口。同时,我们也会讨论用于定制的各种可用选项。

什么是必需的

您需要 JQuery、Bootstrap CSS 和 JavaScript 文件 bootstrap-modal.js。这个 js 文件位于您下载的 Bootstrap 主文件夹中的 js 文件夹内。

JQuery 位于您的 Bootstrap 主文件夹中的 docs > assets > js 下,名为 jQuery.js。或者您可以直接访问 https://ajax.googleapis.com/ajax/libs/jQuery/1.7.1/jquery.min.js 下载 Jquery。

Bootstrap Modals(模态框)长什么样

下面的实例演示了 Bootstrap Modals(模态框)长什么样。

Bootstrap Modals

在您的网站中使用 Bootstrap Modals(模态框)

下面的实例演示了如何在网页中使用 Bootstrap Modals(模态框)。请注意,您不需要编写任何的 JavaScript 代码。实例后面附有相关的解释。

<!DOCTYPE html> 
<html lang="en"> 
<head> 
<meta charset="utf-8"> 
<title>Twitter Bootstrap Modals Example</title> 
<meta name="description" content="Creating Modal Window with Twitter Bootstrap">
<link href="/twitter-bootstrap/twitter-bootstrap-v2/docs/assets/css/bootstrap.css" rel="stylesheet"> 
</head>
<body>
<div class="container">
<h2>Example of creating Modals with Twitter Bootstrap</h2>
<div id="example" class="modal hide fade in" style="display: none; ">
<div class="modal-header">
<a class="close" data-dismiss="modal">×</a>
<h3>This is a Modal Heading</h3>
</div>
<div class="modal-body">
<h4>Text in a modal</h4>
<p>You can add some text here.</p>		        
</div>
<div class="modal-footer">
<a href="#" class="btn btn-success">Call to action</a>
<a href="#" class="btn" data-dismiss="modal">Close</a>
</div>
</div>
<p><a data-toggle="modal" href="#example" class="btn btn-primary btn-large">Launch demo modal</a></p>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script src="/twitter-bootstrap/twitter-bootstrap-v2/js/bootstrap-modal.js"></script>
</body>
</html>

在线查看 Bootstrap Modals(模态框)实例。

解释

下面的表格解释了上面的代码。它将帮助您理解如何使用 Bootstrap Modals(模态框)。

代码 解释
div id=”example” 分配给相关 div 的 id,id 的值指向后边要实现 modal(模态框)的 JavaScript。
class=”modal hide fade in” Bootstrap CSS 的四个 class – modal、hide、fade 和 in,用于设置 modal(模态框)的布局。
style=”display: none; 用于保持模态窗口可见,直到触发器触发(比如点击相关按钮)。
<div class=”modal-header”> modal-header 适用于定义模态窗口标题样式的 class。
a class=”close” CSS class close 用于设置模态窗口关闭按钮的样式。
data-dismiss=”modal” data-dismiss 是一个定制的 HTML5 data 属性。用于关闭模态窗口。
class=”modal-body” modal-body 是 Bootstrap 的一个 CSS class,用于设置模态窗口主体的样式。
class=”modal-footer” modal-footer 是 Bootstrap 的一个 CSS class,用于设置模态窗口尾部的样式。
class=”btn btn-success” CSS class btn 和 btn-success 用于在模态窗口的尾部创建一个大号的按钮。您可以使用任何其他 Bootstrap 按钮代替。
class=”btn” Bootstrap CSS 的 按钮 class btn,用于在模态窗口的尾部创建一个小号的按钮。
data-dismiss=”modal” HTML5 定制的 data 属性 data-dismiss,用于关闭模态窗口。
data-toggle=”modal” HTML5 定制的 data 属性 data-toggle,用于打开模态窗口。
class=”btn btn-primary btn-large” 设置按钮样式,点击该按钮则创建模态窗口。
<script src=”https://ajax.googleapis.com/ajax/libs
/jquery/1.7.1/jquery.min.js”></script>
引用 Jquery 文件。
<script src=”../bootstrap/twitter-bootstrap-v2>
/js/bootstrap-modal.js”></script>
引用 bootstrap modal(模态框)的 JS 文件。

 

使用 JavaScript

您可以使用 JavaScript 来实现 Bootstrap 模态窗口。只需要在您的 JavaScript 中调用 modal() 即可。您的代码如下所示,您可以在 body 结束标签(即 </body>)前引用它。

 $(function ()  
{ $("#identifier").modal();  
});

其中 identifier 是一个 Jquery 选择器,用于标识相关的容器元素。接下来,我们来看看 options 都有哪些。

选项

下面是一些通过 modal() 定制模态窗口外观和感观时可能使用到的选项。

backdrop

backdrop 选项用于包含一个 modal-backdrop 元素。

如果您把”使用 JavaScript”实例中行号 2 的代码替换为下面的代码,即给 backdrop 选项赋值为 false,此时就不存在任何的 modal-backdrop。

{ $("#example").modal({backdrop:false});

keyboard

如果使用 keyboard 选项,当点击 escape 时则关闭模态窗口。它的类型是 boolean,默认值是 true。如果把 keyboard 选项的值设置为 false,此时即使点击 escape 也不会关闭模态窗口。

如果您把”使用 JavaScript”实例中行号 2 的代码替换为下面的代码,即给 keyboard 选项赋值为 false,此时点击 escape 则不会关闭模态窗口。

{ $("#example").modal({keyboard:false});

show

如果使用 show 选项,当初始化的时候则会显示模态窗口。它的类型是 boolean,默认值是 true。如果把 show 选项的值设置为 false,在初始化时不会显示模态窗口。

如果您把”使用 JavaScript”实例中行号 2 的代码替换为下面的代码,即给 show 选项赋值为 false,在初始化时不会显示模态窗口。

{ $("#example").modal({show:false});

方法

下面是一些通过 modal() 使用到的方法。

.modal(options)

该方法把内容激活为一个 modal(模态框)。您可以引用一个可选的 object 类型的 options 参数。如果您在本教程的第一个实例中的 </body> 标签前添加下面的代码,此时就不存在任何的 modal(模态框) backdrop 元素。

$('#example').modal({
  backdrop: false
})

.modal(‘toggle’)

该方法手动切换一个 modal(模态框)。如果您在本教程的第一个实例中的 </body> 标签前添加下面的代码,即可手动切换 modal(模态框)。

$('#example').modal('toggle')

.modal(show)

该方法可用于手动打开一个 modal(模态框)。如果您在本教程的第一个实例中的 </body> 标签前添加下面的代码,即可手动打开 modal(模态框)。

$('#example').modal('show')

.modal(hide)

该方法可用于手动隐藏一个 modal(模态框)。如果您在本教程的第一个实例中的 </body> 标签前添加下面的代码,即可手动隐藏 modal(模态框)。

$('#example').modal('hide')

事件

下面是 Modals(模态框)相关的事件。这些事件用于截获并执行自己的代码。

show

当 show 实例方法被调用之后,此事件被立即触发。

shown

当模态框显示出来之后(同时 CSS 过渡效果也已执行完毕),此事件被触发。

hide

当 hide 实例方法被调用之后,此事件被立即触发。Immediately after the hide instance method has been called, this event is called.

hidden

当模态框向用户隐藏之后(同时 CSS 过渡效果也已执行完毕),此事件被触发。

点击这里,下载本教程中使用到的所有 HTML、CSS、JS 和图片文件。

AngularJS入门(用ng-repeat指令实现循环输出) - 而立技术宅男 - 开源中国社区

mikel阅读(883)

来源: AngularJS入门(用ng-repeat指令实现循环输出) – 而立技术宅男 – 开源中国社区

摘要

本文介绍使用AngularJS的ng-repeat指令从对象数组中循环输出行

循环输出列表很多项目在web服务端做,前端做好模版后后端写jsp代码,双方需要紧密合作,分清责任。有些项目由后端提供restful方法,前端用ajax调用自己循环,这种一般是大把的JQuery拼字符串,太不直观,有人搞出了js模板,也没好到哪里去。

用AngularJS就爽多了,语法和JSP类似:

<!doctype html>
<html ng-app>
<head>
    <meta charset="utf-8">
    <title>ng-repeat directive</title>
</head>
<body>
<table ng-controller="CartController">
    <caption>我的购物车</caption>
    <tr>
        <th>序号</th>
        <th>商品</th>
        <th>单价</th>
        <th>数量</th>
        <th>金额</th>
        <th>操作</th>
    </tr>
    <tr ng-repeat="item in items">
        <td>{{$index + 1}}</td>
        <td>{{item.name}}</td>
        <td>{{item.price | currency}}</td>
        <td><input ng-model="item.quantity"></td>
        <td>{{item.quantity * item.price | currency}}</td>
        <td>
            <button ng-click="remove($index)">Remove</button>
        </td>
    </tr>
</table>

<script src="../lib/angularjs/1.2.26/angular.min.js"></script>
<script>
    function CartController($scope) {
        $scope.items = [
            {name: "雷柏(Rapoo) V500 机械游戏键盘 机械黄轴", quantity: 1, price: 199.00},
            {name: "雷柏(Rapoo) V20 光学游戏鼠标 黑色烈焰版", quantity: 1, price: 139.00},
            {name: "AngularJS权威教程", quantity: 2, price: 84.20}
        ];

        $scope.remove = function (index) {
            $scope.items.splice(index, 1);
        }
    }
</script>
</body>
</html>

ng-repeat指令生命在需要循环内容的元素上,items和控制器上的变量名对应,item是为数组中单个对象起的别名。$index可以返回当前 引用对象的序号,从0开始,另外还有$first、$middle、$last可以返回布尔值,用于告诉你当前元素是否是集合中的第一个中间的最后一个元 素。

搭建可调试的微信公众平台本地测试环境 - 韩兆新 - 博客园

mikel阅读(1030)

来源: 搭建可调试的微信公众平台本地测试环境 – 韩兆新 – 博客园

背景:

最近在筹建一个协同开发的开源项目NWechat,项目开始前,有几样事情要准备。

image

1)项目管理系统的选定;

2)源码版本控制系统的选定;

3)开发环境的搭建。

4)团队的建设。

开发环境搭建便是项目启动前,要做的几件事情之一。

一、问题是这样的

在微信开发的时候,必须要输入URL,而该URL必须是外网域名。

image

这就造成了一个问题,我们在开发环境下不能测试代码,更谈不上调试代码了。

二、大家是这么做的

我问过一些开发者正在使用的方案:

1)搭建测试服务器。

在开发环境编码后,提交到测试服务器测试。

2)在开发环境模拟微信公众平台API。

使用模拟器或Fiddler等工具模拟微信公众平台API的请求或响应。

3)在开发环境的机器上搭建服务器,将发布的网站目录指向开发项目目录。

(其实是方案一的一个变种,减少了提交代码到测试服务器的一个步骤)。

三、NWechat Team是这样做的

1、从localhost到127.0.0.1

1)运行你的web项目,在右下角的任务托盘找到IIS Express,右键弹出菜单,点击“显示所有应用程序”。

image

2)在弹出了的界面中点击网站名称,然后再点击配置文件路径打开配置文件。

image

3)找到sites下对应项目所在的site节点,在bingdings子节点下找到对应的网站,把localhost改成127.0.0.1并保存退出。

image

4)关闭VS2013,然后以管理员身份启动。

image

5)修改项目属性

image

6)运行

image

2、从127.0.0.1到Internet

1)用文本编辑工具打开:ngrok.bat

image

2)修改ngrok.bat

image

3)双击ngrok.bat

image

4)使用外网链接访问

image

3、配置微信公众平台接口信息

image

至此,一个可调试的微信公众平台本地测试环境就搭建完成了。

相关工具下载

image

下载地址:https://github.com/hanzhaoxin/NWechat

mysql定时任务简单例子 - 浮云中的神马 - 博客频道 - CSDN.NET

mikel阅读(892)

来源: mysql定时任务简单例子 – 浮云中的神马 – 博客频道 – CSDN.NET

如果要每30秒执行以下语句:

  1. update userinfo set endtime = now() WHERE id = ‘110’;

可以给mySQL建个定时任务,具体方法如下:

  1. delimiter //   /* 设定语句终结符为 //,因存储过程语句用;结束 */

 

一、查看event是否开启

  1. show variables like ‘%sche%’;

开启event_scheduler

  1. set global event_scheduler =1;

二、创建存储过程test

  1. CREATE PROCEDURE test ()
  2. BEGIN
  3. update userinfo set endtime = now() where id = ‘110’;
  4. END;

三、创建event e_test

  1. create event if not exists e_test
  2. on schedule every 30 second
  3. on completion preserve
  4. do call test();

每隔30秒将执行存储过程test

关闭事件任务

  1. alter event e_test ON COMPLETION PRESERVE DISABLE;

开户事件任务

  1. alter event e_test ON COMPLETION PRESERVE ENABLE;

mysql创建定时任务 - mer1234567的专栏 - 博客频道 - CSDN.NET

mikel阅读(1070)

event_scheduler

来源: mysql创建定时任务 – mer1234567的专栏 – 博客频道 – CSDN.NET

一、前言
自 MySQL5.1.6起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务(例如:删除记录、对数据进行汇总等等),来取代原先只能由操作系统的计划任务来执行的工作。更值得 一提的是MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的CRON或Windows下的任务计划)只能精 确到每分钟执行一次。对于一些对数据实时性要求比较高的应用(例如:股票、赔率、比分等)就非常适合。
事件调度器有时也可称为临时触发器(temporal triggers),因为事件调度器是基于特定时间周期触发来执行某些任务,而触发器(Triggers)是基于某个表所产生的事件触发的,区别也就在这里。
在使用这个功能之前必须确保event_scheduler已开启,可执行

SET GLOBAL event_scheduler = 1;
—或我们可以在配置my.cnf文件 中加上 event_scheduler = 1

SET GLOBAL event_scheduler = ON;

来开启,也可以直接在启动命令加上“–event_scheduler=1”,例如:

mySQLd … –event_scheduler=1

要查看当前是否已开启事件调度器,可执行如下SQL

SHOW VARIABLES LIKE ‘event_scheduler’;

SELECT @@event_scheduler;

SHOW PROCESSLIST;

二、创建事件(CREATE EVENT)
先来看一下它的语法:

1 CREATE EVENT [IFNOT EXISTS] event_name
2    ONSCHEDULE schedule
3    [ONCOMPLETION [NOT] PRESERVE]
4    [ENABLE | DISABLE]
5    [COMMENT 'comment']
6    DO sql_statement;

schedule:
AT TIMESTAMP [+ INTERVAL INTERVAL]
| EVERY INTERVAL [STARTS TIMESTAMP] [ENDS TIMESTAMP]

INTERVAL:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

1) 首先来看一个简单的例子来演示每秒插入一条记录到数据表

1 USE test;
2   CREATETABLE aaa (timeline TIMESTAMP);
3   CREATEEVENT e_test_insert
4    ONSCHEDULE EVERY 1 SECOND
5    DO INSERTINTO test.aaa VALUES(CURRENT_TIMESTAMP);

等待3秒钟后,再执行查询看看:

mysql> SELECT * FROM aaa;
+———————+
| timeline |
+———————+
| 2007-07-18 20:44:26 |
| 2007-07-18 20:44:27 |
| 2007-07-18 20:44:28 |
+———————+

2) 5天后清空test表:

1 CREATE EVENT e_test
2    ONSCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 DAY
3    DO TRUNCATETABLE test.aaa;

3) 2007年7月20日12点整清空test表:

1 CREATE EVENT e_test
2    ONSCHEDULE AT TIMESTAMP '2007-07-20 12:00:00'
3    DO TRUNCATETABLE test.aaa;

4) 每天定时清空test表:

1 CREATE EVENT e_test
2    ONSCHEDULE EVERY 1 DAY
3    DO TRUNCATETABLE test.aaa;

5) 5天后开启每天定时清空test表:

1 CREATE EVENT e_test
2    ONSCHEDULE EVERY 1 DAY
3    STARTS CURRENT_TIMESTAMP+ INTERVAL 5 DAY
4    DO TRUNCATETABLE test.aaa;

6) 每天定时清空test表,5天后停止执行:

1 CREATE EVENT e_test
2    ONSCHEDULE EVERY 1 DAY
3    ENDS CURRENT_TIMESTAMP+ INTERVAL 5 DAY
4    DO TRUNCATETABLE test.aaa;

7) 5天后开启每天定时清空test表,一个月后停止执行:

1 CREATE EVENT e_test
2    ONSCHEDULE EVERY 1 DAY
3    STARTS CURRENT_TIMESTAMP+ INTERVAL 5 DAY
4    ENDS CURRENT_TIMESTAMP+ INTERVAL 1 MONTH
5    DO TRUNCATETABLE test.aaa;

[ON COMPLETION [NOT] PRESERVE]可以设置这个事件是执行一次还是持久执行,默认为NOT PRESERVE。
8) 每天定时清空test表(只执行一次,任务完成后就终止该事件):

1 CREATE EVENT e_test
2    ONSCHEDULE EVERY 1 DAY
3    ONCOMPLETION NOT PRESERVE
4    DO TRUNCATETABLE test.aaa;

[ENABLE | DISABLE]可是设置该事件创建后状态是否开启或关闭,默认为ENABLE。
[COMMENT ‘comment’]可以给该事件加上注释。
三、修改事件(ALTER EVENT)

1 ALTER EVENT event_name
2    [ONSCHEDULE schedule]
3    [RENAME TOnew_event_name]
4    [ONCOMPLETION [NOT] PRESERVE]
5    [COMMENT 'comment']
6    [ENABLE | DISABLE]
7    [DO sql_statement]

1) 临时关闭事件

ALTER EVENT e_test DISABLE;

2) 开启事件

ALTER EVENT e_test ENABLE;

3) 将每天清空test表改为5天清空一次:

ALTER EVENT e_test
ON SCHEDULE EVERY 5 DAY;

四、删除事件(DROP EVENT)
语法很简单,如下所示:

DROP EVENT [IF EXISTS] event_name

例如删除前面创建的e_test事件

DROP EVENT e_test;

当然前提是这个事件存在,否则会产生ERROR 1513 (HY000): Unknown event错误,因此最好加上IF EXISTS

DROP EVENT IF EXISTS e_test;
注意:如果你将event执行了Alter event event_name disable.那么当你重新启动mysql服务
器后,该event将被删除(测试版本:5.1.30)

应用案例
本案例是利用 event scheduler 的特性,每秒钟调用一次存储过程,用于判断 SLAVE 是否正常运行,如果发现 SLAVE 关闭了,忽略 0 次错误,然后重新启动 SLAVE。

* 首先创建存储过程

01 delimiter //
02    createprocedure `Slave_Monitor`()
03    begin
04    SELECTVARIABLE_VALUE INTO @SLAVE_STATUS
05    FROMinformation_schema.GLOBAL_STATUS
06    WHEREVARIABLE_NAME='SLAVE_RUNNING';
07    IF ('ON'!= @SLAVE_STATUS) THEN
08    SETGLOBAL SQL_SLAVE_SKIP_COUNTER=0;
09    SLAVE START;
10    ENDIF;
11    end; //
12    delimiter ;

由于存储过程中无法调用类似 SHOW SLAVE STATUS 这样的语句,因此无法得到确切的复制错误信息和错误代码,不能进一步的处理 SLAVE 停止的各种情况。
* 接着,创建任务

1 CREATE EVENT IFNOT EXISTS `Slave_Monitor`
2    ONSCHEDULE EVERY 5 SECOND
3    ONCOMPLETION PRESERVE
4    DO
5    CALL Slave_Monitor();

创建了一个任务,每 5秒钟执行一次,任务结束后依旧保留该任务,而不是删除。当然了,在本例中的任务不会结束,除非将它手动禁止了。
*
如果在运行中想要临时关闭一下某个任务,执行 ALTER EVENT 语句即可:

(root:localhost:)test> alter event `Slave_Monitor` ON
COMPLETION PRESERVE DISABLE;
(root:localhost:)test> alter event `Slave_Monitor` ON
COMPLETION PRESERVE ENABLE;

wdCP v3无法访问站点phpmyadmin解决办法

mikel阅读(2011)

v3版的phpmyadmin连接和访问,做了比较大的调整

不再使用直接在后台的访问方式,而是要使用前端WEB地址来访问

默认的访问地址如 http://ip/pma_xxx基于安全考虑,xxx为随机生成的字串,在安装时自动生成文件存放在默认目录/www/web/default下如/www/web/default/pma_d51f5b16

要确保默认首页能访问并且是指向到/www/web/default目录

Not FoundThe requested URL / was not found on this server.Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.

创建default站点后用IP地址无法访问phpmyadmin解决办法:

这是因为创建整站时候在/www/web/default/下没有生成public_html文件夹,需要手动新建public_html文件夹,然后将站点放进去,就能通过IP地址访问phpmyadmin了。

MySQL:日期函数、时间函数总结 - ggjucheng - 博客园

mikel阅读(1241)

来源: MySQL:日期函数、时间函数总结 – ggjucheng – 博客园

获得当前日期+时间(date + time)函数:now()

复制代码
mysql> select now();

+---------------------+
| now() |
+---------------------+
| 2008-08-08 22:20:46 |
+---------------------+
复制代码

获得当前日期+时间(date + time)函数:sysdate()
sysdate() 日期时间函数跟 now() 类似,不同之处在于:now() 在执行开始时值就得到了, sysdate() 在函数执行时动态得到值。看下面的例子就明白了:

复制代码
mysql> select now(), sleep(3), now();

+---------------------+----------+---------------------+
| now() | sleep(3) | now() |
+---------------------+----------+---------------------+
| 2008-08-08 22:28:21 | 0 | 2008-08-08 22:28:21 |
+---------------------+----------+---------------------+
复制代码

sysdate() 日期时间函数,一般情况下很少用到。

 

MySQL 获得当前时间戳函数:current_timestamp, current_timestamp()

复制代码
mysql> select current_timestamp, current_timestamp();

+---------------------+---------------------+
| current_timestamp | current_timestamp() |
+---------------------+---------------------+
| 2008-08-09 23:22:24 | 2008-08-09 23:22:24 |
+---------------------+---------------------+
复制代码

MySQL 日期转换函数、时间转换函数

MySQL Date/Time to Str(日期/时间转换为字符串)函数:date_format(date,format), time_format(time,format)

复制代码
mysql> select date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s');

+----------------------------------------------------+
| date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s') |
+----------------------------------------------------+
| 20080808222301 |
+----------------------------------------------------+
复制代码

MySQL 日期、时间转换函数:date_format(date,format), time_format(time,format) 能够把一个日期/时间转换成各种各样的字符串格式。它是 str_to_date(str,format) 函数的 一个逆转换。

 

MySQL Str to Date (字符串转换为日期)函数:str_to_date(str, format)

select str_to_date('08/09/2008', '%m/%d/%Y'); -- 2008-08-09
select str_to_date('08/09/08' , '%m/%d/%y'); -- 2008-08-09
select str_to_date('08.09.2008', '%m.%d.%Y'); -- 2008-08-09
select str_to_date('08:09:30', '%h:%i:%s'); -- 08:09:30
select str_to_date('08.09.2008 08:09:30', '%m.%d.%Y %h:%i:%s'); -- 2008-08-09 08:09:30

可以看到,str_to_date(str,format) 转换函数,可以把一些杂乱无章的字符串转换为日期格式。另外,它也可以转换为时间。“format” 可以参看 MySQL 手册。

 

MySQL (日期、天数)转换函数:to_days(date), from_days(days)

select to_days('0000-00-00'); -- 0
select to_days('2008-08-08'); -- 733627

 

MySQL (时间、秒)转换函数:time_to_sec(time), sec_to_time(seconds)

select time_to_sec('01:00:05'); -- 3605
select sec_to_time(3605); -- '01:00:05'

 

MySQL 拼凑日期、时间函数:makdedate(year,dayofyear), maketime(hour,minute,second)

select makedate(2001,31); -- '2001-01-31'
select makedate(2001,32); -- '2001-02-01'
select maketime(12,15,30); -- '12:15:30'

 

MySQL (Unix 时间戳、日期)转换函数

unix_timestamp(),
unix_timestamp(date),
from_unixtime(unix_timestamp),
from_unixtime(unix_timestamp,format)

下面是示例:

复制代码
select unix_timestamp(); -- 1218290027
select unix_timestamp('2008-08-08'); -- 1218124800
select unix_timestamp('2008-08-08 12:30:00'); -- 1218169800

select from_unixtime(1218290027); -- '2008-08-09 21:53:47'
select from_unixtime(1218124800); -- '2008-08-08 00:00:00'
select from_unixtime(1218169800); -- '2008-08-08 12:30:00'

select from_unixtime(1218169800, '%Y %D %M %h:%i:%s %x'); -- '2008 8th August 12:30:00 2008'
复制代码

 

 

MySQL 日期时间计算函数

 

MySQL 为日期增加一个时间间隔:date_add()

复制代码
set @dt = now();

select date_add(@dt, interval 1 day); -- add 1 day
select date_add(@dt, interval 1 hour); -- add 1 hour
select date_add(@dt, interval 1 minute); -- ...
select date_add(@dt, interval 1 second);
select date_add(@dt, interval 1 microsecond);
select date_add(@dt, interval 1 week);
select date_add(@dt, interval 1 month);
select date_add(@dt, interval 1 quarter);
select date_add(@dt, interval 1 year);

select date_add(@dt, interval -1 day); -- sub 1 day
复制代码

 

MySQL adddate(), addtime()函数,可以用 date_add() 来替代。下面是 date_add() 实现 addtime() 功能示例:

复制代码
mysql> set @dt = '2008-08-09 12:12:33';

mysql>
mysql> select date_add(@dt, interval '01:15:30' hour_second);

+------------------------------------------------+
| date_add(@dt, interval '01:15:30' hour_second) |
+------------------------------------------------+
| 2008-08-09 13:28:03 |
+------------------------------------------------+

mysql> select date_add(@dt, interval '1 01:15:30' day_second);

+-------------------------------------------------+
| date_add(@dt, interval '1 01:15:30' day_second) |
+-------------------------------------------------+
| 2008-08-10 13:28:03 |
+-------------------------------------------------+
复制代码

 

MySQL 为日期减去一个时间间隔:date_sub()

复制代码
mysql> select date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second);

+----------------------------------------------------------------+
| date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second) |
+----------------------------------------------------------------+
| 1997-12-30 22:58:59 |
+----------------------------------------------------------------+
复制代码

MySQL date_sub() 日期时间函数 和 date_add() 用法一致,不再赘述。

 

MySQL 日期、时间相减函数:datediff(date1,date2), timediff(time1,time2)

MySQL datediff(date1,date2):两个日期相减 date1 - date2,返回天数。
select datediff('2008-08-08', '2008-08-01'); -- 7
select datediff('2008-08-01', '2008-08-08'); -- -7

MySQL timediff(time1,time2):两个日期相减 time1 – time2,返回 time 差值。

select timediff('2008-08-08 08:08:08', '2008-08-08 00:00:00'); -- 08:08:08
select timediff('08:08:08', '00:00:00'); -- 08:08:08

注意:timediff(time1,time2) 函数的两个参数类型必须相同。

 

MySQL 时间戳(timestamp)转换、增、减函数:

timestamp(date) -- date to timestamp
timestamp(dt,time) -- dt + time
timestampadd(unit,interval,datetime_expr) --
timestampdiff(unit,datetime_expr1,datetime_expr2) --

请看示例部分:

复制代码
select timestamp('2008-08-08'); -- 2008-08-08 00:00:00
select timestamp('2008-08-08 08:00:00', '01:01:01'); -- 2008-08-08 09:01:01
select timestamp('2008-08-08 08:00:00', '10 01:01:01'); -- 2008-08-18 09:01:01

select timestampadd(day, 1, '2008-08-08 08:00:00'); -- 2008-08-09 08:00:00
select date_add('2008-08-08 08:00:00', interval 1 day); -- 2008-08-09 08:00:00

MySQL timestampadd() 函数类似于 date_add()。
select timestampdiff(year,'2002-05-01','2001-01-01'); -- -1
select timestampdiff(day ,'2002-05-01','2001-01-01'); -- -485
select timestampdiff(hour,'2008-08-08 12:00:00','2008-08-08 00:00:00'); -- -12

select datediff('2008-08-08 12:00:00', '2008-08-01 00:00:00'); -- 7
复制代码

MySQL timestampdiff() 函数就比 datediff() 功能强多了,datediff() 只能计算两个日期(date)之间相差的天数。

 

MySQL 时区(timezone)转换函数

convert_tz(dt,from_tz,to_tz)

select convert_tz('2008-08-08 12:00:00', '+08:00', '+00:00'); -- 2008-08-08 04:00:00

时区转换也可以通过 date_add, date_sub, timestampadd 来实现。

select date_add('2008-08-08 12:00:00', interval -8 hour); -- 2008-08-08 04:00:00
select date_sub('2008-08-08 12:00:00', interval 8 hour); -- 2008-08-08 04:00:00
select timestampadd(hour, -8, '2008-08-08 12:00:00'); -- 2008-08-08 04:00:00

 

更多参考 http://www.cnblogs.com/she27/archive/2009/01/16/1377089.html

通过几个Hello World感受.NET Core全新的开发体验 - Artech - 博客园

mikel阅读(1816)

来源: 通过几个Hello World感受.NET Core全新的开发体验 – Artech – 博客园

2016年6月27日,这是一个特殊的日子,微软全新的.NET开发平台.NET Core的RTM版本正式发布。我个人将.NET Core的核心特性归结为三点,它们的首字母组成一个非常好记的简称——COM,分别代表的含义Cross-Platform、Open-Source和 Modularization。开发.NET Core应用的方式与之前具有非常大的变化,对于那些尚未体验过.NET Core的朋友,我希望通过本篇文章创建的这一个Hello World应用可以很容易地带你们入门。

首先我们会介绍如何构建.NET Core应用的开发环境。在这之后,我们会利用dotnet new命令行创建一个控制台类型的Hello World应用,这个简单的应用时后续几个Hello World应用的雏形,后者都是通过它改变而成。我们做的第一个改变是将它变成一个ASP.NET Core应用,并采用Self-Host的方式将它寄宿于这个控制台应用中。这个ASP.NET Core应用被进一步改造成一个ASP.NET Core MVC应用,我们会自行定义Controller和View已经路由。

目录
一、构建开发环境
二、执行dotnet new命令创建一个控制台应用
三、将应用修改成一个ASP.NET Core应用
四、自行指定监听地址
五、将应用修改成一个ASP.NET Core MVC应用
六、添加View

一、构建开发环境

根据自身的操作系统类型安装和运行环境.NET Core SDK、IDE和相关的工具

二、执行dotnet new命令创建一个控制台应用

我们直接启动命令行工具,为创建的Hello World应用创建一个根目录(%USERPROFILE% projects/helloworld)。在将该目录设置为当前目录后,我们按照如下的方式执行“dotnet new”命令。源代码下载:netcore.helloworld1

image

dotnet new命令会为我们创建一个由如下两个文件组成的控制台应用。

image

作为程序入口的Main方法定义在Program.cs文件中,如下所示的代码片段体现了该文件的整体定义,我们可以看到Main方法仅仅是在控制台上打印出“Hello World”字样而已。

   1: using System;
   2: namespace ConsoleApplication
   3: {
   4:     public class Program
   5:     {
   6:         public static void Main(string[] args)
   7:         {
   8:             Console.WriteLine("Hello World!");
   9:         }
  10:     }
  11: }

我们创建的控制台项目直接映射为一个目录,项目自身的设置定义在project.json这个文件中,该文件的整体定义反应在如下所示的代码片段 中。整个文件由四个节点组成,其中version和buildOptions用来定义目标项目的版本和编译选项。dependencies在用来存放针对 NuGet包的以来。我们创建的项目可以针对一个或者多个Framework(比如我们希望创建的可以同时在.NET Framework和.NET Core上运行),支持的Framework定义在frameworks节点下。如果添加了多个Framework,并不是说最终生成的应用可以同时在这 些Framework中运行,而是说源文件在编译的时候会针对这些Framework生成对应的程序集。

   1: {
   2:   "version": "1.0.0-*",
   3:   "buildOptions": {
   4:     "debugType": "portable",
   5:     "emitEntryPoint": true
   6:   },
   7:   "dependencies": {},
   8:   "frameworks": {
   9:     "netcoreapp1.0": {
  10:       "dependencies": {
  11:         "Microsoft.NETCore.App": {
  12:           "type": "platform",
  13:           "version": "1.0.0"
  14:         }
  15:       },
  16:       "imports": "dnxcore50"
  17:     }
  18:   }
  19: }

对于传统的.NET项目来说,如果我们需要调用某个API,需要添加所在程序集的引用。对于.NET Core来说,所有使用到的程序集都被打包成一个NuGet包,所以针对程序集的直接依赖转变成针对某个NuGet包的依赖。针对NuGet的依赖主要有 两种类型,一种是针对所有Framework的,它们会直接定义在dependencies节点下,另一种则是针对某个具体Framework的,定义的 定义为当前Framework节点下的dependencies子节点。我们定义在Project.json中的设定的NuGet包可能尚未在本地安装, 我们可以执行dotnet restore命令获取并在本地安装所有需要的NuGet包。一旦完成了针对NuGet包的回复操作,我们就可以直接执行dotnet run命令来启动应用。在这期间,我们的应用实际上会经历一个编译的过程,我们也可以执行dotnet build命令对其实施编译。如下面的代码片段所示,我们分别先后执行restore、build和run三个命令,目标程序最终得以执行。

image

三、将应用修改成一个ASP.NET Core应用

接下来我们将这个控制台应用改造成一个最简单的ASP.NET Core应用。IDE的选择,我们可以使用VS 2015,也可以使用VS Code,假设我们选择前者。我们以开启项目(File->Open->Project/Solution)的方式打开 project.json后,相当于开启了整个控制台项目。ASP.NET Core的核心管道定义在NuGet包“Microsoft.AspNetCore.Hosting”中,以Self-Host的方式寄宿ASP.NET Core应用还需要一个Server,我们选择的是定义在“Microsoft.AspNetCore.Server.Kestrel”这个NuGet包 中的KestrelServer,所以我们第一步需要做的就是在project.json中添加针对这两个NuGet包的依赖。源代码下载:netcore.helloworld2

   1: {
   2:   "version": "1.0.0-*",
   3:   "buildOptions": {
   4:     "debugType": "portable",
   5:     "emitEntryPoint": true
   6:   },
   7:   "dependencies": {
   8:      "Microsoft.AspNetCore.Hosting":"1.0.0",
   9:      "Microsoft.AspNetCore.Server.Kestrel":"1.0.0"
  10:   },
  11:   "frameworks": {
  12:     "netcoreapp1.0": {
  13:       "dependencies": {
  14:         "Microsoft.NETCore.App": {
  15:           "type": "platform",
  16:           "version": "1.0.0"
  17:         }
  18:       },
  19:       "imports": "dnxcore50"
  20:     }
  21:   }
  22: }

ASP.NET Core应用的寄宿依赖于一个WebHost对象,后者则通过对应的工厂WebHostBuilder创建,为此我们将针对WebHost的创建定义在作 为入口点的Main方法中。如下面的代码片段所示,我们创建了一个WebHostBuilder对象,在调用其Build方法创建WebHost对象之 前,我们先后调用了前者的UseKestrel和UseStartup方法。前者的目的在于注册上面提及的这个叫做KestrelServer的 Server,后者则注册一个启动类型Startup。WeHost的Run方法一旦调用,意味着ASP.NET Core应用被启动。

   1: using System;
   2: using Microsoft.AspNetCore.Hosting;
   3: using Microsoft.AspNetCore.Builder;
   4: using Microsoft.AspNetCore.Http;
   5:
   6: namespace ConsoleApplication
   7: {
   8:     public class Program
   9:     {
  10:         public static void Main(string[] args)
  11:         {
  12:             new WebHostBuilder()
  13:             .UseKestrel()
  14:             .UseStartup<Startup>()
  15:             .Build()
  16:             .Run();
  17:         }
  18:     }
  19: }

ASP.NET Core应用的背后是一个由Server和Middleware工程的管道,Server实现针对请求的监听、接收和响应,而注册的Middleware 则负责对请求进行处理。WebHostBuilder的UseKestrel方法为管道注册了必不可少Server,Middleware的注册在实现在 由UseStartup方法注册的启动类型中。如下所示的是我们注册的Startup类型的定义,我们在Configure方法中调用 ApplicationBuilder的扩展方法Run注册了唯一的Middleware,它对请求的处理逻辑简单而直接——直接响应一个“Hello World”字符串。

   1: using System;
   2: using Microsoft.AspNetCore.Hosting;
   3: using Microsoft.AspNetCore.Builder;
   4: using Microsoft.AspNetCore.Http;
   5:
   6: namespace ConsoleApplication
   7: {
   8:     public class Startup
   9:     {
  10:         public void Configure(IApplicationBuilder app)
  11:         {
  12:             app.Run(context=>context.Response.WriteAsync("Hello World"));
  13:
  14:         }
  15:
  16:     }
  17: }

我们同样按照上面的方式执行dotnet restore和dotnet run命令,ASP.NET Core应用将被启动。

image

上控制台上的输出我们可以看出,ASP.NET Core启动后会绑定到默认的地址“http://localhost:5000/”来监听请求,所以我们可以利用浏览器向这个地址发送请求,应用处理请 求后会按照如下的形式响应由注册的Middleware写入的“Hello World”。

image

四、自行指定监听地址

我们在利用WebHostBuilder创建WebHost,以及利用后者启动ASP.NET Core应用的整个过程中并没有显式指定Server监听的地址,在此情况下默认的监听地址“http://localhost:5000/”会被使用。 我们也可以自行指定这个监听地址,该地址可以通过调用WebHostBuilder的扩展方法UseUrls来指定。如下面的代码片段所示,我们在利用 WebHostBuilder创建WebHost之前调用UseUrls方法注册了两个监听地址“http://localhost:8888/“和 “http://localhost:9999/”。源代码下载:netcore.helloworld3

   1: using System;
   2: using Microsoft.AspNetCore.Hosting;
   3: using Microsoft.AspNetCore.Builder;
   4: using Microsoft.AspNetCore.Http;
   5:
   6: namespace ConsoleApplication
   7: {
   8:     public class Program
   9:     {
  10:         public static void Main(string[] args)
  11:         {
  12:             new WebHostBuilder()
  13:             .UseKestrel()
  14:             .UseStartup<Startup>()
  15:             .UseUrls("http://localhost:8888/", "http://localhost:9999/")
  16:             .Build()
  17:             .Run();
  18:         }
  19:     }
  20: }

当应用再次被启动后,监听地址将发生改变,我们可以改变浏览器的目标地址来对此做验证。

image

五、将应用修改成一个ASP.NET Core MVC应用

我们继续对上面这个ASP.NET Core应用进行改造,并将其构建成一个MVC应用。建立在ASP.NET Core的所有的开发框架都是通过注册到管道中的某一个或者多个Middleware实现的。针对MVC的Middleware实现了路由、 Controller的激活、Action方法的执行以及View的呈现。相关的类型通过“Microsoft.AspNetCore.Mvc”这个 NuGet包承载,所以我们需要添加这个NuGet包的依赖。简单起见,我们只需要直接将project.json中添加的 “Microsoft.AspNetCore.Hosting”替换成“Microsoft.AspNetCore.Mvc”即可。

   1: {
   2:   "version": "1.0.0-*",
   3:   "buildOptions": {
   4:     "debugType": "portable",
   5:     "emitEntryPoint": true
   6:   },
   7:   "dependencies": {
   8:      "Microsoft.AspNetCore.Mvc":"1.0.0",
   9:      "Microsoft.AspNetCore.Server.Kestrel":"1.0.0"
  10:   },
  11:   "frameworks": {
  12:     "netcoreapp1.0": {
  13:       "dependencies": {
  14:         "Microsoft.NETCore.App": {
  15:           "type": "platform",
  16:           "version": "1.0.0"
  17:         }
  18:       },
  19:       "imports": "dnxcore50"
  20:     }
  21:   }
  22: }

ASP.NET Core MVC相关Middleware的注册同样实现在Startup类型的Configure方法中。如下面的代码片段所示,我们直接调用 ApplicationBuilder的扩展方法UseMvc注册了这个Middleware。由于这个Middleware需要使用到相关的服务,所以 我们在另一个名为ConfigureServices的方法中通过调用ServiceCollection的扩展方法AddMvc注册了这些服务。

   1: using Microsoft.AspNetCore.Hosting;
   2: using Microsoft.AspNetCore.Builder;
   3: using Microsoft.AspNetCore.Http;
   4: using Microsoft.Extensions.DependencyInjection;
   5:
   6: namespace ConsoleApplication
   7: {
   8:     public class Startup
   9:     {
  10:         public void ConfigureServices(IServiceCollection services)
  11:         {
  12:             services.AddMvc();
  13:         }
  14:
  15:         public void Configure(IApplicationBuilder app)
  16:         {
  17:             app.UseMvc();
  18:         }
  19:     }
  20: }

对于一个MVC应用来说,任意一个请求都是指向定义在目标Controller的某个Action方法中,接下来我们就来定义如下一个 HomeController。ASP.NET Core MVC不像之前的MVC版本要求Controller实现IController接口,它可以是一个普通一个以Controller为后缀命名的公共类 型。我们在HomeController中定义的Action方法Index,该方法上应用HttpGetAttribute以特性注入的形式注册了模板 为“/{name}”的路由。

   1: using System;
   2: using Microsoft.AspNetCore.Mvc;
   3:
   4: namespace ConsoleApplication
   5: {
   6:     public class HomeController
   7:     {
   8:         [HttpGet("/{name}")]
   9:         public string Index(string name)
  10:         {
  11:             return $"Hello {name}";
  12:         }
  13:     }
  14: }

当我们按照上面的方式启动这个ASP.NET Core MVC应用后,如果我们利用浏览器访问与注册路由相匹配的目标地址(“http://localhost:9999/foobar”),可以得到如下所示的相应结果。源代码下载:netcore.helloworld4

image

六、添加View

接下来我们为上面这个MVC应用添加View。为此我们需要按照如下的方式改写HomeController。我们让它继承基类 Controller,并改变Action方法Index的返回类型(IActionResult),该方法直接调用View方法返回只想默认View的 ViewResult对象。再次之前,我们将传入的参数name保存在ViewBag中。

   1: using Microsoft.AspNetCore.Mvc;
   2:
   3: namespace ConsoleApplication
   4: {
   5:     public class HomeController: Controller
   6:     {
   7:         [HttpGet("/{name}")]
   8:         public IActionResult Index(string name)
   9:         {
  10:             ViewBag.Name = name;
  11:             return View();
  12:         }
  13:     }
  14: }

接下来我们来定义Action方法Index指向的这个View,按照约定我们应该将对应的Index.cshtml文件存放在/Views/Home目录下。该View定义如下。

   1: <html>
   2:     <head>
   3:         <title>Hello</title>
   4:     <head>
   5:         <body>Hello, @ViewBag.Name</body>
   6: </html>

由于我们使用到了Razor引擎,我们同样需要将相关的NuGet包“Microsoft.AspNetCore.Razor.Tools”按照如 下的方式添加到project.json文件中。除此之外,基于View动态编译的需要,我们需要添加一个名为 “preserveCompilationContext”的编译选项,并将其值设置为true。

   1: {
   2:   "version": "1.0.0-*",
   3:   "buildOptions": {
   4:     "debugType": "portable",
   5:     "emitEntryPoint": true,
   6:     "preserveCompilationContext": true
   7:   },
   8:   "dependencies": {
   9:      "Microsoft.AspNetCore.Mvc":"1.0.0",
  10:      "Microsoft.AspNetCore.Razor.Tools": {
  11:       "version": "1.0.0-preview2-final",
  12:       "type": "build"
  13:     },
  14:      "Microsoft.AspNetCore.Server.Kestrel":"1.0.0"
  15:
  16:   },
  17:   "frameworks": {
  18:     "netcoreapp1.0": {
  19:       "dependencies": {
  20:         "Microsoft.NETCore.App": {
  21:           "type": "platform",
  22:           "version": "1.0.0"
  23:         }
  24:       },
  25:       "imports": "dnxcore50"
  26:     }
  27:   }
  28: }

除此之外,View的定位依赖于一个根路径,所以我们需要按照如下的方式调用WebHostBuilder的UseContentRoot方法将当前目录设置为此根目录。

   1: using Microsoft.AspNetCore.Hosting;
   2: using Microsoft.AspNetCore.Builder;
   3: using System.IO;
   4:
   5: namespace ConsoleApplication
   6: {
   7:     public class Program
   8:     {
   9:         public static void Main(string[] args)
  10:         {
  11:             new WebHostBuilder()
  12:             .UseKestrel()
  13:             .UseStartup<Startup>()
  14:             .UseContentRoot(Directory.GetCurrentDirectory())
  15:             .UseUrls("http://localhost:8888/", "http://localhost:9999/")
  16:             .Build()
  17:             .Run();
  18:         }
  19:     }
  20: }

当我们按照上面的方式启动这个ASP.NET Core MVC应用后,如果我们利用浏览器访问与注册路由相匹配的目标地址(“http://localhost:9999/foobar”),可以得到如下所示的相应结果。源代码下载:netcore.helloworld5

image