From 1a6a40a34f118b7e82779bda98ccf52a4ba61e17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9C=8D=E9=9B=8D?= Date: Wed, 20 Jan 2016 11:37:29 +0800 Subject: [PATCH 01/21] change website --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 213e8322a..aa499bb8a 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ RAP通过GUI工具帮助WEB工程师更高效的管理接口文档,同时通 * 免费、开源,一切尽在掌握中! ### 如何使用RAP -1. 直接访问由作者维护的[rapapi.net](http://rapapi.net/) +1. 直接访问由作者维护的[rap.taobao.org](http://rap.taobao.org/) 2. 自己部署一个RAP服务器,参考最新Release部分 ### 快速上手 quick guide From 5e6a8c959c266ea1074a4c129ea8e05cad6771b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9C=8D=E9=9B=8D?= Date: Mon, 25 Jan 2016 11:22:28 +0800 Subject: [PATCH 02/21] fix #334 --- .../java/com/taobao/rigel/rap/api/web/action/OpenAPIAction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/taobao/rigel/rap/api/web/action/OpenAPIAction.java b/src/main/java/com/taobao/rigel/rap/api/web/action/OpenAPIAction.java index 41e12b2a0..411e3a4a2 100644 --- a/src/main/java/com/taobao/rigel/rap/api/web/action/OpenAPIAction.java +++ b/src/main/java/com/taobao/rigel/rap/api/web/action/OpenAPIAction.java @@ -130,7 +130,7 @@ public String querySchema() { public String queryRAPModel() throws UnsupportedEncodingException { Map resultMap = new HashMap(); Gson g = new Gson(); - Project p = projectMgr.getProjectSummary(projectId); + Project p = projectMgr.getProject(projectId); List aList = p.getAllAction(); Map mockDataMap = new HashMap(); From 735158357e40cef7cc8d5513615ca92f6c521a51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9C=8D=E9=9B=8D?= Date: Tue, 26 Jan 2016 09:04:53 +0800 Subject: [PATCH 03/21] fix access levels and change project summary --- .../rigel/rap/account/service/AccountMgr.java | 10 ------ .../account/service/impl/AccountMgrImpl.java | 34 ------------------ .../organization/service/OrganizationMgr.java | 21 +++++++++++ .../service/impl/OrganizationMgrImpl.java | 35 +++++++++++++++++++ .../organization/web/action/GroupAction.java | 4 +-- .../web/action/OrganizationAction.java | 8 ++--- .../organization/web/action/TeamAction.java | 13 +++++++ .../taobao/rigel/rap/project/bo/Project.java | 31 ++++++++++------ .../rap/project/dao/impl/ProjectDaoImpl.java | 2 +- .../project/service/impl/ProjectMgrImpl.java | 8 ++--- .../rap/project/web/action/ProjectAction.java | 19 +++++++--- .../workspace/web/action/WorkspaceAction.java | 4 +-- 12 files changed, 114 insertions(+), 75 deletions(-) diff --git a/src/main/java/com/taobao/rigel/rap/account/service/AccountMgr.java b/src/main/java/com/taobao/rigel/rap/account/service/AccountMgr.java index 09f4a0ee5..599496015 100644 --- a/src/main/java/com/taobao/rigel/rap/account/service/AccountMgr.java +++ b/src/main/java/com/taobao/rigel/rap/account/service/AccountMgr.java @@ -196,16 +196,6 @@ boolean updateProfile(int userId, String name, String email, */ List getUnreadNotificationList(int curUserId); - - /** - * user access validation - * - * @param userId - * @param projectId - * @return - */ - boolean canUserManageProject(int userId, int projectId); - int getUserNum(); void updateUser(User user); diff --git a/src/main/java/com/taobao/rigel/rap/account/service/impl/AccountMgrImpl.java b/src/main/java/com/taobao/rigel/rap/account/service/impl/AccountMgrImpl.java index 109acb60d..2b3330737 100644 --- a/src/main/java/com/taobao/rigel/rap/account/service/impl/AccountMgrImpl.java +++ b/src/main/java/com/taobao/rigel/rap/account/service/impl/AccountMgrImpl.java @@ -219,40 +219,6 @@ public List getUnreadNotificationList(int curUserId) { } - public boolean canUserManageProject(int userId, int projectId) { - String[] cacheKey = new String[]{CacheUtils.KEY_ACCESS_USER_TO_PROJECT, new Integer(userId).toString(), new Integer(projectId).toString()}; - - String cache = CacheUtils.get(cacheKey); - if (cache != null) { - return Boolean.parseBoolean(cache); - } - - User user = this.getUser(userId); - boolean canAccess = false; - Project project = projectMgr.getProject(projectId); - if (user.isUserInRole("admin")) { - canAccess = true; - } else if (user.getCreatedProjectList() != null) { - for (Project p : user.getCreatedProjectList()) { - if (p.getId() == projectId) { - canAccess = true; - } - } - } - if (project.getUserList() != null) { - for (User member : project.getUserList()) { - if (member.getId() == user.getId()) { - canAccess = true; - } - } - } - - CacheUtils.put(cacheKey, new Boolean(canAccess).toString()); - - return canAccess; - } - - public int getUserNum() { return accountDao.getUsertNum(); } diff --git a/src/main/java/com/taobao/rigel/rap/organization/service/OrganizationMgr.java b/src/main/java/com/taobao/rigel/rap/organization/service/OrganizationMgr.java index 3336469a5..61605fd0c 100644 --- a/src/main/java/com/taobao/rigel/rap/organization/service/OrganizationMgr.java +++ b/src/main/java/com/taobao/rigel/rap/organization/service/OrganizationMgr.java @@ -131,6 +131,26 @@ public interface OrganizationMgr { */ boolean canUserAccessCorp(int userId, int corpId); + + /** + * user access validation + * + * @param userId + * @param projectId + * @return + */ + boolean canUserManageProject(int userId, int projectId); + + + /** + * can user delete project + * + * @param userId + * @param projectId + * @return + */ + boolean canUserDeleteProject(int userId, int projectId); + /** * can user manage corporation * @@ -257,4 +277,5 @@ public interface OrganizationMgr { * @param c */ void updateCorporation(Corporation c); + } diff --git a/src/main/java/com/taobao/rigel/rap/organization/service/impl/OrganizationMgrImpl.java b/src/main/java/com/taobao/rigel/rap/organization/service/impl/OrganizationMgrImpl.java index ec6879dbe..579ed79a6 100644 --- a/src/main/java/com/taobao/rigel/rap/organization/service/impl/OrganizationMgrImpl.java +++ b/src/main/java/com/taobao/rigel/rap/organization/service/impl/OrganizationMgrImpl.java @@ -178,6 +178,41 @@ public boolean canUserAccessCorp(int userId, int corpId) { return organizationDao.isUserInCorp(userId, corpId); } + public boolean canUserManageProject(int userId, int projectId) { + String[] cacheKey = new String[]{CacheUtils.KEY_ACCESS_USER_TO_PROJECT, new Integer(userId).toString(), new Integer(projectId).toString()}; + + String cache = CacheUtils.get(cacheKey); + if (cache != null) { + return Boolean.parseBoolean(cache); + } + + User user = accountMgr.getUser(userId); + boolean canAccess = false; + Project project = projectMgr.getProjectSummary(projectId); + if (user.isUserInRole("admin")) { + canAccess = true; + } else if (project.getUserId() == userId) { + canAccess = true; + } else if (project.getUserList() != null) { + for (User member : project.getUserList()) { + if (member.getId() == user.getId()) { + canAccess = true; + break; + } + } + } + + CacheUtils.put(cacheKey, new Boolean(canAccess).toString()); + + return canAccess; + } + + public boolean canUserDeleteProject(int userId, int projectId) { + User user = accountMgr.getUser(userId); + Project project = projectMgr.getProjectSummary(projectId); + return user.isAdmin() || project.getUserId() == user.getId(); + } + public boolean canUserManageCorp(int userId, int corpId) { int roleId = organizationDao.getUserRoleInCorp(userId, corpId); diff --git a/src/main/java/com/taobao/rigel/rap/organization/web/action/GroupAction.java b/src/main/java/com/taobao/rigel/rap/organization/web/action/GroupAction.java index b4b37c3d6..88f2e2642 100644 --- a/src/main/java/com/taobao/rigel/rap/organization/web/action/GroupAction.java +++ b/src/main/java/com/taobao/rigel/rap/organization/web/action/GroupAction.java @@ -83,7 +83,7 @@ public String all() { List> projects = new ArrayList>(); for (Project projectModel : projectModelList) { if (getCurUser().isUserInRole("admin") - || getAccountMgr().canUserManageProject( + || organizationMgr.canUserManageProject( getCurUser().getId(), projectModel.getId())) { projectModel.setIsManagable(true); } @@ -93,7 +93,7 @@ public String all() { project.put("desc", projectModel.getIntroduction()); project.put("status", projectModel.getLastUpdateStr()); project.put("accounts", projectModel.getMemberAccountListStr()); - project.put("isManagable", projectModel.getIsManagable()); + project.put("isManagable", projectModel.isManagable()); project.put("creator", projectModel.getUser().getUserBaseInfo()); project.put("teamId", projectModel.getTeamId()); projects.add(project); diff --git a/src/main/java/com/taobao/rigel/rap/organization/web/action/OrganizationAction.java b/src/main/java/com/taobao/rigel/rap/organization/web/action/OrganizationAction.java index 94c642e44..17ce95175 100644 --- a/src/main/java/com/taobao/rigel/rap/organization/web/action/OrganizationAction.java +++ b/src/main/java/com/taobao/rigel/rap/organization/web/action/OrganizationAction.java @@ -144,18 +144,14 @@ public String projects() { for (Project p : projectList) { - if (curUser.isUserInRole("admin") - || getAccountMgr().canUserManageProject( - curUser.getId(), p.getId())) { - p.setIsManagable(true); - } Map map = new HashMap(); map.put("id", p.getId()); map.put("name", p.getName()); map.put("desc", p.getIntroduction()); map.put("status", p.getLastUpdateStr()); map.put("accounts", p.getMemberAccountListStr()); - map.put("isManagable", p.getIsManagable()); + map.put("isManagable", p.isManagable()); + map.put("isDeletable", p.isDeletable()); map.put("creator", p.getUser().getUserBaseInfo()); map.put("related", p.getUser().getId() != curUserId); map.put("teamId", p.getTeamId()); diff --git a/src/main/java/com/taobao/rigel/rap/organization/web/action/TeamAction.java b/src/main/java/com/taobao/rigel/rap/organization/web/action/TeamAction.java index 2b29fff39..b90ad8f8d 100644 --- a/src/main/java/com/taobao/rigel/rap/organization/web/action/TeamAction.java +++ b/src/main/java/com/taobao/rigel/rap/organization/web/action/TeamAction.java @@ -236,6 +236,19 @@ public String update() { c.setAccessType(getAccessType()); organizationMgr.updateCorporation(c); + return SUCCESS; + } + + public String search() { + User curUser = getAccountMgr().getUser(getCurUserId()); + if (curUser == null) { + setErrMsg(LOGIN_WARN_MSG); + setIsOk(false); + logger.error("Unlogined user trying to checkin and failed."); + return JSON_ERROR; + } + + return SUCCESS; } } diff --git a/src/main/java/com/taobao/rigel/rap/project/bo/Project.java b/src/main/java/com/taobao/rigel/rap/project/bo/Project.java index 49faf249f..5fce40bb7 100644 --- a/src/main/java/com/taobao/rigel/rap/project/bo/Project.java +++ b/src/main/java/com/taobao/rigel/rap/project/bo/Project.java @@ -36,9 +36,28 @@ public class Project implements java.io.Serializable { private List memberAccountList; private Set workspaceList = new HashSet(); private String version; - private boolean isManagable; private Set checkInList = new HashSet(); + public boolean isDeletable() { + return isDeletable; + } + + public void setIsDeletable(boolean isDeletable) { + this.isDeletable = isDeletable; + } + + private boolean isDeletable; + + public void setIsManagable(boolean isManagable) { + this.isManagable = isManagable; + } + + private boolean isManagable; + + public boolean isManagable() { + return isManagable; + } + public Project() { } @@ -267,15 +286,6 @@ public void update(Project project) { setIntroduction(project.getIntroduction()); setName(project.getName()); } - - public boolean getIsManagable() { - return isManagable; - } - - public void setIsManagable(boolean isManagable) { - this.isManagable = isManagable; - } - public String getCreateDateStr() { return getCreateDate() == null ? "" : DateUtils.DATE_FORMAT.format(getCreateDate()); } @@ -537,6 +547,7 @@ public boolean isUserMember(int userId) { return false; } + public enum TO_STRING_TYPE {TO_MODULE, TO_PAGE, TO_ACTION, TO_PARAMETER} public enum STAGE_TYPE {DESIGNING, DEVELOPING, DEBUGING} diff --git a/src/main/java/com/taobao/rigel/rap/project/dao/impl/ProjectDaoImpl.java b/src/main/java/com/taobao/rigel/rap/project/dao/impl/ProjectDaoImpl.java index b4b8f8c5a..98611bb72 100644 --- a/src/main/java/com/taobao/rigel/rap/project/dao/impl/ProjectDaoImpl.java +++ b/src/main/java/com/taobao/rigel/rap/project/dao/impl/ProjectDaoImpl.java @@ -37,7 +37,7 @@ public List getProjectList(User user, int curPageNum, int pageSize) { List list = query.list(); List resultList = new ArrayList(); for (Integer id : list) { - Project p = this.getProject(id); + Project p = getProjectSummary(id); if (p != null && p.getId() > 0) { resultList.add(p); } diff --git a/src/main/java/com/taobao/rigel/rap/project/service/impl/ProjectMgrImpl.java b/src/main/java/com/taobao/rigel/rap/project/service/impl/ProjectMgrImpl.java index 3a999d817..1d5830157 100644 --- a/src/main/java/com/taobao/rigel/rap/project/service/impl/ProjectMgrImpl.java +++ b/src/main/java/com/taobao/rigel/rap/project/service/impl/ProjectMgrImpl.java @@ -74,23 +74,19 @@ public void setAccountDao(AccountDao accountDao) { this.accountDao = accountDao; } - public List getProjectList(User user, int curPageNum, int pageSize) { List projectList = projectDao.getProjectList(user, curPageNum, pageSize); for (Project p : projectList) { - if (user.isUserInRole("admin") - || p.getUserId() == user.getId()) { - p.setIsManagable(true); - } + p.setIsManagable(organizationMgr.canUserManageProject(user.getId(), p.getId())); + p.setIsDeletable(organizationMgr.canUserDeleteProject(user.getId(), p.getId())); p.setTeamId(organizationDao.getTeamIdByProjectId(p.getId())); p.setUser(accountDao.getUser(p.getUserId())); } return projectList; } - public int addProject(Project project) { project.setUpdateTime(new Date()); project.setCreateDate(new Date()); diff --git a/src/main/java/com/taobao/rigel/rap/project/web/action/ProjectAction.java b/src/main/java/com/taobao/rigel/rap/project/web/action/ProjectAction.java index b93ecd49a..fe55e3beb 100644 --- a/src/main/java/com/taobao/rigel/rap/project/web/action/ProjectAction.java +++ b/src/main/java/com/taobao/rigel/rap/project/web/action/ProjectAction.java @@ -6,6 +6,7 @@ import com.taobao.rigel.rap.auto.generate.contract.Generator; import com.taobao.rigel.rap.common.base.ActionBase; import com.taobao.rigel.rap.common.bo.RapError; +import com.taobao.rigel.rap.organization.service.OrganizationMgr; import com.taobao.rigel.rap.project.bo.Page; import com.taobao.rigel.rap.project.bo.Project; import com.taobao.rigel.rap.project.service.ProjectMgr; @@ -41,6 +42,16 @@ public class ProjectAction extends ActionBase { private String result; private InputStream outputStream; + public OrganizationMgr getOrganizationMgr() { + return organizationMgr; + } + + public void setOrganizationMgr(OrganizationMgr organizationMgr) { + this.organizationMgr = organizationMgr; + } + + private OrganizationMgr organizationMgr; + public String getIds() { if (ids == null || ids.isEmpty()) { return ""; @@ -207,7 +218,7 @@ public void setProjectData(String projectData) { public String delete() { if (!isUserLogined()) return LOGIN; - if (!getAccountMgr().canUserManageProject(getCurUserId(), getId())) { + if (!organizationMgr.canUserManageProject(getCurUserId(), getId())) { setErrMsg("您没有管理该项目的权限"); return ERROR; } @@ -254,7 +265,7 @@ public String create() { public String update() { if (!isUserLogined()) return LOGIN; - if (!getAccountMgr().canUserManageProject(getCurUserId(), getId())) { + if (!organizationMgr.canUserManageProject(getCurUserId(), getId())) { setErrMsg("您没有管理该项目的权限"); return ERROR; } @@ -289,7 +300,7 @@ public String update() { result.put("desc", project.getIntroduction()); result.put("accounts", project.getMemberAccountListStr()); result.put("groupId", project.getGroupId()); - result.put("isManagable", project.getIsManagable()); + result.put("isManagable", project.isManagable()); setJson(new RapError(gson.toJson(result)).toString()); return SUCCESS; @@ -298,7 +309,7 @@ public String update() { public String updateReleatedIds() { if (!isUserLogined()) return LOGIN; - if (!getAccountMgr().canUserManageProject(getCurUserId(), getId())) { + if (!organizationMgr.canUserManageProject(getCurUserId(), getId())) { setErrMsg("您没有管理该项目的权限"); return ERROR; } diff --git a/src/main/java/com/taobao/rigel/rap/workspace/web/action/WorkspaceAction.java b/src/main/java/com/taobao/rigel/rap/workspace/web/action/WorkspaceAction.java index cc9d9e661..a615aaca8 100644 --- a/src/main/java/com/taobao/rigel/rap/workspace/web/action/WorkspaceAction.java +++ b/src/main/java/com/taobao/rigel/rap/workspace/web/action/WorkspaceAction.java @@ -237,7 +237,7 @@ public String myWorkspace() { + projectId); return LOGIN; } - setAccessable(getAccountMgr().canUserManageProject(getCurUserId(), getProjectId())); + setAccessable(organizationMgr.canUserManageProject(getCurUserId(), getProjectId())); return SUCCESS; } @@ -338,7 +338,7 @@ public String checkIn() throws Exception { return JSON_ERROR; } - if (!getAccountMgr().canUserManageProject(getCurUserId(), getId())) { + if (!organizationMgr.canUserManageProject(getCurUserId(), getId())) { setErrMsg("access deny"); logger.error("User %s trying to checkedin project(id=$d) and denied.", getCurAccount(), getId()); return JSON_ERROR; From 33c12579cf6fa29e9ef9313cbce4a76337c6c645 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9C=8D=E9=9B=8D?= Date: Tue, 26 Jan 2016 09:55:31 +0800 Subject: [PATCH 04/21] fix user list problem on projectSummary of projects.do action --- .../service/impl/OrganizationMgrImpl.java | 16 ++++++++-------- .../taobao/rigel/rap/project/dao/ProjectDao.java | 8 ++++++++ .../rap/project/dao/impl/ProjectDaoImpl.java | 6 ++++++ .../rigel/rap/project/service/ProjectMgr.java | 8 ++++++++ .../rap/project/service/impl/ProjectMgrImpl.java | 12 ++++++++++++ src/main/webapp/org/home/index.vm | 2 +- 6 files changed, 43 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/taobao/rigel/rap/organization/service/impl/OrganizationMgrImpl.java b/src/main/java/com/taobao/rigel/rap/organization/service/impl/OrganizationMgrImpl.java index 579ed79a6..66304d67d 100644 --- a/src/main/java/com/taobao/rigel/rap/organization/service/impl/OrganizationMgrImpl.java +++ b/src/main/java/com/taobao/rigel/rap/organization/service/impl/OrganizationMgrImpl.java @@ -193,17 +193,19 @@ public boolean canUserManageProject(int userId, int projectId) { canAccess = true; } else if (project.getUserId() == userId) { canAccess = true; - } else if (project.getUserList() != null) { - for (User member : project.getUserList()) { - if (member.getId() == user.getId()) { - canAccess = true; - break; + } else { + List memberIdList = projectMgr.getMemberIdsOfProject(projectId); + if (memberIdList != null) { + for (int memberId : memberIdList) { + if (memberId == user.getId()) { + canAccess = true; + break; + } } } } CacheUtils.put(cacheKey, new Boolean(canAccess).toString()); - return canAccess; } @@ -213,7 +215,6 @@ public boolean canUserDeleteProject(int userId, int projectId) { return user.isAdmin() || project.getUserId() == user.getId(); } - public boolean canUserManageCorp(int userId, int corpId) { int roleId = organizationDao.getUserRoleInCorp(userId, corpId); Corporation corp = getCorporation(corpId); @@ -223,7 +224,6 @@ public boolean canUserManageCorp(int userId, int corpId) { } - public List getUserLisOfCorp(int corpId) { List list = organizationDao.getUserLisOfCorp(corpId); Corporation c = getCorporation(corpId); diff --git a/src/main/java/com/taobao/rigel/rap/project/dao/ProjectDao.java b/src/main/java/com/taobao/rigel/rap/project/dao/ProjectDao.java index bfcf65014..77ed624d9 100644 --- a/src/main/java/com/taobao/rigel/rap/project/dao/ProjectDao.java +++ b/src/main/java/com/taobao/rigel/rap/project/dao/ProjectDao.java @@ -175,4 +175,12 @@ String updateProject(int id, String projectData, void updateCreatorId(int projectId, int creatorId); Project getProject(int id); + + /** + * get member id list of specified project + * + * @param projectId + * @return + */ + List getMemberIdsOfProject(int projectId); } diff --git a/src/main/java/com/taobao/rigel/rap/project/dao/impl/ProjectDaoImpl.java b/src/main/java/com/taobao/rigel/rap/project/dao/impl/ProjectDaoImpl.java index 98611bb72..3ef2200cd 100644 --- a/src/main/java/com/taobao/rigel/rap/project/dao/impl/ProjectDaoImpl.java +++ b/src/main/java/com/taobao/rigel/rap/project/dao/impl/ProjectDaoImpl.java @@ -572,4 +572,10 @@ public Project getProject(int id) { return currentSession().get(Project.class, id); } + public List getMemberIdsOfProject(int projectId) { + Query query = currentSession().createSQLQuery("SELECT user_id FROM tb_project_and_user WHERE project_id = :projectId"); + query.setInteger("projectId", projectId); + return query.list(); + } + } diff --git a/src/main/java/com/taobao/rigel/rap/project/service/ProjectMgr.java b/src/main/java/com/taobao/rigel/rap/project/service/ProjectMgr.java index e93fc5748..6164643fc 100644 --- a/src/main/java/com/taobao/rigel/rap/project/service/ProjectMgr.java +++ b/src/main/java/com/taobao/rigel/rap/project/service/ProjectMgr.java @@ -216,4 +216,12 @@ String updateProject(int id, String projectData, */ void clearProjectDocCache(int projectId); + /** + * get member user id list of specifid project + * + * @param projectId + * @return + */ + List getMemberIdsOfProject(int projectId); + } diff --git a/src/main/java/com/taobao/rigel/rap/project/service/impl/ProjectMgrImpl.java b/src/main/java/com/taobao/rigel/rap/project/service/impl/ProjectMgrImpl.java index 1d5830157..b878279fa 100644 --- a/src/main/java/com/taobao/rigel/rap/project/service/impl/ProjectMgrImpl.java +++ b/src/main/java/com/taobao/rigel/rap/project/service/impl/ProjectMgrImpl.java @@ -19,6 +19,7 @@ import com.taobao.rigel.rap.workspace.dao.WorkspaceDao; import sun.misc.Cache; +import javax.management.Query; import java.util.*; public class ProjectMgrImpl implements ProjectMgr { @@ -83,6 +84,13 @@ public List getProjectList(User user, int curPageNum, int pageSize) { p.setIsDeletable(organizationMgr.canUserDeleteProject(user.getId(), p.getId())); p.setTeamId(organizationDao.getTeamIdByProjectId(p.getId())); p.setUser(accountDao.getUser(p.getUserId())); + + List memberIdList = getMemberIdsOfProject(p.getId()); + Set memberList = new HashSet(); + for (int memberId : memberIdList) { + memberList.add(accountMgr.getUser(memberId)); + } + p.setUserList(memberList); } return projectList; } @@ -435,6 +443,10 @@ public void clearProjectDocCache(int projectId) { CacheUtils.del(cacheKey); } + public List getMemberIdsOfProject(int projectId) { + return projectDao.getMemberIdsOfProject(projectId); + } + private void updateActionCache(Action action) { action.setDisableCache(0); for (Parameter param : action.getResponseParameterList()) { diff --git a/src/main/webapp/org/home/index.vm b/src/main/webapp/org/home/index.vm index 808172c70..066cfa6d2 100644 --- a/src/main/webapp/org/home/index.vm +++ b/src/main/webapp/org/home/index.vm @@ -43,7 +43,7 @@ {{#isManagable}}{{/isManagable}} - {{#isManagable}}{{/isManagable}} + {{#isDeletable}}{{/isDeletable}} From af39b6b5d6e1cfcf5eab54c73a5cf503e10b8881 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9C=8D=E9=9B=8D?= Date: Tue, 26 Jan 2016 10:06:59 +0800 Subject: [PATCH 05/21] fix a bug cause original info not shown in updateProfile.do page --- .../com/taobao/rigel/rap/account/web/action/AccountAction.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/taobao/rigel/rap/account/web/action/AccountAction.java b/src/main/java/com/taobao/rigel/rap/account/web/action/AccountAction.java index 7ec2d01ae..16cec010b 100644 --- a/src/main/java/com/taobao/rigel/rap/account/web/action/AccountAction.java +++ b/src/main/java/com/taobao/rigel/rap/account/web/action/AccountAction.java @@ -398,6 +398,7 @@ public String updateProfile() { setRelativeReturnUrl("/account/updateProfile.do"); return LOGIN; } + user = getAccountMgr().getUser(getCurUserId()); setIsEditMode(true); return SUCCESS; From 705028915b63d312454e97eae7fb600463d5c486 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9C=8D=E9=9B=8D?= Date: Tue, 26 Jan 2016 10:46:32 +0800 Subject: [PATCH 06/21] fix #243 --- README.md | 2 +- src/main/webapp/stat/js/core/rap.js | 27 +++++++++++++++-- src/main/webapp/tcom/const.inc.vm | 6 +++- src/main/webapp/tcom/template.rap.vm | 2 +- src/main/webapp/workspace/myWorkspace.vm | 37 ++++++++++++++++++++++++ 5 files changed, 68 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index aa499bb8a..970411805 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ RAP通过GUI工具帮助WEB工程师更高效的管理接口文档,同时通 ## About - @version v0.13.1 + @version v0.14.0 (in development) @author @bosn @wangjeaf @director @limu @xinglie @update Oct. 13th 2015 diff --git a/src/main/webapp/stat/js/core/rap.js b/src/main/webapp/stat/js/core/rap.js index 98eda55f1..abe7b1d4a 100644 --- a/src/main/webapp/stat/js/core/rap.js +++ b/src/main/webapp/stat/js/core/rap.js @@ -1358,7 +1358,8 @@ function deepCopy(o) { "VSS_PANEL_MESSAGE" : "div-saveVSS-floater-message", "WORKSPACE_MESSAGE" : "div-w-message", "EDIT_INPUT" : "txtMTName" , - "IMPORT_JSON_MESSAGE" : "div-importJSON-floater-message" + "IMPORT_JSON_MESSAGE" : "div-importJSON-floater-message", + "RECOVER_WORKSPACE_MESSAGE" : "div-recoverWorkspace-floater-message" }, PREFIX = { "SAVE" : "radio-save-" @@ -2315,6 +2316,22 @@ function deepCopy(o) { this._doesImportToRequest = !!doesImportToRequest; }; + ws.doRecoverWorkspace = function() { + try { + var backupData = $('#recoverWorkspaceFloater-text').val(); + var data = eval('(' + backupData + ')'); + data = eval('(' + data.modelJSON + ')'); + if (!data || !data.moduleList) { + throw new Error("找不到moduleList属性,错误的备份文本。你在逗我?"); + } + p.getData().moduleList = data.moduleList; + ecui.get('recoverWorkspaceFloater').hide(); + ws.quickSave('通过备份导入,恢复了数据'); + } catch (ex) { + showMessage(CONST.ERROR, ELEMENT_ID.RECOVER_WORKSPACE_MESSAGE, '导入失败,输入有误。技术错误信息:' + ex.message); + } + }; + /** * cancel save in VSS mode */ @@ -2322,6 +2339,10 @@ function deepCopy(o) { ecui.get("saveVSSFloater").hide(); }; + ws.isEditMode = function() { + return _isEditMode; + }; + /** * switch to edit mode */ @@ -2381,10 +2402,10 @@ function deepCopy(o) { } }; - ws.quickSave = function() { + ws.quickSave = function(commitMsg) { var q = "id=" + p.getId() + "&projectData=" + util.escaper.escapeInU(getProjectDataJson()) + "&deletedObjectListData=" + util.escaper.escapeInU(b.json.stringify(_deletedObjectList)) + - "&versionPosition=4&description=quick save"; + "&versionPosition=4&description=" + (commitMsg ? commitMsg : "quick save"); showMessage(CONST.LOADING, ELEMENT_ID.WORKSPACE_MESSAGE, MESSAGE.SAVING); if (!processing(ELEMENT_ID.WORKSPACE_MESSAGE)) return; b.ajax.post(URL.checkIn, q, function(xhr, response) { diff --git a/src/main/webapp/tcom/const.inc.vm b/src/main/webapp/tcom/const.inc.vm index 1be684a59..1048acd50 100644 --- a/src/main/webapp/tcom/const.inc.vm +++ b/src/main/webapp/tcom/const.inc.vm @@ -11,7 +11,7 @@ ## 精确到天 #set($dateFormat = 'yyyy-MM-dd') ## 时间戳 -#set($timeStamp = '20151111.v0.13.1') +#set($timeStamp = '20151111.v0.14.0') ##----------------------页面请求action地址------------------------------- ## 配置工程的上下文路径 #set($projectContext = "$!link.getContextPath()") @@ -88,4 +88,8 @@ #set($mockUrl = { "queryMockData":"$projectContext/mock/queryMockData.do" +}) + +#set($openAPI = { + "queryRAPModel" : "$projectContext/api/queryRAPModel.do" }) \ No newline at end of file diff --git a/src/main/webapp/tcom/template.rap.vm b/src/main/webapp/tcom/template.rap.vm index 57b6b3772..1e5586afa 100644 --- a/src/main/webapp/tcom/template.rap.vm +++ b/src/main/webapp/tcom/template.rap.vm @@ -36,7 +36,7 @@ RAP v0.13.114.0  beta @@ -344,6 +354,33 @@ #endFloater +#startFloater("recoverWorkspaceFloater" "导入备份数据" 600 350) +
+ +
+ + + + +
+ +
+
+ + +
+
+
+#endFloater + #startFloater("exportRAPDataFloater" "JSON导入" 600 350)
From e15ef606810bd49a1b90da0da43cbe3bb0f12161 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9C=8D=E9=9B=8D?= Date: Tue, 26 Jan 2016 10:53:22 +0800 Subject: [PATCH 07/21] highligh new features --- src/main/webapp/workspace/myWorkspace.vm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/webapp/workspace/myWorkspace.vm b/src/main/webapp/workspace/myWorkspace.vm index 43986e840..6346efcb6 100644 --- a/src/main/webapp/workspace/myWorkspace.vm +++ b/src/main/webapp/workspace/myWorkspace.vm @@ -88,7 +88,7 @@
+ +
#bodyEnd From 42bd655a65647628a2c784be042b5b5b91787adf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9C=8D=E9=9B=8D?= Date: Tue, 26 Jan 2016 16:39:35 +0800 Subject: [PATCH 10/21] fix #261 --- .../dao/impl/OrganizationDaoImpl.java | 14 ++++++--- .../organization/service/OrganizationMgr.java | 9 ++++++ .../service/impl/OrganizationMgrImpl.java | 30 ++++++++++++++++++- .../rap/project/web/action/ProjectAction.java | 9 ++++-- 4 files changed, 55 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/taobao/rigel/rap/organization/dao/impl/OrganizationDaoImpl.java b/src/main/java/com/taobao/rigel/rap/organization/dao/impl/OrganizationDaoImpl.java index a100730fa..b477f17e1 100644 --- a/src/main/java/com/taobao/rigel/rap/organization/dao/impl/OrganizationDaoImpl.java +++ b/src/main/java/com/taobao/rigel/rap/organization/dao/impl/OrganizationDaoImpl.java @@ -188,15 +188,18 @@ public void setUserRoleInCorp(int userId, int corpId, int roleId) { public List getCorporationListWithPager(int pageNum, int pageSize, String keyword) { + boolean isSearch = keyword != null && !keyword.trim().isEmpty(); StringBuilder sql = new StringBuilder(); sql.append("SELECT c.id ") - .append("FROM tb_corporation c ") + .append("FROM tb_corporation c "+(isSearch ? " WHERE name LIKE CONCAT('%', :keyword, '%')" : "")) .append("LIMIT :startIndex, :pageSize "); Query query = currentSession().createSQLQuery(sql.toString()); query.setInteger("startIndex", (pageNum - 1) * pageSize); query.setInteger("pageSize", pageSize); - + if (isSearch) { + query.setString("keyword", keyword); + } List list = (List) query.list(); List resultList = new ArrayList(); for (Integer id : list) { @@ -208,11 +211,15 @@ public List getCorporationListWithPager(int pageNum, int pageSize, public int getCorporationListWithPagerNum(String keyword) { + boolean isSearch = keyword != null && !keyword.trim().isEmpty(); StringBuilder sql = new StringBuilder(); sql.append("SELECT COUNT(*) ") - .append("FROM tb_corporation c "); + .append("FROM tb_corporation c " +(isSearch ? " WHERE name LIKE CONCAT('%', :keyword, '%')" : "")); Query query = currentSession().createSQLQuery(sql.toString()); + if (isSearch) { + query.setString("keyword", keyword); + } return Integer.parseInt(query.uniqueResult().toString()); } @@ -231,7 +238,6 @@ public List getCorporationListWithPager(int userId, int pageNum, in .append(" SELECT id AS cid FROM tb_corporation ") .append(" WHERE (user_id = :userId or access_type = 20) " + (isSearch ? "AND name LIKE CONCAT('%', :keyword, '%') " : "")) .append(") AS TEMP ") - .append("ORDER BY cid DESC ") .append("LIMIT :startIndex, :pageSize "); Query query = currentSession().createSQLQuery(sql.toString()); diff --git a/src/main/java/com/taobao/rigel/rap/organization/service/OrganizationMgr.java b/src/main/java/com/taobao/rigel/rap/organization/service/OrganizationMgr.java index cff0da51f..46453c96f 100644 --- a/src/main/java/com/taobao/rigel/rap/organization/service/OrganizationMgr.java +++ b/src/main/java/com/taobao/rigel/rap/organization/service/OrganizationMgr.java @@ -285,4 +285,13 @@ public interface OrganizationMgr { */ void updateCorporation(Corporation c); + + /** + * get team id by project id + * + * @param id + * @return + */ + int getTeamIdByProjectId(int id); + } diff --git a/src/main/java/com/taobao/rigel/rap/organization/service/impl/OrganizationMgrImpl.java b/src/main/java/com/taobao/rigel/rap/organization/service/impl/OrganizationMgrImpl.java index a581e955a..263da3cc8 100644 --- a/src/main/java/com/taobao/rigel/rap/organization/service/impl/OrganizationMgrImpl.java +++ b/src/main/java/com/taobao/rigel/rap/organization/service/impl/OrganizationMgrImpl.java @@ -1,5 +1,6 @@ package com.taobao.rigel.rap.organization.service.impl; +import com.sun.javaws.CacheUtil; import com.taobao.rigel.rap.account.bo.User; import com.taobao.rigel.rap.account.service.AccountMgr; import com.taobao.rigel.rap.common.utils.CacheUtils; @@ -14,6 +15,7 @@ import com.taobao.rigel.rap.project.bo.Project; import com.taobao.rigel.rap.project.service.ProjectMgr; +import java.util.ArrayList; import java.util.List; public class OrganizationMgrImpl implements OrganizationMgr { @@ -218,7 +220,7 @@ public boolean canUserDeleteProject(int userId, int projectId) { public boolean canUserManageCorp(int userId, int corpId) { int roleId = organizationDao.getUserRoleInCorp(userId, corpId); Corporation corp = getCorporation(corpId); - return corp.getAccessType() == Corporation.PUBLIC_ACCESS || (roleId >= 1 && roleId <= 2 || + return (roleId >= 1 && roleId <= 2 || userId == getCorporation(corpId).getUserId()) || accountMgr.getUser(userId).isAdmin(); @@ -317,12 +319,19 @@ public int addTeam(Corporation team) { for (String account : team.getAccountList()) { if (account == null || account.trim().isEmpty()) continue; User u = accountMgr.getUser(account); + + String [] cacheKey = new String[]{CacheUtils.KEY_CORP_LIST_TOP_ITEMS, new Integer(u.getId()).toString()}; + CacheUtils.del(cacheKey); + if (u.getId() == team.getUserId()) { // if the user is creator, there's no need to add again continue; } organizationDao.addUserToCorp(corpId, u.getId(), 3); // 3, normal member } + + String [] cacheKey = new String[]{CacheUtils.KEY_CORP_LIST_TOP_ITEMS, new Integer(team.getUserId()).toString()}; + CacheUtils.del(cacheKey); return corpId; } @@ -364,6 +373,8 @@ public boolean addTeamMembers(int curUserId, int corpId, String accountList) { && u.getId() != c.getUserId()) { organizationDao.addUserToCorp(corpId, u.getId(), 3); } + String [] cacheKey = new String[]{CacheUtils.KEY_CORP_LIST_TOP_ITEMS, new Integer(u.getId()).toString()}; + CacheUtils.del(cacheKey); } } @@ -372,9 +383,26 @@ public boolean addTeamMembers(int curUserId, int corpId, String accountList) { public void updateCorporation(Corporation c) { + // clear cache + + List userIdList = new ArrayList(); + userIdList.add(c.getUserId()); + List userList = getUserLisOfCorp(c.getId()); + for (User u : userList) { + userIdList.add(u.getId()); + } + + for (Integer userId : userIdList) { + String [] cacheKey = new String[]{CacheUtils.KEY_CORP_LIST_TOP_ITEMS, userId.toString()}; + CacheUtils.del(cacheKey); + } organizationDao.updateCorporation(c); } + public int getTeamIdByProjectId(int id) { + return organizationDao.getTeamIdByProjectId(id); + } + private boolean canUserManageUserInCorp(int curUserId, int userId, int corpId) { User curUser = accountMgr.getUser(curUserId); diff --git a/src/main/java/com/taobao/rigel/rap/project/web/action/ProjectAction.java b/src/main/java/com/taobao/rigel/rap/project/web/action/ProjectAction.java index 9303bcc2e..1e1dc73fb 100644 --- a/src/main/java/com/taobao/rigel/rap/project/web/action/ProjectAction.java +++ b/src/main/java/com/taobao/rigel/rap/project/web/action/ProjectAction.java @@ -244,8 +244,10 @@ public String create() { for (String item : list) { String account = item.contains("(") ? item.substring(0, item.indexOf("(")).trim() : item.trim(); - if (!account.equals("")) + if (!account.equals("")) { memberAccountList.add(account); + organizationMgr.addTeamMembers(getCurUserId(), organizationMgr.getTeamIdByProjectId(project.getId()), account); + } } project.setMemberAccountList(memberAccountList); int projectId = projectMgr.addProject(project); @@ -269,6 +271,7 @@ public String update() { setErrMsg("您没有管理该项目的权限"); return ERROR; } + Project project = new Project(); project.setId(getId()); project.setIntroduction(getDesc()); @@ -280,8 +283,10 @@ public String update() { for (String item : list) { String account = item.contains("(") ? item.substring(0, item.indexOf("(")).trim() : item.trim(); - if (!account.equals("")) + if (!account.equals("")) { memberAccountList.add(account); + organizationMgr.addTeamMembers(getCurUserId(), organizationMgr.getTeamIdByProjectId(project.getId()), account); + } } Gson gson = new Gson(); project.setMemberAccountList(memberAccountList); From 014e80aaab23e40de3e5ac22d695e53ab48b54f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9C=8D=E9=9B=8D?= Date: Wed, 27 Jan 2016 11:13:17 +0800 Subject: [PATCH 11/21] fix #341 --- pom.xml | 2 +- .../rap/common/config/SystemConstant.java | 26 +++++++++++++++++++ .../rigel/rap/common/utils/CacheUtils.java | 9 ++++++- .../rigel/rap/common/utils/JedisFactory.java | 9 +++++-- src/main/resources/config.properties | 6 +++++ src/main/resources/hibernate.cfg.xml | 2 +- src/main/resources/mysql.local.properties | 4 --- 7 files changed, 49 insertions(+), 9 deletions(-) create mode 100644 src/main/resources/config.properties delete mode 100644 src/main/resources/mysql.local.properties diff --git a/pom.xml b/pom.xml index e99f1f1c3..b78771ed8 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ groupId RAP - 0.13.0-SNAPSHOT + 0.14.0-SNAPSHOT war diff --git a/src/main/java/com/taobao/rigel/rap/common/config/SystemConstant.java b/src/main/java/com/taobao/rigel/rap/common/config/SystemConstant.java index ac25250be..a05eb46eb 100644 --- a/src/main/java/com/taobao/rigel/rap/common/config/SystemConstant.java +++ b/src/main/java/com/taobao/rigel/rap/common/config/SystemConstant.java @@ -1,9 +1,15 @@ package com.taobao.rigel.rap.common.config; import com.alibaba.platform.buc.sso.common.dto.SimpleSSOUser; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.IOException; +import java.util.Properties; public class SystemConstant { + private static final Logger logger = LogManager.getFormatterLogger(SystemConstant.class); public static final int DEFAULT_PAGE_SIZE = 12; public static final int ACCOUNT_LENGTH_MIN = 6; public static final int ACCOUNT_LENGTH_MAX = 32; @@ -30,7 +36,27 @@ public static void setDOMAIN_URL(String domainURL) { SystemConstant.domainURL = domainURL; } + private static Properties config; + + private static void loadConfig() { + if (config == null) { + config = new Properties(); + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + try { + config.load(loader.getResourceAsStream("config.properties")); + } catch (IOException e) { + e.printStackTrace(); + logger.error(e.getMessage()); + } + } + } + public static String getConfig(String key) { + if (config == null) { + loadConfig(); + } + return config.getProperty(key); + } } diff --git a/src/main/java/com/taobao/rigel/rap/common/utils/CacheUtils.java b/src/main/java/com/taobao/rigel/rap/common/utils/CacheUtils.java index 86e4defe5..878643a59 100644 --- a/src/main/java/com/taobao/rigel/rap/common/utils/CacheUtils.java +++ b/src/main/java/com/taobao/rigel/rap/common/utils/CacheUtils.java @@ -5,6 +5,8 @@ import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; +import java.io.IOException; + /** * Created by Bosn on 14/11/28. * Basic cache, need weight for string length. @@ -29,7 +31,12 @@ public class CacheUtils { public CacheUtils() {} private static Jedis getJedis() { - jedisPool = JedisFactory.getInstance().getJedisPool(); + try { + jedisPool = JedisFactory.getInstance().getJedisPool(); + } catch (IOException e) { + e.printStackTrace(); + logger.error(e.getMessage()); + } jedis = jedisPool.getResource(); return jedis; } diff --git a/src/main/java/com/taobao/rigel/rap/common/utils/JedisFactory.java b/src/main/java/com/taobao/rigel/rap/common/utils/JedisFactory.java index e85eb7889..81707665a 100644 --- a/src/main/java/com/taobao/rigel/rap/common/utils/JedisFactory.java +++ b/src/main/java/com/taobao/rigel/rap/common/utils/JedisFactory.java @@ -1,23 +1,28 @@ package com.taobao.rigel.rap.common.utils; +import com.taobao.rigel.rap.common.config.SystemConstant; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; +import java.io.IOException; + class JedisFactory { private static JedisPool jedisPool; private static JedisFactory instance = null; public JedisFactory() { JedisPoolConfig poolConfig = new JedisPoolConfig(); - jedisPool = new JedisPool(poolConfig, "localhost", 6379); + String host = SystemConstant.getConfig("redis.host"); + int port = Integer.parseInt(SystemConstant.getConfig("redis.port")); + jedisPool = new JedisPool(poolConfig, host, port); } public JedisPool getJedisPool() { return jedisPool; } - public static JedisFactory getInstance() { + public static JedisFactory getInstance() throws IOException { if (instance == null) { instance = new JedisFactory(); diff --git a/src/main/resources/config.properties b/src/main/resources/config.properties new file mode 100644 index 000000000..3f374045b --- /dev/null +++ b/src/main/resources/config.properties @@ -0,0 +1,6 @@ +jdbc.driverClassName=com.mysql.jdbc.Driver +jdbc.url=jdbc\:mysql\://192.168.0.3\:3306/rap_db?useUnicode\=true&characterEncoding\=utf8&zeroDateTimeBehavior\=convertToNull&noAccessToProcedureBodies\=true +jdbc.username=root +jdbc.password= +redis.host=localhost +redis.port=6379 \ No newline at end of file diff --git a/src/main/resources/hibernate.cfg.xml b/src/main/resources/hibernate.cfg.xml index 9fe49db7b..286cf2bfc 100644 --- a/src/main/resources/hibernate.cfg.xml +++ b/src/main/resources/hibernate.cfg.xml @@ -30,7 +30,7 @@ http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> - classpath:/mysql.local.properties + classpath:/config.properties diff --git a/src/main/resources/mysql.local.properties b/src/main/resources/mysql.local.properties deleted file mode 100644 index e5cac9132..000000000 --- a/src/main/resources/mysql.local.properties +++ /dev/null @@ -1,4 +0,0 @@ -jdbc.driverClassName=com.mysql.jdbc.Driver -jdbc.url=jdbc\:mysql\://localhost\:3306/rap_db?useUnicode\=true&characterEncoding\=utf8&zeroDateTimeBehavior\=convertToNull&noAccessToProcedureBodies\=true -jdbc.username=root -jdbc.password= From e06b9f39c99cca35495ea0f4729404643d5ce887 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9C=8D=E9=9B=8D?= Date: Wed, 27 Jan 2016 14:03:39 +0800 Subject: [PATCH 12/21] fix #340 --- .../taobao/rigel/rap/mock/web/action/MockAction.java | 12 ++++++++++-- src/main/resources/config.properties | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/taobao/rigel/rap/mock/web/action/MockAction.java b/src/main/java/com/taobao/rigel/rap/mock/web/action/MockAction.java index 93981feb2..2f437e764 100644 --- a/src/main/java/com/taobao/rigel/rap/mock/web/action/MockAction.java +++ b/src/main/java/com/taobao/rigel/rap/mock/web/action/MockAction.java @@ -3,6 +3,7 @@ import com.google.gson.Gson; import com.taobao.rigel.rap.common.base.ActionBase; import com.taobao.rigel.rap.common.utils.HTTPUtils; +import com.taobao.rigel.rap.common.utils.StringUtils; import com.taobao.rigel.rap.common.utils.SystemVisitorLog; import com.taobao.rigel.rap.mock.service.MockMgr; import com.taobao.rigel.rap.project.bo.Action; @@ -127,7 +128,7 @@ public void setActionId(int actionId) { } public String get_c() { - return _c; + return StringUtils.escapeInHJ(_c); } public void set_c(String _c) { @@ -135,7 +136,7 @@ public void set_c(String _c) { } public String getCallback() { - return callback; + return StringUtils.escapeInHJ(callback); } public void setCallback(String callback) { @@ -180,6 +181,7 @@ public void setPattern(String pattern) { } public String createData() throws UnsupportedEncodingException { + String callback = getCallback(); boolean isJSON = false; updateProjectListMockNum(SystemVisitorLog.mock(__id__, "createData", pattern, getCurAccount())); Map options = new HashMap(); @@ -206,6 +208,7 @@ public String createData() throws UnsupportedEncodingException { } public String createRule() throws UnsupportedEncodingException { + String callback = getCallback(); boolean isJSON = false; updateProjectListMockNum(SystemVisitorLog.mock(__id__, "createRule", pattern, getCurAccount())); Map options = new HashMap(); @@ -232,6 +235,7 @@ public String createRule() throws UnsupportedEncodingException { } public String createRuleAuto() throws UnsupportedEncodingException { + String callback = getCallback(); boolean isJSON = false; updateProjectListMockNum(SystemVisitorLog.mock(__id__, "createRule", pattern, getCurAccount())); Map options = new HashMap(); @@ -260,6 +264,7 @@ public String createRuleAuto() throws UnsupportedEncodingException { } public String createRuleByActionData() throws UnsupportedEncodingException { + String callback = getCallback(); boolean isJSON = false; updateProjectListMockNum(SystemVisitorLog.mock(id, "createRuleByActionData", pattern, getCurAccount())); Map options = new HashMap(); @@ -349,6 +354,7 @@ private void loadWhiteList(Project p, List list, Map ma } public String createMockjsData() throws UnsupportedEncodingException { + String callback = getCallback(); boolean isJSON = false; updateProjectListMockNum(SystemVisitorLog.mock(__id__, "createMockjsData", pattern, getCurAccount())); String _c = get_c(); @@ -376,6 +382,7 @@ public String createMockjsData() throws UnsupportedEncodingException { } public String createMockjsDataAuto() throws UnsupportedEncodingException { + String callback = getCallback(); boolean isJSON = false; updateProjectListMockNum(SystemVisitorLog.mock(__id__, "createMockjsData", pattern, getCurAccount())); String _c = get_c(); @@ -404,6 +411,7 @@ public String createMockjsDataAuto() throws UnsupportedEncodingException { } public String validateAPI() throws UnsupportedEncodingException { + String callback = getCallback(); boolean isJSON = false; updateProjectListMockNum(SystemVisitorLog.mock(id, "createRule", pattern, getCurAccount())); Map options = new HashMap(); diff --git a/src/main/resources/config.properties b/src/main/resources/config.properties index 3f374045b..40e2fd82a 100644 --- a/src/main/resources/config.properties +++ b/src/main/resources/config.properties @@ -1,5 +1,5 @@ jdbc.driverClassName=com.mysql.jdbc.Driver -jdbc.url=jdbc\:mysql\://192.168.0.3\:3306/rap_db?useUnicode\=true&characterEncoding\=utf8&zeroDateTimeBehavior\=convertToNull&noAccessToProcedureBodies\=true +jdbc.url=jdbc\:mysql\://localhost\:3306/rap_db?useUnicode\=true&characterEncoding\=utf8&zeroDateTimeBehavior\=convertToNull&noAccessToProcedureBodies\=true jdbc.username=root jdbc.password= redis.host=localhost From 0b084b4c346013f162f0daad436cff42c6146dcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9C=8D=E9=9B=8D?= Date: Wed, 27 Jan 2016 14:56:19 +0800 Subject: [PATCH 13/21] optimize access logic, team admin can also delete project, others can not do that. --- .../com/taobao/rigel/rap/account/bo/Role.java | 10 ++++++++++ .../service/impl/OrganizationMgrImpl.java | 19 ++++++++++--------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/taobao/rigel/rap/account/bo/Role.java b/src/main/java/com/taobao/rigel/rap/account/bo/Role.java index 3e9a5cb26..d756b69cf 100644 --- a/src/main/java/com/taobao/rigel/rap/account/bo/Role.java +++ b/src/main/java/com/taobao/rigel/rap/account/bo/Role.java @@ -21,4 +21,14 @@ public void setName(String name) { this.name = name; } + public static final int SUPER_ADMIN = 1; + + public static final int ADMIN = 2; + + public static final int USER = 3; + + public static boolean isAdmin(int roleId) { + return roleId == ADMIN || roleId == SUPER_ADMIN; + } + } diff --git a/src/main/java/com/taobao/rigel/rap/organization/service/impl/OrganizationMgrImpl.java b/src/main/java/com/taobao/rigel/rap/organization/service/impl/OrganizationMgrImpl.java index 263da3cc8..c307c9714 100644 --- a/src/main/java/com/taobao/rigel/rap/organization/service/impl/OrganizationMgrImpl.java +++ b/src/main/java/com/taobao/rigel/rap/organization/service/impl/OrganizationMgrImpl.java @@ -1,6 +1,6 @@ package com.taobao.rigel.rap.organization.service.impl; -import com.sun.javaws.CacheUtil; +import com.taobao.rigel.rap.account.bo.Role; import com.taobao.rigel.rap.account.bo.User; import com.taobao.rigel.rap.account.service.AccountMgr; import com.taobao.rigel.rap.common.utils.CacheUtils; @@ -214,13 +214,14 @@ public boolean canUserManageProject(int userId, int projectId) { public boolean canUserDeleteProject(int userId, int projectId) { User user = accountMgr.getUser(userId); Project project = projectMgr.getProjectSummary(projectId); - return user.isAdmin() || project.getUserId() == user.getId(); + int corpId = getTeamIdByProjectId(projectId); + int roleId = organizationDao.getUserRoleInCorp(userId, corpId); + return user.isAdmin() || project.getUserId() == user.getId() || Role.isAdmin(roleId); } public boolean canUserManageCorp(int userId, int corpId) { int roleId = organizationDao.getUserRoleInCorp(userId, corpId); - Corporation corp = getCorporation(corpId); - return (roleId >= 1 && roleId <= 2 || + return (Role.isAdmin(roleId) || userId == getCorporation(corpId).getUserId()) || accountMgr.getUser(userId).isAdmin(); @@ -234,9 +235,9 @@ public List getUserLisOfCorp(int corpId) { for (User user : list) { int roleId = getUserRoleInCorp(user.getId(), corpId); if (user.isAdmin()) { - roleId = 1; // user is the RAP platform admin + roleId = Role.SUPER_ADMIN; // user is the RAP platform admin } else if (user.getId() == c.getUserId()) { - roleId = 1; // user is the author + roleId = Role.SUPER_ADMIN; // user is the author } user.setRoleId(roleId); } @@ -349,8 +350,8 @@ public boolean setUserRoleInCorp(int curUserId, int userId, int corpId, int role public boolean removeMemberFromCorp(int curUserId, int userId, int corpId) { int roleId = getUserRoleInCorp(userId, corpId); - // if user can't manage team, or the user to be deleted is super admin, failed - if (!canUserManageCorp(curUserId, corpId) || roleId == 1) { + // if user can't manage team, failed + if (!canUserManageCorp(curUserId, corpId)) { return false; } @@ -410,7 +411,7 @@ private boolean canUserManageUserInCorp(int curUserId, int userId, int corpId) { return true; } int roleId = getUserRoleInCorp(curUserId, corpId); - if (roleId >= 1 || roleId <= 2) { + if (Role.isAdmin(roleId)) { return true; } return false; From fc4a1571da54148f765de93985cd38a4bced62c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9C=8D=E9=9B=8D?= Date: Wed, 27 Jan 2016 15:24:11 +0800 Subject: [PATCH 14/21] fix #343 --- src/main/webapp/stat/js/core/rap.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/webapp/stat/js/core/rap.js b/src/main/webapp/stat/js/core/rap.js index abe7b1d4a..0f2090488 100644 --- a/src/main/webapp/stat/js/core/rap.js +++ b/src/main/webapp/stat/js/core/rap.js @@ -2610,7 +2610,7 @@ function deepCopy(o) { //} } if (empty) { - $('#actionOpFloater-page').append($("