在熟悉完下面这三种维度的创建方式之后,就可以开始创建我们的第一个 Cube 了。

SSAS 系列 - 自定义的日期维度设计

SSAS 系列 - 基于雪花模型的维度设计

SSAS系列 - 关于父子维度的设计

我们将使用下面的这些脚本来创建一些维度表和事实表,数据源的来源是 AdventureWorksDW2012,但由于数据列太多因此我精简了一些表并且自定义了 DimDate 表。

USE BIWORK_SSIS
GO
SET NOCOUNT ON
IF OBJECT_ID('FactInternetSales','U') IS NOT NULL
DROP TABLE FactInternetSales IF OBJECT_ID('FactResellerSales','U') IS NOT NULL
DROP TABLE FactResellerSales IF OBJECT_ID('DimEmployee','U') IS NOT NULL
DROP TABLE DimEmployee IF OBJECT_ID('DimDate','U') IS NOT NULL
DROP TABLE DimDate IF OBJECT_ID('DimProduct','U') IS NOT NULL
DROP TABLE DimProduct IF OBJECT_ID('DimProductSubcategory','U') IS NOT NULL
DROP TABLE DimProductSubcategory IF OBJECT_ID('DimProductCategory','U') IS NOT NULL
DROP TABLE DimProductCategory
GO CREATE TABLE DimDate
(
DateKey INT PRIMARY KEY,
ShortDateName NVARCHAR(12) NOT NULL,
FullDateName NVARCHAR(20) NOT NULL,
DayNumberOfWeek TINYINT NOT NULL,
DayNameOfWeek NVARCHAR(10) NOT NULL,
DayNumberOfMonth TINYINT NOT NULL,
DayNumberOfYear SMALLINT NOT NULL,
WeekNumberOfYear TINYINT NOT NULL,
IsWeekend NVARCHAR(7) NOT NULL,
IsLeapYear BIT NOT NULL,
MonthKey INT NOT NULL,
MonthNumberOfYear TINYINT NOT NULL,
MonthNameOfYear NVARCHAR(10) NOT NULL,
MonthNameWithYear NVARCHAR(20) NOT NULL,
CalendarQuarterKey INT NOT NULL,
CalendarQuarterNumber TINYINT NOT NULL,
CalendarQuarterNameWithYear NVARCHAR(20) NOT NULL,
CalendarSemesterNumber TINYINT NOT NULL,
CalendarYearKey SMALLINT NOT NULL,
CalendarYearName NVARCHAR(20) NOT NULL,
FiscalQuarterKey INT,
FiscalQuarterNumber TINYINT NOT NULL,
FiscalQuarterName NVARCHAR(20),
FiscalSemester TINYINT NOT NULL,
FiscalYearKey SMALLINT NOT NULL,
FiscalYearName NVARCHAR(20),
) DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME SELECT @StartDate = '2005-01-01',
@EndDate = '2013-12-31' WHILE (@StartDate <= @EndDate)
BEGIN
INSERT INTO DimDate
(
DateKey,
ShortDateName,
FullDateName,
DayNumberOfWeek,
DayNameOfWeek,
DayNumberOfMonth,
DayNumberOfYear,
WeekNumberOfYear,
IsWeekend,
IsLeapYear,
MonthKey,
MonthNumberOfYear,
MonthNameOfYear,
MonthNameWithYear,
CalendarQuarterKey,
CalendarQuarterNumber,
CalendarQuarterNameWithYear,
CalendarSemesterNumber,
CalendarYearKey,
CalendarYearName,
FiscalQuarterNumber,
FiscalSemester,
FiscalYearKey
)
SELECT CAST(CONVERT(VARCHAR(8),@StartDate,112) AS INT) AS 'DateKey',
CONVERT(VARCHAR(20), @StartDate,106) AS 'ShortDateName',
CONVERT(VARCHAR(2),DATENAME(DD,@StartDate))
+ ' '
+ DATENAME(MM,@StartDate)
+ ' '
+ CONVERT(CHAR(4), DATEPART(YY,@StartDate)) AS 'FullDateName', -- 1 July 2005
DATEPART(DW,@StartDate) AS 'DayNumberOfWeek',
DATENAME(DW,@StartDate) AS 'DayNameOfWeek',
DATENAME(DD,@StartDate) AS 'DayNumberOfMonth',
DATENAME(DY,@StartDate) AS 'DayNumberOfYear',
DATEPART(WW,@StartDate) AS 'WeekNumberOfYear',
CASE WHEN DATEPART(DW,@StartDate) IN (1,7)
THEN 'Weekend'
ELSE 'Weekday'
END AS 'IsWeekend',
CASE WHEN ((YEAR(@StartDate) % 4 = 0) AND (YEAR(@StartDate) % 100 != 0 OR YEAR(@StartDate) % 400 = 0))
THEN 1
ELSE 0
END AS 'IsLeapYear',
DATEPART(YY,@StartDate) * 100 + DATEPART(MM,@StartDate) AS 'MonthKey', --
DATEPART(MM,@StartDate) AS 'MonthNumberOfYear',
DATENAME(MM,@StartDate) AS 'MonthNameOfYear',
DATENAME(MM,@StartDate) + ' ' + CONVERT(CHAR(4),DATEPART(YY,@StartDate)) AS 'MonthNameWithYear', -- July 2005
DATEPART(YY,@StartDate) * 100 + DATEPART(QQ,@StartDate) AS 'CalendarQuarterKey', --
DATEPART(QQ,@StartDate) AS 'CalendarQuarterNumber',
'CY ' + CONVERT(CHAR(4),DATEPART(YY,@StartDate))
+ ' Qtr '
+ CONVERT(CHAR(1), DATEPART(QQ,@StartDate)) AS 'CalendarQuarterNameWithYear', -- CY 2005 Qtr 3
CASE WHEN DATEPART(MM,@StartDate) BETWEEN 1 AND 6
THEN 1
ELSE 2
END AS 'CalendarSemester',
DATEPART(YY,@StartDate) AS 'CalendarYearKey',
'CY ' + CONVERT(CHAR(4),DATEPART(YY,@StartDate)) AS 'CalendarYearName', -- CY 2005
CASE WHEN DATEPART(MM,@StartDate) BETWEEN 1 AND 6
THEN DATEPART(QQ,@StartDate) + 2
ELSE DATEPART(QQ,@StartDate) - 2
END AS 'FiscalQuarter',
CASE WHEN DATEPART(MM,@StartDate) BETWEEN 1 AND 6
THEN 2
ELSE 1
END AS 'FiscalSemester',
CASE WHEN DATEPART(MM,@StartDate) BETWEEN 1 AND 6
THEN DATEPART(YY,@StartDate)
ELSE DATEPART(YY,@StartDate) + 1
END AS 'FiscalYear' UPDATE DimDate
SET FiscalQuarterKey = FiscalYearKey * 100 + FiscalQuarterNumber, --
FiscalYearName = 'FY ' + CONVERT(CHAR(4), FiscalYearKey), -- FY 2006
FiscalQuarterName = 'FY ' + CONVERT(Char(4), FiscalYearKey) + ' Qtr ' + CONVERT(CHAR(1), FiscalQuarterNumber) -- FY 2006 Qtr 1
WHERE DateKey = CONVERT(INT,CONVERT(VARCHAR(8),@StartDate,112)) SET @StartDate = @StartDate + 1
END SELECT EmployeeKey,
ParentEmployeeKey,
EmployeeNationalIDAlternateKey,
CASE WHEN ISNULL(MiddleName,'') = '' THEN FirstName +' '+ LastName
ELSE FirstName +' '+ MiddleName +' '+LastName
END AS FullName,
Title
INTO DimEmployee
FROM AdventureWorksDW2012.dbo.DimEmployee SELECT ProductKey,
ProductAlternateKey,
ProductSubcategoryKey,
EnglishProductName,
StandardCost,
Color,
SafetyStockLevel,
ListPrice,
Class,
Size,
StartDate,
EndDate,
[Status],
ProductAlternateKey + ' (' + CONVERT (Char(10), StartDate, 120) + ')' AS ProductID
INTO DimProduct
FROM AdventureWorksDW2012.dbo.DimProduct SELECT ProductSubcategoryKey,
ProductSubcategoryAlternateKey,
EnglishProductSubcategoryName,
ProductCategoryKey
INTO DimProductSubcategory
FROM AdventureWorksDW2012.dbo.DimProductSubcategory SELECT ProductCategoryKey,
ProductCategoryAlternateKey,
EnglishProductCategoryName
INTO DimProductCategory
FROM AdventureWorksDW2012.dbo.DimProductCategory SELECT ProductKey,
OrderDateKey,
EmployeeKey,
SalesOrderLineNumber,
SalesOrderNumber,
UnitPrice,
ProductStandardCost,
SalesAmount
INTO FactResellerSales
FROM AdventureWorksDW2012.dbo.FactResellerSales SELECT ProductKey,
OrderDateKey,
DueDateKey,
ShipDateKey,
SalesOrderNumber,
SalesOrderLineNumber,
OrderQuantity,
UnitPrice,
SalesAmount
INTO FactInternetSales
FROM AdventureWorksDW2012.dbo.FactInternetSales ------------------------------------------------------------------------------
-- Add Primary Key Constraint
------------------------------------------------------------------------------
ALTER TABLE DimEmployee
ADD CONSTRAINT PK_EmployeeKey PRIMARY KEY CLUSTERED (EmployeeKey) ALTER TABLE DimProduct
ADD CONSTRAINT PK_ProductKey PRIMARY KEY CLUSTERED(ProductKey) ALTER TABLE DimProductSubcategory
ADD CONSTRAINT PK_SubcategoryKey PRIMARY KEY CLUSTERED(ProductSubcategoryKey) ALTER TABLE DimProductCategory
ADD CONSTRAINT PK_CategoryKey PRIMARY KEY CLUSTERED(ProductCategoryKey) ALTER TABLE FactInternetSales
ADD CONSTRAINT PK_InternetSales PRIMARY KEY CLUSTERED(SalesOrderNumber,SalesOrderLineNumber) ALTER TABLE FactResellerSales
ADD CONSTRAINT PK_ResellerSales PRIMARY KEY CLUSTERED(SalesOrderNumber,SalesOrderLineNumber) ------------------------------------------------------------------------------
-- Add Primary Key Constraint
------------------------------------------------------------------------------
ALTER TABLE FactResellerSales
ADD CONSTRAINT FK_Reseller_EmployeeKey FOREIGN KEY(EmployeeKey) REFERENCES DimEmployee(EmployeeKey) ALTER TABLE FactResellerSales
ADD CONSTRAINT FK_Reseller_ProductKey FOREIGN KEY(ProductKey) REFERENCES DimProduct(ProductKey) ALTER TABLE FactResellerSales
ADD CONSTRAINT FK_Reseller_OrderDateKey FOREIGN KEY(OrderDateKey) REFERENCES DimDate(DateKey) ALTER TABLE FactInternetSales
ADD CONSTRAINT FK_Internet_ProductKey FOREIGN KEY(ProductKey) REFERENCES DimProduct(ProductKey) ALTER TABLE FactInternetSales
ADD CONSTRAINT FK_Internet_OrderDateKey FOREIGN KEY(OrderDateKey) REFERENCES DimDate(DateKey) ALTER TABLE FactInternetSales
ADD CONSTRAINT FK_Internet_ShipDateKey FOREIGN KEY(ShipDateKey) REFERENCES DimDate(DateKey) ALTER TABLE FactInternetSales
ADD CONSTRAINT FK_Internet_DueDateKey FOREIGN KEY(DueDateKey) REFERENCES DimDate(DateKey) ALTER TABLE DimProduct
ADD CONSTRAINT FK_Product_SubcatetoryKey FOREIGN KEY (ProductSubcategoryKey) REFERENCES DimProductSubcategory (ProductSubcategoryKey) ALTER TABLE DimProductSubcategory
ADD CONSTRAINT FK_Subcategory_CatetoryKey FOREIGN KEY (ProductCategoryKey) REFERENCES DimProductCategory (ProductCategoryKey) SELECT * FROM DimEmployee
SELECT * FROM DimDate
SELECT * FROM DimProduct
SELECT * FROM DimProductSubcategory
SELECT * FROM DimProductCategory
SELECT * FROM FactResellerSales
SELECT * FROM FactInternetSales

