从限行限号看消费习惯

mikel阅读(1127)

最近几天限号,开始按后3位限了三天,结果发现很多车牌最后一位的数字居多,然后含4的很少,然后今天开始又单双号限行,结果发现尾数是双号的居多,比较有意思的消费习惯

联想的和号码有关的互联网商机,那就是手机号码、QQ号码、邮箱号码、域名等等与号码有着数不清关系的行业,为什么说行业,可以去58看看基本上都有专业的倒卖上述号码的人在做了。

前 些日子写的关于每天领取一个QQ靓号的文章里有提到,可以注册QQ靓号,怕带坏小朋友,然后就没有然后了,这些日子在一天一个QQ号的注,发现好号还是很 多的,很多人觉得没用,通过上面的消费习惯分析,你会发现这个市场很大,号码又是唯一资源,你占了别人都没办法用了,所以只能用抢。

资源总是用时方恨少,比如我注册了那么多QQ号,开始也没啥用,就放58卖了,结果这几天折腾移动电源的网站,还有一系列产品的网站,发现都需要在线QQ客服,这不,全部都用上了, 还不够呢!

有人有问了,你一个新网站用那么多客服QQ号干嘛?!炫富吗?!

还真是炫富,这就是形象工程,你一个高大上的网站,没有几个客服,你都不好意思说你是团队运营,客服都寒酸的那么1个,好意思吗?!

这也是消费习惯,人们总是喜欢那些热闹的网站,跟线下的市场一样,一个门可罗雀的市场谁都不愿意进去看看,因为不热闹,如果一个说话基本靠喊,满是吆喝的市场,肯定招人,这就是凑热闹!!

再说个先有鸡还是先有蛋的问题,道理很简单,就是很多人弄不明白

都在喊着要走小米的模式,然后产品还没出来,就要找粉丝营销,营销不是空穴来风,没东西你营销也是耍流氓,小米人家也是先有的miui系统给用户用,然后才有得铁杆粉,然后再借势推出的手机好不好?!

拜托,在学人家的时候先看看自己有没有东西再说,实在没有也造个吸引人的产品来,先聚人气,然后建立信任再谈粉丝营销。

没有无缘无故的粉丝,都是通过产品认识企业,从而建立信任成为粉丝的,考虑清楚再出来卖吧!

微信是商家必争之地

mikel阅读(1085)

没有为什么!就是人多!这一点儿就让那些唱衰微商的闭嘴。

没办法,中国人就是喜欢热闹,不管你什么产品,只要有人用,就成创造商机。

淘宝人多吗?也多,但是就跟集市一样,大家就是为了买东西来的,买完了走人,没啥可发生关系的机会,顶头儿聊聊旺旺砍砍价,所以阿里这个急啊,出了个来往想让卖家和买家发生深度关系,结果已经干不过微信了。

微信上的人们为啥那么多,还不走呢,就是很强的熟人关系,让人们想扔都扔不掉,过去PC时代是谁占领用户的桌面,谁有市场,移动时代是谁黏住用户谁有市场。

微信上卖东西的都成了微商,从个人到商家都争先恐后的往里跳,结果发现那么多人在卖,熟人的买卖看来还是好做的,最起码比网络可信。

尽 管大家一直在喊着O2O,可真正做到的没几家微信人家也没喊O2O,结果你看看多少人线下开店,线上刷微信卖货,然后线下到店提货,然后还可以唠唠嗑,再 试试衣服,淘淘新款啥的,走时候卖家还不忘了说一下,以后新款都在微信上订,不方便来店,可以微信支付,我给你送过去啊!

试问从线下到线下这么引流,带体验的,那么多喊要做O2O的有几家能做到?!

被说微商怎么不靠谱,最起码人家成交量在那摆着呢!自己那点儿成交量好意思拿出来比比!?

自媒体从微信开始是不争的事实,从公众号到朋友圈都是要让用户踊跃发表自己的想法,做自媒体,那些粉丝大号都已经风生水起好些年了,各位电商大佬们是不是该醒醒了?!

[转载]OPENXML - 无名 - 博客园

mikel阅读(983)

[转载]OPENXML – 无名 – 博客园.

OPENXML

OPENXML 通过 XML 文档提供行集视图。由于OPENXML 是行集提供程序,因此可在会出现行集提供程序(如表、视图或 OPENROWSET 函数)的 Transact-SQL 语句中使用 OPENXML。

语法

OPENXML(idoc int [in],rowpattern nvarchar[in],[flags byte[in]])
[WITH (SchemaDeclaration | TableName)]

参数

idoc

是 XML 文档的内部表式法的文档句柄。通过调用 sp_xml_preparedocument 创建 XML 文档的内部表式法。

rowpattern

是 XPath 模式,用来标识要作为行处理的节点(这些节点在 XML 文档中,该文档的句柄由 idoc 参数传递)。

flags

表示应在 XML 数据和关系行集间使用映射以及应如何填充溢出列。flag 为可选输入参数,可以是下列值之一。

字节值 描述
0 默认为以特性为中心的映射。
1 使用以特性为中心的映射。
在某些情况下,可以将它与 XML_ELEMENTS 组合使用。使用时首先应用以特性为中心的映射,然后对于所有仍未处理的列应用以元素为中心的映射。
2 使用以元素为中心的映射。
在某些情况下,可以将它与 XML_ATTRIBUTES 组合使用。使用时先应用以特性为中心的映射,然后对于所有仍未处理的列应用以元素为中心的映射。
8 可与 XML_ATTRIBUTES 或 XML_ELEMENTS 组合使用(逻辑 OR)。
在检索的上下文中,该标志指明不应将已消耗的数据复制到溢出属性 @mp:xmltext

 

