实现一个基于 SharePoint 2013 的 Timecard 应用(中)

门户视图

随着 Timecard 列表的增多,如何查找和管理这许多的 Timecard 也就成了问题。尤其对于团队经理而言,他除了自己填写的 Timecard,还要审核团队成员的 Timecard 任务更重。

这里我把实际的需求简化成为 2 个主要的视图(但能够提供的效果和实际需求其实是非常接近的):

  1. Time Window 视图
    这个视图列出当前用户在所有可以填写的时间窗口中是否提交了 Timecard,起到提醒的作用。
  2. Timecard 视图
    这个视图列出在 Timecard 网站中,所有当前用户参与(包括提交和审批 Timecard)的项目/组织中的 Timecard 的审批状态。方便了解自己的 Timecard 填报进展、方便团队经理查找还没有审批的 Timecard。

技术方案

2个门户视图有很多种技术方案来实现。

  • Content Query Web Part 或者 Content Search Web Part。实现第二个视图还勉强可以,注意,只是勉强。实现第一个视图需要 Group Count 功能,直接歇菜。Pass。
  • 可视化 Web Part。C# 开发,服务器(场)部署。可以利用服务器端的缓存技术来提高性能。不过,调试是个噩梦,不信你可以搬着指头数数你重启一次 Web Front 需要多少秒。
  • Sandbox Web Part。C# 开发,网站部署。具有上面服务器场方案的优点外也避免了它的缺点。不过 SharePoint 2013 叫大家不要用。
  • SharePoint Hosted App。JavaScript 开发,服务器(场)发布、网站部署。需要额外配置一个专用的 app 域名和证书。其实这个方案不错,扩展性也很好。但是相比下面的方案,实现显得复杂了点儿。(另外,如果有时间折腾,其实 Provider Hosted App 也可以考虑,这个甚至允许你用 PHP 来写。是那些不喜欢(不愿意喜欢)SharePoint 而又不得不用 SharePoint 的人的不二之选)。顺带提一句,所有 App 方案都有一个巨大初始的优势:调试。直接用 VS 调 JavaScript,那是相当喜闻乐见的。为什么说是“初始”的优势呢?因为一旦基本的 SharePoint 操作你都调得差不多了(熟练掌握)的时候,这个优势就慢慢消失了,那个时候,你的 JavaScript 代码其实已经不容易出现无法在 failure 函数里面捕获的错误了。
  • Embedded JavaScript,在网页上面嵌 JavaScript 代码。实现起来最简单,最好维护,对服务器端压力也最小,不刷屏,保护视力。就以上门户视图的需求来看,我选择这个方案。而且,这个方案的代码,搬到 SharePoint Hosted App 也不浪费的。

技术实现

JavaScript (SharePoint CSOM)开发,最烦的是其异步回调的机制。所有向服务器发送的操作,都要在回调函数里面收结果,然后你才能继续下一步的业务逻辑。

目前我找到的比较容易减轻这个症状的方案,是用 Deferred。先将调用服务器的操作用 Deferred 包装,然后用 $.when 来调用并捕获其返回结果。这样,至少形式上看上去,后续的业务逻辑操作是紧跟在前面一步的服务器调用后面的,看上去就舒服多了。

也有很多 JavaScript 的函数库提供了这个问题的解决方案,但在试用之后,我都放弃了。简单的问题还是用简单的方案吧。

为了说明这个实现方法,我们先看一个空的 Deferred 包装的 SharePoint 调用:

   1: return $.Deferred(function (dtd) {
   2:     var web = context.get_web();
   3:     sp.context.load(web);
   4:     var failure_callback = Function.createCallback(onSharePointFailed, dtd);
   5:     sp.context.executeQueryAsync(
   6:         function () {
   7:             var title = web.get_title();
   8:             dtd.resolve();
   9:         },
  10:         Function.createDelegate(this, failure_callback));
  11: }).promise();

上面的例子中,context 是在调用前初始化好了的 SharePoint Context 全局变量,而 onSharePointFailed 则是预先定义的出错回调函数。

通过上面这样的形式,就完成了一个最简单的 Deferred 封装。

为了使用上面的封装,我们先要将其放入一个函数中去:

   1: var spGetWeb = function () {
   2:     var web = context.get_web();
   3:     context.load(web);
   4:     var failure_callback = Function.createCallback(sp.Failed, dtd);
   5:     sp.context.executeQueryAsync(
   6:         function () {
   7:             var title = web.get_title();
   8:             dtd.resolve();
   9:         },
  10:         Function.createDelegate(this, failure_callback));
  11:     }).promise();
  12: }

好了,下面就可以开始调用了(这只是个例子,真的要调用,还是要做很多准备的,比如初始化 context 等等):

   1: $.when(spGetWeb())
   2:     .done(function(){
   3:         message.succeed("Web is ready.");
   4:         $.when(spGetList("Time Window"))
   5:             .done(function(){...})
   6:             .fail(function(){...});
   7:     })
   8:     .fail(function(){
   9:         message.error("Can‘t get the web.");
  10:     }}

上面的例子中,先调用了 spGetWeb,在成功以后(done),接着又调用了 spGetList。这样,原先像面条一样散落的回调业务逻辑,可以用比较人性化的方式呈现了,我们也好少死几个脑细胞。

下面的视频是实现的效果:

实现一个基于 SharePoint 2013 的 Timecard 应用(中),布布扣,bubuko.com

时间: 2024-10-27 13:51:01

实现一个基于 SharePoint 2013 的 Timecard 应用(中)的相关文章

实现一个基于 SharePoint 2013 的 Timecard 应用(下)

现在,基于 Timecard 数据来一点儿数据分析. 应用需求 对于 Timecard,分析下面 2 个方面: 对于单个项目,分析其中每个成员的工时占比,以此了解工作量分配,为组间人员调度提供参考. 对于整个公司,分析每周 Timecard 的总工时变化趋势,以此了解公司人员的利用率.过高,如100%(甚至超过 100%),或者过低的利用率都是不可取的. 应用设计 对于第一种分析,选择饼图比较合适.因为是针对每个项目的,所以,还要提供一个选择项目的选项.比如下面这样: 从设计图可以看出来,我们需

SharePoint 2013 文档库中PPT转换PDF

原文:SharePoint 2013 文档库中PPT转换PDF 通过使用 PowerPoint Automation Services,可以从 PowerPoint 二进制文件格式 (.ppt) 和 PowerPoint Open XML 文件格式 (.pptx) 转换为其他格式.例如,您可能需要将一批 PowerPoint 97–2003 文件升级到 Open XML 演示文稿文件.您还可以在“编辑”菜单中创建自定义操作,以允许用户按需创建 PDF 版本的演示文稿. 一.效果演示: 1.新建一

SharePoint 2013 的Master page 中引入Jquery

SharePoint 2013 的Master page 中引入Jquery 分类: JavaScript SharePoint2013-02-03 22:01 1978人阅读 评论(0) 收藏 举报 design managerjqueryjQueryJQUERYJqueryJQueryMaster pageSharePoint 2013引入 本文讲述如何在SharePoint 2013 的Master page 中引入Jquery. 在SharePoint 2013 的Master page

关于在SharePoint 2013(2010)中Javascript如何实现批量批准的自定义操作功能?

1.概述: SharePoint 2013(包括SharePoint 2010)提供了很方便的,多选的界面,但是很多操作还是不能批量进行,比如:批准的功能.如果您要解决方案不关心代码,那么请直接联系作者.如果您对技术感兴趣,那么下面的组合拳就是告诉你如何在2013的Ribbon的工具栏上实现这个小功能,整个实验必须要有SPD(SharePoint Designer 2013),要使用到Javascript的很多知识.作者完全从实际出发,应对了在这个过程中可能出现的各种各样的"状况",比

SharePoint 2013 代码获取图片库中的大图、小图、原图

SharePoint 2013中,上传一张图片,除原图外,默认生成一张大图.一张小图,可以根据自己的需要将不同的图运用在不同的位置. SPListItemCollection itemColl=GetPicLibraryItemColl(); SPWeb web = SPContext.Current.Web;SPFile sf = spfolder.Files[0];string folderUrl = sf.ParentFolder.Url; string fileName = sf.Nam

基于SharePoint 2013的论坛解决方案

前言 这是自己在空闲时间里,为了提高对SharePoint的认识和熟悉技术,做的一个Demo.可能不尽完善,但是基本功能都已经有了,欢迎大家评论和提意见.自己也会在把源代码放到Github上进行开源,和大家一起讨论和学习. 主要功能 论坛发帖 评论功能 消息管理 功能演示 论坛首页,左侧为分类选择菜单,可以通过点击进行右侧的筛选,利用SharePoint XsltListViewWebPart自带的筛选实现:右侧是论坛帖子展示,是XsltListViewWebPart,右上角有消息提醒模块,点击

BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第1章节--SharePoint 2013 介绍

BEGINNING SHAREPOINT? 2013 DEVELOPMENT 第1章节--SharePoint 2013 介绍 本章节中你将学到: 理解什么是SharePoint 了解SharePoint 2013 高级功能区域和用途 理解对于开发人员,这些功能区域和用途的相关性 SharePoint 2010 在产品生命中推出了重要革新.它是个一级平台:不仅使你能够使用大量开箱即用的功能管理协同,而且它也提供了丰富的开发平台.这使得开发解决方案变得强大而且相对直接.SharePoint 201

SharePoint 2013 Nintex Workflow 工作流帮助(一)

接下来一段时间的内容中,我们基于SharePoint 2013来了解一下Nintex Workflow的具体内容. 之前的几篇由于之前注册的时候选择了SharePoint 2010的版本,所以就基于2010了,这次我又重新注册了一个2013版本的. 直接查看工作流设计视图,我们点击设置,创建网站工作流这个菜单. 在左侧,有一系列的Workflow Action集合,处于不同的分组里,也就是设计器的Toolbox.可以用关键字搜索Action. 如何插入一个动作呢?在设计面板上点击开始和结束之间的

SharePoint 2013 开发——工作流架构

博客地址:http://blog.csdn.net/FoxDave SharePoint 2013的工作流较之前有了不同,第一次真正地作为独立的服务的概念推出了.这意味着SharePoint工作流不再运行于SharePoint服务中,而是在一个独立的服务器(Windows Azure Workflow场)处理.新的工作流架构基于Windows Workflow Foundation 4.0和.NET Framework 4.5,它们较之前的版本都有了很大的改进. SharePoint 2013工