感觉没太看明白onboard是如何使用maven来管理项目依赖的

下载了onboard的源码,导入eclipse之后,pom文件各种报错,最主要是因为dependency的version问题,不明白为什么代码里的pom文件不写依赖版本是怎么通过编译的。 实际上,原生osgi应该是通过manifest中定义的import和export来管理依赖。结合maven的话,网上比较多的做法是使用maven进行依赖管理,然后通过maven-bundle-plugin在打包时自动生成manifest文件,并且把依赖的jar包装入,部署到容器中运行的。onboard应该也是用的这么一套东西吧。 但是在使用virgo的时候,virgo的做法是将需要的依赖包丢进容器的repository目录,实际上在构建onboard的步骤里,也确实有这么一步。 所以我猜测,pom文件里面,对依赖的描述,目的是为了生成manifest文件,以及第一次使用时打好依赖的bundle包,然后,我们把生成的bundle丢进virgo的repository里面;再然后,除非要添加新的依赖,否则我们的工程就不需要maven构建了,直接用生成好的manifest文件,扔到virgo里面运行就好了。。。因为所有依赖都已经在里面了 以上为一个初学者的个人猜测,不知道对不对,请大神指点一下


如何通过 ACE 实现管理一个或多个 OSGI 平台 中的BUNDLE ( 安装,启动,停止,卸载,查看状态)

Apache ACE [1] 是一个软件发布框架,用于管理和发布模块化软件的组件、配置数据、其他基于OSGi的产品以及相关目标系统。Apache ACE包含了一组OSGi包,允许开发者轻松管理软件组件安装中依赖关系、部署和反馈。 https://ace.apache.org/docs/index.html https://ace.apache.org/docs/shell-api.html 问题:如何通过 ACE 实现管理多个 OSGI SERVER 中的BUNDLE ( 安装,启动,停止,卸载,查看状态) 如果回复指教,万分感谢。 我的邮件:shengzizai@126.com 微信: wuxiangrensheng


Onboard插件编程指南

