diff --git a/README.md b/README.md index 213e8322a..970411805 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 @@ -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/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/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/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..5cfb38966 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 @@ -72,9 +72,6 @@ public boolean addUser(User user) { String ps = user.getPassword(); if (ps == null) return false; - if (this.getUserId(user.getAccount()) > 0) { - return false; - } // DOUBLE MD5 encryption ps = StringUtils.getDoubleMD5(ps); @@ -160,7 +157,7 @@ public List getCorporationList() { public List getCorporationListWithPager(int userId, int pageNum, int pageSize) { - return organizationMgr.getCorporationListWithPager(userId, pageNum, pageSize); + return organizationMgr.getCorporationListWithPager(userId, pageNum, pageSize, null); } @@ -219,40 +216,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/account/web/action/AccountAction.java b/src/main/java/com/taobao/rigel/rap/account/web/action/AccountAction.java index 7ec2d01ae..d1f5dfeaa 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 @@ -150,6 +150,8 @@ public String readAllNotification() { return LOGIN; } getAccountMgr().readNotificationList(getCurUserId()); + String[] cacheKey = new String[]{CacheUtils.KEY_NOTIFICATION, new Integer(getCurUserId()).toString()}; + CacheUtils.del(cacheKey); return SUCCESS; } @@ -357,7 +359,10 @@ public String doRegister() { return ERROR; } - if (super.getAccountMgr().addUser(user)) { + if (getAccountMgr().getUserId(user.getAccount()) > 0) { + setErrMsg("该用户名" + user.getAccount() + "已经存在咯~~~"); + return ERROR; + } else if (super.getAccountMgr().addUser(user)) { return doLogin(); } else { return ERROR; @@ -398,6 +403,7 @@ public String updateProfile() { setRelativeReturnUrl("/account/updateProfile.do"); return LOGIN; } + user = getAccountMgr().getUser(getCurUserId()); setIsEditMode(true); return SUCCESS; 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(); diff --git a/src/main/java/com/taobao/rigel/rap/common/base/ActionBase.java b/src/main/java/com/taobao/rigel/rap/common/base/ActionBase.java index 97ab50328..a5eb20f23 100644 --- a/src/main/java/com/taobao/rigel/rap/common/base/ActionBase.java +++ b/src/main/java/com/taobao/rigel/rap/common/base/ActionBase.java @@ -48,7 +48,7 @@ public List> getCorpList() { if (cache != null) { corpList = CommonUtils.gson.fromJson(cache, new TypeToken>(){}.getType()); } else { - List list = accountMgr.getCorporationListWithPager(getCurUserId(), 1, 20); + List list = accountMgr.getCorporationListWithPager(getCurUserId(), 1, 40); for (Corporation c : list) { corpList.add(c.toMap()); } 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..c895ae94e 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. @@ -22,6 +24,8 @@ public class CacheUtils { public static final String KEY_ACCESS_USER_TO_PROJECT = "KEY_ACCESS_USER_TO_PROJECT"; public static final String KEY_NOTIFICATION = "KEY_NOTIFICATION"; + public static final String KEY_STATISTICS = "KEY_STATISTICS"; + public static final String KEY_STATISTICS_OF_TEAM = "KEY_STATISTICS_OF_TEAM"; private static JedisPool jedisPool; private static Jedis jedis; @@ -29,7 +33,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/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/java/com/taobao/rigel/rap/organization/dao/OrganizationDao.java b/src/main/java/com/taobao/rigel/rap/organization/dao/OrganizationDao.java index 62d042f6a..30fb442e0 100644 --- a/src/main/java/com/taobao/rigel/rap/organization/dao/OrganizationDao.java +++ b/src/main/java/com/taobao/rigel/rap/organization/dao/OrganizationDao.java @@ -148,34 +148,42 @@ public interface OrganizationDao { void setUserRoleInCorp(int userId, int corpId, int roleId); /** - * get corporation list * + * + * @param pageNum + * @param pageSize + * @param keyword * @return */ - List getCorporationListWithPager(int pageNum, int pageSize); + List getCorporationListWithPager(int pageNum, int pageSize, String keyword); /** - * get corporation list * + * + * @param keyword * @return */ - int getCorporationListWithPagerNum(); + int getCorporationListWithPagerNum(String keyword); /** - * get corporation list of user + * * * @param userId + * @param pageNum + * @param pageSize + * @param keyword * @return */ - List getCorporationListWithPager(int userId, int pageNum, int pageSize); + List getCorporationListWithPager(int userId, int pageNum, int pageSize, String keyword); /** - * get corporation list of user num + * * * @param userId + * @param keyword * @return */ - int getCorporationListWithPagerNum(int userId); + int getCorporationListWithPagerNum(int userId, String keyword); /** * add new corporation @@ -192,6 +200,22 @@ public interface OrganizationDao { */ int getMemberNumOfCorporation(int corpId); + /** + * get project num of corporation + * + * @param corpId + * @return + */ + int getProjectNumOfCorporation(int corpId); + + /** + * get action num of corporation + * + * @param corpId + * @return + */ + int getActionNumOfCorporation(int corpId); + /** * delete all membership from team * 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 1f875a4a7..7d7135010 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 @@ -187,16 +187,19 @@ public void setUserRoleInCorp(int userId, int corpId, int roleId) { } - public List getCorporationListWithPager(int pageNum, int pageSize) { + 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) { @@ -207,36 +210,43 @@ public List getCorporationListWithPager(int pageNum, int pageSize) } - public int getCorporationListWithPagerNum() { + 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()); } - public List getCorporationListWithPager(int userId, int pageNum, int pageSize) { + public List getCorporationListWithPager(int userId, int pageNum, int pageSize, String keyword) { + boolean isSearch = keyword != null && !keyword.trim().isEmpty(); StringBuilder sql = new StringBuilder(); sql .append("SELECT DISTINCT cid FROM ( ") .append(" SELECT c.id AS cid ") .append(" FROM tb_corporation c ") .append(" JOIN tb_corporation_and_user u ON u.corporation_id = c.id ") - .append(" WHERE u.user_id = :userId ") + .append(" WHERE u.user_id = :userId " + (isSearch ? "AND c.name LIKE CONCAT('%', :keyword, '%') " : "")) .append(" UNION ") .append(" SELECT id AS cid FROM tb_corporation ") - .append(" WHERE user_id = :userId or access_type = 20") + .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()); query.setInteger("userId", userId); query.setInteger("startIndex", (pageNum - 1) * pageSize); query.setInteger("pageSize", pageSize); + if (isSearch) { + query.setString("keyword", keyword); + } List list = query.list(); List resultList = new ArrayList(); @@ -248,21 +258,25 @@ public List getCorporationListWithPager(int userId, int pageNum, in } - public int getCorporationListWithPagerNum(int userId) { + public int getCorporationListWithPagerNum(int userId, String keyword) { + boolean isSearch = keyword != null && !keyword.trim().isEmpty(); StringBuilder sql = new StringBuilder(); sql .append("SELECT COUNT(DISTINCT cid) FROM ( ") .append(" SELECT c.id AS cid ") .append(" FROM tb_corporation c ") .append(" JOIN tb_corporation_and_user u ON u.corporation_id = c.id ") - .append(" WHERE u.user_id = :userId ") + .append(" WHERE u.user_id = :userId " + (isSearch ? "AND c.name LIKE CONCAT('%', :keyword, '%') " : "")) .append(" UNION ") .append(" SELECT id AS cid FROM tb_corporation ") - .append(" WHERE user_id = :userId or access_type = 20") + .append(" WHERE (user_id = :userId or access_type = 20) " + (isSearch ? "AND name LIKE CONCAT('%', :keyword, '%') " : "")) .append(") AS TEMP "); Query query = currentSession().createSQLQuery(sql.toString()); query.setInteger("userId", userId); + if (isSearch) { + query.setString("keyword", keyword); + } return Integer.parseInt(query.uniqueResult().toString()); } @@ -290,6 +304,34 @@ public int getMemberNumOfCorporation(int corpId) { return Integer.parseInt(query.uniqueResult().toString()); } + public int getProjectNumOfCorporation(int corpId) { + String sql = "SELECT COUNT(p.id) \n" + + "FROM tb_project p \n" + + "JOIN tb_group g ON g.id = p.group_id \n" + + "JOIN tb_production_line pl ON p.id = g.production_line_id\n" + + "WHERE pl.corporation_id = :corpId"; + Query query = currentSession().createSQLQuery(sql); + query.setInteger("corpId", corpId); + + return Integer.parseInt(query.uniqueResult().toString()); + } + + public int getActionNumOfCorporation(int corpId) { + String sql = "SELECT COUNT(a.id) \n" + + "FROM tb_action a\n" + + "JOIN tb_action_and_page ap ON ap.action_id = a.id\n" + + "JOIN tb_page p ON p.id = ap.page_id\n" + + "JOIN tb_module m ON m.id = p.module_id\n" + + "JOIN tb_project pr ON pr.id = m.project_id\n" + + "JOIN tb_group g ON g.id = pr.group_id \n" + + "JOIN tb_production_line pl ON pl.id = g.production_line_id\n" + + "WHERE pl.corporation_id = :corpId"; + Query query = currentSession().createSQLQuery(sql); + query.setInteger("corpId", corpId); + + return Integer.parseInt(query.uniqueResult().toString()); + } + private List getProjectIdsFromCorporation(int userId, int corpId) { StringBuilder builder = new StringBuilder(); builder.append("SELECT DISTINCT p.id AS projectId ") 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..ea67d4105 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 @@ -17,35 +17,42 @@ public interface OrganizationMgr { List getCorporationList(); /** - * get corporation list + * get corporation list with pager and search * + * @param pageNum + * @param pageSize + * @param keyword * @return */ - List getCorporationListWithPager(int pageNum, int pageSize); - + List getCorporationListWithPager(int pageNum, int pageSize, String keyword); /** - * get corporation list + * get corporation list num * + * @param keyword * @return */ - int getCorporationListWithPagerNum(); + int getCorporationListWithPagerNum(String keyword); /** - * get corporation list of user + * get corporation list of user with pager and search * * @param userId + * @param pageNum + * @param pageSize + * @param keyword * @return */ - List getCorporationListWithPager(int userId, int pageNum, int pageSize); + List getCorporationListWithPager(int userId, int pageNum, int pageSize, String keyword); /** - * get corporation list of user num + * get corporation list num * * @param userId + * @param keyword * @return */ - int getCorporationListWithPagerNum(int userId); + int getCorporationListWithPagerNum(int userId, String keyword); /** * get group list @@ -131,6 +138,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 +284,46 @@ public interface OrganizationMgr { * @param c */ void updateCorporation(Corporation c); + + + /** + * get team id by project id + * + * @param id + * @return + */ + int getTeamIdByProjectId(int id); + + /** + * get group + * + * @param id + * @return + */ + Group getGroup(int id); + + /** + * get number of member in specific corporation + * + * @param corpId + * @return + */ + int getMemberNumOfCorporation(int corpId); + + /** + * get project num of corporation + * + * @param corpId + * @return + */ + int getProjectNumOfCorporation(int corpId); + + /** + * get action num of corporation + * + * @param corpId + * @return + */ + int getActionNumOfCorporation(int corpId); + } 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..b693672c4 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,7 @@ 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; @@ -14,6 +16,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 { @@ -51,9 +54,9 @@ public List getCorporationList() { } - public List getCorporationListWithPager(int pageNum, int pageSize) { + public List getCorporationListWithPager(int pageNum, int pageSize, String keyword) { - List list = organizationDao.getCorporationListWithPager(pageNum, pageSize); + List list = organizationDao.getCorporationListWithPager(pageNum, pageSize, keyword); for (Corporation c : list) { int memberNum = organizationDao.getMemberNumOfCorporation(c.getId()); @@ -65,17 +68,17 @@ public List getCorporationListWithPager(int pageNum, int pageSize) } - public int getCorporationListWithPagerNum() { - return organizationDao.getCorporationListWithPagerNum(); + public int getCorporationListWithPagerNum(String keyword) { + return organizationDao.getCorporationListWithPagerNum(keyword); } - public List getCorporationListWithPager(int userId, int pageNum, int pageSize) { + public List getCorporationListWithPager(int userId, int pageNum, int pageSize, String keyword) { User user = accountMgr.getUser(userId); if (user.isAdmin()) { - return getCorporationListWithPager(pageNum, pageSize); + return getCorporationListWithPager(pageNum, pageSize, keyword); } - List list = organizationDao.getCorporationListWithPager(userId, pageNum, pageSize); + List list = organizationDao.getCorporationListWithPager(userId, pageNum, pageSize, keyword); for (Corporation c : list) { int memberNum = organizationDao.getMemberNumOfCorporation(c.getId()); c.setMemberNum(memberNum + 1); // +1 project creator @@ -86,12 +89,12 @@ public List getCorporationListWithPager(int userId, int pageNum, in } - public int getCorporationListWithPagerNum(int userId) { + public int getCorporationListWithPagerNum(int userId, String keyword) { User user = accountMgr.getUser(userId); if (user.isAdmin()) { - return getCorporationListWithPagerNum(); + return getCorporationListWithPagerNum(keyword); } - return organizationDao.getCorporationListWithPagerNum(userId); + return organizationDao.getCorporationListWithPagerNum(userId, keyword); } @@ -178,17 +181,53 @@ 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 { + 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; + } + + public boolean canUserDeleteProject(int userId, int projectId) { + User user = accountMgr.getUser(userId); + Project project = projectMgr.getProjectSummary(projectId); + 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 corp.getAccessType() == Corporation.PUBLIC_ACCESS || (roleId >= 1 && roleId <= 2 || + return (Role.isAdmin(roleId) || userId == getCorporation(corpId).getUserId()) || accountMgr.getUser(userId).isAdmin(); } - public List getUserLisOfCorp(int corpId) { List list = organizationDao.getUserLisOfCorp(corpId); Corporation c = getCorporation(corpId); @@ -197,9 +236,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); } @@ -282,19 +321,28 @@ 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; } public boolean setUserRoleInCorp(int curUserId, int userId, int corpId, int roleId) { - if (canUserManageUserInCorp(curUserId, userId, corpId)) { + if (canUserManageCorp(curUserId, corpId)) { organizationDao.setUserRoleInCorp(userId, corpId, roleId); + String[] cacheKey = new String[]{CacheUtils.KEY_PROJECT_LIST, new Integer(userId).toString()}; + CacheUtils.del(cacheKey); return true; } else { return false; @@ -303,15 +351,11 @@ 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; } - organizationDao.deleteMembershipFromCorp(curUserId, userId, corpId); - return true; } @@ -329,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); } } @@ -337,20 +383,39 @@ 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); - if (curUser.isAdmin()) { - return true; - } - int roleId = getUserRoleInCorp(curUserId, corpId); - if (roleId >= 1 || roleId <= 2) { - return true; - } - return false; + public Group getGroup(int id) { + return organizationDao.getGroup(id); } + public int getMemberNumOfCorporation(int corpId) { + return organizationDao.getMemberNumOfCorporation(corpId); + } + + public int getProjectNumOfCorporation(int corpId) { + return organizationDao.getProjectNumOfCorporation(corpId); + } + + public int getActionNumOfCorporation(int corpId) { + return organizationDao.getActionNumOfCorporation(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..63fd68edb 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 @@ -19,7 +19,16 @@ public class GroupAction extends ActionBase { private ProjectMgr projectMgr; private int id; private String name; - private int productLineId; + + public int getProductlineId() { + return productlineId; + } + + public void setProductlineId(int productlineId) { + this.productlineId = productlineId; + } + + private int productlineId; public int getId() { return id; @@ -45,14 +54,6 @@ public void setProjectMgr(ProjectMgr projectMgr) { this.projectMgr = projectMgr; } - public int getProductLineId() { - return productLineId; - } - - public void setProductLineId(int productLineId) { - this.productLineId = productLineId; - } - public OrganizationMgr getOrganizationMgr() { return organizationMgr; } @@ -66,14 +67,14 @@ public String all() { plsLogin(); return JSON_ERROR; } - if (!organizationMgr.canUserAccessProductionLine(getCurUserId(), productLineId)) { + if (!organizationMgr.canUserAccessProductionLine(getCurUserId(), productlineId)) { setErrMsg(ACCESS_DENY); return JSON_ERROR; } Gson gson = new Gson(); Map result = new HashMap(); List> groups = new ArrayList>(); - List groupModels = organizationMgr.getGroupList(productLineId); + List groupModels = organizationMgr.getGroupList(productlineId); for (Group groupModel : groupModels) { Map group = new HashMap(); group.put("id", groupModel.getId()); @@ -83,7 +84,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 +94,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); @@ -113,14 +114,14 @@ public String groups() { plsLogin(); return JSON_ERROR; } - if (!organizationMgr.canUserAccessProductionLine(getCurUserId(), productLineId)) { + if (!organizationMgr.canUserAccessProductionLine(getCurUserId(), productlineId)) { setErrMsg(ACCESS_DENY); return JSON_ERROR; } Gson gson = new Gson(); Map result = new HashMap(); List> groups = new ArrayList>(); - List groupModels = organizationMgr.getGroupList(productLineId); + List groupModels = organizationMgr.getGroupList(productlineId); for (Group groupModel : groupModels) { Map group = new HashMap(); group.put("id", groupModel.getId()); @@ -139,7 +140,7 @@ public String create() { plsLogin(); return JSON_ERROR; } - if (!organizationMgr.canUserManageProductionLine(getCurUserId(), productLineId)) { + if (!organizationMgr.canUserManageProductionLine(getCurUserId(), productlineId)) { setErrMsg(ACCESS_DENY); return JSON_ERROR; } @@ -147,7 +148,7 @@ public String create() { Group group = new Group(); group.setName(name); group.setUserId((int) getCurUserId()); - group.setProductionLineId(productLineId); + group.setProductionLineId(productlineId); int id = organizationMgr.addGroup(group); Map g = new HashMap(); g.put("id", id); 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..76f84aff1 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 @@ -18,19 +18,25 @@ public class OrganizationAction extends ActionBase { private OrganizationMgr organizationMgr; private ProjectMgr projectMgr; + + public int getPlid() { + return plid; + } + + public void setPlid(int plid) { + this.plid = plid; + } + private int plid; private int id; - private Corporation corporation; private ProductionLine productline; - private Corporation team; - public Corporation getCorporation() { - return corporation; - } - public void setCorporation(Corporation corporation) { - this.corporation = corporation; + public void setTeam(Corporation team) { + this.team = team; } + private Corporation team; + public int getId() { return id; } @@ -39,15 +45,7 @@ public void setId(int id) { this.id = id; } - public int getPlid() { - return plid; - } - - public void setPlid(int plid) { - this.plid = plid; - } - - public ProductionLine getProductLine() { + public ProductionLine getProductline() { return productline; } @@ -97,8 +95,7 @@ public String group() { } productline = organizationMgr.getProductionLine(plid); - int corpId = productline.getCorporationId(); - team = organizationMgr.getCorporation(corpId); + team = organizationMgr.getCorporation(productline.getCorporationId()); return SUCCESS; } @@ -114,7 +111,7 @@ public String productline() { return ERROR; } - setCorporation(organizationMgr.getCorporation(id)); + setTeam(organizationMgr.getCorporation(id)); return SUCCESS; } @@ -144,18 +141,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()); @@ -182,7 +175,7 @@ public String corporationList() { } Gson gson = new Gson(); - setJson(gson.toJson(organizationMgr.getCorporationListWithPager(getCurUserId(), 1, 1000))); + setJson(gson.toJson(organizationMgr.getCorporationListWithPager(getCurUserId(), 1, 1000, null))); return SUCCESS; } 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..a6a9694dd 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 @@ -30,6 +30,16 @@ public class TeamAction extends ActionBase { private OrganizationMgr organizationMgr; private String desc; + public String getKeyword() { + return keyword; + } + + public void setKeyword(String keyword) { + this.keyword = keyword; + } + + private String keyword; + public Corporation getTeam() { return team; } @@ -118,8 +128,8 @@ public String teams() { return LOGIN; } int userId = getCurUserId(); - teamList = organizationMgr.getCorporationListWithPager(userId, getPageNum(), SystemConstant.DEFAULT_PAGE_SIZE); - teamListNum = organizationMgr.getCorporationListWithPagerNum(userId); + teamList = organizationMgr.getCorporationListWithPager(userId, getPageNum(), SystemConstant.DEFAULT_PAGE_SIZE, keyword); + teamListNum = organizationMgr.getCorporationListWithPagerNum(userId, keyword); return SUCCESS; } @@ -236,6 +246,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/platform/dao/DataDao.java b/src/main/java/com/taobao/rigel/rap/platform/dao/DataDao.java index 8ac1b8936..dbf4c75c6 100644 --- a/src/main/java/com/taobao/rigel/rap/platform/dao/DataDao.java +++ b/src/main/java/com/taobao/rigel/rap/platform/dao/DataDao.java @@ -16,4 +16,6 @@ public interface DataDao { List> getActionNumByTeam(); + List> getTop10ActionNumByTeam(int teamId); + } diff --git a/src/main/java/com/taobao/rigel/rap/platform/dao/impl/DataDaoImpl.java b/src/main/java/com/taobao/rigel/rap/platform/dao/impl/DataDaoImpl.java index 729e6290a..21082cd5a 100644 --- a/src/main/java/com/taobao/rigel/rap/platform/dao/impl/DataDaoImpl.java +++ b/src/main/java/com/taobao/rigel/rap/platform/dao/impl/DataDaoImpl.java @@ -127,4 +127,32 @@ public List> getActionNumByTeam() { return result; } + + public List> getTop10ActionNumByTeam(int teamId) { + String sql = "SELECT\n" + + " p.name AS name,\n" + + " COUNT(a.id) AS actionNum\n" + + "FROM tb_production_line pl\n" + + " JOIN tb_group g ON g.production_line_id = pl.id\n" + + " JOIN tb_project p ON p.group_id = g.id\n" + + " JOIN tb_module m ON m.project_id = p.id\n" + + " JOIN tb_page p2 ON p2.module_id = m.id\n" + + " JOIN tb_action_and_page ap ON ap.page_id = p2.id\n" + + " JOIN tb_action a ON a.id = ap.action_id\n" + + "WHERE pl.corporation_id = :corpId\n" + + "GROUP BY p.id\n" + + "ORDER BY COUNT(a.id) DESC\n" + + "LIMIT 0, 50"; + Query query = currentSession().createSQLQuery(sql); + query.setInteger("corpId", teamId); + List list = query.list(); + List> result = new ArrayList>(); + for (Object[] row : list) { + Map map = new HashMap(); + map.put("name", row[0].toString()); + map.put("num", row[1].toString()); + result.add(map); + } + return result; + } } diff --git a/src/main/java/com/taobao/rigel/rap/platform/service/DataMgr.java b/src/main/java/com/taobao/rigel/rap/platform/service/DataMgr.java index b5f2072bf..04c0ba01f 100644 --- a/src/main/java/com/taobao/rigel/rap/platform/service/DataMgr.java +++ b/src/main/java/com/taobao/rigel/rap/platform/service/DataMgr.java @@ -17,4 +17,6 @@ public interface DataMgr { List> getActionNumByTeam(); List> getMockNumByProject(); + + List> getTop10ActionNumByTeam(int teamId); } diff --git a/src/main/java/com/taobao/rigel/rap/platform/service/impl/DataMgrImpl.java b/src/main/java/com/taobao/rigel/rap/platform/service/impl/DataMgrImpl.java index 1dda99108..37749a911 100644 --- a/src/main/java/com/taobao/rigel/rap/platform/service/impl/DataMgrImpl.java +++ b/src/main/java/com/taobao/rigel/rap/platform/service/impl/DataMgrImpl.java @@ -67,4 +67,8 @@ public List> getMockNumByProject() { return results; } + public List> getTop10ActionNumByTeam(int teamId) { + return dataDao.getTop10ActionNumByTeam(teamId); + } + } diff --git a/src/main/java/com/taobao/rigel/rap/platform/web/action/PlatformAction.java b/src/main/java/com/taobao/rigel/rap/platform/web/action/PlatformAction.java index 4ba96f9c8..8e761fc20 100644 --- a/src/main/java/com/taobao/rigel/rap/platform/web/action/PlatformAction.java +++ b/src/main/java/com/taobao/rigel/rap/platform/web/action/PlatformAction.java @@ -1,32 +1,60 @@ package com.taobao.rigel.rap.platform.web.action; import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.taobao.rigel.rap.account.bo.User; import com.taobao.rigel.rap.common.base.ActionBase; import com.taobao.rigel.rap.common.bo.Item; +import com.taobao.rigel.rap.common.config.SystemConstant; +import com.taobao.rigel.rap.common.utils.CacheUtils; +import com.taobao.rigel.rap.common.utils.CommonUtils; import com.taobao.rigel.rap.common.utils.SystemVisitorLog; +import com.taobao.rigel.rap.organization.bo.Corporation; +import com.taobao.rigel.rap.organization.service.OrganizationMgr; import com.taobao.rigel.rap.platform.service.DataMgr; import com.taobao.rigel.rap.project.service.ProjectMgr; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.awt.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class PlatformAction extends ActionBase { - private static final Logger logger = LogManager.getFormatterLogger(PlatformAction.class.getName()); + // private static final Logger logger = LogManager.getFormatterLogger(PlatformAction.class); private Gson gson = new Gson(); private int time; - private Map>> trends = new HashMap>>(); - private Map>> statistics = new HashMap>>(); + private Map>> trends; + private Map>> statistics; private int tabIndex; private ProjectMgr projectMgr; - private List modelLog = new ArrayList(); - private Map modelLogMap = new HashMap(); + private List modelLog; + private Map modelLogMap; private DataMgr dataMgr; private String text; + public OrganizationMgr getOrganizationMgr() { + return organizationMgr; + } + + public void setOrganizationMgr(OrganizationMgr organizationMgr) { + this.organizationMgr = organizationMgr; + } + + private OrganizationMgr organizationMgr; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + private int id; + public void setTime(int time) { this.time = time; } @@ -103,32 +131,122 @@ public String test() { return SUCCESS; } + public String teamLog() { + if (!isUserLogined()) { + plsLogin(); + setRelativeReturnUrl("/platform/teamLog.do?id=" + id); + return LOGIN; + } + if (!organizationMgr.canUserAccessCorp(getCurUserId(), id)) { + setErrMsg(ACCESS_DENY); + return ERROR; + } + Corporation team = organizationMgr.getCorporation(id); + if (team == null) { + setErrMsg("错误的team id,请检查页面参数是否复制不完整."); + return ERROR; + } + + String[] cacheKey = {CacheUtils.KEY_STATISTICS_OF_TEAM, new Integer(getId()).toString()}; + String cache = CacheUtils.get(cacheKey); + + if (cache != null) { + Map mapCache = CommonUtils.gson.fromJson(cache, new TypeToken>() { + }.getType()); + modelLogMap = (Map) mapCache.get("modelLogMap"); + trends = (Map>>) mapCache.get("trends"); + statistics = (Map>>) mapCache.get("statistics"); + modelLog = (List) mapCache.get("modelLog"); + } else { + modelLog = new ArrayList(); + modelLogMap = new HashMap(); + trends = new HashMap>>(); + statistics = new HashMap>>(); + + // statistics for RAP models + modelLog.add(new Item("user", "" + organizationMgr.getMemberNumOfCorporation(id))); + modelLog.add(new Item("project", "" + organizationMgr.getProjectNumOfCorporation(id))); + modelLog.add(new Item("action", "" + organizationMgr.getActionNumOfCorporation(id))); + + for (Item item : modelLog) { + modelLogMap.put(item.getKey(), item); + } + + // trends data + trends.put("user", dataMgr.getUserTrendByMonth()); + trends.put("project", dataMgr.getProjectTrendByMonth()); + trends.put("checkIn", dataMgr.getCheckInTrendByMonth()); + + + // statistics data + statistics.put("top10ActionNumByTeam", dataMgr.getTop10ActionNumByTeam(id)); + + Map mapCache = new HashMap(); + mapCache.put("modelLogMap", modelLogMap); + mapCache.put("trends", trends); + mapCache.put("statistics", statistics); + mapCache.put("modelLog", modelLog); + CacheUtils.put(cacheKey, CommonUtils.gson.toJson(mapCache)); + } + return SUCCESS; + } + public String log() { - // statistics for RAP models - modelLog.add(new Item("用户数", new Integer(getAccountMgr().getUserNum()).toString())); - modelLog.add(new Item("项目数", new Integer(projectMgr.getProjectNum()).toString())); - modelLog.add(new Item("接口数", new Integer(projectMgr.getActionNum()).toString())); - //modelLog.add(new Item("TAB数", new Integer(projectMgr.getModuleNum()).toString())); - //modelLog.add(new Item("页面数", new Integer(projectMgr.getPageNum()).toString())); - //modelLog.add(new Item("参数数", new Integer(projectMgr.getParametertNum()).toString())); - modelLog.add(new Item("文档提交数", new Integer(projectMgr.getCheckInNum()).toString())); - modelLog.add(new Item("MOCK服务调用次数", new Integer(projectMgr.getMockNumInTotal()).toString(), "该信息自2014年10月底开始记录")); - - for (Item item : modelLog) { - modelLogMap.put(item.getKey(), item); + if (!isUserLogined()) { + plsLogin(); + setRelativeReturnUrl("/platform/log.do"); + return LOGIN; } + String[] cacheKey = {CacheUtils.KEY_STATISTICS}; + String cache = CacheUtils.get(cacheKey); + + if (cache != null) { + Map mapCache = CommonUtils.gson.fromJson(cache, new TypeToken>() { + }.getType()); + modelLogMap = (Map) mapCache.get("modelLogMap"); + trends = (Map>>) mapCache.get("trends"); + statistics = (Map>>) mapCache.get("statistics"); + modelLog = (List) mapCache.get("modelLog"); + } else { + modelLog = new ArrayList(); + modelLogMap = new HashMap(); + trends = new HashMap>>(); + statistics = new HashMap>>(); + + // statistics for RAP models + modelLog.add(new Item("user", new Integer(getAccountMgr().getUserNum()).toString())); + modelLog.add(new Item("project", new Integer(projectMgr.getProjectNum()).toString())); + modelLog.add(new Item("action", new Integer(projectMgr.getActionNum()).toString())); + + //modelLog.add(new Item("TAB数", new Integer(projectMgr.getModuleNum()).toString())); + //modelLog.add(new Item("页面数", new Integer(projectMgr.getPageNum()).toString())); + //odelLog.add(new Item("参数数", new Integer(projectMgr.getParametertNum()).toString())); - // trends data - trends.put("user", dataMgr.getUserTrendByMonth()); - trends.put("project", dataMgr.getProjectTrendByMonth()); - trends.put("checkIn", dataMgr.getCheckInTrendByMonth()); + modelLog.add(new Item("checkIn", new Integer(projectMgr.getCheckInNum()).toString())); + modelLog.add(new Item("mockNum", new Integer(projectMgr.getMockNumInTotal()).toString())); + for (Item item : modelLog) { + modelLogMap.put(item.getKey(), item); + } - // statistics data - statistics.put("actionNumByTeam", dataMgr.getActionNumByTeam()); - statistics.put("mockNumByProject", dataMgr.getMockNumByProject()); - statistics.put("mockNumByProjectToday", SystemVisitorLog.getMockNumByProjectToday(projectMgr)); + // trends data + trends.put("user", dataMgr.getUserTrendByMonth()); + trends.put("project", dataMgr.getProjectTrendByMonth()); + trends.put("checkIn", dataMgr.getCheckInTrendByMonth()); + + // statistics data + statistics.put("actionNumByTeam", dataMgr.getActionNumByTeam()); + statistics.put("mockNumByProject", dataMgr.getMockNumByProject()); + statistics.put("mockNumByProjectToday", SystemVisitorLog.getMockNumByProjectToday(projectMgr)); + + Map mapCache = new HashMap(); + mapCache.put("modelLogMap", modelLogMap); + mapCache.put("trends", trends); + mapCache.put("statistics", statistics); + mapCache.put("modelLog", modelLog); + CacheUtils.put(cacheKey, CommonUtils.gson.toJson(mapCache)); + } 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/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 b4b8f8c5a..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 @@ -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); } @@ -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 3a999d817..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 { @@ -74,23 +75,26 @@ 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())); + + List memberIdList = getMemberIdsOfProject(p.getId()); + Set memberList = new HashSet(); + for (int memberId : memberIdList) { + memberList.add(accountMgr.getUser(memberId)); + } + p.setUserList(memberList); } return projectList; } - public int addProject(Project project) { project.setUpdateTime(new Date()); project.setCreateDate(new Date()); @@ -439,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/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..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 @@ -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,8 +218,8 @@ public void setProjectData(String projectData) { public String delete() { if (!isUserLogined()) return LOGIN; - if (!getAccountMgr().canUserManageProject(getCurUserId(), getId())) { - setErrMsg("您没有管理该项目的权限"); + if (!organizationMgr.canUserDeleteProject(getCurUserId(), getId())) { + setErrMsg("您没有删除该项目的权限"); return ERROR; } projectMgr.removeProject(getId()); @@ -233,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); @@ -254,10 +267,11 @@ public String create() { public String update() { if (!isUserLogined()) return LOGIN; - if (!getAccountMgr().canUserManageProject(getCurUserId(), getId())) { + if (!organizationMgr.canUserManageProject(getCurUserId(), getId())) { setErrMsg("您没有管理该项目的权限"); return ERROR; } + Project project = new Project(); project.setId(getId()); project.setIntroduction(getDesc()); @@ -269,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); @@ -289,7 +305,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 +314,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..f62d64b08 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 @@ -8,6 +8,9 @@ import com.taobao.rigel.rap.common.service.impl.ContextManager; import com.taobao.rigel.rap.common.utils.CacheUtils; import com.taobao.rigel.rap.common.utils.MapUtils; +import com.taobao.rigel.rap.organization.bo.Corporation; +import com.taobao.rigel.rap.organization.bo.Group; +import com.taobao.rigel.rap.organization.bo.ProductionLine; import com.taobao.rigel.rap.organization.service.OrganizationMgr; import com.taobao.rigel.rap.project.bo.Module; import com.taobao.rigel.rap.project.bo.Project; @@ -51,6 +54,36 @@ public class WorkspaceAction extends ActionBase { private int versionId; private String deletedObjectListData; private String tag; + + public Group getGroup() { + return group; + } + + public void setGroup(Group group) { + this.group = group; + } + + private Group group; + + public Corporation getTeam() { + return team; + } + + public void setTeam(Corporation team) { + this.team = team; + } + + private Corporation team; + + public ProductionLine getProductline() { + return productline; + } + + public void setProductline(ProductionLine productline) { + this.productline = productline; + } + + private ProductionLine productline; /** * from 1 to 4, version position */ @@ -237,7 +270,12 @@ public String myWorkspace() { + projectId); return LOGIN; } - setAccessable(getAccountMgr().canUserManageProject(getCurUserId(), getProjectId())); + setAccessable(organizationMgr.canUserManageProject(getCurUserId(), getProjectId())); + + Project p = projectMgr.getProjectSummary(getProjectId()); + group = organizationMgr.getGroup(p.getGroupId()); + productline = organizationMgr.getProductionLine(group.getProductionLineId()); + team = organizationMgr.getCorporation(productline.getCorporationId()); return SUCCESS; } @@ -338,7 +376,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; diff --git a/src/main/resources/com/taobao/rigel/rap/platform/web/action/struts.xml b/src/main/resources/com/taobao/rigel/rap/platform/web/action/struts.xml index ef25d4cad..93e79b8cd 100644 --- a/src/main/resources/com/taobao/rigel/rap/platform/web/action/struts.xml +++ b/src/main/resources/com/taobao/rigel/rap/platform/web/action/struts.xml @@ -13,6 +13,9 @@ /platform/log.vm + + /platform/teamLog.vm + /platform/monitor.vm diff --git a/src/main/resources/mysql.local.properties b/src/main/resources/config.properties similarity index 86% rename from src/main/resources/mysql.local.properties rename to src/main/resources/config.properties index e5cac9132..40e2fd82a 100644 --- a/src/main/resources/mysql.local.properties +++ b/src/main/resources/config.properties @@ -2,3 +2,5 @@ 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= +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/webapp/org/group/index.js b/src/main/webapp/org/group/index.js index 593563b6b..448b58b6c 100644 --- a/src/main/webapp/org/group/index.js +++ b/src/main/webapp/org/group/index.js @@ -79,7 +79,7 @@ $(function () { } var modal = $(this); $.post($.route('org.group.create'), { - productLineId: plId, + productlineId: plId, name: inputer.val().trim() }, function (data) { var html = $.render(tmpl, data); @@ -297,7 +297,7 @@ $(function () { function render() { $.get($.route('org.group.all'), { - productLineId: plId + productlineId: plId }, function (groups) { var tmpl = $('#group-tmpl').text(); diff --git a/src/main/webapp/org/group/index.vm b/src/main/webapp/org/group/index.vm index 0ff6df221..a959cce01 100644 --- a/src/main/webapp/org/group/index.vm +++ b/src/main/webapp/org/group/index.vm @@ -13,11 +13,7 @@ #bodyNewStart
- + #breadcrumb
创建分组
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}}
diff --git a/src/main/webapp/org/productline/index.vm b/src/main/webapp/org/productline/index.vm index 695e98710..2a603b7c6 100644 --- a/src/main/webapp/org/productline/index.vm +++ b/src/main/webapp/org/productline/index.vm @@ -13,10 +13,7 @@
- + #breadcrumb
diff --git a/src/main/webapp/org/team/manage.vm b/src/main/webapp/org/team/manage.vm index 43093d9dd..1044eeedf 100644 --- a/src/main/webapp/org/team/manage.vm +++ b/src/main/webapp/org/team/manage.vm @@ -8,6 +8,10 @@ #bodyNewStart
diff --git a/src/main/webapp/org/team/teams.vm b/src/main/webapp/org/team/teams.vm index db3ea3e62..150be3359 100644 --- a/src/main/webapp/org/team/teams.vm +++ b/src/main/webapp/org/team/teams.vm @@ -7,57 +7,90 @@ #bodyNewStart -
名字
- - - - - - - - #foreach($item in $teamList) - - - - - + #end + +
团队名称创建人人数操作
#if($item.accessType==20)  #end $!utils.escapeInH($item.name)$!utils.escapeInH($item.creatorName)$item.memberNum - -      - #if($item.hasAccess) - + + + + + + + + + + + + #foreach($item in $teamList) + + + + + - - #end - -
团队名称创建人人数操作
#if($item.accessType==20)  #end $!utils.escapeInH($item.name)$!utils.escapeInH($item.creatorName)$item.memberNum + - #end -
-
+ + #end +
  • +
  • + + +
    #bodyEnd diff --git a/src/main/webapp/platform/log.vm b/src/main/webapp/platform/log.vm index bb677ed9f..5dc34079f 100644 --- a/src/main/webapp/platform/log.vm +++ b/src/main/webapp/platform/log.vm @@ -19,15 +19,6 @@ height: 250px; } - #debug { - display: none; - } - - #debug .content { - width: 1140px; - word-break: break-all; - } - .data-tab { font-size: 30px; color: #888; @@ -41,14 +32,6 @@ #bodyNewStart

     RAP Dashboard

    - -
    -
    -

    DEBUG INFO

    - -
    $realtimeJSON
    -
    -

     实时数据

    @@ -76,14 +59,12 @@

     使用数据

    - 目前已有$modelLogMap.get("用户数").getValue() 位工程师
    - $modelLogMap.get("项目数").getValue() 个业务项目在使用RAP。
    + 目前已有$modelLogMap.user.value 位工程师
    + $modelLogMap.project.value 个业务项目在使用RAP。
    在这里定义了 - $modelLogMap.get( - "接口数").getValue() 个接口
    RAP已为小伙伴们伪造了
    + $modelLogMap.action.value 个接口
    RAP已为小伙伴们伪造了
    $modelLogMap.get( - "MOCK服务调用次数").getValue() 次MOCK数据! + data-start="$modelLogMap.mockNum.value">$modelLogMap.mockNum.value 次MOCK数据!
    diff --git a/src/main/webapp/platform/teamLog.js b/src/main/webapp/platform/teamLog.js new file mode 100644 index 000000000..0825f8196 --- /dev/null +++ b/src/main/webapp/platform/teamLog.js @@ -0,0 +1,5 @@ +'use strict'; + +!function (global) { + +}(this); \ No newline at end of file diff --git a/src/main/webapp/platform/teamLog.vm b/src/main/webapp/platform/teamLog.vm new file mode 100644 index 000000000..8ccdd0130 --- /dev/null +++ b/src/main/webapp/platform/teamLog.vm @@ -0,0 +1,90 @@ + + + + + RAP Dashboard for Team + #parse('/tcom/template.rap.vm') + #includeNewRapStatic + + + + + + + +#bodyNewStart +
    +

    + + RAP Dashboard for Team +

    +
    +
    +

     使用数据

    + +
    + 该团队中目前已有$modelLogMap.user.value 位工程师
    + $modelLogMap.project.value 个业务项目在使用RAP。
    + 在这里定义了 + $modelLogMap.action.value 个接口! +
    +
    +
    +

     全量统计

    + + + +
    +
    + + + + + + + + + + #foreach($item in $statistics.top10ActionNumByTeam) + + + + + + #end + +
    #IPCount
    $velocityCount$item.name$item.num
    +
    +
    +
    +
    +
    +#bodyEnd + + + \ No newline at end of file diff --git a/src/main/webapp/stat/css/rap.template.css b/src/main/webapp/stat/css/rap.template.css index 71424b461..20c3e0f9c 100644 --- a/src/main/webapp/stat/css/rap.template.css +++ b/src/main/webapp/stat/css/rap.template.css @@ -748,4 +748,21 @@ div#tipDiv { text-shadow: 0 0 2px rgba(0, 0, 0, .4); right: 2px; bottom: 0; +} + +#rap-logo-text { + color: #FF0052; /* Fallback Color */ + text-transform: uppercase; + font-weight: bold; + font-family: helvetica; + text-align:center; + font-size: 30px; + letter-spacing: 0; +} +@media screen and (-webkit-min-device-pixel-ratio:0) { + #rap-logo-text { + background: -webkit-gradient(linear,left top,left bottom,from(#FF0052),to(#802F7B)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + } } \ No newline at end of file diff --git a/src/main/webapp/stat/js/core/rap.js b/src/main/webapp/stat/js/core/rap.js index 98eda55f1..0f2090488 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) { @@ -2589,7 +2610,7 @@ function deepCopy(o) { //} } if (empty) { - $('#actionOpFloater-page').append($("