下面可以看到维度表和事实表,其中包括了常用的时间维度,父子维度和雪花型维度的概念。另外要注意到 FactInternetSales 表中的 OrderDateKey, DueDateKey, ShipDateKey 都关联到了 DimDate 的主键 DateKey。 在后面有一个概念 Role-Playing Dimension 角色扮演维度就和这里的几个时间列有关。

创建数据源,数据源视图以及时间维度,父子维度,标准维度等过程就不再重复了,可以参照文章开头部分的几篇文章。

下面显示的是 Product 维度以及维度属性,同时有两个自定义的层次结构 Product by Category 和 Size by Color。

时间维度 - Date 以及两个自定义的属性层次结构 Calendar Date 和 Fiscal Date 。

父子维度 Employee -

创建完各个维度之后,我们将创建多维数据集 Cube。指定数据源视图 DSV_BIWORK,并选择事实表,这个向导将为每一个事实表创建一个度量值组,包含了由表中各列所创建的度量值。

有两个事实表,因此就有两个度量值组,并且向导将为非维度键的事实表中的每一个数值列创建一个度量值。由于我们这里不需要那么多,所以只选择部分度量值。另外要注意,度量值的名称源于事实表中的列,所有名称由可能相同。但是在多维数据集中,由于度量值的名称必须是唯一的,所以向导会在重复的度量值名称后添加所属的度量值组名称。

