[转载]ASP.NET MVC使用Bootstrap系列(5)——创建ASP.NET MVC Bootstrap Helpers - 木宛城主 - 博客园

mikel阅读(1111)

[转载]ASP.NET MVC使用Bootstrap系列(5)——创建ASP.NET MVC Bootstrap Helpers – 木宛城主 – 博客园.

序言

ASP.NET MVC允许开发者创建自定义的HTML Helpers,不管是使用静态方法还是扩展方法。一个HTML Helper本质上其实是输出一段HTML字符串。

HTML Helpers能让我们在多个页面上公用同一段HTML标记,这样不仅提高了稳定性也便于开发者去维护。当然对于这些可重用的代码,开发者也方便对他们进行单元测试。所以,创建ASP.NET MVC Bootstrap Helpers是及其有必要的。

内置的HTML Helpers

ASP.NET MVC内置了若干标准HTML Helpers,通过@HTML来调用这些方法在视图引擎中解析、渲染输出HTML内容,这允许开发者在多个视图中重用公共的方法。

举个栗子,以下代码产生一个type等于text的Input ,并且其id和name都等于CustomerName,其Value等于Northwind Traders:

  1. @Html.TextBox(“CustomerName”,”Northwind Traders”);

大多数内置的HTML helpers提供传入匿名类型为元素产生指定HTML属性的选项,对上述的@HTML.TextBox方法稍作修改,通过传入匿名类型设置输出元素的style属性:

  1. @Html.TextBox(“CustomerName”,”Northwind Traders”, new { style=”background-color:Blue;” })

创建自定义的Helpers

因为Bootstrap提供了大量不同的组件,所以创建Bootstrap helpers可以在多个视图上快速使用这些组件。在ASP.NET MVC中最简单创建Bootstrap helpers是通过@helper语法来实现。一个自定义的helper可以包含任何HTML标记甚至Razor标记,你可以通过如下步骤来创建:

  • 在项目的根目录创建文件夹App_Code
  • 在App_Code文件夹中新建BootstrapHelpers.cshtml文件并加入如下代码
  1. @helper PrimaryButtonSmall(string id,string caption)
  2. {
  3.     <button id=”@id” type=”buttonclass=”btn btn-primary btn-sm“>@caption</button>
  4. }

上述代码使用@helper创建了一个新的名为PrimaryButtonSmall helper,它接受2个参数,分别是Id和caption。其中,它产生一个Button类型的HTML标记并设置了Bootstrap的样式。

注意:任何自定义的helpers必须存在App_Code文件夹中,这样才能被ASP.NET MVC视图识别。

  • 在视图中通过 @BootstrapHelpers.PrimaryButtonSmall(“btnSave”,“保存”)来使用新创建的helper。
  • 它将产生如下Bootstrap HTML元素:

当然,为了让我们的helper更加通用性,比如指定大小、样式等,对上述稍作如下修改,增加传入的参数:

  1. @helper Button(string style, string size, string caption, string id)
  2. {
  3.     <button id=”@id” type=“button” class=“btn btn-@style btn-@size”>@caption </button>
  4. }

现在我们可以这样去使用:

  1. @BootstrapHelpers.Button(“danger”,”lg”,”危险”,”btnDanger”)

它将产生如下样式的按钮:

不过,这种方式的helper唯一的不足是你需要”hard code”传入样式和尺寸,这可能需要你非常熟悉Bootstrap的样式。

使用静态方法创建Helpers

通过静态方法同样也能快速方便的创建自定义Bootstrap helpers,同样它也是返回了HTML标记,要创建静态方法,你可以按照如下步骤来实现:

  • 添加命了Helpers的文件夹
  • 创建如下枚举类
  1. public class ButtonHelper
  2.    {
  3.        public static MvcHtmlString Button(string caption, Enums.ButtonStyle style, Enums.ButtonSize size)
  4.        {
  5.            if (size != Enums.ButtonSize.Normal)
  6.            {
  7.                return new MvcHtmlString(string.Format(“<button type=\”button\” class=\”btn btn-{0} btn-{1}\”>{2}</button>“, style.ToString().ToLower(), ToBootstrapSize(size), caption));
  8.            }
  9.            return new MvcHtmlString(string.Format(“<button type=\”button\” class=\”btn btn-{0}\”>{1}</button>“, style.ToString().ToLower(), caption));
  10.        }
  11.        private static string ToBootstrapSize(Enums.ButtonSize size)
  12.        {
  13.            string bootstrapSize = string.Empty;
  14.            switch (size)
  15.            {
  16.                case Enums.ButtonSize.Large:
  17.                    bootstrapSize = “lg“;
  18.                    break;
  19.                case Enums.ButtonSize.Small:
  20.                    bootstrapSize = “sm“;
  21.                    break;
  22.                case Enums.ButtonSize.ExtraSmall:
  23.                    bootstrapSize = “xs“;
  24.                    break;
  25.            }
  26.            return bootstrapSize;
  27.        }
  28.    }

Button方法返回了一个MvcHtmlString对象,它代表了编码过后的HTML字符。

  • 通过使用静态方法来调用:
  1. @ButtonHelper.Button(“危险“, Enums.ButtonStyle.Danger, Enums.ButtonSize.Large)

你可以和之前的”hard code”写法进行比较,尽管他们产生相同的结果:

  1. @BootstrapHelpers.Button(“danger“,”lg“,”危险“,”btnDanger“)

使用扩展方法创建Helpers

内置的ASP.NET MVC helper(@HTML)是基于扩展方法的,我们可以再对上述的静态方法进行升级——使用扩展方法来创建Bootstrap helpers。

  • 在Helpers文件夹下创建ButtonExtensions类
  • 修改ButtonExtensions为Static类型
  • 修改Namespace为System.Web.Mvc.Html,这样方便@HTML调用扩展方法
  • 添加扩展方法,返回MvcHtmlString
  1. public static MvcHtmlString BootstrapButton(this HtmlHelper helper, string caption, Enums.ButtonStyle style, Enums.ButtonSize size)
  2.         {
  3.             if (size != Enums.ButtonSize.Normal)
  4.             {
  5.                 return new MvcHtmlString(string.Format(“<button type=\”button\” class=\”btn btn-{0} btn-{1}\”>{2}</button>“, style.ToString().ToLower(), ToBootstrapSize(size), caption));
  6.             }
  7.             return new MvcHtmlString(string.Format(“<button type=\”button\” class=\”btn btn-{0}\”>{1}</button>“, style.ToString().ToLower(), caption));
  8.         }

因为BootstrapButton方法是扩展方法,通过如下方式去调用:

  1. @Html.BootstrapButton(“很危险“,Enums.ButtonStyle.Danger,Enums.ButtonSize.Large)

写法虽不同,但返回的结果都是一致的。

