Bladeren bron

保存和更新部分数据的接口

sunyj 8 jaren geleden
bovenliggende
commit
094beb1eb5

+ 1 - 1
kanban-auth/src/main/java/com/uas/kanban/filter/SecurityInterceptor.java

@@ -47,7 +47,7 @@ public class SecurityInterceptor extends HandlerInterceptorAdapter {
 
 		// session 中不存在登陆信息
 		if (resourcePoint == null) {
-			logger.info("No session for path: " + url + " , redirecting to page: login...");
+			logger.info("No session for path: " + url + " , redirecting to page: login ...");
 			response.sendRedirect("login");
 			return false;
 		}

+ 32 - 1
kanban-common/src/main/java/com/uas/kanban/base/BaseController.java

@@ -38,6 +38,20 @@ public abstract class BaseController<T extends BaseEntity> {
 		return baseService.save(json);
 	}
 
+	/**
+	 * 保存部分数据(不对数据的非空等做检查)
+	 * 
+	 * @param json
+	 *            json格式的数据
+	 * @param request
+	 * @return 保存的数据
+	 */
+	@RequestMapping("/savePart")
+	@ResponseBody
+	public T savePart(@NotEmpty("json") String json, HttpServletRequest request) {
+		return baseService.savePart(json);
+	}
+
 	/**
 	 * 删除所有数据
 	 * 
@@ -65,7 +79,7 @@ public abstract class BaseController<T extends BaseEntity> {
 	}
 
 	/**
-	 * 根据id更新数据
+	 * 根据 code 更新数据
 	 * 
 	 * @param json
 	 *            json格式的数据
@@ -81,6 +95,23 @@ public abstract class BaseController<T extends BaseEntity> {
 		return baseService.update(json);
 	}
 
+	/**
+	 * 根据 code 更新部分数据(不对数据的非空等做检查)
+	 * 
+	 * @param json
+	 *            json格式的数据
+	 * @param request
+	 * @return 更新的数据条数
+	 * @throws OperationException
+	 * @throws IllegalArgumentException
+	 */
+	@RequestMapping("/updatePart")
+	@ResponseBody
+	public int updatePart(@NotEmpty("json") String json, HttpServletRequest request)
+			throws IllegalArgumentException, OperationException {
+		return baseService.updatePart(json);
+	}
+
 	/**
 	 * 获取所有数据
 	 * 

+ 86 - 3
kanban-common/src/main/java/com/uas/kanban/base/BaseDao.java

@@ -163,10 +163,40 @@ public class BaseDao<T extends BaseEntity> {
 	 * @throws IllegalStateException
 	 */
 	public T save(@NotEmpty("t") T t) throws IllegalArgumentException, IllegalStateException {
+		return save(t, true);
+	}
+
+	/**
+	 * 保存 json 所指定的字段
+	 * 
+	 * @param t
+	 *            the entity to save
+	 * @return the entity saved
+	 * @throws IllegalArgumentException
+	 * @throws IllegalStateException
+	 */
+	public T savePart(@NotEmpty("t") T t) throws IllegalArgumentException, IllegalStateException {
+		return save(t, false);
+	}
+
+	/**
+	 * Saves an entity (Object) and updates the @Id field
+	 * 
+	 * @param t
+	 *            the entity to save
+	 * @param checkFields
+	 *            是否对对象的字段进行检查,包括是否为空等
+	 * @return the entity saved
+	 * @throws IllegalArgumentException
+	 * @throws IllegalStateException
+	 */
+	private T save(@NotEmpty("t") T t, boolean checkFields) throws IllegalArgumentException, IllegalStateException {
 		if (!StringUtils.isEmpty(t.getCode())) {
 			throw new IllegalArgumentException("不能指定 code:" + t);
 		}
-		checkFields(t);
+		if (checkFields) {
+			checkFields(t);
+		}
 		t.init();
 		Key<T> key = datastore.save(t);
 		Object id = key.getId();
@@ -296,7 +326,7 @@ public class BaseDao<T extends BaseEntity> {
 	 * 
 	 * @param t
 	 *            the entity to update
-	 * @return the entity updated
+	 * @return number updated
 	 * @throws OperationException
 	 * @throws IllegalArgumentException
 	 */
@@ -311,7 +341,7 @@ public class BaseDao<T extends BaseEntity> {
 	 *            the entity to update
 	 * @param ignoreFields
 	 *            不更新的字段
-	 * @return the entity updated
+	 * @return number updated
 	 * @throws OperationException
 	 * @throws IllegalArgumentException
 	 */
@@ -323,6 +353,59 @@ public class BaseDao<T extends BaseEntity> {
 		return update(code, operations);
 	}
 
+	/**
+	 * 更新 json 所指定的字段
+	 * 
+	 * @param json
+	 *            json格式的数据
+	 * @return number updated
+	 * @throws NoSuchFieldException
+	 * @throws SecurityException
+	 */
+	public int updatePart(@NotEmpty("json") String json) {
+		JSONObject jsonObject = JSONObject.parseObject(json);
+		T t = JSONObject.parseObject(json, entityClass);
+		if (t == null) {
+			throw new IllegalArgumentException("解析得到的数据为空");
+		}
+		String code = t.codeNotEmpty();
+		jsonObject.remove("code");
+		UpdateOperations<T> operations = createUpdateOperations();
+		Set<String> keySet = jsonObject.keySet();
+		for (String key : keySet) {
+			Field field;
+			try {
+				field = entityClass.getDeclaredField(key);
+			} catch (NoSuchFieldException | SecurityException e1) {
+				throw new IllegalArgumentException("表中不存在该字段:" + key);
+			}
+			Object value = null;
+			int modifiers = field.getModifiers();
+			// 不处理static、final、transient修饰的变量(只处理普通成员变量)
+			if (Modifier.isStatic(modifiers) || Modifier.isFinal(modifiers) || Modifier.isTransient(modifiers)) {
+				continue;
+			}
+			try {
+				if (!field.isAccessible()) {
+					field.setAccessible(true);
+					value = field.get(t);
+					field.setAccessible(false);
+				} else {
+					value = field.get(t);
+				}
+			} catch (IllegalArgumentException | IllegalAccessException e) {
+				throw new IllegalStateException("通过反射自动构造 UpdateOperations 时出错", e);
+			}
+			// 如果值为空,则移除文档中的该字段
+			if (ObjectUtils.isEmpty(value)) {
+				operations.unset(key);
+			} else {
+				operations.set(key, value);
+			}
+		}
+		return update(code, operations);
+	}
+
 	/**
 	 * Update the given entity (by code)
 	 * 

+ 26 - 1
kanban-common/src/main/java/com/uas/kanban/base/BaseService.java

@@ -31,6 +31,18 @@ public abstract class BaseService<T extends BaseEntity> {
 		return baseDao.save(t);
 	}
 
+	/**
+	 * 保存部分数据(不对数据的非空等做检查)
+	 * 
+	 * @param json
+	 *            json格式的数据
+	 * @return 保存的数据
+	 */
+	public T savePart(@NotEmpty("json") String json) {
+		T t = baseDao.parse(json);
+		return baseDao.savePart(t);
+	}
+
 	/**
 	 * 删除所有数据
 	 * 
@@ -52,7 +64,7 @@ public abstract class BaseService<T extends BaseEntity> {
 	}
 
 	/**
-	 * 根据id更新数据
+	 * 根据 code 更新数据
 	 * 
 	 * @param json
 	 *            json格式的数据
@@ -65,6 +77,19 @@ public abstract class BaseService<T extends BaseEntity> {
 		return baseDao.update(t);
 	}
 
+	/**
+	 * 更新部分数据(不对数据的非空等做检查)
+	 * 
+	 * @param json
+	 *            json格式的数据
+	 * @return 更新的数据条数
+	 * @throws OperationException
+	 * @throws IllegalArgumentException
+	 */
+	public int updatePart(@NotEmpty("json") String json) throws IllegalArgumentException, OperationException {
+		return baseDao.updatePart(json);
+	}
+
 	/**
 	 * 获取所有数据
 	 * 

+ 11 - 1
kanban-console/src/main/java/com/uas/kanban/service/impl/GlobalParameterServiceImpl.java

@@ -32,6 +32,11 @@ public class GlobalParameterServiceImpl extends BaseService<GlobalParameter> {
 		return globalParameterDao.save(globalParameter);
 	}
 
+	@Override
+	public GlobalParameter savePart(@NotEmpty("json") String json) {
+		return save(json);
+	}
+
 	@Override
 	public int update(@NotEmpty("json") String json) throws IllegalArgumentException, OperationException {
 		GlobalParameter globalParameter = globalParameterDao.parse(json);
@@ -39,6 +44,11 @@ public class GlobalParameterServiceImpl extends BaseService<GlobalParameter> {
 		return globalParameterDao.update(globalParameter);
 	}
 
+	@Override
+	public int updatePart(@NotEmpty("json") String json) throws IllegalArgumentException, OperationException {
+		return update(json);
+	}
+
 	/**
 	 * 检查输入方式
 	 * 
@@ -49,7 +59,7 @@ public class GlobalParameterServiceImpl extends BaseService<GlobalParameter> {
 	 */
 	private void checkInputMode(@NotEmpty("globalParameter") GlobalParameter globalParameter) {
 		InputMode inputMode = globalParameter.getInputMode();
-		// 输入方式为 {@link InputMode.Radio} 时,需提供可选值
+		// 输入方式为 {@link InputMode.Radio} 或 {@link DropDownBox} 时,需提供可选值
 		if (inputMode != null) {
 			List<Object> optionalValues = globalParameter.getOptionalValues();
 			Integer defaultOptionalValueIndex = globalParameter.getDefaultOptionalValueIndex();

+ 10 - 0
kanban-console/src/main/java/com/uas/kanban/service/impl/KanbanInstanceServiceImpl.java

@@ -75,6 +75,11 @@ public class KanbanInstanceServiceImpl extends BaseService<KanbanInstance> imple
 		return kanbanInstanceDao.save(kanbanInstance);
 	}
 
+	@Override
+	public KanbanInstance savePart(@NotEmpty("json") String json) {
+		return save(json);
+	}
+
 	@Override
 	public int update(@NotEmpty("json") String json) throws IllegalArgumentException, OperationException {
 		// TODO 一个资源点只能为某个看板维护一个看板实例
@@ -82,6 +87,11 @@ public class KanbanInstanceServiceImpl extends BaseService<KanbanInstance> imple
 		checkParameters(kanbanInstance);
 		return kanbanInstanceDao.update(kanbanInstance);
 	}
+	
+	@Override
+	public int updatePart(@NotEmpty("json")String json) throws IllegalArgumentException, OperationException {
+		return update(json);
+	}
 
 	/**
 	 * 检查公共参数、模版参数等是否正确填写(没有遗漏参数、每个参数都有值并且类型匹配)

+ 10 - 0
kanban-console/src/main/java/com/uas/kanban/service/impl/KanbanServiceImpl.java

@@ -38,6 +38,11 @@ public class KanbanServiceImpl extends BaseService<Kanban> {
 		return kanbanDao.save(kanban);
 	}
 
+	@Override
+	public Kanban savePart(@NotEmpty("json") String json) {
+		return save(json);
+	}
+
 	@Override
 	public int update(@NotEmpty("json") String json) throws IllegalArgumentException, OperationException {
 		Kanban kanban = kanbanDao.parse(json);
@@ -46,6 +51,11 @@ public class KanbanServiceImpl extends BaseService<Kanban> {
 		return kanbanDao.update(kanban);
 	}
 
+	@Override
+	public int updatePart(String json) throws IllegalArgumentException, OperationException {
+		return update(json);
+	}
+
 	/**
 	 * 检查模版是否存在
 	 * 

+ 36 - 0
kanban-console/src/main/java/com/uas/kanban/service/impl/TemplateServiceImpl.java

@@ -21,6 +21,7 @@ import com.uas.kanban.model.Template;
 import com.uas.kanban.model.TemplateParameter;
 import com.uas.kanban.service.TemplateService;
 import com.uas.kanban.util.CollectionUtils;
+import com.uas.kanban.util.StringUtils;
 
 /**
  * 模版
@@ -55,6 +56,25 @@ public class TemplateServiceImpl extends BaseService<Template> implements Templa
 		return templateDao.save(template);
 	}
 
+	@Override
+	public Template savePart(String json) {
+		Template template = templateDao.parse(json);
+		// 可以不指定数据源
+		String dataSourceCode = template.getDataSourceCode();
+		if (!StringUtils.isEmpty(dataSourceCode)) {
+			checkDataSource(template.getDataSourceCode());
+		}
+		checkGlobalParameters(template.getGlobalParameterCodes());
+		// 保存时,不允许指定参数的 code
+		List<TemplateParameter> parameters = template.getParameters();
+		if (!CollectionUtils.isEmpty(parameters)) {
+			for (TemplateParameter parameter : parameters) {
+				parameter.init();
+			}
+		}
+		return templateDao.savePart(template);
+	}
+
 	@Override
 	public int update(@NotEmpty("json") String json) throws IllegalArgumentException, OperationException {
 		Template template = templateDao.parse(json);
@@ -72,6 +92,22 @@ public class TemplateServiceImpl extends BaseService<Template> implements Templa
 		return templateDao.update(code, operations);
 	}
 
+	@Override
+	public int updatePart(@NotEmpty("json") String json) throws IllegalArgumentException, OperationException {
+		Template template = templateDao.parse(json);
+		// 可以不指定数据源
+		String dataSourceCode = template.getDataSourceCode();
+		if (!StringUtils.isEmpty(dataSourceCode)) {
+			checkDataSource(template.getDataSourceCode());
+		}
+		checkGlobalParameters(template.getGlobalParameterCodes());
+		List<TemplateParameter> parameters = template.getParameters();
+		if (!CollectionUtils.isEmpty(parameters)) {
+			throw new OperationException("请单独更新模版参数");
+		}
+		return templateDao.updatePart(json);
+	}
+
 	/**
 	 * 检查数据源是否存在
 	 * 

+ 14 - 0
kanban-console/src/main/webapp/WEB-INF/views/console.html

@@ -11,7 +11,9 @@
 			<strong><li class="title">用户</li></strong>
 			<ol>
 				<li><a target="_blank">user/save?json={"name": "name","password": "password"}</a></li>
+				<li><a target="_blank">user/savePart?json={"name": "name","password": "password"}</a></li>
 				<li><a target="_blank">user/update?json={"code":"4EC2735D343","name": "name","password": "password"}</a></li>
+				<li><a target="_blank">user/updatePart?json={"code":"4EC2735D343","name": "name","password": "password"}</a></li>
 				<li><a target="_blank">user/delete/all</a></li>
 				<li><a target="_blank">user/delete/4EC2735D343</a></li>
 				<li><a target="_blank">user/get/all</a></li>
@@ -21,7 +23,9 @@
 			<strong><li class="title">资源点</li></strong>
 			<ol>
 				<li><a target="_blank">resourcePoint/save?json={"name": "name","password": "password"}</a></li>
+				<li><a target="_blank">resourcePoint/savePart?json={"name": "name","password": "password"}</a></li>
 				<li><a target="_blank">resourcePoint/update?json={"code":"4EC2735D343","name": "name","password": "password"}</a></li>
+				<li><a target="_blank">resourcePoint/updatePart?json={"code":"4EC2735D343","name": "name","password": "password"}</a></li>
 				<li><a target="_blank">resourcePoint/delete/all</a></li>
 				<li><a target="_blank">resourcePoint/delete/4EC2735D343</a></li>
 				<li><a target="_blank">resourcePoint/get/all</a></li>
@@ -35,7 +39,9 @@
 			<strong><li class="title">数据源</li></strong>
 			<ol>
 				<li><a target="_blank">datasource/save?json={"name": "UAS标准版", "driverClassName": "driver_class_name","password": "password","url": "url","username": "username"}</a></li>
+				<li><a target="_blank">datasource/savePart?json={"name": "UAS标准版", "driverClassName": "driver_class_name","password": "password","url": "url","username": "username"}</a></li>
 				<li><a target="_blank">datasource/update?json={"name": "UAS标准版", "driverClassName":"oracle.jdbc.driver.OracleDriver","code":"4EC3C69D011","password":"select!%23%25*(","url":"jdbc:oracle:thin:@192.168.253.6:1521:orcl","username":"UAS"}</a></li>
+				<li><a target="_blank">datasource/updatePart?json={"name": "UAS标准版", "driverClassName":"oracle.jdbc.driver.OracleDriver","code":"4EC3C69D011","password":"select!%23%25*(","url":"jdbc:oracle:thin:@192.168.253.6:1521:orcl","username":"UAS"}</a></li>
 				<li><a target="_blank">datasource/delete/all</a></li>
 				<li><a target="_blank">datasource/delete/4EC2735D343</a></li>
 				<li><a target="_blank">datasource/get/all</a></li>
@@ -47,7 +53,9 @@
 			<strong><li class="title">公共参数</li></strong>
 			<ol>
 				<li><a target="_blank">globalParameters/save?json={"name": "公共参数1","type": "String", "inputMode": "Radio", "optionalValues":["值1","值2"], "defaultOptionalValueIndex": 1}</a></li>
+				<li><a target="_blank">globalParameters/savePart?json={"name": "公共参数1","type": "String", "inputMode": "Radio", "optionalValues":["值1","值2"], "defaultOptionalValueIndex": 1}</a></li>
 				<li><a target="_blank">globalParameters/update?json={"code":"5061EE73213", "name": "公共参数3","type": "Number", "inputMode": "DropDownBox", "optionalValues":[21,3.8,12.12], "defaultOptionalValueIndex": 1}</a></li>
+				<li><a target="_blank">globalParameters/updatePart?json={"code":"5061EE73213", "name": "公共参数3","type": "Number", "inputMode": "DropDownBox", "optionalValues":[21,3.8,12.12], "defaultOptionalValueIndex": 1}</a></li>
 				<li><a target="_blank">globalParameters/delete/all</a></li>
 				<li><a target="_blank">globalParameters/delete/4EC2735D343</a></li>
 				<li><a target="_blank">globalParameters/get/all</a></li>
@@ -57,7 +65,9 @@
 			<strong><li class="title">模版</li></strong>
 			<ol>
 				<li><a target="_blank">template/save?json={"name": "name","content": "&lt;content&gt;&lt;/content&gt;","dataSourceCode":"4EC3C69D011","parameters":[{"name":"PU_NAME","type":"String"},{"name":"PU_DATE","type":"Date"}], "globalParameterCodes": ["5061DFD0811", "5061E8A3812"]}</a></li>
+				<li><a target="_blank">template/savePart?json={"name": "name","content": "&lt;content&gt;&lt;/content&gt;","dataSourceCode":"4EC3C69D011","parameters":[{"name":"PU_NAME","type":"String"},{"name":"PU_DATE","type":"Date"}], "globalParameterCodes": ["5061DFD0811", "5061E8A3812"]}</a></li>
 				<li><a target="_blank">template/update?json={"code":"4EC2735D343","name": "name","content": "&lt;content&gt;&lt;/content&gt;","dataSourceCode":"4EC3C69D011", "globalParameterCodes": ["5061DFD0811", "5061E8A3812"]}</a></li>
+				<li><a target="_blank">template/updatePart?json={"code":"4EC2735D343","name": "name","content": "&lt;content&gt;&lt;/content&gt;","dataSourceCode":"4EC3C69D011", "globalParameterCodes": ["5061DFD0811", "5061E8A3812"]}</a></li>
 				<li><a target="_blank">template/delete/all</a></li>
 				<li><a target="_blank">template/delete/4EC2735D343</a></li>
 				<li><a target="_blank">template/get/all</a></li>
@@ -71,8 +81,10 @@
 			<strong><li class="title">看版</li></strong>
 			<ol>
 				<li><a target="_blank">kanban/save?json={"name": "name","templateCodes":["500DE5D931C"],"display":"AutoSwitch","switchFrequency":5000, "iconCls":"grid-shortcut"}</a></li>
+				<li><a target="_blank">kanban/savePart?json={"name": "name","templateCodes":["500DE5D931C"],"display":"AutoSwitch","switchFrequency":5000, "iconCls":"grid-shortcut"}</a></li>
 				<!-- "templateCodes":"4ED1EA76E16" 或 "templateCodes":["4ED1EA76E16"]-->
 				<li><a target="_blank">kanban/update?json={"code":"506C9FB0311","name": "name","templateCodes":["4FF1AD1C411","4FF1F024412"],"display":"SplitScreen", "iconCls":"grid-shortcut"}</a></li>
+				<li><a target="_blank">kanban/updatePart?json={"code":"506C9FB0311","name": "name","templateCodes":["4FF1AD1C411","4FF1F024412"],"display":"SplitScreen", "iconCls":"grid-shortcut"}</a></li>
 				<li><a target="_blank">kanban/delete/all</a></li>
 				<li><a target="_blank">kanban/delete/4EC2735D343</a></li>
 				<li><a target="_blank">kanban/get/all</a></li>
@@ -82,7 +94,9 @@
 			<strong><li class="title">看版实例</li></strong>
 			<ol>
 				<li><a target="_blank">kanbanInstance/save?json={"globalParameters":[{"code":"5061DFD0811","type":"String","defaultOptionalValueIndex":1,"inputMode":"Radio","name":"公共参数1","optionalValues":["值1","值2"],"value":"值2"},{"code":"5061E8A3812","type":"Number","defaultOptionalValueIndex":1,"inputMode":"Radio","name":"公共参数2","optionalValues":[12,32],"value":12.0}],"kanbanCode":"50C01D61F19","parameters":{"4FF1F024412":[{"code":"50C00E19815","name":"pq_av","type":"Number","value":2},{"code":"50C010D1716","name":"ma_ad","type":"Date","value":2},{"code":"50C012E1817","name":"afd_ad","type":"String","value":2}],"4FF1AD1C411":[{"code":"50BFED83B13","name":"PU_NAME","type":"String","value":2},{"code":"50C00990C14","name":"as_type","type":"Number","value":2}]},"refreshFrequency":5000}</a></li>
+				<li><a target="_blank">kanbanInstance/savePart?json={"globalParameters":[{"code":"5061DFD0811","type":"String","defaultOptionalValueIndex":1,"inputMode":"Radio","name":"公共参数1","optionalValues":["值1","值2"],"value":"值2"},{"code":"5061E8A3812","type":"Number","defaultOptionalValueIndex":1,"inputMode":"Radio","name":"公共参数2","optionalValues":[12,32],"value":12.0}],"kanbanCode":"50C01D61F19","parameters":{"4FF1F024412":[{"code":"50C00E19815","name":"pq_av","type":"Number","value":2},{"code":"50C010D1716","name":"ma_ad","type":"Date","value":2},{"code":"50C012E1817","name":"afd_ad","type":"String","value":2}],"4FF1AD1C411":[{"code":"50BFED83B13","name":"PU_NAME","type":"String","value":2},{"code":"50C00990C14","name":"as_type","type":"Number","value":2}]},"refreshFrequency":5000}</a></li>
 				<li><a target="_blank">kanbanInstance/update?json={"code":"50C2C15A411","globalParameters":[{"code":"5061DFD0811","type":"String","defaultOptionalValueIndex":1,"inputMode":"Radio","name":"公共参数1","optionalValues":["值1","值2"],"value":"值2"},{"code":"5061E8A3812","type":"Number","defaultOptionalValueIndex":1,"inputMode":"Radio","name":"公共参数2","optionalValues":[12,32],"value":12.0}],"kanbanCode":"50C01D61F19","parameters":{"4FF1F024412":[{"code":"50C00E19815","name":"pq_av","type":"Number","value":2},{"code":"50C010D1716","name":"ma_ad","type":"Date","value":2},{"code":"50C012E1817","name":"afd_ad","type":"String","value":2}],"4FF1AD1C411":[{"code":"50BFED83B13","name":"PU_NAME","type":"String","value":2},{"code":"50C00990C14","name":"as_type","type":"Number","value":2}]},"refreshFrequency":5000}</a></li>
+				<li><a target="_blank">kanbanInstance/updatePart?json={"code":"50C2C15A411","globalParameters":[{"code":"5061DFD0811","type":"String","defaultOptionalValueIndex":1,"inputMode":"Radio","name":"公共参数1","optionalValues":["值1","值2"],"value":"值2"},{"code":"5061E8A3812","type":"Number","defaultOptionalValueIndex":1,"inputMode":"Radio","name":"公共参数2","optionalValues":[12,32],"value":12.0}],"kanbanCode":"50C01D61F19","parameters":{"4FF1F024412":[{"code":"50C00E19815","name":"pq_av","type":"Number","value":2},{"code":"50C010D1716","name":"ma_ad","type":"Date","value":2},{"code":"50C012E1817","name":"afd_ad","type":"String","value":2}],"4FF1AD1C411":[{"code":"50BFED83B13","name":"PU_NAME","type":"String","value":2},{"code":"50C00990C14","name":"as_type","type":"Number","value":2}]},"refreshFrequency":5000}</a></li>
 				<li><a target="_blank">kanbanInstance/delete/all</a></li>
 				<li><a target="_blank">kanbanInstance/delete/4EC2735D343</a></li>
 				<li><a target="_blank">kanbanInstance/get/all</a></li>