下一步的时候多维数据集的向导识别了度量值组即之前的事实表与之相关的维度表,因此这里全部会显示出来。

为多维数据集取一个名称并保存。

可以看到在 Cube 文件夹中出现一个 BIWORK_FirstCube.cube ,这就是我们创建好的多维数据集。 最左侧能看到度量值组和度量值,左下侧可以看到多维数据集中的维度。

那么要注意到我们在数据库中的维度是 DimDate ,但是在多维数据集中就变成了三个时间维度 Order Date,Due Date 和 Ship Daet,这三个多维数据集维度就是角色扮演维度 Role-Playing Dimension。 因为它们本身就是 DimDate, 但是由于 FactInternetSales 中有三个时间列 OrderDateKey, DueDateKey 和 ShipDateKey 都关联到了 DimDate 表中的 DateKey。因此如果就只有一个 Date 时间维度,那么就分不清这个时间维度到底是指的 Order Date , Due Date 还是 Ship Date,这就是角色扮演维度的产生的原因。

角色扮演维度解释了数据库维度 Database Dimension 和多维数据集维度 Cube Dimension 的差异。一个维度的属性和数据包含在分析服务数据库中,这就是数据库维度。一个多维数据集可能包含一个或多个多维数据集维度,它引用了数据库维度的属性和数据。