创建Fluent Helpers

Fluent Interface(参考:http://martinfowler.com/bliki/FluentInterface.html)用于软件开发实现 了一种面向对象的API,以这种方式,它提供了更多的可读性代码,易于开发人员理解。通常通过链式编程来实现。

举个栗子,我们将创建一个HTML helper来产生一个可关闭的警告框,使用Fluent Interface可以这样来调用:

  1. @Html.Alert(“警告“).Warning().Dismissible()

所以要创建Fluent helpers,需要实现如下步骤:

  • 创建IFluentAlert实现IHtmlString接口,这是非常重要的一步,对于ASP.NET MVC Razor视图引擎,如果@之后返回的类型实现了IHtmlString接口,那么视图引擎会自动调用ToHtmlString()方法,返回实际的HTML标记。
  1. public interface IAlertFluent : IHtmlString
  2.     {
  3.         IAlertFluent Dismissible(bool canDismiss = true);
  4.     }
  • 创建IAlert实现IFluentAlert接口
  1. public interface IAlert : IAlertFluent
  2. {
  3.     IAlertFluent Danger();
  4.     IAlertFluent Info();
  5.     IAlertFluent Success();
  6.     IAlertFluent Warning();
  7. }
  • 创建Alert继承IAlert接口
  1. public class Alert : IAlert
  2.    {
  3.        private Enums.AlertStyle _style;
  4.        private bool _dismissible;
  5.        private string _message;
  6.        public Alert(string message)
  7.        {
  8.            _message = message;
  9.        }
  10.        public IAlertFluent Danger()
  11.        {
  12.            _style = Enums.AlertStyle.Danger;
  13.            return new AlertFluent(this);
  14.        }
  15.        public IAlertFluent Info()
  16.        {
  17.            _style = Enums.AlertStyle.Info;
  18.            return new AlertFluent(this);
  19.        }
  20.        public IAlertFluent Success()
  21.        {
  22.            _style = Enums.AlertStyle.Success;
  23.            return new AlertFluent(this);
  24.        }
  25.        public IAlertFluent Warning()
  26.        {
  27.            _style = Enums.AlertStyle.Warning;
  28.            return new AlertFluent(this);
  29.        }
  30.        public IAlertFluent Dismissible(bool canDismiss = true)
  31.        {
  32.            this._dismissible = canDismiss;
  33.            return new AlertFluent(this);
  34.        }
  35.        public string ToHtmlString()
  36.        {
  37.            var alertDiv = new TagBuilder(“div“);
  38.            alertDiv.AddCssClass(“alert“);
  39.            alertDiv.AddCssClass(“alert-” + _style.ToString().ToLower());
  40.            alertDiv.InnerHtml = _message;
  41.            if (_dismissible)
  42.            {
  43.                alertDiv.AddCssClass(“alert-dismissable“);
  44.                alertDiv.InnerHtml += AddCloseButton();
  45.            }
  46.            return alertDiv.ToString();
  47.        }
  48.        private static TagBuilder AddCloseButton()
  49.        {
  50.            var closeButton = new TagBuilder(“button“);
  51.            closeButton.AddCssClass(“close“);
  52.            closeButton.Attributes.Add(“data-dismiss“, “alert“);
  53.            closeButton.InnerHtml = “&times;“;
  54.            return closeButton;
  55.        }
  56.    }

上述代码中,通过TagBuilder可以快速的创建HTML元素。

  • 创建AlertFluent继承IAlertFluent
  1. public class AlertFluent : IAlertFluent
  2.     {
  3.         private readonly Alert _parent;
  4.         public AlertFluent(Alert parent)
  5.         {
  6.             _parent = parent;
  7.         }
  8.         public IAlertFluent Dismissible(bool canDismiss = true)
  9.         {
  10.             return _parent.Dismissible(canDismiss);
  11.         }
  12.         public string ToHtmlString()
  13.         {
  14.             return _parent.ToHtmlString();
  15.         }
  16.     }
  • 最后创建静态方法
  1. public static class AlertHelper
  2. {
  3.     public static Alert Alert(this HtmlHelper html,string message)
  4.     {
  5.         return new Alert(message);
  6.     }
  7. }

通过构建这种Fluent API,我们可以链式的去创建Bootstrap 组件,这对于不熟悉Bootstrap Framework的人来说是非常方便的,我们可以使用@HTML.Alert(“Title”).Danger().Dismissible()来创建如下风格的警告框:

创建自动闭合的Helpers

在ASP.NET MVC中,内置的@HTML.BeginForm() helper就是一个自动闭合的helper。当然我们也能自定义自动闭合的helpers,只要 实现IDisposable接口即可。使用IDisposable接口,当对象Dispose时我们输出元素的闭合标记,具体按照如下步骤:

  • 所以在Helpers文件夹下创建一个名为Panel的文件夹
  • 添加Panel,并实现IDisposable接口
  1. public class Panel : IDisposable
  2.     {
  3.         private readonly TextWriter _writer;
  4.         public Panel(HtmlHelper helper, string title, Enums.PanelStyle style = Enums.PanelStyle.Default)
  5.         {
  6.             _writer = helper.ViewContext.Writer;
  7.             var panelDiv = new TagBuilder(“div“);
  8.             panelDiv.AddCssClass(“panel-” + style.ToString().ToLower());
  9.             panelDiv.AddCssClass(“panel“);
  10.             var panelHeadingDiv = new TagBuilder(“div“);
  11.             panelHeadingDiv.AddCssClass(“panel-heading“);
  12.             var heading3Div = new TagBuilder(“h3“);
  13.             heading3Div.AddCssClass(“panel-title“);
  14.             heading3Div.SetInnerText(title);
  15.             var panelBodyDiv = new TagBuilder(“div“);
  16.             panelBodyDiv.AddCssClass(“panel-body“);
  17.             panelHeadingDiv.InnerHtml = heading3Div.ToString();
  18.             string html = string.Format(“{0}{1}{2}“, panelDiv.ToString(TagRenderMode.StartTag), panelHeadingDiv, panelBodyDiv.ToString(TagRenderMode.StartTag));
  19.             _writer.Write(html);
  20.         }
  21.         public void Dispose()
  22.         {
  23.             _writer.Write(“</div></div>“);
  24.         }
  25.     }

上述代码中利用Write属性可以在当前视图中输出HTML标记,并在Dispose方法里输出2个闭合的<div>标签。

注意,我们重写了TagBuilder的ToString()方法,只让它生成<div>元素的开始标签。

  • 在View中使用自动闭合的helpers
  1. @using (Html.Panel(“Title“, Enums.PanelStyle.Success))
  2. {
  3.     <p>这是自动闭合的Helpers</p>
  4.     <p>panel..</p>
  5. }

产生的结果如下:

小结

在这篇博客中,为了减少书写HTML标记,我们创建了若干Bootstrap helpers来实现。这些helpers的意义在于能让不了解Bootstrap Framework的人也能快速上手Bootstrap。

参考代码下载

本博客为木宛城主原创,基于Creative Commons Attribution 2.5 China Mainland License发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名木宛城主(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。

[转载]Android应用安全之数据传输安全 - bamb00 - 博客园

mikel阅读(1083)

[转载]Android应用安全之数据传输安全 – bamb00 – 博客园.

Android软件通常使用WIFI网络与服务器进行通信。WiFi并非总是可靠的,例如,开放式网络或弱加密网络中,接入者可以监听网络流量;攻击者可能 自己设置WIFI网络钓鱼。此外,在获得root权限后,还可以在Android系统中监听网络数据。

不加密地明文传输敏感数据

最危险的是直接使用HTTP协议登录账户或交换数据。例如,攻击者在自己设置的钓鱼网络中配置DNS服务器,将软件要连接的服务器域名解析至攻击者的另一台服务器在,这台服务器就可以获得用户登录信息,或者充当客户端与原服务器的中间人,转发双方数据。

早期,国外一些著名社交网站Android客户端的登录会话没有加密,后来出现了黑客工具FaceNiff,专门嗅探这些会话并进行劫持(它甚至支持在WEP、WPA、WPA2加密的WIFI网络上展开攻击),这是目前我所知的唯一一个公开攻击移动软件漏洞的案例。

这类问题的解决方法很显然—–对敏感数据采用基于SSL/TLS的HTTPS进行传输。

SSL通信不检查证书有效性

在SSL/TLS通信中,客户端通过数字证书判断服务器是否可信,并采用证书的公钥与服务器进行加密通信。

然而,开发人员在开发过程中为了解决ssl证书报错的问题(使用了自己生成了证书后,客户端发现证书无法与系统可信根CA形成信任链,出现了CertificateException等异常),会在客户端代码中采用信任客户端中所有证书的方式:

public static HttpClient getWapHttpClient() {

try {

KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());

trustStore.load(null, null);

SSLSocketFactory sf = new MySSLSocketFactory(trustStore);

sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

//此处信任手机中的所有证书,包括用户安装的第三方证书

HttpParams params = new BasicHttpParams();

HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);

HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

SchemeRegistry registry = new SchemeRegistry();

registry.register(new Scheme(“http”, PlainSocketFactory.getSocketFactory(), 80));

registry.register(new Scheme(“https”, sf, 443));

ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);

return new DefaultHttpClient(ccm, params);

} catch (Exception e) {

return new DefaultHttpClient();

}

}