SchemaDeclaration

是窗体的架构定义:
ColName ColType [ColPattern | MetaProperty][, ColName ColType [ColPattern | MetaProperty]…]

ColName
是行集中的列名。
ColType
是行集中列的 SQL 数据类型。如果列类型不同于特性的基础 XML 数据类型,那么将发生类型压制。如果列的类型是 TIMESTAMP,则当从 OPENXML 行集中进行选择时,将忽略 XML 文档中现有的值并返回自动填充值。
ColPattern
是可选的通用 XPath 模式,它说明应如何将 XML 节点映射到列。如果没有指定 ColPattern,那么发生默认的映射(由 flags 指定的以特性为中心或以元素为中心的映射)。指定为 ColPattern 的 XPath 模式用于指定特殊的映射性质(如果发生以特性为中心和以元素为中心的映射),这些特殊的映射性质可以重写或增强由标志所指定的默认映射。

指定为 ColPattern 的通用 XPath 模式也支持元属性。

MetaProperty
是由 OPENXML 提供的元属性之一。如果指定元属性,则该列包含元属性提供的信息。这些元属性使您得以析取 XML 节点的信息(如相对位置、命名空间信息),以提供比文本化表示法更详细的信息。

TableName

如果具有期望架构的表已经存在且不要求列模式,则为给定的表名(而不是 SchemaDeclaration)。

通过使用 SchemaDeclaration 或者指定一个现有的 TableNameWITH 子句提供一种行集格式(根据需要还提供其它映射信息)。如果没有指定可选的 WITH 子句,那么以 edge table 格式返回结果。边缘表在单个表中表示 XML 文档的细密结构(例如,元素/特性名、文档层次结构、命名空间、PI 等)。

下表描述边缘表的结构。

列名 数据类型 描述
id bigint 是文档节点的唯一 ID。根元素的 ID 值为 0。保留负 ID 值。
parentid bigint 标识节点的父节点。此 ID 所标识的父节点不一定是父元素,而是取决于此 ID 所标识节点的子节点的 NodeType。例如,如果节点是文本节点,则其父节点可能是特性节点。如果节点位于 XML 文档的顶层,则其 ParentID 为 NULL。
nodetype int 标识节点类型。是对应于 XML DOM 节点类型编号的整数(有关节点信息,请参见 DOM)。三种节点类型是:

1 = 元素节点
2 = 特性节点
3 = 文本节点

localname nvarchar 给出元素或特性的本地名称。如果 DOM 对象没有名称则为 NULL。
prefix nvarchar 是节点名称的命名空间前缀。
namespaceuri nvarchar 是节点的命名空间 URI。如果值是 NULL,则命名空间不存在。
datatype nvarchar 是元素或特性行的实际数据类型,否则是 NULL。从内嵌 DTD 中或从内嵌架构中推断数据类型。
prev bigint 是前一个兄弟元素的 XML ID。如果前面没有兄弟元素则为 NULL。
text ntext 包含文本格式的特性值或元素内容(如果边缘表项不需要值则为 NULL)。

 

示例
A.使用带有 OPENXML 的 SELECT 语句。

下面的示例使用 sp_xml_preparedocument 创建 XML 图像的内部表示。然后对 XML 文档的内部表示法执行使用 OPENXML 行集提供程序的 SELECT 语句。

flag 值设置为 1,表示以特性为中心的映射。因此,XML 特性映射到行集中的列。指定为 /ROOT/Customersrowpattern 标识要处理的 <Customers> 节点。

没有指定可选的 colpattern(列模式),因为列名和 XML 特性名称匹配。

OPENXML 行集提供程序创建了一个双列行集(CustomerID ContactName),SELECT 语句从该行集中检索必要的列(在本例中检索所有的列)。

DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
   <Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
      <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
      <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
   </Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
   <Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">
      <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
   </Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Execute a SELECT statement that uses the OPENXML rowset provider.
SELECT    *
FROM       OPENXML (@idoc, '/ROOT/Customer',1)
            WITH (CustomerID  varchar(10),
                  ContactName varchar(20))

下面是结果集:

CustomerID ContactName          
---------- -------------------- 
VINET      Paul Henriot
LILAS      Carlos Gonzlez

如果将 flags 设置为 2(表示以元素为中心的映射)并执行相同的 SELECT 语句,由于 <Customers> 元素没有任何子元素,则对于 XML 文档中两个 Customer 的 CustomerIDContactName 的值都作为 NULL 返回。

下面是结果集:

CustomerID ContactName
---------- -----------
NULL       NULL
NULL       NULL
B. 为列和 XML 特性之间的映射指定 ColPattern

下面的查询从 XML 文档返回客户 ID、订单日期、产品 ID 和数量等特性。rowpattern 标识 <OrderDetail> 元素。ProductIDQuantity 是 <OrderDetails> 元素的特性。而 CustomerIDOrderDate 是父元素 (<Orders>) 的特性。

指定可选的 ColPattern,表示:

  • 行集中的 OrderIDCustomerIDOrderDate 列映射到 XML 文档中 rowpattern 所标识节点的父节点的特性。
  • 行集中的 ProdID 列映射到 ProductID 特性,而行集中的 Qty 列映射到 rowpattern 所标识节点的 Quantity 特性。