### 1概述 本篇指南将为你介绍如何从零开始实现一个Onboard插件 实现一个onboard插件需要完成两部分工作,分别为插件的前端和插件的后端。后端需要完成插件所需的领域模型、数据访问接口、业务类以及通过Controller实现的Rest API。前端需要完成插件所需的前端页面、描述样式的less文件以及描述页面交互逻辑的js文件。 ### 2插件后端 在编写onboard插件后端之前,我们先来看看一个插件示例的目录结构。 #### 2. 1目录结构 ├─pom.xml ├─osgi.bnd ├─src │ └─main │ ├─java │ │ └─com │ │ └─onboard │ │ └─plugin │ │ ├─sample │ │ │ ├─activity │ │ │ ├─api │ │ │ ├─impl │ │ │ ├─mapper │ │ │ ├─model │ │ │ ├─dto │ └─resources │ ├─com │ │ └─onboard │ │ └─plugin │ │ └─sample │ │ └─mapper │ ├─META-INF │ │ └─spring │ └─WEB-INF **Pom.xml** 文件用来管理插件所需的第三方依赖, **osgi.bnd** 管理plugin bundle中需要引入以及暴露的package,需要引用的Bundle等。 **Src** 目录中,com.onboard.plugin.sample中需要定义插件所需的业务接口。在其子package impl中完成接口的实现。 子package **activity** 中定义了当前业务所需要的回顾信息的生成方法。 子package **model** 中定义了插件所需的领域模型。 子package **mapper** 中定义了插件所需的数据访问接口。 子package **dto** 中定义了传输所需的DTO类。 子package **api** 中定义了插件所需的Controller来提供Rest API。 **Resource** 文件夹中, **com.onboard.plugin.sample.mapper** 中存放了mapper包中接口对应的 **mybatis** 配置文件。 **META-INF/spring** 文件夹中一般存放plugin.sample. **aop**.xml, plugin.sample. **osgi**.xml, plugin.sample. **git**.xml这三个文件。分别用来进行切面配置管理,osgi服务管理以及spring bean的声明。 **WEB-INF** 文件夹中存放web相关的配置,包括 **applicationContext**.xml, **applicationOSGI**.xml, **applicationSecurity**.xml, **dispatcher-servlet**.xml, **web**.xml文件。分别进行Bean的声明,OSGI服务的引用,安全认证的管理,web相关配置等。 #### 2. 2建立项目、引入第一方和第三方依赖 在写一个插件之前,我们需要建立一个maven项目,在项目根目录下创建一个pom.xml文件。 ![输入图片说明](http://d.pcs.baidu.com/thumbnail/60a66dcb50c71f7e0159404d88488d1f?fid=321279816-250528-458481449713399&time=1444719600&rt=sh&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-igCfb1isAOQL9WCojyypRvfixEU%3D&expires=2h&chkv=0&chkbd=0&chkpc=&dp-logid=6624675723551484499&dp-callid=0&size=c850_u580&quality=100 "在这里输入图片标题") 在其中,将parent设为onboard.parent,并定义插件的artifactId: 接下来,引入插件所需的第一方和第三方依赖,比如我们需要使用onboard中的回顾生成工具来生成回顾并需要spring security来做认证: ![输入图片说明](http://d.pcs.baidu.com/thumbnail/b6b16494024352397bd3669a89f7cfef?fid=321279816-250528-764039788443568&time=1444719600&rt=sh&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-VrhM1xTM9TboZsjGPTK3x5mt3tw%3D&expires=2h&chkv=0&chkbd=0&chkpc=&dp-logid=6624675723551484499&dp-callid=0&size=c850_u580&quality=100 "在这里输入图片标题") #### 2. 3设计数据库、使用自动化工具生成mapper和数据库映射实体类 (待补充) #### 2. 4设计领域模型 领域模型(domain model)是描述业务用例实现的对象模型。在onboard中领域模型有几种类型: Attachable: 可添加附件的对象。 Broadable: 可以进看板的对象。 Commentable:可以评论的对象。 Identifiable: 具有id和类型的对象。 Indexable: 可以被索引的对象。 Iterable: 可以进入迭代的对象。 Subscribable:可以被订阅的对象。 Taggable: 可以打标签的对象。 每种领域模型都可以通过实现接口来成为上述一种或几种类型的对象,每个领域模型一般都会继承数据库映射实体类。 插件开发者可以根据需求来实现自己的领域模型,放入com.onboard.plugin.\*.model中。 ##### 2. 5完成业务逻辑 首先在com.onboard.plugin.\*中定义一个业务接口。 在com.onboard.plugin.\*.impl中定义实现类,并通过@Service标注的方式装配Bean。 在META-INF/spring中plugin.git.xml中加入配置来支持Bean的自动装配: <context:component-scanbase-package=_"com.onboard.plugin.sample"_/> #####2.5.1 生成回顾 如果业务的某个表示创建、更新的方法需要生成activity,我们在实现业务类时需要完成一些额外的工作。 首先操作方法的目标类需要是一个Identifiable类。 其次Service的实现需要继承DefaultIdentifiableService或实现IdentifiableService接口。 然后需要在META-INF/spring文件夹中的plugin.xxx.osgi文件中声明一个OSGI服务来让Kernel监听到这个服务: > <service id="xxxService" interface="com.onboard.plugin.xxx.XxxService, com.onboard.service.common.identifiable.IdentifiableService" ref="xxxServiceBean" /> > 最后需要在com.onboard.plugin.xxx.activity包中完成Activity的生成类,并实现ActivityGenerator接口,并将其装配到Bean当中,并声明OSGI服务。 > <serviceid=_"xxxActivityGenerator"_interface=_"com.onboard.service.activity.ActivityGenerator"_ref=_"xxxActivityGeneratorBean"_/> > > ##### 2.5.2生成索引 生成索引与生成回顾类似,需要完成一些额外工作。 首先领域模型需要实现Indexable接口。 其次在com.onboard.plugin.xxx.index中建立类来需要实现IndexableService接口。 然后需要在META-INF/spring文件夹中的plugin.xxx.osgi文件中声明一个OSGI服务来让Kernel监听到这个服务: <service id="xxxService" interface="com.onboard.plugin.xxx.XxxService, com.onboard.service.index.custom. IndexableService" ref="xxxServiceBean" /> 最后声明OSGI服务,来注册到kernel中: <interface=_"com.onboard.service.index.custom.IndexableService"_ref=_"xxxIndexableServiceBean"_/> ##### 2.5.3生成通知 生成通知时,首先需要在com.onboard.plugin.xxx.notification.rule包中实现类继承抽象类SimpleNotificationRule来定义通知条件。 其次在com.onboard.plugin.xxx.notification.email中实现类继承抽象类AbstractEmailNotification,来定义通知模板。 最后在META-INF/spring中的plugin.xxx.osgi.xml中声明服务来让kernel监听到这个服务: <serviceid=_"xxxNotification"_interface=_" com.onboard.service.notification.NotificationMethod"_ref=_"xxxNotificationBean"_/> <serviceid=_"xxxNotificationRule"_interface=_" com.onboard.service.notification.NotificationRule"_ ref=_"xxxNotificationRuleBean"_/> #### 2.6完成REST API ##### 2.6.1 完成Security的配置 Onboard实现了前后端的分离,前端服务器和后端服务器使用BASIC AUTH的方式进行验证。 在plugin中需要完成Security的配置,在resource文件夹的WEB-INF中完成applicationSecurity.xml文件,在其中声明myEncoder和userDetialsServiceBean两个Bean。 <beans:beanid=_"myEncoder"_class=_"com.onboard.service.security.auth.CustomizedPasswordEncoder"_/> <beans:beanid=_"userDetailsServiceBean"_class=_"com.onboard.service.security.auth.UserAuthenticationService"_/> 定义需要进行拦截的url特征: <httpauto-config=_"true"_use-expressions=_"true"_create-session=_"stateless"_> <intercept-urlpattern=_"/\*\*"_access=_"isAuthenticated()"_/> <http-basic/> </http> 声明authentication-manager: <authentication-manager> <authentication-provideruser-service-ref=_"userDetailsServiceBean"_> <password-encoderref=_"myEncoder"_> <salt-sourceuser-property=_"salt"_/> </password-encoder> </authentication-provider> </authentication-manager> ##### 2.6.2完成web.xml和dispatcher-servlet.xml的配置 参照web.api bundle完成。 ##### 2.6.3DTO 在com.onboard.plugin.xxx.dto包中实现传输用的类。其中仅仅包含数据库中的字段和Getter setter方法。 ##### 2.6.4完成Controller 在com.onboard.plugin.xxx.api包中实现相关Controller 在osgi.bnd中可以设置plugin的uri的header,onboard插件统一命名规则为: {host}:{port}/plugins/${pluginName}/api/\*\*\* Controller中我们推荐使用Rest风格的URL设计。 ### 3插件前端 前端插件的编写主要使用了AngularJS框架,并通过Theamleaf将插件所有的JavaScript文件、Less/Css文件以及Html文件引入Onboard之中。 #### 3.1目录结构 ├─src └─main └─resources ├─static │ ├─js │ │ └─ng-modules │ │ └─plugin │ │ └─插件js文件 │ └─less │ └─插件less文件 └─templates └─plugin └─插件html文件 #### 3.2JaveScript 不同插件所使用的Js文件不允许出现同名,否则会产生覆盖的情况。 任意一个插件注册时需要在主要的Js文件中书写一下语句,以将插件的Module注入到Onboard的Module中: angular.module('onboard').requires.push('pluginName'); angular.module('pluginName',['plugin']) .run(['pluginService', **function** (pluginService) { // 通过PluginService内方法将插件入口写入Onboard }]); 根据插件入口类型的不同,一共有7种不同的入口,分别为: - pluginService.registerDrawer方法,插件为右边展开的Drawer > 其参数需要包含有: > > { > > name: 'drawerSample', // 插件名 > > template: 'drawerSample.html' // 插件模板 > > size: 'drawer-fl' // 插件窗口大小(可选) > > } - pluginService.registerTab方法,插件为Drawer页面的Tab > 其参数需要包含有: > > { > > name: 'tabSample', // 插件名 > > title: '样例TAB', // 插件所展示的Tab名称 > > templateUrl: 'tabSample.html' // 插件模板 > > } - pluginService.registerCompanyPlugin方法,插件为团队层面的插件,展示于团队选择页面Header > 其参数需要包含有: > > { > > title: '团队层-样例插件', // 插件名称 > > 'ui-sref': 'companyPluginSample' // 插件页面路由 > > } - pluginService.registerProjectPlugin方法,插件为项目层面的插件,展示于项目选择页面Header 其参数需要包含有: > { > > title: '项目层-样例插件', // 插件名称 > > 'ui-sref': 'projectPluginSample' // 插件页面路由 > > } - pluginService.registerSidePlugin方法,插件为项目层面的插件,展示于项目页面左侧边栏 > 其参数需要包含有: > > { > > icon: 'fa-plug', // 标签图标 > > title: '项目插件', // 插件名称 > > 'ui-sref': 'sidebarPluginSample' // 插件页面路由 > > } - pluginService.registerAccountPlugin方法,插件为个人设置层面的插件,展示于个人设置页面 > 其参数需要包含有: > > { > > title: '个人设置-样例插件', // 插件名称 > > 'ui-sref': 'account.accountPluginSample' // 插件页面路由 > > } - pluginService.registerFooterPlugin方法,插件为项目层面的插件,展示于项目页面左侧边栏下方 > 其参数需要包含有: > > { > > icon: 'fa-plug', // 标签图标 > > title: '项目插件', // 插件名称 > > 'ui-sref': 'footerPluginSample' // 插件页面路由 > > } 其他JavaScript内容的书写遵循AngularJS规范即可使用。 #### 3.3Less/Css文件 将Less/Css文件放入对应的文件即可。 #### 3.4Html文件 在插件中Html文件使用Theamleaf渲染进主模板Onboard.html。故需要在插件的Html文件中通过th:fragment属性的方式将插件内容引入,其代码为: <scriptth:fragment=_"plugin"_type=_"text/ng-template"_id=_"pluginName"_> <div> … </div> </script> 其中带有th:fragment=_"plugin"_ 属性的元素会被引入至Onboard.html。`此处输入代码`