而在客户端中覆盖google默认的证书检查机制(X509TrustManager),并且在代码中无任何校验SSL证书有效性相关代码:

public class MySSLSocketFactory extends SSLSocketFactory {

SSLContext sslContext = SSLContext.getInstance(“TLS”);

public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {

super(truststore);

TrustManager tm = new X509TrustManager() {

public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {

}

//客户端并未对SSL证书的有效性进行校验,并且使用了自定义方法的方式覆盖android自带的校验方法

public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {

}

public X509Certificate[] getAcceptedIssuers() {

return null;

}

};

sslContext.init(null, new TrustManager[] { tm }, null);

}
}

如果用户手机中安装了一个恶意证书,那么就可以通过中间人攻击的方式进行窃听用户通信以及修改request或者response中的数据。

在钓鱼Wifi网络中,同样地,攻击者可以通过设置DNS服务器使客户端与指定的服务器进行通信。攻击者在服务器上部署另一个证书,在会话建立 阶段,客户端会收到这张证书,如果客户端忽略这个证书上的异常,或者接受这个证书,就会成功建立会话、开始加密通信。但攻击者拥有私钥,因此可以解密得到 客户端发来数据的明文。攻击者还可以模拟客户端,与真正的服务器联系,充当中间人做监听。

手机应用中间人攻击过程:

1 客户端在启动时,传输数据之前需要客户端与服务端之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。

2 中间人在此过程中将客户端请求服务器的握手信息拦截后,模拟客户端请求给服务器(将自己支持的一套加密规则发送给服务器),服务器会从中选出一组加密算法 与HASH算法,并将自己的身份信息以证书的形式发回给客户端。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。

3 而此时中间人会拦截下服务端返回给客户端的证书信息,并替换成自己的证书信息。

4 客户端得到中间人的response后,会选择以中间人的证书进行加密数据传输。

5 中间人在得到客户端的请求数据后,以自己的证书进行解密。

6 在经过窃听或者是修改请求数据后,再模拟客户端加密请求数据传给服务端。就此完成整个中间人攻击的过程。

防护办法:

使用CA机构颁发证书的方式可行,但是如果与实际情况相结合来看的话,时间和成本太高,所以目前很少有用此办法来做。由于手机应用服务器其实是固定的,所以证书也是固定的,可以使用“证书或公钥锁定”的办法来防护证书有效性未作验证的问题。

具体实现:

1 公钥锁定

将证书公钥写入客户端apk中,https通信时检查服务端传输时证书公钥与apk中是否一致(实现X509TrustManager接口)

public final class PubKeyManager implements X509TrustManager{
private static String PUB_KEY = "30820122300d06092a864886f70d0101" + "0105000382010f003082010a0282010100b35ea8adaf4cb6db86068a836f3c85" +"5a545b1f0cc8afb19e38213bac4d55c3f2f19df6dee82ead67f70a990131b6bc" + "ac1a9116acc883862f00593199df19ce027c8eaaae8e3121f7f329219464e657" +"2cbf66e8e229eac2992dd795c4f23df0fe72b6ceef457eba0b9029619e0395b8" + "609851849dd6214589a2ceba4f7a7dcceb7ab2a6b60c27c69317bd7ab2135f50" +"c6317e5dbfb9d1e55936e4109b7b911450c746fe0d5d07165b6b23ada7700b00" + "33238c858ad179a82459c4718019c111b4ef7be53e5972e06ca68a112406da38" + "cf60d2f4fda4d1cd52f1da9fd6104d91a34455cd7b328b02525320a35253147b" + "e0b7a5bc860966dc84f10d723ce7eed5430203010001";

//锁定证书公钥在apk中

public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException

{

if (chain == null) {

throw new IllegalArgumentException("checkServerTrusted: X509Certificate array is null");

}

if (!(chain.length &gt; 0)) {

throw new IllegalArgumentException("checkServerTrusted: X509Certificate is empty");

}

if (!(null != authType &amp;&amp; authType.equalsIgnoreCase("RSA"))) {

throw new CertificateException("checkServerTrusted: AuthType is not RSA");

}

// Perform customary SSL/TLS checks

try {

TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");

tmf.init((KeyStore) null);

for (TrustManager trustManager : tmf.getTrustManagers()) {

((X509TrustManager) trustManager).checkServerTrusted(chain, authType);

}

} catch (Exception e) {

throw new CertificateException(e);

}

// Hack ahead: BigInteger and toString(). We know a DER encoded Public Key begins

// with 0×30 (ASN.1 SEQUENCE and CONSTRUCTED), so there is no leading 0×00 to drop.

RSAPublicKey pubkey = (RSAPublicKey) chain[0].getPublicKey();

String encoded = new BigInteger(1 /* positive */, pubkey.getEncoded()).toString(16);

// Pin it!

final boolean expected = PUB_KEY.equalsIgnoreCase(encoded);

if (!expected) {

throw new CertificateException("checkServerTrusted: Expected public key: " + PUB_KEY + ", got public key:" + encoded);

}

}

}