尽管以元素为中心的映射由 flag 参数指定,但 ColPattern 中指定的映射重写该映射。

declare @idoc int
declare @doc varchar(1000)
set @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
   <Order OrderID="10248" CustomerID="VINET" EmployeeID="5" 
           OrderDate="1996-07-04T00:00:00">
      <OrderDetail ProductID="11" Quantity="12"/>
      <OrderDetail ProductID="42" Quantity="10"/>
   </Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
   <Order OrderID="10283" CustomerID="LILAS" EmployeeID="3" 
           OrderDate="1996-08-16T00:00:00">
      <OrderDetail ProductID="72" Quantity="3"/>
   </Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
exec sp_xml_preparedocument @idoc OUTPUT, @doc
-- SELECT stmt using OPENXML rowset provider
SELECT *
FROM   OPENXML (@idoc, '/ROOT/Customer/Order/OrderDetail',2)
         WITH (OrderID       int         '../@OrderID',
               CustomerID  varchar(10) '../@CustomerID',
               OrderDate   datetime    '../@OrderDate',
               ProdID      int         '@ProductID',
               Qty         int         '@Quantity')

结果如下:

OrderID CustomerID           OrderDate                 ProdID    Qty

————————————————————————

10248      VINET       1996-07-04 00:00:00.000   11      12
10248      VINET       1996-07-04 00:00:00.000   42      10
10283      LILAS       1996-08-16 00:00:00.000   72      3
C. 获得边缘表格式的结果

在下例中,在 OPENXML 语句中未指定 WITH 子句。因此,OPENXML 所生成的行集具有边缘表格式。SELECT 语句返回边缘表中的所有列。

下例中的示例 XML 文档由 <Customer>、<Order> 和 <Order_0020_Details> 元素组成。

首先调用 sp_xml_preparedocument 以获得文档句柄。此文档句柄传递到 OPENXML。

在 OPENXML 语句中

  • rowpattern (/ROOT/Customer) 标识要处理的 <Customer> 节点。
  • 未提供 WITH 子句。因此 OPENXML 以边缘表格式返回行集。

最后 SELECT 语句检索边缘表中的所有列。

declare @idoc int
declare @doc varchar(1000)
set @doc ='
<ROOT>
<Customers CustomerID="VINET" ContactName="Paul Henriot">
   <Orders CustomerID="VINET" EmployeeID="5" OrderDate=
           "1996-07-04T00:00:00">
      <Order_x0020_Details OrderID="10248" ProductID="11" Quantity="12"/>
      <Order_x0020_Details OrderID="10248" ProductID="42" Quantity="10"/>
   </Orders>
</Customers>
<Customers CustomerID="LILAS" ContactName="Carlos Gonzlez">
   <Orders CustomerID="LILAS" EmployeeID="3" OrderDate=
           "1996-08-16T00:00:00">
      <Order_x0020_Details OrderID="10283" ProductID="72" Quantity="3"/>
   </Orders>
</Customers>
</ROOT>'
--Create an internal representation of the XML document.
exec sp_xml_preparedocument @idoc OUTPUT, @doc
-- SELECT statement using OPENXML rowset provider
SELECT    *
FROM       OPENXML (@idoc, '/ROOT/Customers')
EXEC sp_xml_removedocument @idoc

结果作为边缘表返回。

 

from :http://www.yesky.com/imagesnew/software/tSQL/ts_oa-oz_5c89.htm

[转载]SQL Server 使用OpenXML 导入xml格式的数据 - 鸿鹄_A - 博客园

mikel阅读(1151)

[转载]SQL Server 使用OpenXML 导入xml格式的数据 – 鸿鹄_A – 博客园.

declare @xmlText xml
declare @club varchar(50)
DECLARE @idoc int

set @xmlText = (select doc from openrowset(bulk 'D:\RF_Integration\Code\Import\RF.Integration.Import.BusinessLogic\bin\Debug\ModifiedPackageFiles\golf_b6dd63fb30f84a9b941a9cdcbbacb30f_201209041607[007-004].xml',single_blob) as t(doc))

EXEC sp_xml_preparedocument @idoc OUTPUT,@xmlText

set @club='golf'

insert into [dbo].Address_Temp([AddressType] ,[Country],[PostalCity] ,[PostalNumber],[Street],[CO_Address],[PersonID],[PersonNum],[PersonOptType])
select [AddressType] ,[Country],[PostalCity] ,[PostalNumber],[Street],[CO_Address],[PersonID],[PersonalNumber] as [PersonNum],'Insert' as [PersonOptType]
from openxml(@Idoc,'/persons/InsertRecord/Person/Addresses/Address',2)
With(
[AddressType] varchar(50),
[Country] varchar(50),
[PostalCity] varchar(50),
[PostalNumber] varchar(50),
[Street] varchar(50),
[CO_Address] varchar(50),
[PersonId] varchar(50) ..//..//PersonId',--(此处应该为单斜杠,应为blog编辑器写单斜杠有问题,所以将其写为双斜杠)
[PersonalNumber] varchar(50) '..//..//@PersonalNumber'
)

  上边的代码中, 数据库直接读取了xml文件,然后解析 xml 数据,将其保存到Address_Temp 表中,蓝色文字部门,..//..//PersonId 表示单签节点 上两级节点 字段  PersonId 的值,如果带上‘@’ ,表示属性值。