维度用法显示了各个多维数据集的维度是如何与度量值组进行关联的,交叉的内容显示了关联的维度属性。

部署这个项目然后到 Browser 浏览器中查看多维数据集,注意在 SQL Server 2012 版本中取消了之前在 SQL Server 2008 R2 版本中出现的能够显示多维数据的设计,而变成了在 SSRS 报表开发时的多维数据集的设计样式。 另外,添加了一个 Excel 连接,其实是要求开发者使用 Excel 在 Excel 中查看分析服务中多维数据集的数据。

部署完成后也可以到分析服务中查看多维数据集,左边可以看到数据库维度的 Date 维度,右边创建完一个 MDX 查询页面后可以看到多维数据集中的角色扮演维度以及其它维度,度量值组和度量值。

由于 Order Date 角色扮演维度在两个度量值组中同时出现,所以其实它就可以认为是 Date 维度,为了精简一下命名,可以先添加一个新的时间维度,然后再把 Order Date 维度给删除掉。

先添加一个时间维度。

可以看到与 FactResellerSales 的关联关系,是通过 OrderDateKey 进行关联的,同样的道理 FactInternetSales 也是这样关联的。

删除 Order Date 维度。

直接使用 Date 维度,这样名称更加简洁一下,它的作用和 Order Date 的作用是一样的。

再次部署之后,我们就可以看到一个比较简洁的 Order Date 维度的替身 Date 维度了。

可以在刚才看到的浏览器中打开 Excel  工具,在这里面就会自动加载多维数据集中的维度和度量值组。比如要查看 Internet Sales Amount 和 Reseller Sales Amount 在 Product Category 下的表现情况,那么就可以很容易的拖拽实现。

也可以通过 MDX 查询实现这样的效果,查询在 Product Category  成员下的 Internet Sales Amount 和 Reseller Sales Amount 的情况。

但是在 MDX 查询中可以看到查询出来的结果并没有良好的格式化,因此回到开发设计中对度量值进行格式化,右键属性。

Reseller Sales Amount - Format String - 输入下面的格式 ,同理 Internet Sales Amount 也这么选择,表示金额的格式。

而对于 Reseller Sales Count, Order Quantity 和 Internet Sales Count 就只需要像下面这样设置就可以了。

重新部署之后在 MDX 中查询的结果 -

在 Excel 中看到的结果 -