2 证书锁定:

为客户端颁发公钥证书存放在手机客户端中(使用keystore),在https通信时,在客户端代码中固定去取证书信息,不是从服务端中获取

关于证书或公钥锁定技术可参考下面链接:

https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning

靠文章堆起来的媒体,就是没有作品的媒体

mikel阅读(1150)

原文《自媒体人,也不过是网红》原文摘要:

“对于一个网红来说,最痛苦的事情就是:ta必须和前赴后继的网红争夺注意力。这是和一个兵员源源不断的军团作战,必败无疑。没有人可以一直撑下去。唯一的 方法是:有作品,厚重的作品。以文字内容纯媒体,要么你能拿出来足以颠覆一个领域的文章,要么,乖乖地承认,这玩意儿,不值钱。

 

正如我相当讨厌别人称我为“知名自媒体人”一样。

在我的语境里,知名博客都比知名自媒体人好。

由于要参加各种会议,需要写一个自我介绍,我从来不会写:魏武挥,知名自媒体人。

这六个字的真实意思就是:网红。

 

我混互联网十余年了,在我的视野里,网红红到发紫的,颇有一些。但红到发紫而后死的,同样不少。

网红是一个只有几年的职业——甚至几年都没有。

网红唯一不死的可能是:拿得出足够有分量的作品。

作品,这两个字很重要。对于网红来说,电影、电视剧,可以算。但得够分量。而出席什么商品发布会,唱首别人唱过的歌,跳一段自己创作的舞蹈,真心不算。

对于一个自媒体人来说,文章,算不算作品?

 

互联网的快速和即时,已经很难允许媒体做这样的文章。

还是当年那帮人,近年来,很少再能推出他们当年那种颠覆行业的文章了。

几乎可以这么说,靠文章堆起来的媒体,就是没有作品的媒体。

就是“机构化的网红”。

 

有两个蛮有名的所谓自媒体,一个我称之为W,一个我称之为L。

L最近经常有人控诉它盗版,在我的视野里,已经发生三起了。

控诉成立与否,不是我想讨论的。

我琢磨的事情是,为什么会发生这样的事呢?

是不是被掏干了以至于会用到别人的内容还有些吃相难看了?

 

芙蓉姐姐想成为…唔,姑且用个赵薇吧,难。

赵薇想做芙蓉姐姐,那是….高维打低维,简直手到擒来。

其实,赵薇就是有作品的红人。

单纯的网红,是没有积累的,没有沉淀的。

靠不长不短的文章,靠耸人听闻的标题,这样的纯内容媒体,和网红没啥差别。

能做到的,无非就是一时里朋友圈刷刷人屏。

然后,

然后,就没有了。

 

一篇文章?

呵呵,在互联网上的寿命,夸张点说,只有几分钟而已。

反正不会超过三天。

在这个市场上,有太多的机构媒体,已露“网红”之像。

自媒体,就越发了。

别人我不方便说,说自己总可以:比如我。

不要做网红。

在得意洋洋于十万加的时候,其实,网红的命运,是那么凄然。

无论是个人,还是机构。

观点:

作者讨厌网红,可又不得不迎合读者的口味,这就是互联网媒体的尴尬,一篇文章几分钟之内就过期了,可见又有多少做媒体的人的心酸在里面,的确没有自己鲜明内容和价值的自媒体只能沦为一时的眼球效应,过后就尘归尘土归土了,再也难以为继,其实就看每个人怎么看自媒体了,我觉得是不是自媒体都说不上就那么稀里糊涂随大流儿写起文章做上自媒体的大有人在,这不能说是赶潮流,应该说是人的本身需要,也就是找存在感而已,上升成自媒体的高度未免有点儿过了。

对于那些真正媒体圈的人来说,我这种根本就不能算,就是自己在那写日记而已,所以说别把写日记的上升到自媒体高度,那太抬举我们这种刷存在感的人了,什么网红不网红的跟我们这种没关系,就是写着玩儿图个乐呵,至于作者说的作品,那就更谈不上了,你做个网站也是作品,拍段视频也是作品,要是能称之为媒体作品的,还真不多,何必纠结这些,自己喜欢就写,不喜欢就干点儿别的,自媒体本来是自由的东西,非要给上纲上线,总觉得别扭。

[转载]SWFUpload插件+FTP文件上传,我这么玩 - Ar.Issac - 博客园

mikel阅读(985)

[转载]SWFUpload插件+FTP文件上传,我这么玩 – Ar.Issac – 博客园.

效果图:

虽然之前接触过swfupload这个上传插件,但是之前做的样子是这样的
实战项目做的这么丑爆了我估计老大的内心是会崩溃的,所以特地在网上找了美观一点的样式,原帖地址:http://www.xiariboke.com/article/200.html
原帖后台是基于php写的插件,虽然各位看官也许没学过php但是也应该见过php跑,后台改成C#代码就可以了。
前台页面是一样的,在引入一堆js文件之后,改动一下对js文件的引用路径即可,比如这样:
由于原版直接使用页面会有乱码
我也懒得测试是哪个js文件的编码不支持中文所以对js文件一律加上了 chartset=”gb2312″的属性,显示问题解决。
来看看js中的配置,改动如下:
upload_url:请求上传的地址。请求自己写的aspx或者ashx或者MVC的controller
file_size_limit:上传文件限制大小。当然这只是插件初步对文件大小的检测,为防止大请求报文攻击,iis已经默认对文件上传做了限制,具体的数据我忘记了,测试是在5M以内,因此并不是在这里写多少就能上传多少,具体实现修改文件上传大小见下文
file_types:上传文件类型的检查。
下面的file_upload_limit也可以自行配置,用于配置上传文件个数
private FtpStatusCode FtpUpload(string sFileDstPath, string FolderName, string ftpServerIP, string ftpUserName, string ftpPwd)
{
try
{
FileInfo fileInf = new FileInfo(sFileDstPath);
FtpWebRequest reqFTP;
FtpWebResponse uploadResponse = null;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpServerIP + "/" + FolderName + "/" + fileInf.Name));
reqFTP.Credentials = new NetworkCredential(ftpUserName, ftpPwd);
reqFTP.KeepAlive = false;
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
reqFTP.UseBinary = true;
reqFTP.ContentLength = fileInf.Length;
int buffLength = 2048;
byte[] buff = new byte[buffLength];
int contentLen;
using (FileStream fs = fileInf.OpenRead())
{
using (Stream strm = reqFTP.GetRequestStream())
{
contentLen = fs.Read(buff, 0, buffLength);
while (contentLen != 0)
{
strm.Write(buff, 0, contentLen);
contentLen = fs.Read(buff, 0, buffLength);
}
}
}
uploadResponse = (FtpWebResponse)reqFTP.GetResponse();
return uploadResponse.StatusCode;
}
catch (Exception e)
{
return FtpStatusCode.Undefined;
throw new Exception("Ftp错误", e);
}
}