具体的openxml 的用法,可以参看一下链接:http://www.cnblogs.com/wuming/archive/2010/01/18/1650755.html

http://technet.microsoft.com/zh-cn/ms175160.aspx

Download jQuery EasyUI 1.4.1

mikel阅读(1095)

ChangeLog

Bug
  • The combogrid has different height than other combo components. fixed.
  • datagrid: The row element loses some class style value after calling ‘updateRow’ method. fixed.
  • menubutton: Calling ‘enable’ method on a disabled button can not work well. fixed.
  • form: The filebox components in the form do not work correctly after calling ‘clear’ method. fixed.
Improvement
  • tabs: The ‘update’ method accepts ‘type’ option that allows the user to update the header,body,or both.
  • panel: Add ‘openAnimation’,’openDuration’,’closeAnimation’ and ‘closeDuration’ properties to set the animation for opening or closing a panel.
  • panel: Add ‘footer’ property that allows the user to add a footer bar to the bottom of panel.
  • datagrid: Calling ‘endEdit’ method will accept the editing value correctly.
  • datagrid: Add ‘onBeforeSelect’,’onBeforeCheck’,’onBeforeUnselect’,’onBeforeUncheck’ events.
  • propertygrid: The user can edit a row by calling ‘beginEdit’ method.
  • datebox: Add ‘cloneFrom’ method to create the datebox component quickly.
  • datetimebox: Add ‘cloneFrom’ method to create the datetimebox component quickly.

Download EasyUI Package

There are two editions of EasyUI package:

GPL Edition

The GPL Edition is available under GPL License, you can use it in any GPL-licensed projects. Download JQuery EasyUI under GPL license:

Download

Commercial Edition

The Commercial Edition is also available under Commercial License, you can use it in a non-GPL/proprietary project.

Purchase

Other Versions

The other released versions of JQuery EasyUI are also available. Click here to view a listing and choose which version you would like to download.

[转载]easyui弹出层在最顶层显示跳出iframe框架通用javascript代码 - Angelasp - 博客园

mikel阅读(1494)

[转载]easyui弹出层在最顶层显示跳出iframe框架通用javascript代码 – Angelasp – 博客园.

有时候我们用easyui在后台框架中弹框的时候,总是显示在框架页面里面而不是整个系统框架的上面,看着有些不太乐意。