有的时候我们可能需要在 MDX 中做出这样的查询,即通过 Internet Sales Amount 和 Reseller Sales Amount 计算销售总额,会通过定义一个计算成员来实现。

WITH MEMBER [Measures].[Sales Amount Total]
AS
[Measures].[Internet Sales Amount] + [Measures].[Reseller Sales Amount]
,FORMAT_STRING ="$#,#"
SELECT {
[Measures].[Internet Sales Amount],
[Measures].[Reseller Sales Amount],
[Measures].[Sales Amount Total]
} ON COLUMNS,
NON EMPTY([Product].[Category].Members) ON ROWS
FROM [BIWORK_FirstCube]

如果是我们自己开发的 SSRS 报表来查询数据没有问题,但是可能有很多时候客户会直接从 Excel 上去查询这些数据,那么我们可以先在设计度量值的时候将这些总额设计好。可以通过在多维数据集中在某一个维度(一般指的是度量值维度)上添加一个计算成员,将相关的计算公式直接存储在这个成员中。

在多维数据集设计器中选择计算 Calculations 并在 Script Organizer 的第一个 Command 下右键新建一个计算成员。

定义一个名称并注意需要带上方括号 [Sales Amount Total],将两个度量值拖到 Expression 中,并在 Format string 中指定一个带字符串的金额格式。

部署项目并重新连接就能看到度量值组中多了一个计算成员,可以切换到代码模式,就能看到这个计算的成员的创建就已经在服务器端存在了,实际上这个创建计算成员的语法和我们在 MDX 查询的语法是一样的。

CALCULATE;
CREATE MEMBER CURRENTCUBE.[Measures].[Sales Amount Total]
AS [Measures].[Internet Sales Amount] + [Measures].[Reseller Sales Amount],
FORMAT_STRING = "$#,#",
VISIBLE = 1 ;

既然已经存在这个度量值计算成员了,那么就直接可以在 MDX 中查询了。

并且在 Excel 中也可以直接使用这个计算成员了,当然对于使用者来说这就是一个度量值。

在分析服务中创建计算成员一来可以提高计算成员(度量值)的重用性,二来这种常用的度量值计算成员放在一起也便于组织查看和管理,可以避免在各个客户端 MDX 查询中的计算成员创建的不统一,最后就是如果用户并不是使用我们自定义开发的报表,而是通过像 Excel 这种客户端的工具,常用的汇总计算成员事先定义好后面使用就很方便了。

更多 BI 文章请参看 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server) 如果觉得这篇文章看了对您有帮助,请帮助推荐,以方便他人在 BIWORK 博客推荐栏中快速看到这些文章。

微软BI 之SSAS 系列 - 实现Cube 以及角色扮演维度,度量值格式化和计算成员的创建的更多相关文章

  1. 微软BI 之SSAS 系列 - 多维数据集维度用法之一 引用维度 Referenced Dimension

    在 CUBE 设计过程中有一个非常重要的点就是定义维度与度量值组关系,维度的创建一般在前,而度量值组一般来源于一个事实表.当维度和度量值组在 CUBE 中定义完成之后,下一个最重要的动作就是定义两者之 ...

  2. 微软BI 之SSAS 系列 - 多维数据集中度量值设计时的聚合函数 (累加性_半累加性和非累加性)

    在 SSAS 系列 - 实现第一个 Cube 以及角色扮演维度,度量值格式化和计算成员的创建 中主要是通过已存在的维度和事实数据创建了一个多维数据集,并同时解释了 Role-Playing Dimen ...

  3. 微软BI 之SSAS 系列 - 在SQL Server 2012 中开发 Analysis Services Multidimensional Project

    SQL Server 2012 中提供了开发 SSAS 项目的两种模型,一种是新增加的 Tabular Model 表格模型,另一种就是原始的 Multidimensional Model 多维模型. ...

  4. 微软BI 之SSAS 系列 - 自定义的日期维度设计

    SSAS Date 维度基本上在所有的 Cube 设计过程中都存在,很难见到没有时间维度的 OLAP 数据库.但是根据不同的项目需求, Date 维度的设计可能不大相同,所以在设计时间维度的时候需要搞 ...

  5. 微软BI 之SSAS 系列 - 多维数据集维度用法之三 多对多维度 Many to Many

    开篇介绍 对于维度成员和事实数据直接的关系看到更多的可能还是一对一,一对多的关系.比方在事实维度(或退化维度)中一个订单和明细号组合而成的ID,对应的就是事实表中的一条数据,这就是一对一的关系.比方说 ...

  6. 微软BI 之SSAS 系列 - 多维数据集维度用法之二 事实维度(退化维度 Degenerate Dimension)

    这篇文章是基于上一篇 SSAS 系列 - 多维数据集维度用法之一 引用维度 Referenced Dimension 继续讲解多维数据集维度用法中的事实维度. 事实维度,顾名思义就是把事实表 Fact ...

  7. 微软BI 之SSRS 系列 - 在 Cube 中通过 MDX 查询实现基于父子递归关系的汇总报表

    之前我写了一篇在 SSRS 开发中处理这种父子关系的汇总与聚合的文章 (SSRS 系列 - 使用分组 Group 属性实现基于父子递归关系的汇总报表),示例中的查询是基于 SQL Server 关系型 ...

  8. 微软BI 之SSAS 系列 - 维度的优化,灌木丛属性关系,以及自然层次结构与非自然层次结构的概念

    维度的优化 在 SSAS 开发设计过程中,维度的优化非常重要,因为它在 SSAS 分析服务性能调优的过程中往往能起到一个非常重要的作用. 一般来说,对于 Cube 的性能优化第一步可能考虑的就是查看维 ...

  9. 微软BI 之SSAS 系列 - 基于雪花模型的维度设计

    基于雪花模型的维度以下面的 Product 产品与产品子类别,产品类别为例. DimProduct 表和 DimProductSubcategory 表有外键关系,而 DimProductSubcat ...