后台代码,根据项目加入了上传FTP及插入数据库:

ok,基本的配置就已经完成,但是由于前文说的iis对上传做了限制,所以我们还需要对此进行解除操作。
1.在Web.config文件中添加httpRuntime节点
<httpRuntime targetFramework=”4.5″ maxRequestLength=”1073741824″ executionTimeout=”3600″ appRequestQueueLimit=”100″ />
maxRequestLength决定了你要上传文件的最大长度,单位是kb,我随便写了个很大的数。后面两个一个是超时时间和最大请求队列,根据情况自定义设置。
2.部署项目后,在iis管理器里
请求筛选-编辑功能设置
最大内容长度里面填写在Web.config里面设置的最大长度
以上,所谓的大文件上传功能就基本实现了,你以为完事了?最好玩的才开始。
举个例子,实际项目在上传我们可能要显示上传失败的原因,比如上面的数据库错误,FTP错误等其它问题,因此要修改SWFupload的handler中的js事件,js配置部分:
我修改了file_dialog_complete_handler事件,改成了自己写的fileDialogComplete1,比如要在上传前添加些必填信息才可以执行上传,在【选择上传文件弹窗关闭事件】之后确定验证信息是否填写完毕再执行上传。
function fileDialogComplete1(numFilesSelected, numFilesQueued) {
try {
var info = $('#info').val();
if (numFilesQueued &gt; 0) {
if (info == "") {
alert("信息不能为空");
swfu.cancelUpload();
return;
}
//在上传文件中加入自定义参数,用于后台接收处理
var postParams = {
'info': info
};
swfu.setPostParams(postParams);
if (numFilesSelected &gt; 0) {
document.getElementById(this.customSettings.cancelButtonId).disabled = false;
}
swfu.startUpload();
}
} catch (ex) {
this.debug(ex);
}
}

实际上SWFupload可以玩的事件有很多,在handler.js文件中可以看到,如果需要控制某个事件可以直接修改,具体可见这篇文章:

SWFUpload 2.5.0版 官方说明文档 http://www.cnblogs.com/youring2/archive/2012/07/13/2590010.html

[转载]百度分享如何自定义分享url和内容? - kwishly - 博客园

mikel阅读(819)

[转载]百度分享如何自定义分享url和内容? – kwishly – 博客园.

百度分享默认分享的是当前页的url,但也可以在同一个页面中分享多个不同的url,仅需进行如下简单的配置。

默认的代码如下:

<div id=”bdshare” class=”bdshare_t bds_tools get-codes-bdshare”>

其实是有很多隐藏的参数的:

<div id=”bdshare” class=”bdshare_t bds_tools_32 get-codes-bdshare” data=”{
‘bdDes’:’您的自定义分享摘要’,  //’请参考自定义分享摘要’
‘text’:’您的自定义分享内容’,  //’请参考自定义分享内容’
‘title’:’您的自定义pop窗口标题’, //’请参考自定义pop窗口标题’
‘pic’:’您的自定义分享出去的图片’, //’请参考自定义分享出去的图片’
‘bdComment’:’您的自定义分享评论’, //’请参考自定义分享评论’
‘url’:’您的自定义分享url’,  //’请参考自定义分享url’,
‘wbuid’:’您的自定义微博 ID’
}”>

如果想自定义url,只需要写如下代码即可,红色文字部分就是增加的url:

<!– Baidu Button BEGIN –>
<div id=”bdshare” class=”bdshare_t bds_tools_32 get-codes-bdshare” data=”{‘url’:’http://www.weste.net/index.html’}“>
<span class=”bds_more”>更多</span>
<a class=”bds_tsina”>新浪</a>
<a class=”bds_tqq”>腾讯</a>
<a class=”bds_renren”>人人</a>
<a class=”bds_qzone”>QQ </a>
</div>
<script type=”text/JavaScript” id=”bdshare_js” data=”type=tools” ></script>
<script type=”text/JavaScript” id=”bdshell_js”></script>
<script type=”text/JavaScript”>
document.getElementById(“bdshell_js”).src = “http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=” + Math.ceil(new Date()/3600000);
</script>
<!– Baidu Button END –>

参考资料:http://share.baidu.com/help/customization/config

互联网赚钱不需要咋呼

mikel阅读(1109)

互联网上真正能赚钱的都在闷头做事,很少在那咋呼,因为都知道咋呼半天只不过是在浪费赚钱的时间,为什么这么说,因为只有互联网上不赚钱的人才有时间在那瞎逼逼,真正赚到钱的或者操作项目的都在忙着操作项目,千万别信那些所谓的自动赚钱系统,那都是扯淡的,互联网和传统行业一样一份付出一份收获。

很多人都在问怎么快速赚钱,其实完全没有快速赚钱的方法,一天赚个几块算快速吗?可是需要付出的辛苦的劳动,比如打码、游戏之类的体验任务都是这种方式,如果说能够赚更多的最快也就是最直接的就是推广,比如淘宝客、陆金所这种拿推广佣金的,不过同样是要付出辛苦努力推广的,发帖或者QQ群发之类的推广方式需要的不是什么技术而是持之以恒的毅力。

如果说能够有一夜暴富的项目,那都是些见不得光的,赚钱应该有底线,就像做人要有原则一样,很多人问我为什么不做某某项目,其实就是原则问题,可能很多人说我矫情,有钱还不赚。我只想说不以恶少而为之,出来混迟早要还的,且行且珍惜。

互联网上可以操作的赚钱项目很多,同样都有个项目的生命周期,从开始得发展期到中期的暴利期,然后到最后的衰退期和消亡期,都有个高潮低谷到消失,外在和人为的因素很多,很多人唯利是图明明很好的项目最后被生生作死的比比皆是,人心不古蛇吞象,有人的地方就有不安定的因素,因为人性是最难参透的东西,所以说想要在互联网上赚钱首先要有适应这种变化的心态,没有永远不消失的项目,也没有不赚钱的项目,其实就是这么矛盾的存在才让人欲罢不能的迷恋操作项目的过程,就像冲浪一样总是有那么多的变化一波波来袭,不适应则会被淘汰,永远不要指望操作一个永远能赚钱的互联网项目到老,所以说生于忧患死于安乐,越是赚钱的时候就越要做好没钱赚的准备,那就是果断寻找新的项目,不要盯死在赚钱的项目上。

[转载]五分钟 知晓Eclipse不为人知的秘密(越熟悉 越陌生) - RunforLove - 博客园

mikel阅读(900)

[转载]五分钟 知晓Eclipse不为人知的秘密(越熟悉 越陌生) – RunforLove – 博客园.

  大家好,这篇博客的目的是总结一下Eclipse这个软件中一些不为常用的功能。与大家分享。谢谢~

1.利用one hour看了一下Eclipse的使用,用two hour写了这篇blog。

2.在现实项目中,活学活用,才会真正对你有利,否则你浪费时间看了本博客,对你毫无帮助。

本博客结构:目录 + 按目录分述

目录:

1.给Eclipse添加书签。

2.通过Attach File查看源码和系统函数。也可以通过open Type;Open Type Hierarchy;Open resources查所有类

3.Font size修改字体;Theme修改Eclipse IDE主题。

4.Content Assistant,添加熟悉的代码提示功能(与其它快捷键冲突);常用 “Alt+/”

5.Quick Fix功能+F2代码提示功能。

6.重启功能,就像microsoft onenote的自动保存功能。

7.设置web browser,通过Debug模式+Firebug模式,前后台调试。

8.Eclipse中常时用的快捷键。+win D + win E。

9.show line number。

10.market place,安装集成插件的功能。

11.new window;new console功能。管理工作区;切换工作区。

12.Eclipse管理任务;悬浮提示;关闭项目的重要性。

13.run 配置参数。写小程序要输入参数的。

14.open perspective的功能。

15.学会使用problems视图,

16.一个文件夹视图,与两个文件夹视图的切换。

17.管理workspace工作区。切换工作区。

18.Java Build Path设置Java构建路径。

 

正文:

1.使用书签作为提示信息,或者使用书签可以快速定位到文件中的指定的行。如果你想设置书签,你只需要在代码区右侧竖线上右击鼠标并选择能 “Add Bookmark” 即可。。

 

如上图所示,是操作方法及操作效果图。同时在show view视图中也有个Bookmarks视图。可以查看所有书签。删除时,还要定位到添加的那个界面,有一个选项是Remove Tasks,即删除了该书签。

2.Navigate, 在英文中含义是驾驶 航行的意思。可见其重要性。在菜单栏的这个菜单中,有几个很重要的选项。Last Edit Location;Back .java;此外,还有Open Type;浏览(Navigate)菜单提供了多个菜单可以让你快速定位到指定资源。Open Type, Open Type in Hierarchy 和 Open Resource 三个菜单项是非常有用的。

如上图所示,Open Type 菜单项可以打开一个对话框,对话框中可以查找 Java 类型文件。你可以在输入框中输入类名查找。 ‘*’ 号表示 0 个或多个字母,’?’ 号表示单个字母可用于指定模式。对话框中将显示所有匹配的模式。(包括JDK中的类)第二个图片中,你可以点击 Attach Source 按钮来查看类文件对应的源码。源代码位于 Java 主目录中的 src.zip 压缩文件中。

如上图所示,Open Type in Hierarchy 菜单允许用户在 Type Hierarchy 视图中查看类的继承层次。Type Hierarchy视图中选择指定的类就可以看到类的定义信息,包含对应的属性和方法,当然还有它的继承的层次结构。

3.

中国特色的万亿级社区O2O 身边的买卖最赚钱?!

mikel阅读(1248)

原文《中国特色的万亿级社区O2O,下一个“阿里巴巴”在哪里?》 ,摘要:

现在,中国许多城市的小区正上演着如下一幕幕场景:

一大早,“阿姨帮”上叫的家政服务人员已经来敲门,做早餐、搞清洁、然后送孩子上学。业主吃完早餐,用滴滴叫了一部专车去上班。

中午,留守的太太不想做饭,通过“百度外卖”叫了一份热气腾腾的快餐。衣服窗帘的洗涤由“e袋洗”上门来收,家具电器的维修保养通过彩生活的“易维修”上门服务。

黄昏,“链农”刚送到新鲜便宜的蔬菜水果,在“爱大厨”上叫的厨师就上门了,一顿晚餐让全家人都很满意。

晚上,孩子在“58到家”上叫的钢琴老师指导下练琴,享受“河狸家”上叫的美甲服务后,两口子在“美团猫眼”上预定了电影和座位,出门看电影去了。

这样的家庭生活场景,就是现在正在大爆发的“社区O2O”,未来可能超过淘宝的万亿级市场。

  1、社区O2O的商业模式本质是B2F(Business to Family)

这样的服务模式,在中国正红得发紫。既符合硅谷式称谓“O2O”特征,也符合李克强总理政府工作报告中的“互联网+”战略。

“O2O”是 “online to offline” 和 “offline to online” 的缩写,强调的是线上和线下的融合和联动;“互联网+”指移动互联网、云计算、大数据、物联网等与传统行业相结合,雷军认为代表着一种新的经济形态,于扬 (易观国际董事长)甚至认为中国的互联网+战略有点像美国信息高速公路战略的升级版。

社区O2O是通过移动互联网的革命性技术和新的商业模式,将家庭与商业服务之间做一个“连接”。

谁能成为这个“连接器”(正如马化腾对微信的定位),谁就将执万亿社区O2O市场的牛耳。现在看,也许“地派”即掌控物业的打法希望貌似比较大。

这个特殊性,就是物业在中国城市社区中的特殊定位和关键地位。正因为如此,这个连接,是足够重度的,也是黏性极高的。毕竟用户在家和小区的时间,加起来远远超过在外(公司、旅途)。

其次,与传统互联网企业的虚拟性迥异,基于线下的本地生活服务有许多的独特场景和远胜线上的真实交互、交易,对于严重依赖信任、真实的互联网金 融而言,线下可能是更重要的基础优势,未来是否在中国会出现富国银行、LendingClub 的社区金融?我认为,真实、快捷的线下服务入口是众多互联网金融企业未来争夺的新热点。

第三,线下服务平台的开放能力更胜于线上,因而商业生态体系可能更健康。例如,在彩生活服务的众多社区中,母公司花样年集团的物业只占3%不 到;一旦能形成更为开放的涵盖 Content、Community、Commerce的综合商业生态,可能会较基于支付宝的阿里生态系统对上下游企业更为友好,且面向真实家庭的大数据 数据积累的更为持续、优质和有价值。

觊觎社区O2O的巨头,其实有很多。譬如,中国房地产行业龙头万科在2014年首次正式提出“轻资产”运营模式,并放话要致力于掘金社区服务市场。

这个战争才刚刚开始。

反方的文章《万亿社区O2O? 别搞笑了 做了都不知道怎么死的》 摘要:

“这两天有企业背后鼓吹社区O2O是万亿市场,这纯是为吸引眼球忽悠不懂行的。这个万亿市场是这么算出来的?社区O2O包括哪些服务?怎么赚钱?谁能赚到?很多问题都没弄清楚,就鼓吹社区O2O是万亿市场,照这么下去这个概念迟早要被吹破的。

一群脑袋大的投资人一看社区O2O概念热就一股脑的投了进去,进去之后才发现现实没有想象中的那么顺利美好,各种问题开始爆发了,最具代表性的就是叮咚小区,现在还活不活着都不清楚了。类似的投资案例还有很多,细心的话你可能发现了,社区O2O的天使轮融资的消息比较多,但获得A轮B轮的却鲜有听闻,为何会这样?

更 有意思的是社区O2O的概念够热,吸引来一大群做生鲜电商的,开便利店的,送快递的,上门美甲、按摩、洗衣的等等也开始举起社区O2O的大旗“招摇撞 骗”。究竟什么是社区O2O,似乎越来越难搞清楚了,貌似与居民生活相关的都可以与社区O2O贴上边,要是这么说的话,社区O2O何止万亿,十万亿也不止 呀~

热吵社区O2O的主要分四派:其一,是具备互联网电商背景的公司,包括京东、顺丰、拉卡拉,以及房产业务的易居等;其二,是房产和物业公司,万科、龙湖,以及主打社区O2O的彩生活;其三,拿到融资的创业团队,包括叮咚小区、小区管家等;其四,就是蹭概念的上门服务类的互联网公司了。

如此丰富的参与者构成对社区O2O的发展本是好事,但现在却有些过犹不及了,参与者越多,社区O2O的概念就越模糊,可能多数人已经无法对社区O2O究竟是什么达成统一标准了。不同的参与者会根据自身的厉害关系给出有利自身的市场定义。

再 这么肆无忌惮的发展下去,用不了多久舆论对社区O2O的反思浪潮就会兴起,到时候这帮靠概念而生的社区O2O企业多数都会被淹死了。现在乐呵的热吵社区 O2O概念忽悠着投资,最后概念泡沫破灭创始人们拍拍屁股走人了,留下投资人在那傻眼。所以,奉劝做社区O2O投资的,眼光要放亮点,再遇个叮咚小区之类 的毁不毁啊?泡沫之下尽是炮灰。

知道目前社区O2O最大的问题是什么吗?答案:线上线下严重脱节。

以互联网形式做社区O2O的无法掌握线下大量的物业服务资源,因为 互联网公司不适合养那么多人,而且也没办法获得那么多物业资源。物业公司本来就比较零散,数量众多,而且每个楼盘的情况还不一样,首先整合物业资源就不太 现实。另外,很多楼盘与物业并不是“终生”制的,物业若服务不好,业委会有权利要求更换物业,所以这些物业哪有那个闲功夫去为互联网公司提供免费服务啊?

你跟物业谈未来如何美好,但物业跟你谈现在是否有钱赚,有钱赚还能合作,没钱赚的话多一事不如少一事,毕竟谁知道两三年后这家物业公司还能不能服务这个楼盘,他们更着眼于当下的利益。互联网公司想说服物业提供帮助的方法只有一个,要么直接给他们钱,要么间接帮他们获利。

观点:

人以群分,同样人多的地方就是社区,很多人的生活基本都在周围的一亩三分地儿,没有多少人上蹿下跳的四处奔波,中国又是一个比较喜欢聚堆儿的民情,所以说身边的买卖最好赚钱。

阿里巴巴将传统商业的信息差将到最低,倒逼传统企业压缩成本和各级代理商撕逼大战,结果淘宝成了最大的赢家啊,苦了卖家所以才有了淘宝刷单和各种所谓的“网货”的出现,最终也苦了买家,好了不说阿里的问题了,就说阿里的确是改变了人们的消费习惯,这年头没有支付宝就不好意思跟人打招呼,没网上买过东西那跟原始人差不多了,从支付习惯的养成到网上购物的生活习惯开始,天下就没有了难做的买卖了。

微信再次推波助澜得将移动消费的场景推到老百姓的手掌上,连小孩和老人基本上都有了微信号,并且通过发红包绑定了多少银行卡,让全民移动消费习惯养成了,社区O2O的天时地利基本上都被接受了,就看谁能够做起身边的买卖了,毕竟这个市场很大,不仅仅是交易这么简单,包括物业、本地服务、社交等等实在是很大的市场,没有哪个巨头能够保证自己能够一口吃下,所以才会给了大家一个讲故事的好机会,各种热钱会陆续投入进来,不过对于中国互联网这个“剩者为王”的竞争环境,那要多久能够“剩”出个王来,就看BAT等等巨头的动作了,目前最有希望的也最看好的还是微信,毕竟先入为主,人群覆盖率在那了,有了用户基础再有了好的社区O2O模式将是一个很有希望的未来。

反面的观点是大家都不知道社区O2O怎么做,就在那瞎逼逼只能是空中楼阁,别说万亿估计不对,连现在的舆论都是在瞎说,线上的不懂线下的规则运营,互联网不懂物业的想法,物业怕丢了饭碗眼前利益为大,接入互联网闲麻烦,然后就是各个社区的住户不买账,导致现在的社区O2O一直是个无主之地的大市场,就是没有几个能够存活得滋润的,其实没有问题的市场是没有未来可言的,我还是觉得大家都被局限在“社区”这两个代表地域的字眼儿上了,其实应该细化到“住户”的这个“社区”的重要分子上,毕竟没有人也就没有社区,至于物业不能不管,但是你只要取悦“住户”的需求,让他们满意的使用你的产品,就不用发愁物业不被 挟天子以令诸侯,让住户倒逼物业等线下社区相关服务商家变化,不痛则不通!想要真正革社区O2O的命,还是要从人下手!

[转载]Android锁定屏幕 - Wossoneri - 博客园

mikel阅读(1210)

[转载][Android]锁定屏幕 – Wossoneri – 博客园.

最近玩的比较欢脱,欠了好多东西没写。今天先简单地补一篇简单的内容。就是最近涉及到一个锁定Android设备屏幕的设计,大概就是通过一个 按钮或者服务消息,来控制设备界面完全锁定,不能点击任何东西。感觉上这个需求可能会涉及很多东西,然而做起来发现并没有。。。内容很简单,跟着代码快速 过一遍。

本文地址:http://www.cnblogs.com/rossoneri/p/4409691.html 

主界面就放一个按钮来触发事件好了:

 

按下按钮后显示另一个锁屏界面,同时加上一个解锁按钮(如果不加的话怎么退出程序啊- -!)

可以看到,启动锁屏后 顶部的status bar完全消失,下方的Navigation bar按钮淡化成小圆点。这时你点击屏幕任何地方程序都不会有任何反应。好了,下面上代码。

 

锁屏类 LockScreen.java:

package com.example.wow.demo_lockscreen;

import android.content.Context;
import android.graphics.PixelFormat;
import android.graphics.Point;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Button;

/**
* Created by wow on 15-4-9.
*/
public class LockScreen {

Point mLpSize;
Button mBtnUnlock;
ViewGroup mView;
final WindowManager mWindowManager;
final WindowManager.LayoutParams mLp;

public LockScreen(Context mContext){

mView = (ViewGroup) LayoutInflater.from(mContext).inflate(R.layout.lock_screen_view, null);
mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
mLp = new WindowManager.LayoutParams();
mBtnUnlock = (Button)mView.findViewById(R.id.btn_unlock);

mBtnUnlock.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
show(false);
}
});

