美国空前成功的团购网站Groupon 获得巨大成功后,2010年新春以来 国内团购网站雨后春笋般的出现了,中国互联网领域突然掀起一股“团购网”创业热潮,上演了目前的千团大战。
美团网、拉手、爱赴团、聚划算、米团网、窝窝团、赶团网、团宝网、可可网、七七团、KK团。。。。其中 拉手还获得了风投的亲睐,迅速将团购城市从北京伸向全国各大城市。
本人是在今年4月知道团购这个模式的,起初也想弄一个团购站,但由于要上班,精力有限,还有秒杀网要弄,所以就没有弄团购站了。后来也不知道正在哪看到一个团购导航站点,该站点将其收录的所有团购站的团购信息集中到一块,方便用户查找浏览,我觉得这样挺好,接下来就开始了我的团购网站的开发,为了起个好听的名字,我就叫它"嗨团",是从淘宝网的嗨淘网联想的。
各大有资源、有平台的门户站点也相继建立起团购站点,都来瓜分这个大蛋糕,腾讯QQ团、搜狐爱家团、新浪团、千橡集团的糯米团 等等。最后孰赢孰输,我想很快就能见分晓了。我们拭目以待。
如果有兴趣的可以看看我的 嗨团网 域名 http://www.hituan.net/ 只可惜 .com的域名已经被注册了。
从选择前台,到后台简单开发,用了一个晚上的时间,一直弄到凌晨3点半(杯具 第二天上班迟到,被扣了一百多)。
本站的所用到的简单技术:
1、数据缓存 网站自动定时更新
从数据库读取数据放入cache 记录 并设置过期时间为5分钟后
代码
private
double
createTimeSpan
=
300000
;
//
默认为5分钟
public
void
ProcessRequest(HttpContext context)
{
if
(System.Web.HttpContext.Current.Cache.Get(
"
createTime
"
)
!=
null
)
{
DateTime createTime
=
(DateTime)System.Web.HttpContext.Current.Cache.Get(
"
createTime
"
);
double
.TryParse(System.Configuration.ConfigurationManager.AppSettings[
"
createTimeSpan
"
].ToString(),
out
createTimeSpan);
TimeSpan sp
=
DateTime.Now
-
createTime;
if
(sp.TotalMilliseconds
>
createTimeSpan)
{
getItemList();
}
}
else
{
getItemList();
context.Response.Write(
"
refresh
"
);
}
}
网站前台用Ajax去请求后台文件 每5分钟请求一次(即从API中抓取数据,入库以及更新团购成交量等信息)
代码:
代码
1
function update() {
2
$.
get
(
"
UpdateItemList.ashx?rnd=
"
+
Math.random()
+
""
,
""
,
3
function(r) {
4
if
(r
==
"
refresh
"
) {;
5
location.href
=
window.location.href
6
}
7
})
8
}
9
update();
10
setInterval(update,
300000
);
2、图片延时加载
所有团购图片默认不显示,等网页加载完毕后用jQuery遍历去填充图片
13 if(arrImg!=""){ //arrImg 在后台生成好,已经放到前台了。
14 var arrImg=imgStr.split("|");
15 var imgsrc=new Array();
16 for(var i=0;i<arrImg.length;i++){
17 imgsrc[i]=arrImg[i];
18 }
19 var img=new Image(267,160);
20 $(function(){
21 $('.bigImg').each(function(i){
22 $(this).get(0).style.display="none";
23 img.src="uploadfile/"+imgsrc[i];
24 $(this).attr("src",img.src);
25 $(this).get(0).style.display="block";
26 });
27 });
28 }
3、动态采集所有团购站的API数据
分析API数据 并入库
具体的API格式 可以看这个地方:http://www.hituan.net/API/api.xml
从API采集数据入库
///
<summary>
///
从已知的API获取数据
///
</summary>
///
<returns></returns>
protected
void
getItemList()
{
DataTable dt
=
null
;
using
(DataSet ds
=
DataAccess.DbHelperSQL.Query(
"
select distinct API,siteID from tbl_API where ispublic ='1'
"
))
{
if
(ds
!=
null
&&
ds.Tables[
0
].Rows.Count
>
0
)
{
dt
=
new
DataTable();
dt.Columns.Add(
"
siteID
"
, Type.GetType(
"
System.Int32
"
));
dt.Columns.Add(
"
itemURL
"
, Type.GetType(
"
System.String
"
));
dt.Columns.Add(
"
webSiteName
"
, Type.GetType(
"
System.String
"
));
dt.Columns.Add(
"
siteUrl
"
, Type.GetType(
"
System.String
"
));
dt.Columns.Add(
"
city
"
, Type.GetType(
"
System.String
"
));
dt.Columns.Add(
"
title
"
, Type.GetType(
"
System.String
"
));
dt.Columns.Add(
"
image
"
, Type.GetType(
"
System.String
"
));
dt.Columns.Add(
"
startTime
"
, Type.GetType(
"
System.String
"
));
dt.Columns.Add(
"
endTime
"
, Type.GetType(
"
System.String
"
));
dt.Columns.Add(
"
value
"
,
typeof
(
float
));
dt.Columns.Add(
"
price
"
,
typeof
(
float
));
dt.Columns.Add(
"
rebate
"
,
typeof
(
float
));
dt.Columns.Add(
"
bought
"
, Type.GetType(
"
System.Int32
"
));
foreach
(DataRow dr
in
ds.Tables[
0
].Rows)
{
string
api
=
dr[
0
].ToString();
string
siteID
=
dr[
1
].ToString();
if
(
string
.IsNullOrEmpty(api)) {
continue
; }
string
xmlInfo
=
getXmlFileString(api).ToLower();
if
(
string
.IsNullOrEmpty(xmlInfo)) {
continue
; }
if
(
!
string
.IsNullOrEmpty(xmlInfo))
{
XmlDocument doc
=
new
XmlDocument();
try
{
doc.LoadXml(xmlInfo);
}
catch
{
continue
;
}
XmlNodeList nodes
=
doc.SelectNodes(
"
/urlset/url
"
);
if
(nodes
!=
null
)
{
foreach
(XmlNode node
in
nodes)
{
XmlNode NodeItemURL
=
node.SelectSingleNode(
"
loc
"
);
XmlNode NodeWebsite
=
node.SelectSingleNode(
"
data/display/website
"
);
XmlNode NodeSiteUrl
=
node.SelectSingleNode(
"
data/display/siteurl
"
);
XmlNode NodeCity
=
node.SelectSingleNode(
"
data/display/city
"
);
XmlNode NodeTitle
=
node.SelectSingleNode(
"
data/display/title
"
);
XmlNode NodeImage
=
node.SelectSingleNode(
"
data/display/image
"
);
XmlNode NodeStartTime
=
node.SelectSingleNode(
"
data/display/starttime
"
);
XmlNode NodeEndTime
=
node.SelectSingleNode(
"
data/display/endtime
"
);
XmlNode NodeValue
=
node.SelectSingleNode(
"
data/display/value
"
);
XmlNode NodePrice
=
node.SelectSingleNode(
"
data/display/price
"
);
XmlNode NodeRebate
=
node.SelectSingleNode(
"
data/display/rebate
"
);
XmlNode NodeBought
=
node.SelectSingleNode(
"
data/display/bought
"
);
string
itemURL
=
NodeItemURL.InnerText;
//
具体的团购地址
string
webSiteName
=
NodeWebsite.InnerText;
//
网站名称
string
siteUrl
=
NodeSiteUrl.InnerText;
//
具体城市的站点地址
string
city
=
NodeCity.InnerText;
//
城市
string
title
=
NodeTitle.InnerText;
//
团购标题
string
image
=
NodeImage.InnerText;
//
图片
string
startTime
=
NodeStartTime.InnerText;
//
开始时间
string
endTime
=
NodeEndTime.InnerText;
//
结束时间
string
value
=
NodeValue.InnerText;
///
/原价
decimal
price
=
Decimal.Parse(NodePrice.InnerText.Trim());
//
购买价格
decimal
rebate
=
0
;
decimal
.TryParse(NodeRebate.InnerText.Trim(),
out
rebate);
//
折扣
int
bought
=
Convert.ToInt32(NodeBought.InnerText.Trim());
//
已经购买人数
DataRow drr
=
dt.NewRow();
drr[
"
siteID
"
]
=
siteID;
drr[
"
itemURL
"
]
=
itemURL;
drr[
"
webSiteName
"
]
=
webSiteName;
drr[
"
siteUrl
"
]
=
siteUrl;
drr[
"
city
"
]
=
city;
drr[
"
title
"
]
=
title;
drr[
"
image
"
]
=
image;
drr[
"
startTime
"
]
=
startTime;
drr[
"
endTime
"
]
=
endTime;
drr[
"
value
"
]
=
value;
drr[
"
price
"
]
=
price;
drr[
"
rebate
"
]
=
rebate;
drr[
"
bought
"
]
=
bought;
dt.Rows.Add(drr);
}
}
}
}
double
.TryParse(System.Configuration.ConfigurationManager.AppSettings[
"
createTimeSpan
"
].ToString(),
out
createTimeSpan);
System.Web.HttpContext.Current.Cache.Add(
"
createTime
"
, DateTime.Now,
null
, DateTime.Now.AddMilliseconds(createTimeSpan), TimeSpan.Zero, System.Web.Caching.CacheItemPriority.Normal,
null
);
UpdateDataBase(dt);
}
if
(dt
!=
null
)
{
dt.Dispose();
}
}
}
5、首页团片展示 随即动态提取
随即的从数据库中提取正在团购的信息。
前台展示的方法:
代码
1
private
void
getItemList()
2
{
3
DataTable dt
=
null
;
4
if
(System.Web.HttpContext.Current.Cache.Get(
"
ItemList
"
)
!=
null
)
5
{
6
dt
=
(DataTable)System.Web.HttpContext.Current.Cache.Get(
"
ItemList
"
);
7
}
8
else
9
{
10
int
dataGridNum
=
33
;
//
团片展示显示的个数默认为33个
11
if
(System.Web.HttpContext.Current.Cache.Get(
"
datagridNum
"
)
!=
null
)
12
{
13
dataGridNum
=
(
int
)System.Web.HttpContext.Current.Cache.Get(
"
datagridNum
"
);
14
}
15
else
16
{
17
int
.TryParse(System.Configuration.ConfigurationManager.AppSettings[
"
datagridNum
"
].ToString(),
out
dataGridNum);
18
System.Web.HttpContext.Current.Cache.Add(
"
dataGridNum
"
, dataGridNum.ToString(),
null
, DateTime.Now.AddHours(
1
), TimeSpan.Zero, System.Web.Caching.CacheItemPriority.Normal,
null
);
19
20
}
21
string
SQL
=
@"
select top
"
+
dataGridNum.ToString()
+
"
list.*,site.sitename from tbl_itemlist list left join tbl_siteList site on list.siteid=site.id where closeDate>getdate() and picpath<>'' Order By NewID() asc,price asc
"
;
22
using
(DataSet ds
=
DataAccess.DbHelperSQL.Query(SQL))
23
{
24
if
(ds
!=
null
&&
ds.Tables[
0
].Rows.Count
>
0
)
25
{
26
27
int
createTimeSpan
=
300000
;
//
5分钟
28
if
(System.Web.HttpContext.Current.Cache.Get(
"
createTimeSpan
"
)
!=
null
)
29
{
30
createTimeSpan
=
Convert.ToInt32(System.Web.HttpContext.Current.Cache.Get(
"
createTimeSpan
"
).ToString());
31
}
32
else
33
{
34
int
.TryParse(System.Configuration.ConfigurationManager.AppSettings[
"
createTimeSpan
"
].ToString(),
out
createTimeSpan);
35
System.Web.HttpContext.Current.Cache.Add(
"
createTimeSpan
"
, createTimeSpan.ToString(),
null
, DateTime.Now.AddHours(
1
), TimeSpan.Zero, System.Web.Caching.CacheItemPriority.Normal,
null
);
36
}
37
dt
=
ds.Tables[
0
];
38
System.Web.HttpContext.Current.Cache.Add(
"
ItemList
"
, ds.Tables[
0
],
null
, DateTime.Now.AddMilliseconds(createTimeSpan), TimeSpan.Zero, System.Web.Caching.CacheItemPriority.Normal,
null
);
39
}
40
}
41
}
42
if
(dt
!=
null
)
43
{
44
this
.rptItemList.DataSource
=
dt;
45
this
.rptItemList.DataBind();
46
foreach
(DataRow dr
in
dt.Rows) {
47
sb.Append(dr[
"
PicPath
"
].ToString()
+
"
|
"
);
48
}
49
if
(sb.Length
<
1
) {
50
sb.Append(
"
"
);
51
}
52
}
53
}
6、将Unix timestamp 时间戳与目前的时间格式如(2010-10-59 10:59:59)之间的相互转化
我从有的团购站说 Unix timestamp 与具体的时间之间无法转化
代码
///
<summary>
///
根据时间戳返回团购具体的结束时间
///
</summary>
///
<param name="timeStamp"></param>
///
<returns></returns>
private
string
getRealTime(
string
timeStamp)
{
DateTime dtStart
=
TimeZone.CurrentTimeZone.ToLocalTime(
new
DateTime(
1970
,
1
,
1
));
long
lTime
=
long
.Parse(timeStamp
+
"
0000000
"
);
TimeSpan toNow
=
new
TimeSpan(lTime);
return
dtStart.Add(toNow).ToString(
"
yyyy-MM-dd hh:mm:ss
"
);
}
代码
private
string
DateString2TimeSpan(
string
DateString)
{
string
querySQL
=
"
select datediff(second,'1970/1/1 00:00:00','
"
+
DateString
+
"
')-8*60*60
"
;
return
DataAccess.DbHelperSQL.GetSingle(querySQL).ToString();
}