UpYun服务信息从哪里获取?

1. upyunImageService的属性信息bucketName,username, password 从哪里获取?需要自己在UpYun上注册账户吗 @Service("upyunImageServiceBean") public class UpyunImageServiceImpl implements ImageService { @Value("${upyun.bucketName}") private String bucketName; @Value("${upyun.username}") private String username; @Value("${upyun.password}") private String password; 2.运行Virgo时,有些模块找不到onboard.properties文件中定义的变量。


Onboard 部署是,Marven用的是哪个版本?知道的给说一下,感谢!

Onboard 部署是,Marven用的是哪个版本?知道的给说一下,感谢!


【新人求教】- HelloWorld 问题

gogo: IllegalArgumentException: Cannot coerce start(Long) to any of [(Bundle[])] 这段报错 怎么解决,是我的包有问题吗? 刚学 OSGI ,求各位大神指点


Onboard配置不起来啊?

太难配置了,就是整不起来,求指导


Onboard插件编程指南

# 1. 1概述 本篇指南将为你介绍如何从零开始实现一个Onboard插件 实现一个onboard插件需要完成两部分工作,分别为插件的前端和插件的后端。后端需要完成插件所需的领域模型、数据访问接口、业务类以及通过Controller实现的Rest API。前端需要完成插件所需的前端页面、描述样式的less文件以及描述页面交互逻辑的js文件。 1. 2插件后端 在编写onboard插件后端之前,我们先来看看一个插件示例的目录结构。 1. 1. 1目录结构 ├─pom.xml ├─osgi.bnd ├─src │ └─main │ ├─java │ │ └─com │ │ └─onboard │ │ └─plugin │ │ ├─sample │ │ │ ├─activity │ │ │ ├─api │ │ │ ├─impl │ │ │ ├─mapper │ │ │ ├─model │ │ │ ├─dto │ └─resources │ ├─com │ │ └─onboard │ │ └─plugin │ │ └─sample │ │ └─mapper │ ├─META-INF │ │ └─spring │ └─WEB-INF **Pom.xml** 文件用来管理插件所需的第三方依赖, **osgi.bnd** 管理plugin bundle中需要引入以及暴露的package,需要引用的Bundle等。 **Src** 目录中,com.onboard.plugin.sample中需要定义插件所需的业务接口。在其子package impl中完成接口的实现。 子package **activity** 中定义了当前业务所需要的回顾信息的生成方法。 子package **model** 中定义了插件所需的领域模型。 子package **mapper** 中定义了插件所需的数据访问接口。 子package **dto** 中定义了传输所需的DTO类。 子package **api** 中定义了插件所需的Controller来提供Rest API。 **Resource** 文件夹中, **com.onboard.plugin.sample.mapper** 中存放了mapper包中接口对应的 **mybatis** 配置文件。 **META-INF/spring** 文件夹中一般存放plugin.sample. **aop**.xml, plugin.sample. **osgi**.xml, plugin.sample. **git**.xml这三个文件。分别用来进行切面配置管理,osgi服务管理以及spring bean的声明。 **WEB-INF** 文件夹中存放web相关的配置,包括 **applicationContext**.xml, **applicationOSGI**.xml, **applicationSecurity**.xml, **dispatcher-servlet**.xml, **web**.xml文件。分别进行Bean的声明,OSGI服务的引用,安全认证的管理,web相关配置等。 1. 1. 2建立项目、引入第一方和第三方依赖 在写一个插件之前,我们需要建立一个maven项目,在项目根目录下创建一个pom.xml文件。 在其中,将parent设为onboard.parent,并定义插件的artifactId: <parent> <groupId>com.onboard</groupId> <artifactId>com.onboard.parent</artifactId> <version>3.0.0-SNAPSHOT</version> <relativePath>../../pom.xml</relativePath> </parent> <packaging>bundle</packaging> <artifactId>com.onboard.plugin.sample</artifactId> <name>com.onboard.plugin.sample </name> <description>com.onboard.plugin.sample </description> 接下来,引入插件所需的第一方和第三方依赖,比如我们需要使用onboard中的回顾生成工具来生成回顾并需要spring security来做认证: <dependencies> <dependency> <groupId>org.springframework.security</groupId> <artifactId>org.springframework.security.config</artifactId> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>org.springframework.security.web</artifactId> </dependency> <dependency> <groupId>com.onboard</groupId> <artifactId>com.onboard.service.activity</artifactId> <version>${project.version}</version> </dependency> </dependencies> 1. 1. 3设计数据库、使用自动化工具生成mapper和数据库映射实体类 (待补充) 1. 1. 4设计领域模型 领域模型(domain model)是描述业务用例实现的对象模型。在onboard中领域模型有几种类型: Attachable: 可添加附件的对象。 Broadable: 可以进看板的对象。 Commentable:可以评论的对象。 Identifiable: 具有id和类型的对象。 Indexable: 可以被索引的对象。 Iterable: 可以进入迭代的对象。 Subscribable:可以被订阅的对象。 Taggable: 可以打标签的对象。 每种领域模型都可以通过实现接口来成为上述一种或几种类型的对象,每个领域模型一般都会继承数据库映射实体类。 插件开发者可以根据需求来实现自己的领域模型,放入com.onboard.plugin.\*.model中。 1. 1. 5完成业务逻辑 首先在com.onboard.plugin.\*中定义一个业务接口。 在com.onboard.plugin.\*.impl中定义实现类,并通过@Service标注的方式装配Bean。 在META-INF/spring中plugin.git.xml中加入配置来支持Bean的自动装配: <context:component-scanbase-package=_"com.onboard.plugin.sample"_/> 1. 1. 1. 5.1生成回顾 如果业务的某个表示创建、更新的方法需要生成activity,我们在实现业务类时需要完成一些额外的工作。 首先操作方法的目标类需要是一个Identifiable类。 其次Service的实现需要继承DefaultIdentifiableService或实现IdentifiableService接口。 然后需要在META-INF/spring文件夹中的plugin.xxx.osgi文件中声明一个OSGI服务来让Kernel监听到这个服务: <service id="xxxService" interface="com.onboard.plugin.xxx.XxxService, com.onboard.service.common.identifiable.IdentifiableService" ref="xxxServiceBean" /> 最后需要在com.onboard.plugin.xxx.activity包中完成Activity的生成类,并实现ActivityGenerator接口,并将其装配到Bean当中,并声明OSGI服务。 <serviceid=_"xxxActivityGenerator"_interface=_"com.onboard.service.activity.ActivityGenerator"_ref=_"xxxActivityGeneratorBean"_/> 1. 1. 1. 5.2生成索引 生成索引与生成回顾类似,需要完成一些额外工作。 首先领域模型需要实现Indexable接口。 其次在com.onboard.plugin.xxx.index中建立类来需要实现IndexableService接口。 然后需要在META-INF/spring文件夹中的plugin.xxx.osgi文件中声明一个OSGI服务来让Kernel监听到这个服务: <service id="xxxService" interface="com.onboard.plugin.xxx.XxxService, com.onboard.service.index.custom. IndexableService" ref="xxxServiceBean" /> 最后声明OSGI服务,来注册到kernel中: interface=_"com.onboard.service.index.custom.IndexableService"_ref=_"xxxIndexableServiceBean"_/> 1. 1. 1. 5.3生成通知 生成通知时,首先需要在com.onboard.plugin.xxx.notification.rule包中实现类继承抽象类SimpleNotificationRule来定义通知条件。 其次在com.onboard.plugin.xxx.notification.email中实现类继承抽象类AbstractEmailNotification,来定义通知模板。 最后在META-INF/spring中的plugin.xxx.osgi.xml中声明服务来让kernel监听到这个服务: <serviceid=_"xxxNotification"_interface=_" com.onboard.service.notification.NotificationMethod"_ref=_"xxxNotificationBean"_/> <serviceid=_"xxxNotificationRule"_interface=_" com.onboard.service.notification.NotificationRule"_ ref=_"xxxNotificationRuleBean"_/> 1. 1. 6完成REST API 1. 6.1完成Security的配置 Onboard实现了前后端的分离,前端服务器和后端服务器使用BASIC AUTH的方式进行验证。 在plugin中需要完成Security的配置,在resource文件夹的WEB-INF中完成applicationSecurity.xml文件,在其中声明myEncoder和userDetialsServiceBean两个Bean。 <beans:beanid=_"myEncoder"_class=_"com.onboard.service.security.auth.CustomizedPasswordEncoder"_/> <beans:beanid=_"userDetailsServiceBean"_class=_"com.onboard.service.security.auth.UserAuthenticationService"_/> 定义需要进行拦截的url特征: <httpauto-config=_"true"_use-expressions=_"true"_create-session=_"stateless"_> <intercept-urlpattern=_"/\*\*"_access=_"isAuthenticated()"_/> <http-basic/> </http> 声明authentication-manager: <authentication-manager> <authentication-provideruser-service-ref=_"userDetailsServiceBean"_> <password-encoderref=_"myEncoder"_> <salt-sourceuser-property=_"salt"_/> </password-encoder> </authentication-provider> </authentication-manager> 1. 1. 1. 6.2完成web.xml和dispatcher-servlet.xml的配置 参照web.api bundle完成。 1. 1. 1. 6.3DTO 在com.onboard.plugin.xxx.dto包中实现传输用的类。其中仅仅包含数据库中的字段和Getter setter方法。 1. 1. 1. 6.4完成Controller 在com.onboard.plugin.xxx.api包中实现相关Controller 在osgi.bnd中可以设置plugin的uri的header,onboard插件统一命名规则为: {host}:{port}/plugins/${pluginName}/api/\*\*\* Controller中我们推荐使用Rest风格的URL设计。 1. 3插件前端 前端插件的编写主要使用了AngularJS框架,并通过Theamleaf将插件所有的JavaScript文件、Less/Css文件以及Html文件引入Onboard之中。 1. 1. 1目录结构 ├─src └─main └─resources ├─static │ ├─js │ │ └─ng-modules │ │ └─plugin │ │ └─插件js文件 │ └─less │ └─插件less文件 └─templates └─plugin └─插件html文件 1. 1. 2JaveScript 不同插件所使用的Js文件不允许出现同名,否则会产生覆盖的情况。 任意一个插件注册时需要在主要的Js文件中书写一下语句,以将插件的Module注入到Onboard的Module中: angular.module('onboard').requires.push('pluginName'); angular.module('pluginName',['plugin']) .run(['pluginService', **function** (pluginService) { // 通过PluginService内方法将插件入口写入Onboard }]); 根据插件入口类型的不同,一共有7种不同的入口,分别为: pluginService.registerDrawer方法,插件为右边展开的Drawer 其参数需要包含有: { name: 'drawerSample', // 插件名 template: 'drawerSample.html' // 插件模板 size: 'drawer-fl' // 插件窗口大小(可选) } pluginService.registerTab方法,插件为Drawer页面的Tab 其参数需要包含有: { name: 'tabSample', // 插件名 title: '样例TAB', // 插件所展示的Tab名称 templateUrl: 'tabSample.html' // 插件模板 } pluginService.registerCompanyPlugin方法,插件为团队层面的插件,展示于团队选择页面Header 其参数需要包含有: { title: '团队层-样例插件', // 插件名称 'ui-sref': 'companyPluginSample' // 插件页面路由 } pluginService.registerProjectPlugin方法,插件为项目层面的插件,展示于项目选择页面Header 其参数需要包含有: { title: '项目层-样例插件', // 插件名称 'ui-sref': 'projectPluginSample' // 插件页面路由 } pluginService.registerSidePlugin方法,插件为项目层面的插件,展示于项目页面左侧边栏 其参数需要包含有: { icon: 'fa-plug', // 标签图标 title: '项目插件', // 插件名称 'ui-sref': 'sidebarPluginSample' // 插件页面路由 } pluginService.registerAccountPlugin方法,插件为个人设置层面的插件,展示于个人设置页面 其参数需要包含有: { title: '个人设置-样例插件', // 插件名称 'ui-sref': 'account.accountPluginSample' // 插件页面路由 } pluginService.registerFooterPlugin方法,插件为项目层面的插件,展示于项目页面左侧边栏下方 其参数需要包含有: { icon: 'fa-plug', // 标签图标 title: '项目插件', // 插件名称 'ui-sref': 'footerPluginSample' // 插件页面路由 } 其他JavaScript内容的书写遵循AngularJS规范即可使用。 1. 1. 3Less/Css文件 将Less/Css文件放入对应的文件即可。 1. 1. 4Html文件 在插件中Html文件使用Theamleaf渲染进主模板Onboard.html。故需要在插件的Html文件中通过th:fragment属性的方式将插件内容引入,其代码为: <scriptth:fragment=_"plugin"_type=_"text/ng-template"_id=_"pluginName"_> <div> … </div> </script> 其中带有th:fragment=_"plugin"_ 属性的元素会被引入至Onboard.html。


如何理解整体进度的统计图?

**回答:** 该统计图集中展现了某一时间范围间隔内(通常是一天)产生的活动数目、完成的任务个数、提交的代码次数以及增加的代码行数。其中有两个纵坐标轴,代码行数的纵坐标轴位于右侧,其余对应左边的纵坐标轴。点击图例,可以隐藏或显示对应的数据图形。