initLp();

}

private void initLp(){
mLp.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;// TYPE_SYSTEM_ALERT;
mLp.format = PixelFormat.RGBA_8888;

mLp.flags |= WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_FULLSCREEN
| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;

mLp.systemUiVisibility = View.STATUS_BAR_HIDDEN;

mLp.width = WindowManager.LayoutParams.MATCH_PARENT;
mLp.height = WindowManager.LayoutParams.MATCH_PARENT;

}

public void show(boolean flag){
if (flag){
mWindowManager.addView(mView, mLp);
} else {
mWindowManager.removeView(mView);
}
}

}

这里的重点在于

mLp.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;

这一句,type一定要设置成这种类型,这个类型的功能就是让当前显示的view无理由地出现在最上端。 flags 就是根据需求来设定,可以再加其他内容,也可以删掉一些,不影响的。

这里还要在Manifest中添加权限才行

 

MainActivity:

package com.example.wow.demo_lockscreen;

import android.app.Activity;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {

Button mBtnLock;
LockScreen mLockScreen;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mBtnLock = (Button)findViewById(R.id.btn_lock);
mLockScreen = new LockScreen(this);

mBtnLock.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mLockScreen.show(true);
}
});

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}

return super.onOptionsItemSelected(item);
}
}

 界面文件就不贴了,太简单。。哦对,这个我在5.0上测的是完美运行,4.2有点问题,不太清楚为什么。。有知道的给我说下。