dialog = function (opts) {
var query = parent.$, fnClose = opts.onClose;
opts = query.extend({
title: 'My Dialog',
width: 400,
height: 220,
closed: false,
cache: false,
modal: true,
html: '',
url: '',
viewModel: query.noop
}, opts);

opts.onClose = function () {
if (query.isFunction(fnClose)) fnClose();
query(this).dialog('destroy');
};

if (query.isFunction(opts.html))
opts.html = utils.functionComment(opts.html);
else if (/^\#.*\-template$/.test(opts.html))
opts.html = $(opts.html).html();

var win = query('
<div></div>
').appendTo('body').html(opts.html);
if (opts.url)
query.ajax({ async: false, url: opts.url, success: function (d) { win.empty().html(d); } });

win.dialog(opts);
query.parser.onComplete = function () {
if ("undefined" === typeof ko)
opts.viewModel(win);
else
ko.applyBindings(new opts.viewModel(win), win[0]);

query.parser.onComplete = query.noop;
};
query.parser.parse(win);
return win;
};

接下来我们来看看怎么调用这个通用的弹出方法:

var query = parent.$;
var winAudit = query("#angelasp_div");
winAudit.dialog('open');

这样看起来是不是是很简单别忘了angelasp_div这个div或者标签窗体代码要在顶层框架页面中定义:

如果你想让框架页面没那么多繁琐的html代码,那么我们还可以这样写:

var html = '
<div id="w_angelasp_div">'
html += '
<div id="angelasp_div" class="easyui-dialog" style="width: 400px; height: 210px;" title="标题" data-options="modal:true,closed:true,iconCls:\'icon-user-accept\'">'
html += '
<div class="container_16" style="width: 90%; margin: 5%;">'
html += '
<div class="grid_13 val">窗体内容
<div>'
html += '</div>
'
html += '

</div>
'
html += '
<div id="w_audit_div_button" class="audit_button">'
html += ' <a class="easyui-linkbutton" data-bind="click:confirmClick">确定</a> '
html += ' <a class="easyui-linkbutton" data-bind="click:cancelClick">取消</a> '
html += '</div>
'
html += '

</div>
';
var winAudit= query(html).appendTo("body");

最后别忘了上面的那个open一下显示。看看效果图:

[转载]wifidog 认证 - 逆雪寒的天坑 - 博客频道 - CSDN.NET

mikel阅读(1720)

[转载]wifidog 认证 – 逆雪寒的天坑 – 博客频道 – CSDN.NET.

首先简单介绍一下什么是Portal认证,Portal认证,通常也会叫Web认证,未认证用户上网时,设备强制用户登录到特定站点,用户可以免费访问其 中的服务。当用户需要使用互联网中的其它信息时,必须在门户网站进行认证,只有认证通过后才可以使用互联网资源。现金很多中国移动CMCC、中国联通、中 国电信ChinaNet的WIFI都使用这种认证接入方式。

在OpenWRT上实现Portal认证,实际上早已有解决方案:

1. chillispot,但原维护作者停止更新,被chillispot.info接管继续开发;

2.coova-chilli,它是基于chillispot开发拓展的,功能最为强大;可以去官方看一下Coova-chilli;

3.wifidog

前两个由于原维护作者停止更新,笔者也没有深入研究,重点钻研了wifidog,Wifidog也是OpenWRT和DD-WRT中实现Portal比较出名的。

但是,Wifidog只是实现AP认证网关,需要配合外部的Portal服务器才能使用,Portal主要是提供认证所需的WEB页面且实现认证计费等的 功能。虽然这也有很多商用解决方案,例如wiwiz、wifiap等,但是这些商业解决方案的目标都是盈利,即使可以免费使用,免费账号的功能和权限都受 到了很大的限制,例如不能自定义页面,Web认证页面有广告等等。有条件的人可能打算自己搭建Portal服务器,但是看看Wifidog的官方 Wiki,对搭建过程实在是难以理解。后来,笔者发现网络上还有一个authpuppy方案,官方网站www.authpuppy.org,是一个已实现好的Wifidog认证服务器,里面包含各种插件供你使用,官方的安装过程也很简单,如果你懂的HTML和面向对象编程的相关知识且拥有一个服务器,可以自行修改认证页面,使用authpuppy也是一个不错的方案。

但是,即便如此,这些方案还是不够灵活,经过笔者认真钻研,查阅大量资料并经过多次抓包分析,终于理解了Wifidog的工作原理。接下来笔者将会跟你介 绍如何自行编写一个轻量级的Web Portal认证服务器。当然,这需要你具有程序设计基础,HTML、CSS当然是少不得的,后端开发语言可以使用PHP或Python或Java等。

首先,需要简单介绍一下Wifidog的工作原理:

1.客户端发出初始化请求,比如访问 www.baidu.com

2.网关的防火墙规则将这个请求重定向到本地网关的端口上。这个端口是Wifidog监听的端口。

3.Wfidog提供一个HTTP重定向回复,重定向到Web认证页面,重定向的Url的Querystring中包含了Gateway的ID,Gateway的FQDN以及其他的信息。

4.用户向认证服务器发出认证请求

http://portal_server:port/login_script?

gw_id=[GatewayID, default: “default”]

gw_address=[GatewayAddress, internal IP of router]

gw_port=[GatewayPort, port that wifidog Gateway is listening on]

url=[user requested url];

5.网关返回一个(可以是自定义的)splash(也称作“登录”)页面。

6.用户提供他的凭据信息,比如用户名和密码。

7.成功认证的话,客户端将会被重定向到网关的自己的web页面上,并且带有一个认证凭据(一个一次性的token),内容比如:

http://GatewayIP:GatewayPort/wifidog/auth?token=[auth token];

8.用户就是用获取到的凭据访问网关。

9.网关去认证服务器询问token的有效性。

10.认证服务器确认token的有效性。

11.网关发送重定向给客户端,以从认证服务器上获取 成功提示页面,重定向到 http://portal_server:port/portal_script 这个位置。

12.认证服务器通知客户请求成功,可以上网了。

图解:

图解Wifidog工作原理

然后考察一下Wifidog的配置文件/etc/wifidog.conf,关键的配置项是:

AuthServer {

Hostname             (Mandatory; Default: NONE)

SSLAvailable           (Optional; Default: no; Possible values: yes, no)

SSLPort               (Optional; Default: 443)

HTTPPort             (Optional; Default: 80)

Path                  (Optional; Default: /wifidog/ Note:  The path must be both prefixed and suffixed by /.  Use a single / for server root.)

LoginScriptPathFragment  (Optional; Default: login/? Note:  This is the script the user will be sent to for login.)

PortalScriptPathFragment (Optional; Default: portal/? Note:  This is the script the user will be sent to after a successfull login.)

MsgScriptPathFragment    (Optional; Default: gw_message.php? Note:  This is the script the user will be sent to upon error to read a readable message.)

PingScriptPathFragment    (Optional; Default: ping/? Note:  This is the script the user will be sent to upon error to read a readable message.)

AuthScriptPathFragment    (Optional; Default: auth/? Note:  This is the script the user will be sent to upon error to read a readable message.)

}

# Listen on this port

GatewayPort 2060

# Parameter: CheckInterval

# Default: 60

# Optional

#

# How many seconds should we wait between timeout checks.  This is also

# how often the gateway will ping the auth server and how often it will

# update the traffic counters on the auth server.  Setting this too low

# wastes bandwidth, setting this too high will cause the gateway to take

# a long time to switch to it’s backup auth server(s).

CheckInterval 60

# Parameter: ClientTimeout

# Default: 5

# Optional

#

# Set this to the desired of number of CheckInterval of inactivity before a client is logged out

# The timeout will be INTERVAL * TIMEOUT

ClientTimeout 5

AuthServer是Portal服务器的配置项;GatewayPort是Wifidog监听的地址,默认是2060,一般保持默认即 可;CheckInterval是心跳时长,单位是秒,什么是心跳呢,客户端认证成功之后,如果有网络访问动作,Wifidog getway就会每隔一段时间访问Portal服务器的一个脚本,用于认证计费,当然,如果客户使用超时或超流量,也可以通过心跳强制客户端下线。 ClientTimeout是用户一次认证成功后的网络访问时长,超过这个时间需要重新认证,这个时长并非由ClientTimeout单独决定,取决于 INTERVAL * TIMEOUT。详细的配置信息可以访问:http://dev.wifidog.org/browser/trunk/wifidog/wifidog.conf

我们重点讨论Portal服务器的配置项,Hostname是Portal服务器的ip或者是域名,SSLAvailable和SSLPort是SSL加 密配置,如果你的Portal服务器有配置HTTPS加密,则需要配置这两项;Path是指你的脚本路径(举例,http://a.com/to/,则 a.com是域名,/to/是路径),注意路径必须以“/”开头和结尾,如果是根路径,则填一个“/”即可;接下来的5个配置指明你的脚本名,这说明了我 们需要写五个脚本,我会详细说明。(以下文中涉及的“第几步”均是指Wifidog认证过程的步骤)

LoginScriptPathFragment配置项配置的是登陆脚本,它通过GET方式接受传入参数gw_address、gw_port、 gw_id、mac和url,gw_address是AP Getway的ip地址;gw_port是Wifidog监听的端口,即上面介绍的wifidog.conf中的GatewayPort配置;gw_id 是AP Getway的id,配置文件wifidog.conf中可以配置,默认值是default,这个值的作用是当存在多个AP是,服务器或管理员可以根据不 同的id确定用户的接入点;mac是客户计算机的网卡物理地址,注意不是AP网关的mac,这个mac是用来识别客户计算机的;url是客户初始访问的 Url,这些Querystring都是AP Getway向客户端发出重定向请求自动生成的。这个脚本同时需要提供登陆页面,如果登陆成功,需要向客户;端返回302重定向,重定向 到:http://gw_address:gw_port/wifidog/auth?token=[token];即实现第7步,其中[token]是 你自己自动生成的token字符串,随机生成一个字符串即可,但是长度最好长些,安全性更高,另外,token需要根据不同用户保存,最好保存于数据库 中,之后的AP Getway询问token有效性(第9步)还需要用到。这里最好使用cookie或session,使之后的登陆成功页面可以判断用户已经成功,阻止未 登录成功的人访问认证成功页面。

PortalScriptPathFragment配置项配置的是登陆成功后服务器展示的脚本(第11步),它通过GET方式接受1个传入参 数,gw_id,这个脚本比较简单,告知用户登陆成功即可,当然,最好重定向到用户之前想要方位的url,即第1步用户输入的URL。

MsgScriptPathFragment配置项配置的是错误信息展示脚本,它通过GET方式接受一个传入参数message,这个脚本也很简单,展示 message的内容即可,目的是当认证过程出现错误,AP Getway会重定向到这个脚本,URL中含有错误的信息。

PingScriptPathFragment配置项配置的是心跳脚本,这个脚本它通过GET方式接受5个传入参 数,gw_id,sys.uptime,sys.memfree,sys.load,wifidog.uptime,其中,sys.uptime指的是 AP Getway的启动时间,sys.memfree指的是AP Getway的空闲内存,sys.load指的是AP Getway的CPU负载,wifidog.uptime指的是wifidog的启动时间,这个脚本每隔一段时间(Wifidog.conf里配置的 CheckInterval),Wifidog会自动访问,但是其目的不是用户验证,而是帮助管理员管理AP节点,了解AP节点的负载情况,适时增加节点 等,Wifidog访问这个脚本时,需要这个脚本返回Pong,如果你没有统计AP节点负载数据的需求,可以丢弃这些数据,直接回应Pong,注意,这个 回应只包含“Pong”字符串,无需包含其他html标签。

AuthScriptPathFragment是用户认证脚本,实现的是第10步的功能,这个脚本它通过GET方式接受7个传入参数:stage、ip、 mac、token、incoming、outcoming和gw_id。其中stage的值是login,ip是客户端的ip,注意不是AP Getwap的ip;mac是客户端的网卡物理地址,token就是你在认证脚本生成并返回给客户端的;incoming和outcoming用于流量控 制,默认值为0;gw_id同上。如何识别用户登录成功,通过mac和token吧,LoginScriptPathFragment登陆脚本在用户登陆 成功后需要记录用户的mac和token,然后在此处验证,如果匹配,回复Auth: 1,否则,回复Auth: 0。另外,这个脚本也是心跳脚本,每隔一段时间Wifidog会自动访问,如果用户使用时间超过限制或流量超过额度,服务器可以及时回应Auth: 0结束用户的访问。另外需要注意的是,回应同样无需包含html标签,另外,在Auth后的冒号和0/1之间,有一个空格,缺少这个空格也会导致出错。

在配置Wifidog的配置文件wifidog.conf是,配置脚本的配置项都必须以“?”结尾,否则以GET方式传递的QueryString会因Url缺少问号访问错误的脚本。

看到了吧,仅仅5个简单脚本,就可以实现利用Wifidog的Portal认证,当然,这过中还可以有很多应用尚未发掘,比如流量控制、带宽控制、结合 Radius服务器实现认证等,你的开发也可以更上一层楼,实现更多功能。不过笔者还有一个建议,在登录页面除了用户名和密码意外,最好加个验证码,防止 不怀好意之人暴力破解。

这样,你只需要一个免费的空间,甚至是简单的百度云、新浪SAE等,就可以实现一个认证服务器;有的人可能还会问,能不能把这些脚本集成到路由器当中,我 的回答是能,只要你的脚本的功能不多,问题应该不大,但是这么做的风险比较大,路由的负载比较高,导致路由的运行会很不稳定,甚至经常死机,这也是笔者亲 身实践的结果,所以笔者不建议这么做。

最后啰嗦提醒的是,WiFidog是使用iptables基于三层协议工作的,所以使用Wifidog的结果是,不仅是Wifi接入需要Portal认 证,有线接入同样需要认证。避免这种情况最简单的做法是设立mac白名单。可能有的人又会问,能不能做到仅是Wifi接入需要认证,有线接入的无需认证, 有的人可能想更上一层楼,能不能开两个Wifi,仅其中一个Wifi需要认证,另一个Wifi和有线网络不需要Portal认证,我的回答是能,至于具体 做法,以后再介绍。

[转载]Ecshop:后台添加新功能栏目以及管理权限设置 - 公明 - 博客园

mikel阅读(883)

转载Ecshop:后台添加新功能栏目以及管理权限设置 – 公明 – 博客园.

一、添加菜单项

打开 /admin/includes/inc_menu.php文件(后台框架左边菜单),在最后添加一行如下:

1$modules[’17_other_menu’][‘sns_list’] = ‘sns_list.php?act=list’;

ecshop默认一级菜单项有16项,所里这里的例子从17开始。当然这个key可以随便取的,index.php文件中对菜单用 了ksort排序。“17_other_menu” 表示一级菜单,“sns_list”表示二级菜单。等号后面的值表示该菜单栏目打开的页面链接。

二、配置菜单语言

打开 /languages/zh_cn/admin/common.php文件,添加语言

1$_LANG[’17_other_menu’] = ‘其它设置’;

2$_LANG[‘sns_list’] = ‘SNS管理’;

这时候,用管理员身份(admin用户)登录后台,便可看到新添加的菜单项了。因为admin的权限是“all”。如果后台有多个 管理员,比如ecshop商城的供货商们,或者其它管理人员(由admin创建的其它可登陆后台的账户),如果想让他们也拥有新添加菜单的查看权利,则必 须为他们分配该栏目的管理权限。

三、把新菜单加入权限列表

打开 /languages/zh_cn/admin/priv_action.php文件,在“权限管理的一级分组”注释行下面添加如下代码

1$_LANG[‘other_manager’] = ‘其它设置’;

这里的“other_manager”是该一级栏目的权限名称,这里和栏目名称“17_other_menu”保持一致,也可以随便取个名。这里以示区别,就没有和菜单名一样。

然后,添加二级栏目“sns_list”的权限名称。在本文件的最后添加即可

1//其它管理

2$_LANG[‘sns_list’] = ‘SNS管理’;

这里这个权限名称和二级菜单名是一致的。这两项现在在哪里呢?如下图

四、把一级菜单和二级菜单的权限关联起来

Ecshop:后台添加新栏目打开数据库,看到{pre}_admin_action表,新增两行数据。如下图

截图中第1列数据是action_id,是该表的自增主键。第2列数据是parent_id,来自上级的action_id。第3列数 据就是step3中定义的权限名(键)。这样的话,两种权限就联系起来了。到这里,打开后台“管理员列表”,点击“分派权限”的图标,便可以看到 step3示图所示权限了。用某后台用户勾选提交,该用户登陆后就能看到新增的菜单项了。\

mySQL语句:

INSERT INTO .`admin_action` (  `action_id` ,  `parent_id` ,  `action_code` ,  `relevance`  )  VALUES (  NULL , ‘6’, ‘shipment_view’,   );

微信自动查找附近的人打招呼

mikel阅读(1231)

最近发现按键精灵居然有手机版,刚刚弄的一个微信自动跟附近人打招呼的源码,配合微信伪装位置软件使用,效果更佳!

Dim 屏幕宽度, 屏幕高度
Dim intX, intY
Dim intX1, intY1
Dim intX2, intY2
Dim intX3, intY3
KeepScreen True
屏幕宽度 = GetScreenX()
屏幕高度 = GetScreenY()
If Not (屏幕宽度 = 1080 And 屏幕高度 = 1920) Then
        ShowMessage “屏幕分辨率必须是1080*1920,即将退出”
        Delay 500
        EndScript
End If
KeyPress “Home”
Delay 500
RunApp “com.tencent.mm”, “.plugin.nearby.ui.NearbyFriendsUI”
Delay 8000
Call 附近的人()
Delay 1000
Call 附近是否有人()
Delay 1000
Sub 附近是否有人()
FindPic 0, 0, 1080, 1920, “Attachment:2.png”, 0, 0.9, intX1, intY1
If intX1 > 0 And intY1 > 0 Then
ShowMessage “附近有人”
Call 点击打招呼()
Else
ShowMessage “附近没人”
EndScript
End If
End Sub
Sub 写字并发送()
InputText”你好,交个朋友吧”
End Sub
Sub 发送按钮找图()
FindColor 0, 0, 1080, 200, “1AC045”, 0, 0.9, intX3, intY3
If intX3 > 0 And intY3 > 0 Then
ShowMessage “准备发送”
Else
ShowMessage “发送失败”
EndScript
End If
End Sub
Sub 附近的人()
FindPic 0, 0, 540, 960, “Attachment:1.png”, 0, 0.9, intX, intY
//如果没有找到,intX和intY的值都会被置为-1
If intX > 0 And intY > 0 Then
ShowMessage “成功查找到附近的人”
Else
ShowMessage “查找到附近的人失败”
EndScript
End If
End Sub
Sub 打招呼找图()
FindColor 0, 0, 1080, 1920, “1AC045”, 0, 0.9, intX2, intY2
If intX2 > 0 And intY2 > 0 Then
ShowMessage”即将打招呼”
Else
ShowMessage”打招呼失败”
Delay 2000
EndScript
End If
End Sub
Sub 点击打招呼()
Tap intX1, intY1
Delay 1000
Call 打招呼找图()
Tap intX2+20, intY2+20
Delay 1000
Call 写字并发送()
Delay 1000
Call 发送按钮找图()
Delay 1000
Tap intX3, intY3
Delay 1000
KeyPress “Back”
Delay 1000
Tap intX1, intY1+200
Delay 1000
Call 打招呼找图()
Tap intX2+20, intY2+20
Delay 1000
Call 写字并发送()
Delay 1000
Call 发送按钮找图()
Delay 1000
Tap intX3, intY3
Delay 1000
KeyPress “Back”
Delay 1000
Tap intX1, intY1+400
Delay 1000
Call 打招呼找图()
Tap intX2+20, intY2+20
Delay 1000
Call 写字并发送()
Delay 1000
Call 发送按钮找图()
Delay 1000
Tap intX3, intY3
Delay 1000
KeyPress “Back”
Delay 1000
Tap intX1, intY1+600
Delay 1000
Call 打招呼找图()
Tap intX2+20, intY2+20
Delay 1000
Call 写字并发送()
Delay 1000
Call 发送按钮找图()
Delay 1000
Tap intX3, intY3
Delay 1000
KeyPress “Back”
Delay 1000
Tap intX1, intY1+800
Delay 1000
Call 打招呼找图()
Tap intX2+20, intY2+20
Delay 1000
Call 写字并发送()
Delay 1000
Call 发送按钮找图()
Delay 1000
Tap intX3, intY3
Delay 1000
KeyPress “Back”
Delay 1000
Tap intX1, intY1+1000
Delay 1000
Call 打招呼找图()
Tap intX2+20, intY2+20
Delay 1000
Call 写字并发送()
Delay 1000
Call 发送按钮找图()
Delay 1000
Tap intX3, intY3
Delay 1000
KeyPress “Back”
Delay 1000
Tap intX1, intY1+1200
Delay 1000
Call 打招呼找图()
Tap intX2+20, intY2+20
Delay 1000
Call 写字并发送()
Delay 1000
Call 发送按钮找图()
Delay 1000
Tap intX3, intY3
Delay 1000
KeyPress “Back”
Delay 1000
Tap intX1, intY1+1400
Delay 1000
Call 打招呼找图()
Tap intX2+20, intY2+20
Delay 1000
Call 写字并发送()
Delay 1000
Call 发送按钮找图()
Delay 1000
Tap intX3, intY3
Delay 1000
KeyPress “Back”
Delay 1000
Tap intX1, intY1+1600
Delay 1000
Call 打招呼找图()
Tap intX2+20, intY2+20
Delay 1000
Call 写字并发送()
Delay 1000
Call 发送按钮找图()
Delay 1000
Tap intX3, intY3
Delay 1000
KeyPress “Back”
Delay 1000
PutAttachment “”, “*.png”
End Sub
Sub 滑动()
Swipe 0, 1919, 24, 384
End Sub
For 4
Call 滑动()
Delay 2000
Call 点击打招呼()
Delay 1000
Next

营销不是没有底线的

mikel阅读(1005)

 友加被封了,都是营销的错吗?!

总是喜欢打擦边球,现在网络上微商增多,也让有关部门开始关注了网络营销,很多时候大家还沉浸在营销无底线的过去,不看看当下互联网不再是为所欲为的时代了,什么营销手法都赶上的时代已经过去了。

还是谨慎做好营销策划,别得不偿失,到时候封门就怪不得谁了。

吸引眼球也要适可而止,别什么招子都往上整,结果让人反感不说,还被拉黑。

这个买卖的世界,没有营销是万万不能的,最近看过一篇介绍黑帽SEO的文章,写了些见不得光的内幕,这些所谓的黑帽SEOer们过得都是见光死的生活,尽管一时暴富,但出来混总归是要还的,要不然就太不公平了。

建议做微商或者营销的朋友还是踏踏实实做推广,按套路出牌,不要轻易触碰底线,在灰色地带折腾迟早会出事儿。

新东西出来很多人好奇,但是真正认真使用的人很少,就像营销方法,很多人用,都是表面那些发发帖子,转转微信,然后就好像没事儿了,坐等客户来,守株待兔。

有些人总是在创新,互联网本来就是个新东西的集散地,每天都有新的产品上线,做互联网营销就应该有尝鲜儿的本能,不要总是慢半拍,新东西出来就要研究出它的原理和使用心得,然后化为己用这样才能不被淘汰。

啥叫创新,不是从无到有你造个东西出来,普通的东西进行微创新就ok了。

就比如我在卖的充电宝,没啥的说白了就是个大电池,为啥我这个卖得很好,只是简单的微创新加了个手电筒,加上贴心的用户关怀:提供多接口的手机数据线,就弄得人爱不释手。

可能觉得没啥新意,不算什么,可是真正能做出产品的又有几家,淘宝上搜了搜同价位的,就干巴巴给根单接口的数据线算是有线了,有的甚至连线都没有,你让用户充电自备手机线是没错,可是大家用充电宝的时候又有几个天天带根线,要是手机多了,那还麻烦了。

现在人们买的不再是产品,而是感觉