随机推荐

  1. 在delphi中嵌入脚本语言--(译)RemObjects Pascal Script使用说明(1)(译)

    翻譯這篇文章源於我的一個通用工資計算平台的想法,在工資的計算中,不可避免的需要使用到自定義公式,然而對於自定義公式的實現,我自己想了一些,也在網上搜索了很多,解決辦法大致有以下幾種: 1. 自己寫代碼 ...

  2. 支持xp风格的manifest

    MSDN 和一些网站上的manifest 有问题 ,  自己修改了一下加上Microsoft.VC80.DebugCRT 和 Microsoft.VC80.DebugMFC 就可以了.如果是relea ...

  3. 线程池大小设置,CPU的核心数、线程数的关系和区别,同步与堵塞完全是两码事

    线程池应该设置多少线程合适,怎么样估算出来.最近接触到一些相关资料,现作如下总结. 最开始接触线程池的时候,没有想到就仅仅是设置一个线程池的大小居然还有这么多的学问,汗颜啊. 首先,需要考虑到线程池所 ...

  4. C语言控制结构

    C语言流程控制 一.流程控制结构 (1)顺序结构:按书写顺序执行每一条语句. (2)选择结构:对给定的条件进行判断,根据判断结果决定执行哪一段代码. (3)循环结构:在给定条件成立的情况下,反复执行某 ...

  5. 解决警告 warning: directory not found for option

    解决方法: 选择项目名称----->Targets----->Build Settings----->Search Paths----->Library Search Path ...

  6. 【Devops】【docker】【CI/CD】关于jenkins构建成功后一步,执行的shell命令详解+jenkins容器运行宿主机shell命令的实现方法

    1.展示这段shell命令 +详解 #================================================================================= ...

  7. Java编解码分析

    一.为什么要编解码? 网络或磁盘传输的单位都是字节,平常我们使用的单位都是字符,所以数据需要在字节和字符之间进行转换. 二.编解码概念 1.编码:字符转换成字节 2.解码:字节转换成字符 三.常用字符 ...

  8. 吸血鬼猎人巴菲第一至八季/全集Buffy迅雷下载

    本季看点:<吸血鬼猎人巴菲>故事背景在现代,话说于每一个世代都会出现一个年青的女孩子,在人世间寻找及对付一些妖魔鬼怪,例如有吸血鬼.坏女巫等等邪恶的势力,而这个年青的女孩子则被称为Slay ...

  9. JQuery攻略(四)事件

    jQuery事件处理,鼠标的单击,双击,悬停,键盘按键,文本动画..... 此章节有 1.1被点击的按钮查找 1.2事件的自动触发 1.3点击之后禁用按钮 1.4鼠标事件 1.5焦点事件 1.6CSS ...

  10. 《Google Glass开发指南》

    <Google Glass开发指南> 基本信息 作者: BestApp工作室 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115349477 上架时间:2014-3-19 ...