好了,锁屏其实就这么简单。后面我会再研究一些界面效果,做点实用的锁屏功能。

最近在研究 system bar,挺简单的,之前写了几篇相关的博客,发现之前理解还是有点偏差,打算过一段写个最终版的,把这块知识搞定。

本文版权归Wossoneri博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则追究法律责任。

[转载]第三方支付集成 - 邹琼俊 - 博客园

mikel阅读(1827)

[转载]第三方支付集成 – 邹琼俊 – 博客园.

    看一个典型的在线支付流程。第三方支付平台就是提供网上支付的平台,由第三方支付平台来和各个银行进行对接,商户只要和第三方支付平台对接即可,降低了商户的技术难度和接入门槛。常见的第三方支付平台:支付宝、网银在线、快钱、财付通、易宝等。

一个支付流程的数据流动:客户在网上商店挑选商品、点击支付,网站将用户重定向到第三方支付平台的支付网关,并且将订单号、金额等信息通过 QueryString传递给支付网关,用户在第三方支付平台支付成功后,第三方支付平台会自动访问商户的确认页面,将支付成功的订单号等信息通过 QueryString传递给确认页面,这样商户网站就能得到支付成功的通知了。以服装卖场中的收银台流程类比(漏洞:自己偷偷盖假章,防范办法:收银台 和商户约定一个密钥“天灵灵”,然后收银台在小票上根据“小票编号”+“金额”+密钥计算出md5写到小票上)。

todo:模拟器增加1 3 5分钟重复通知商户支付成功。重复通知的话是支付宝向商户网站发请求,这时候支付宝服务器是客户端。商户号不存在的问题解决
Response.redirect过程商户网站、浏览器、支付宝的请求流程。注意Transfer和Redirect的区别。retun.aspx页面的参数是支付宝传递过来的。
虚拟商品(积分、充值卡)就直接增加积分、充值了。物理商品(鲜花、图书)就把订单标记为已支付,然后网站工作人员处理订单、发货,再把订单状态标记为“已发货”(业务员手动完成),最后用户确认收货。

第三方支付平台都提供了集成文档和示例代码,拿过来改改就行,当然如果你有兴趣的话,可以看下这些示例代码。至于具体的调用和实现,我就没必要讲了,因为支付宝有现成的Demo和灰常详细的api文档,我们要思考的是如何和订单系统结合。

网店不是直接向支付宝服务器发请求,而是让用户重定向到支付宝服务器去支付。就像服装店让客户自己拿着小票去交钱一样。

每个商家的密钥都和其他商家不一样,避免了“整个服装城用一个hahah”的漏洞。要把订单编号也加入md5的运算,防止用“001的返回小票领002号订单的商品的漏洞”。商户端的MD5算法要和支付宝一样,否则会报错,这个MD5算法是支付宝开发包中提供的。

开发包和密钥的获取,我们可以访问支付宝官网技术支持页面:https://b.alipay.com/order/techService.htm

下载相应的接口包,里面有各种语言的实例代码和详细的API文档。

注意事项:

1、  订单号是商家确定的。

2、  参数顺序无所谓。

3、  支付宝就是“收银台”,很形象,支付宝就是负责收银,商家引导客户去收银台。收费单据就是返回的值。

4、  不要直接访问模拟器主页,模拟器主页就是相当于支付宝的主页

模拟器整合方法

1、解压PaySiteSimulator.zip,如下:

运行Casini,把PaySiteSimulator当成网站运行,8080端口。这个相当于搭建支付宝模拟器网站,这个网站不需要咱们开发。

访问模拟器的首页:“支付宝网站后台(支付宝工作人员用)”是用来分配商户编号的,支付宝商户后台是供商户修改密钥的。

点击Start按钮,然后访问模拟器主页

2、修改C:\WINDOWS\system32\drivers\etc\hosts,把www.zhifubao.com映射到127.0.0.1

3、按照AliPay/支付宝接口集成文档.进行集成测试。注意:那个支付宝模拟器是模拟支付宝的网站,不是商户的程序。

博客地址: http://www.cnblogs.com/jiekzou/
博客版权: 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。
如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!
再次感谢您耐心的读完本篇文章。