Эх сурвалжийг харах

Manage panelCodes in entity User

sunyj 8 жил өмнө
parent
commit
75feb2e4bb
23 өөрчлөгдсөн 306 нэмэгдсэн , 478 устгасан
  1. 5 5
      kanban-auth/src/main/java/com/uas/kanban/SecurityConfiguration.java
  2. 16 0
      kanban-auth/src/main/java/com/uas/kanban/controller/UserController.java
  3. 25 0
      kanban-auth/src/main/java/com/uas/kanban/dao/PanelInstanceDao.java
  4. 37 0
      kanban-auth/src/main/java/com/uas/kanban/dao/UserDao.java
  5. 17 0
      kanban-auth/src/main/java/com/uas/kanban/model/Panel.java
  6. 17 0
      kanban-auth/src/main/java/com/uas/kanban/model/PanelInstance.java
  7. 22 4
      kanban-auth/src/main/java/com/uas/kanban/model/User.java
  8. 10 0
      kanban-auth/src/main/java/com/uas/kanban/service/UserService.java
  9. 22 1
      kanban-auth/src/main/java/com/uas/kanban/service/impl/UserServiceImpl.java
  10. 11 2
      kanban-common/src/main/java/com/uas/kanban/base/BaseDao.java
  11. 59 68
      kanban-console/README.md
  12. 0 40
      kanban-console/src/main/java/com/uas/kanban/controller/PanelController.java
  13. 0 18
      kanban-console/src/main/java/com/uas/kanban/controller/UserPanelRelationController.java
  14. 2 8
      kanban-console/src/main/java/com/uas/kanban/dao/PanelDao.java
  15. 22 11
      kanban-console/src/main/java/com/uas/kanban/dao/PanelInstanceDao.java
  16. 0 121
      kanban-console/src/main/java/com/uas/kanban/dao/UserPanelRelationDao.java
  17. 23 9
      kanban-console/src/main/java/com/uas/kanban/model/PanelInstance.java
  18. 0 64
      kanban-console/src/main/java/com/uas/kanban/model/UserPanelRelation.java
  19. 0 33
      kanban-console/src/main/java/com/uas/kanban/service/PanelService.java
  20. 14 30
      kanban-console/src/main/java/com/uas/kanban/service/impl/PanelInstanceServiceImpl.java
  21. 1 31
      kanban-console/src/main/java/com/uas/kanban/service/impl/PanelServiceImpl.java
  22. 0 16
      kanban-console/src/main/java/com/uas/kanban/service/impl/UserPanelRelationServiceImpl.java
  23. 3 17
      kanban-console/src/main/webapp/WEB-INF/views/console.html

+ 5 - 5
kanban-auth/src/main/java/com/uas/kanban/SecurityConfiguration.java

@@ -34,11 +34,11 @@ public class SecurityConfiguration extends WebMvcConfigurerAdapter {
         registration.excludePathPatterns("/user/login", "/user/logout", "/user/exist");
 
         // 添加管理员才可访问的路径
-        // 用户面板关系
-        securityInterceptor.addAdminPatterns("/userPanelRelation/**");
-        // 用户、面板管理
-        securityInterceptor.addAdminPatterns("/user/save*/**", "/user/update*/**", "/user/delete*/**", "/user/get*/**",
-                "/panel/save*/**", "/panel/update*/**", "/panel/delete*/**", "/panel/assignPanel", "/panel/get/byUser/**");
+        // 用户管理
+        securityInterceptor.addAdminPatterns("/user/save*/**", "/user/update*/**", "/user/delete*/**",
+                "/user/get*/**", "/user/assignPanel");
+        // 面板管理
+        securityInterceptor.addAdminPatterns("/panel/save*/**", "/panel/update*/**", "/panel/delete*/**");
         // 看板设计
         securityInterceptor.addAdminPatterns("/kanban/**", "/board");
         // 参数

+ 16 - 0
kanban-auth/src/main/java/com/uas/kanban/controller/UserController.java

@@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
+import java.util.Arrays;
 
 /**
  * 用户
@@ -101,4 +102,19 @@ public class UserController extends BaseController<User> {
         user.setRole(User.Role.Admin);
         return save(JSONObject.toJSONString(user), request);
     }
+
+    /**
+     * 为指定用户分配面板
+     *
+     * @param userCode   用户 code
+     * @param panelCodes 面板 code
+     * @param request    request
+     * @return 分配成功
+     */
+    @RequestMapping("/assignPanel")
+    @ResponseBody
+    public boolean assignPanel(@NotEmpty("userCode") String userCode, String[] panelCodes, HttpServletRequest request) {
+        userService.assignPanel(userCode, panelCodes == null ? null : Arrays.asList(panelCodes));
+        return true;
+    }
 }

+ 25 - 0
kanban-auth/src/main/java/com/uas/kanban/dao/PanelInstanceDao.java

@@ -0,0 +1,25 @@
+package com.uas.kanban.dao;
+
+import com.uas.kanban.annotation.NotEmpty;
+
+import java.util.List;
+
+/**
+ * 面板实例(这里仅仅声明这个类,之后在 kanban-console 会覆盖该类)
+ *
+ * @author sunyj
+ * @since 2017/10/24 9:55
+ */
+public class PanelInstanceDao {
+
+    /**
+     * 根据用户和面板,删除相应的实例
+     *
+     * @param userCode   用户 code
+     * @param panelCodes 面板 code
+     * @return 删除的数据条数
+     */
+    public int deleteByUserCodeAndPanelCode(@NotEmpty("userCode") String userCode, List<String> panelCodes) {
+        return 0;
+    }
+}

+ 37 - 0
kanban-auth/src/main/java/com/uas/kanban/dao/UserDao.java

@@ -1,9 +1,16 @@
 package com.uas.kanban.dao;
 
+import com.uas.kanban.annotation.NotEmpty;
 import com.uas.kanban.base.BaseDao;
+import com.uas.kanban.model.Panel;
 import com.uas.kanban.model.User;
+import org.mongodb.morphia.query.UpdateOperations;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * 用户
  *
@@ -13,9 +20,39 @@ import org.springframework.stereotype.Component;
 @Component
 public class UserDao extends BaseDao<User> {
 
+    @Autowired
+    private BaseDao<Panel> panelDao;
+
+    @Autowired
+    private PanelInstanceDao panelInstanceDao;
+
     @Override
     protected String collectionSimpleName() {
         return "用户";
     }
 
+    /**
+     * 为指定用户分配面板
+     *
+     * @param userCode   用户 code
+     * @param panelCodes 面板 code
+     */
+    public void assignPanel(@NotEmpty("userCode") String userCode, List<String> panelCodes) {
+        User user = findOne(userCode);
+        List<String> oldPanelCodes = user.getPanelCodes();
+        // 初始化
+        oldPanelCodes = oldPanelCodes == null ? new ArrayList<String>() : oldPanelCodes;
+        panelCodes = panelCodes == null ? new ArrayList<String>() : panelCodes;
+        for (String panelCode : panelCodes) {
+            panelDao.checkExist(panelCode);
+            // 如果已分配,则移出,剩下的便是已弃用的,需要删除相关的面板实例
+            oldPanelCodes.remove(panelCode);
+        }
+        UpdateOperations<User> operations = createUpdateOperations();
+        operations.set("panelCodes", panelCodes);
+        update(userCode, operations);
+        // 删除弃用面板相关的面板实例
+        panelInstanceDao.deleteByUserCodeAndPanelCode(userCode, oldPanelCodes);
+        // delete user's PanelInstance before generating new instances?
+    }
 }

+ 17 - 0
kanban-auth/src/main/java/com/uas/kanban/model/Panel.java

@@ -0,0 +1,17 @@
+package com.uas.kanban.model;
+
+import com.uas.kanban.base.BaseEntity;
+import org.mongodb.morphia.annotations.Entity;
+
+/**
+ * 面板(这里仅仅声明这个类,之后在 kanban-console 会覆盖该类)
+ *
+ * @author sunyj
+ * @since 2017/10/24 9:02
+ */
+@Entity
+public class Panel extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+}

+ 17 - 0
kanban-auth/src/main/java/com/uas/kanban/model/PanelInstance.java

@@ -0,0 +1,17 @@
+package com.uas.kanban.model;
+
+import com.uas.kanban.base.BaseEntity;
+import org.mongodb.morphia.annotations.Entity;
+
+/**
+ * 面板实例(这里仅仅声明这个类,之后在 kanban-console 会覆盖该类)
+ *
+ * @author sunyj
+ * @since 2017/10/24 9:02
+ */
+@Entity
+public class PanelInstance extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+}

+ 22 - 4
kanban-auth/src/main/java/com/uas/kanban/model/User.java

@@ -6,6 +6,7 @@ import org.mongodb.morphia.annotations.Entity;
 import org.mongodb.morphia.annotations.IndexOptions;
 import org.mongodb.morphia.annotations.Indexed;
 
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -38,6 +39,11 @@ public class User extends BaseEntity {
     @FieldProperty(nullable = false)
     private Role role;
 
+    /**
+     * 分配的面板 code
+     */
+    private List<String> panelCodes;
+
     public String getName() {
         return name;
     }
@@ -62,11 +68,22 @@ public class User extends BaseEntity {
         this.role = role;
     }
 
+    public List<String> getPanelCodes() {
+        return panelCodes;
+    }
+
+    public void setPanelCodes(List<String> panelCodes) {
+        this.panelCodes = panelCodes;
+    }
+
     @Override
     public String toString() {
-        return "User [name=" + name + ", password=" + password + ", role=" + role
-                + ", id=" + id + ", createTime=" + createTime + ", lastModified="
-                + lastModified + ", version=" + version + ", code=" + code + "]";
+        return "User{" +
+                "name='" + name + '\'' +
+                ", password='" + password + '\'' +
+                ", role=" + role +
+                ", panelCodes=" + panelCodes +
+                "} " + super.toString();
     }
 
     @Override
@@ -79,7 +96,8 @@ public class User extends BaseEntity {
         }
         User other = (User) obj;
         return Objects.equals(code, other.getCode()) && Objects.equals(name, other.getName())
-                && Objects.equals(password, other.getPassword()) && Objects.equals(role, other.getRole());
+                && Objects.equals(password, other.getPassword()) && Objects.equals(role, other.getRole())
+                && Objects.equals(panelCodes, other.getPanelCodes());
     }
 
     /**

+ 10 - 0
kanban-auth/src/main/java/com/uas/kanban/service/UserService.java

@@ -3,6 +3,8 @@ package com.uas.kanban.service;
 import com.uas.kanban.annotation.NotEmpty;
 import com.uas.kanban.model.User;
 
+import java.util.List;
+
 /**
  * 用户
  *
@@ -29,4 +31,12 @@ public interface UserService {
      */
     boolean resetPassword(@NotEmpty("password") String password, @NotEmpty("newPassword") String newPassword);
 
+    /**
+     * 为指定用户分配面板
+     *
+     * @param userCode   用户 code
+     * @param panelCodes 面板 code
+     */
+    void assignPanel(@NotEmpty("userCode") String userCode, List<String> panelCodes);
+
 }

+ 22 - 1
kanban-auth/src/main/java/com/uas/kanban/service/impl/UserServiceImpl.java

@@ -1,13 +1,16 @@
 package com.uas.kanban.service.impl;
 
 import com.uas.kanban.annotation.NotEmpty;
+import com.uas.kanban.base.BaseDao;
 import com.uas.kanban.base.BaseService;
 import com.uas.kanban.dao.UserDao;
 import com.uas.kanban.exception.OperationException;
+import com.uas.kanban.model.Panel;
 import com.uas.kanban.model.User;
 import com.uas.kanban.model.User.Role;
 import com.uas.kanban.service.UserService;
 import com.uas.kanban.support.SystemSession;
+import com.uas.kanban.util.CollectionUtils;
 import org.mongodb.morphia.query.Query;
 import org.mongodb.morphia.query.UpdateOperations;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -28,6 +31,9 @@ public class UserServiceImpl extends BaseService<User> implements UserService {
     @Autowired
     private UserDao userDao;
 
+    @Autowired
+    private BaseDao<Panel> panelDao;
+
     @Override
     public User save(@NotEmpty("json") String json) {
         User user = userDao.parse(json);
@@ -75,7 +81,7 @@ public class UserServiceImpl extends BaseService<User> implements UserService {
     }
 
     /**
-     * 对名称和密码长度进行校验
+     * 对名称和密码长度、面板是否存在进行校验
      *
      * @param user 用户
      */
@@ -88,6 +94,13 @@ public class UserServiceImpl extends BaseService<User> implements UserService {
         if (password != null && password.trim().length() < 3) {
             throw new IllegalArgumentException("密码过短");
         }
+        // 检查面板
+        List<String> panelCodes = user.getPanelCodes();
+        if (!CollectionUtils.isEmpty(panelCodes)) {
+            for (String panelCode : panelCodes) {
+                panelDao.checkExist(panelCode);
+            }
+        }
     }
 
     @Override
@@ -125,6 +138,11 @@ public class UserServiceImpl extends BaseService<User> implements UserService {
         return true;
     }
 
+    @Override
+    public void assignPanel(@NotEmpty("userCode") String userCode, List<String> panelCodes) {
+        userDao.assignPanel(userCode, panelCodes);
+    }
+
     /**
      * 用户是否已存在
      *
@@ -151,6 +169,8 @@ public class UserServiceImpl extends BaseService<User> implements UserService {
         return super.delete(codes);
     }
 
+    // TODO update or delete related panel instance when update or delete panelCode
+
     /**
      * 检查对管理员的操作
      *
@@ -163,6 +183,7 @@ public class UserServiceImpl extends BaseService<User> implements UserService {
             if (!Objects.equals(code, SystemSession.checkUser().getCode())) {
                 throw new OperationException("不允许删除其他管理员:" + user.getName());
             } else {
+                // 如果自己是最后一个管理员,不可删除自己
                 if (countAdmin() <= 1) {
                     throw new OperationException("不可删除最后一个管理员");
                 }

+ 11 - 2
kanban-common/src/main/java/com/uas/kanban/base/BaseDao.java

@@ -58,8 +58,7 @@ public class BaseDao<T extends BaseEntity> {
     }
 
     /**
-     * Returns a new query bound to the collection (a specific
-     * {@link DBCollection})
+     * Returns a new query bound to the collection (a specific {@link DBCollection})
      *
      * @return the query
      */
@@ -69,6 +68,16 @@ public class BaseDao<T extends BaseEntity> {
         return query;
     }
 
+    /**
+     * Returns a new query bound to the collection (a specific {@link DBCollection} without {@link BaseDao#globalFilter()}
+     *
+     * @return the query
+     */
+    public Query<T> createQueryWithoutGlobalFilter() {
+        return datastore.createQuery(entityClass);
+    }
+
+
     /**
      * 全局过滤,如有需要,可重写该方法
      *

+ 59 - 68
kanban-console/README.md

@@ -352,6 +352,13 @@
         <td>角色,有两个值:1. Admin 管理员;2. Default 普通用户。默认为 Default</td>
         <td>Default</td>
     </tr>
+    <tr>
+        <td>panelCodes</td>
+        <td>JSONArray</td>
+        <td>✔</td>
+        <td>面板 code</td>
+        <td>["53E04542411", "53E04542412"]</td>
+    </tr>
 </table>
 
 ## 通用接口
@@ -449,6 +456,43 @@
     </tr>
 </table>
 
+## 分配面板
+- 路径
+`
+/user/assignPanel
+`
+
+- 参数
+<table border=0 cellpadding=5 cellspacing=0>
+    <tr style="color:#fff">
+        <th>参数名</th>
+        <th>参数类型</th>
+        <th>描述</th>
+    </tr>
+    <tr>
+        <td>userCode</td>
+        <td>String</td>
+        <td>用户 code</td>
+    </tr>
+    <tr>
+        <td>panelCodes</td>
+        <td>String[]</td>
+        <td>面板 code</td>
+    </tr>
+</table>
+
+- 返回值
+<table border=0 cellpadding=5 cellspacing=0>
+    <tr style="color:#fff">
+        <th>类型</th>
+        <th>描述</th>
+    </tr>
+    <tr>
+        <td>Boolean</td>
+        <td>分配是否成功</td>
+    </tr>
+</table>
+
 # 数据源
 ## 数据字典
 <table border=0 cellpadding=5 cellspacing=0>
@@ -543,73 +587,6 @@
 ## 通用接口
   请参照[通用接口](#通用接口)
 
-## 获取分配给用户的面板
-- 路径
-`
-/panel/get/byUser/{userCode}
-`
-
-- 参数
-<table border=0 cellpadding=5 cellspacing=0>
-    <tr style="color:#fff">
-        <th>参数类型</th>
-        <th>描述</th>
-    </tr>
-    <tr>
-        <td>String</td>
-        <td>用户 code,将路径中的 {userCode} 替换为实际值</td>
-    </tr>
-</table>
-
-- 返回值
-<table border=0 cellpadding=5 cellspacing=0>
-    <tr style="color:#fff">
-        <th>类型</th>
-        <th>描述</th>
-    </tr>
-    <tr>
-        <td>JSONArray</td>
-        <td>面板数据,具体字段请参照[数据字典](#面板数据字典)</td>
-    </tr>
-</table>
-
-## 分配面板
-- 路径
-`
-/panel/assignPanel
-`
-
-- 参数
-<table border=0 cellpadding=5 cellspacing=0>
-    <tr style="color:#fff">
-        <th>参数名</th>
-        <th>参数类型</th>
-        <th>描述</th>
-    </tr>
-    <tr>
-        <td>userCode</td>
-        <td>String</td>
-        <td>用户 code</td>
-    </tr>
-    <tr>
-        <td>panelCodes</td>
-        <td>String[]</td>
-        <td>面板 code</td>
-    </tr>
-</table>
-
-- 返回值
-<table border=0 cellpadding=5 cellspacing=0>
-    <tr style="color:#fff">
-        <th>类型</th>
-        <th>描述</th>
-    </tr>
-    <tr>
-        <td>Boolean</td>
-        <td>分配是否成功</td>
-    </tr>
-</table>
-
 # 参数
 ## <span id="参数数据字典">数据字典</span>
 <table border=0 cellpadding=5 cellspacing=0>
@@ -863,12 +840,26 @@
         </td>
     </tr>
     <tr>
-        <td>relatedKanben</td>
+        <td>relatedKanban</td>
         <td>String</td>
         <td>✘</td>
         <td>关联的看板 code,具体字段请参照[关联看板数据字典](#关联看板数据字典)</td>
         <td>5DE18FCEF14</td>
     </tr>
+    <tr>
+        <td>userCode</td>
+        <td>String</td>
+        <td>✘</td>
+        <td>用户 code</td>
+        <td>5DE18FCEF14</td>
+    </tr>
+    <tr>
+        <td>panelCode</td>
+        <td>String</td>
+        <td>✘</td>
+        <td>面板 code</td>
+        <td>5DE18FCEF14</td>
+    </tr>
 </table>
 
 ## <span id="关联看板数据字典">关联看板数据字典</span>

+ 0 - 40
kanban-console/src/main/java/com/uas/kanban/controller/PanelController.java

@@ -1,18 +1,9 @@
 package com.uas.kanban.controller;
 
-import com.uas.kanban.annotation.NotEmpty;
 import com.uas.kanban.base.BaseController;
 import com.uas.kanban.model.Panel;
-import com.uas.kanban.service.PanelService;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.Arrays;
-import java.util.List;
 
 /**
  * 面板
@@ -24,35 +15,4 @@ import java.util.List;
 @RequestMapping("/panel")
 public class PanelController extends BaseController<Panel> {
 
-    @Autowired
-    private PanelService panelService;
-
-    /**
-     * 为指定用户分配面板
-     *
-     * @param userCode   用户 code
-     * @param panelCodes 面板 code
-     * @param request    request
-     * @return 分配成功
-     */
-    @RequestMapping("/assignPanel")
-    @ResponseBody
-    public boolean assignPanel(@NotEmpty("userCode") String userCode, String[] panelCodes, HttpServletRequest request) {
-        panelService.assignPanel(userCode, panelCodes == null ? null : Arrays.asList(panelCodes));
-        return true;
-    }
-
-    /**
-     * 获取分配给用户的面板
-     *
-     * @param userCode 用户 code
-     * @param request  request
-     * @return 面板
-     */
-    @RequestMapping("/get/byUser/{userCode}")
-    @ResponseBody
-    public List<Panel> getByUserCode(@PathVariable("userCode") String userCode, HttpServletRequest request) {
-        return panelService.getByUserCode(userCode);
-    }
-
 }

+ 0 - 18
kanban-console/src/main/java/com/uas/kanban/controller/UserPanelRelationController.java

@@ -1,18 +0,0 @@
-package com.uas.kanban.controller;
-
-import com.uas.kanban.base.BaseController;
-import com.uas.kanban.model.UserPanelRelation;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-
-/**
- * 用户面板关系(存储分配给用户的面板)
- *
- * @author sunyj
- * @since 2017年9月1日 下午4:42:10
- */
-@Controller
-@RequestMapping("/userPanelRelation")
-public class UserPanelRelationController extends BaseController<UserPanelRelation> {
-
-}

+ 2 - 8
kanban-console/src/main/java/com/uas/kanban/dao/PanelDao.java

@@ -7,7 +7,6 @@ import com.uas.kanban.model.User;
 import com.uas.kanban.support.SystemSession;
 import org.mongodb.morphia.query.Query;
 import org.mongodb.morphia.query.UpdateOperations;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import java.util.ArrayList;
@@ -24,9 +23,6 @@ import java.util.Map;
 @Component
 public class PanelDao extends BaseDao<Panel> {
 
-    @Autowired
-    private UserPanelRelationDao userPanelRelationDao;
-
     @Override
     protected Map<String, Object> globalFilter() {
         User user = SystemSession.checkUser();
@@ -34,10 +30,8 @@ public class PanelDao extends BaseDao<Panel> {
         if (user.getRole() == User.Role.Admin) {
             return null;
         }
-        List<String> panelCodes = userPanelRelationDao.findAllPanelCodes();
-        if (panelCodes == null) {
-            panelCodes = new ArrayList<>();
-        }
+        List<String> panelCodes = user.getPanelCodes();
+        panelCodes = panelCodes == null ? new ArrayList<String>() : panelCodes;
         Map<String, Object> filters = new HashMap<>();
         // 普通用户只能操作自己的实例
         filters.put("code in", panelCodes);

+ 22 - 11
kanban-console/src/main/java/com/uas/kanban/dao/PanelInstanceDao.java

@@ -3,9 +3,10 @@ package com.uas.kanban.dao;
 import com.uas.kanban.annotation.NotEmpty;
 import com.uas.kanban.base.BaseDao;
 import com.uas.kanban.model.PanelInstance;
-import com.uas.kanban.model.UserPanelRelation;
+import com.uas.kanban.model.User;
 import com.uas.kanban.support.SystemSession;
-import org.springframework.beans.factory.annotation.Autowired;
+import com.uas.kanban.util.CollectionUtils;
+import org.mongodb.morphia.query.Query;
 import org.springframework.stereotype.Component;
 
 import java.util.HashMap;
@@ -21,15 +22,12 @@ import java.util.Map;
 @Component
 public class PanelInstanceDao extends BaseDao<PanelInstance> {
 
-    @Autowired
-    private UserPanelRelationDao userPanelRelationDao;
-
     @Override
     protected Map<String, Object> globalFilter() {
-        List<String> userPanelRelationCodes = userPanelRelationDao.findAllCodes();
+        User user = SystemSession.checkUser();
         Map<String, Object> filters = new HashMap<>();
         // 所有用户只能操作自己的实例
-        filters.put("userPanelRelationCode in", userPanelRelationCodes);
+        filters.put("userCode", user.getCode());
         return filters;
     }
 
@@ -45,10 +43,23 @@ public class PanelInstanceDao extends BaseDao<PanelInstance> {
      * @return 面板实例
      */
     public PanelInstance findByPanelCode(@NotEmpty("panelCode") String panelCode) {
-        UserPanelRelation userPanelRelation = userPanelRelationDao.findByUserCodeAndPanelCode(SystemSession.getUser().getCode(), panelCode);
-        if (userPanelRelation == null) {
-            return null;
+        return findOneBy("panelCode", panelCode);
+    }
+
+    /**
+     * 根据用户和面板,删除相应的实例
+     *
+     * @param userCode   用户 code
+     * @param panelCodes 面板 code
+     * @return 删除的数据条数
+     */
+    public int deleteByUserCodeAndPanelCode(@NotEmpty("userCode") String userCode, List<String> panelCodes) {
+        if (CollectionUtils.isEmpty(panelCodes)) {
+            return 0;
         }
-        return findOneBy("userPanelRelationCode", userPanelRelation.getCode());
+        Query<PanelInstance> query = createQueryWithoutGlobalFilter();
+        query.field("userCode").equal(userCode);
+        query.field("panelCode").in(panelCodes);
+        return delete(query);
     }
 }

+ 0 - 121
kanban-console/src/main/java/com/uas/kanban/dao/UserPanelRelationDao.java

@@ -1,121 +0,0 @@
-package com.uas.kanban.dao;
-
-import com.uas.kanban.annotation.NotEmpty;
-import com.uas.kanban.base.BaseDao;
-import com.uas.kanban.model.User;
-import com.uas.kanban.model.UserPanelRelation;
-import com.uas.kanban.support.SystemSession;
-import com.uas.kanban.util.CollectionUtils;
-import org.mongodb.morphia.query.Query;
-import org.springframework.stereotype.Component;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 用户面板关系(存储分配给用户的面板)
- *
- * @author sunyj
- * @since 2017/10/18 14:21
- */
-@Component
-public class UserPanelRelationDao extends BaseDao<UserPanelRelation> {
-
-    @Override
-    protected Map<String, Object> globalFilter() {
-        User user = SystemSession.checkUser();
-        if (user.getRole() == User.Role.Admin) {
-            return null;
-        }
-        Map<String, Object> filters = new HashMap<>();
-        // 普通用户只能查看已分配给自己的面板
-        filters.put("userCode", user.getCode());
-        return filters;
-    }
-
-    @Override
-    protected String collectionSimpleName() {
-        return "用户面板关系";
-    }
-
-    /**
-     * 获取所有用户面板关系 code
-     *
-     * @return 用户面板关系 code
-     */
-    public List<String> findAllCodes() {
-        Query<UserPanelRelation> query = createQuery();
-        try {
-            return findField(query, "code", String.class);
-        } catch (NoSuchFieldException e) {
-            throw new IllegalStateException(e.getMessage(), e);
-        }
-    }
-
-    /**
-     * 获取分配给用户的面板 code
-     *
-     * @return 面板 code
-     */
-    public List<String> findAllPanelCodes() {
-        Query<UserPanelRelation> query = createQuery();
-        try {
-            return findField(query, "panelCode", String.class);
-        } catch (NoSuchFieldException e) {
-            throw new IllegalStateException(e.getMessage(), e);
-        }
-    }
-
-    /**
-     * 获取分配给用户的面板 code
-     *
-     * @param userCode 用户 code
-     * @return 面板 code
-     */
-    public List<String> findAllUserPanelCodes(@NotEmpty("userCode") String userCode) {
-        Query<UserPanelRelation> query = createQuery();
-        query.field("userCode").equal(userCode);
-        try {
-            return findField(query, "panelCode", String.class);
-        } catch (NoSuchFieldException e) {
-            throw new IllegalStateException(e.getMessage(), e);
-        }
-    }
-
-    /**
-     * 根据指定的用户 code 和面板 code 查询用户面板关系
-     *
-     * @param userCode  用户 code
-     * @param panelCode 面板 code
-     * @return 用户面板关系
-     */
-    public UserPanelRelation findByUserCodeAndPanelCode(@NotEmpty("userCode") String userCode, @NotEmpty("panelCode") String panelCode) {
-        Query<UserPanelRelation> query = createQuery();
-        Map<String, Object> filters = new HashMap<>();
-        filters.put("userCode", userCode);
-        filters.put("panelCode", panelCode);
-        filter(query, filters);
-        List<UserPanelRelation> userPanelRelations = find(query);
-        if (CollectionUtils.isEmpty(userPanelRelations)) {
-            return null;
-        } else if (userPanelRelations.size() > 1) {
-            throw new IllegalStateException("存在不止一条数据");
-        }
-        return userPanelRelations.get(0);
-    }
-
-    /**
-     * 删除某个用户的用户面板关系,指定的面板除外
-     *
-     * @param userCode   用户 code
-     * @param panelCodes 面板 code
-     * @return 修改的数据条数
-     */
-    public int deleteExcept(@NotEmpty("userCode") String userCode, List<String> panelCodes) {
-        Map<String, Object> filters = new HashMap<>();
-        filters.put("userCode", userCode);
-        filters.put("panelCode nin", panelCodes);
-        return delete(filters);
-    }
-}

+ 23 - 9
kanban-console/src/main/java/com/uas/kanban/model/PanelInstance.java

@@ -22,7 +22,7 @@ import java.util.List;
  * @since 2017/10/18 15:58
  */
 @Entity
-@Indexes(@Index(value = "userPanelRelationCode", unique = true))
+@Indexes(@Index(value = "userCode, panelCode", unique = true))
 public class PanelInstance extends BaseEntity {
 
     /**
@@ -63,10 +63,16 @@ public class PanelInstance extends BaseEntity {
     private List<RelatedKanban> relatedKanbans;
 
     /**
-     * 用户面板关系 code {@link UserPanelRelation}
+     * 用户 code {@link User}
      */
     @FieldProperty(nullable = false)
-    private String userPanelRelationCode;
+    private String userCode;
+
+    /**
+     * 面板 code {@link Panel}
+     */
+    @FieldProperty(nullable = false)
+    private String panelCode;
 
     /**
      * 面板的版本号
@@ -114,13 +120,20 @@ public class PanelInstance extends BaseEntity {
         this.relatedKanbans = relatedKanbans;
     }
 
-    public String getUserPanelRelationCode() {
-        // TODO sort by enabled state
-        return userPanelRelationCode;
+    public String getUserCode() {
+        return userCode;
+    }
+
+    public void setUserCode(String userCode) {
+        this.userCode = userCode;
+    }
+
+    public String getPanelCode() {
+        return panelCode;
     }
 
-    public void setUserPanelRelationCode(String userPanelRelationCode) {
-        this.userPanelRelationCode = userPanelRelationCode;
+    public void setPanelCode(String panelCode) {
+        this.panelCode = panelCode;
     }
 
     public Long getPanelVersion() {
@@ -138,7 +151,8 @@ public class PanelInstance extends BaseEntity {
                 ", refreshFrequency=" + refreshFrequency +
                 ", parameters='" + parameters + '\'' +
                 ", relatedKanbans=" + relatedKanbans +
-                ", userPanelRelationCode='" + userPanelRelationCode + '\'' +
+                ", userCode='" + userCode + '\'' +
+                ", panelCode='" + panelCode + '\'' +
                 ", panelVersion=" + panelVersion +
                 "} " + super.toString();
     }

+ 0 - 64
kanban-console/src/main/java/com/uas/kanban/model/UserPanelRelation.java

@@ -1,64 +0,0 @@
-package com.uas.kanban.model;
-
-import com.uas.kanban.annotation.FieldProperty;
-import com.uas.kanban.base.BaseEntity;
-import org.mongodb.morphia.annotations.Entity;
-import org.mongodb.morphia.annotations.Index;
-import org.mongodb.morphia.annotations.Indexes;
-
-/**
- * 中间表,用户面板关系(存储分配给用户的面板)
- *
- * @author sunyj
- * @since 2017/10/20 11:12
- */
-@Entity
-@Indexes(@Index(value = "userCode, panelCode", unique = true))
-public class UserPanelRelation extends BaseEntity {
-
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 用户 code {@link User}
-     */
-    @FieldProperty(nullable = false)
-    private String userCode;
-
-    /**
-     * 面板 code {@link Panel}
-     */
-    @FieldProperty(nullable = false)
-    private String panelCode;
-
-    public UserPanelRelation() {
-    }
-
-    public UserPanelRelation(String userCode, String panelCode) {
-        this.userCode = userCode;
-        this.panelCode = panelCode;
-    }
-
-    public String getUserCode() {
-        return userCode;
-    }
-
-    public void setUserCode(String userCode) {
-        this.userCode = userCode;
-    }
-
-    public String getPanelCode() {
-        return panelCode;
-    }
-
-    public void setPanelCode(String panelCode) {
-        this.panelCode = panelCode;
-    }
-
-    @Override
-    public String toString() {
-        return "UserPanelRelation{" +
-                "userCode='" + userCode + '\'' +
-                ", panelCode='" + panelCode + '\'' +
-                "} " + super.toString();
-    }
-}

+ 0 - 33
kanban-console/src/main/java/com/uas/kanban/service/PanelService.java

@@ -1,33 +0,0 @@
-package com.uas.kanban.service;
-
-import com.uas.kanban.annotation.NotEmpty;
-import com.uas.kanban.model.Panel;
-import com.uas.kanban.model.UserPanelRelation;
-
-import java.util.List;
-
-/**
- * 面板
- *
- * @author sunyj
- * @since 2017/10/19 14:28
- */
-public interface PanelService {
-
-    /**
-     * 为指定用户分配面板
-     *
-     * @param userCode   用户 code
-     * @param panelCodes 面板 code
-     * @return 面板实例
-     */
-    List<UserPanelRelation> assignPanel(@NotEmpty("userCode") String userCode, List<String> panelCodes);
-
-    /**
-     * 获取分配给用户的面板
-     *
-     * @param userCode 用户 code
-     * @return 面板
-     */
-    List<Panel> getByUserCode(@NotEmpty("userCode") String userCode);
-}

+ 14 - 30
kanban-console/src/main/java/com/uas/kanban/service/impl/PanelInstanceServiceImpl.java

@@ -6,7 +6,6 @@ import com.uas.kanban.base.BaseService;
 import com.uas.kanban.dao.KanbanDao;
 import com.uas.kanban.dao.PanelDao;
 import com.uas.kanban.dao.PanelInstanceDao;
-import com.uas.kanban.dao.UserPanelRelationDao;
 import com.uas.kanban.exception.OperationException;
 import com.uas.kanban.model.*;
 import com.uas.kanban.service.PanelInstanceService;
@@ -48,9 +47,6 @@ public class PanelInstanceServiceImpl extends BaseService<PanelInstance> impleme
     @Autowired
     private KanbanDao kanbanDao;
 
-    @Autowired
-    private UserPanelRelationDao userPanelRelationDao;
-
     @Autowired
     private ParameterService parameterService;
 
@@ -82,7 +78,7 @@ public class PanelInstanceServiceImpl extends BaseService<PanelInstance> impleme
                     parameter.mayInitValue();
                 }
             }
-            List<Parameter> references = generateParameters(panelInstance);
+            List<Parameter> references = generateParameters(panelInstance.getPanelCode());
             // 重置 SQL 类型的参数(其值是解析出来的,不进行保存)
             resetSQLParameter(parameters, references);
             panelInstance.toParameters(parameters);
@@ -93,13 +89,12 @@ public class PanelInstanceServiceImpl extends BaseService<PanelInstance> impleme
     }
 
     /**
-     * 根据关联的面板,为面板实例生成参数
+     * 根据面板,为面板实例生成参数
      *
-     * @param panelInstance 面板实例
+     * @param panelCode 面板 code
      * @return 生成的参数
      */
-    private List<Parameter> generateParameters(@NotEmpty("panelInstance") PanelInstance panelInstance) {
-        String panelCode = userPanelRelationDao.checkExist(panelInstance.getUserPanelRelationCode()).getPanelCode();
+    private List<Parameter> generateParameters(@NotEmpty("panelCode") String panelCode) {
         List<Parameter> parameters = parameterService.getByPanelCode(panelCode);
         if (CollectionUtils.isEmpty(parameters)) {
             return null;
@@ -202,7 +197,7 @@ public class PanelInstanceServiceImpl extends BaseService<PanelInstance> impleme
     @Override
     public Map<String, Object> parseData(@NotEmpty("code") String code, String kanbanCode) {
         PanelInstance panelInstance = panelInstanceDao.checkExist(code);
-        Panel panel = panelDao.checkExist(userPanelRelationDao.checkExist(panelInstance.getUserPanelRelationCode()).getPanelCode());
+        Panel panel = panelDao.checkExist(panelInstance.getPanelCode());
         List<PanelInstance.RelatedKanban> relatedKanbans = panelInstance.getRelatedKanbans();
         if (CollectionUtils.isEmpty(relatedKanbans)) {
             throw new IllegalStateException("面板下没有看板");
@@ -267,18 +262,7 @@ public class PanelInstanceServiceImpl extends BaseService<PanelInstance> impleme
             if (panelInstance != null) {
                 deleteOne(panelInstance.getCode());
             }
-            User user = SystemSession.getUser();
-            String userCode = user.getCode();
-            UserPanelRelation userPanelRelation = userPanelRelationDao.findByUserCodeAndPanelCode(userCode, panelCode);
-            // 管理员可以查看所有面板,不必先分配,但是想要保存实例,就需要先建立用户面板关系
-            if (userPanelRelation == null) {
-                if (user.getRole() == User.Role.Admin) {
-                    userPanelRelation = userPanelRelationDao.save(new UserPanelRelation(userCode, panelCode));
-                } else {
-                    throw new IllegalArgumentException("用户未分配该面板");
-                }
-            }
-            panelInstance = generateInstance(userPanelRelation);
+            panelInstance = generateInstance(panelCode);
         }
         try {
             NewbieJdbcSupport jdbc = dataSourceManager.getJdbc(panel.getDataSourceCode());
@@ -323,22 +307,22 @@ public class PanelInstanceServiceImpl extends BaseService<PanelInstance> impleme
     }
 
     /**
-     * 根据用户面板关系生成面板实例
+     * 根据用户和面板,删除相应的实例
      *
-     * @param userPanelRelation 用户面板关系
+     * @param panelCode 面板 code
      * @return 面板实例
      */
-    private PanelInstance generateInstance(@NotEmpty("userPanelRelation") UserPanelRelation userPanelRelation) {
-        String panelCode = userPanelRelation.getPanelCode();
+    private PanelInstance generateInstance(@NotEmpty("panelCode") String panelCode) {
         Panel panel = panelDao.checkExist(panelCode);
         PanelInstance panelInstance = new PanelInstance();
-        panelInstance.setUserPanelRelationCode(userPanelRelation.getCode());
+        panelInstance.setUserCode(SystemSession.getUser().getCode());
+        panelInstance.setPanelCode(panelCode);
         panelInstance.setPanelVersion(panel.getVersion());
         initSwitchFrequence(panelInstance);
-        panelInstance.toParameters(generateParameters(panelInstance));
+        panelInstance.toParameters(generateParameters(panelCode));
         List<Kanban> kanbans = kanbanDao.findByPanelCode(panelCode);
         if (CollectionUtils.isEmpty(kanbans)) {
-            throw new IllegalStateException("面板 '" + panel.getName() + "' 未关联看板,请联系管理员");
+            throw new IllegalStateException("面板 '" + panel.getName() + "' 未关联看板");
         }
         panelInstance.initKanbanCodes(kanbans);
         return panelInstanceDao.save(panelInstance);
@@ -351,7 +335,7 @@ public class PanelInstanceServiceImpl extends BaseService<PanelInstance> impleme
      */
     private void initSwitchFrequence(@NotEmpty("panelInstance") PanelInstance panelInstance)
             throws IllegalArgumentException {
-        Panel panel = panelDao.checkExist(userPanelRelationDao.checkExist(panelInstance.getUserPanelRelationCode()).getPanelCode());
+        Panel panel = panelDao.checkExist(panelInstance.getPanelCode());
         switch (panel.getDisplay()) {
             case AutoSwitch:
                 if (panelInstance.getSwitchFrequency() == null) {

+ 1 - 31
kanban-console/src/main/java/com/uas/kanban/service/impl/PanelServiceImpl.java

@@ -4,15 +4,11 @@ import com.uas.kanban.annotation.NotEmpty;
 import com.uas.kanban.base.BaseService;
 import com.uas.kanban.dao.DataSourceDao;
 import com.uas.kanban.dao.PanelDao;
-import com.uas.kanban.dao.UserPanelRelationDao;
 import com.uas.kanban.exception.OperationException;
 import com.uas.kanban.model.Panel;
-import com.uas.kanban.model.UserPanelRelation;
-import com.uas.kanban.service.PanelService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -22,7 +18,7 @@ import java.util.List;
  * @since 2017/10/18 14:20
  */
 @Service
-public class PanelServiceImpl extends BaseService<Panel> implements PanelService {
+public class PanelServiceImpl extends BaseService<Panel> {
 
     @Autowired
     private PanelDao panelDao;
@@ -30,9 +26,6 @@ public class PanelServiceImpl extends BaseService<Panel> implements PanelService
     @Autowired
     private DataSourceDao dataSourceDao;
 
-    @Autowired
-    private UserPanelRelationDao userPanelRelationDao;
-
     @Override
     public Panel save(@NotEmpty("json") String json) {
         // TODO generate PanelInstance
@@ -83,27 +76,4 @@ public class PanelServiceImpl extends BaseService<Panel> implements PanelService
         return super.delete(codes);
     }
 
-    @Override
-    public List<UserPanelRelation> assignPanel(@NotEmpty("userCode") String userCode, List<String> panelCodes) {
-        List<UserPanelRelation> userPanelRelations = new ArrayList<>();
-        panelCodes = panelCodes == null ? new ArrayList<String>() : panelCodes;
-        for (String panelCode : panelCodes) {
-            // 如果已存在用户面板关系,不必再进行关联
-            UserPanelRelation userPanelRelation = userPanelRelationDao.findByUserCodeAndPanelCode(userCode, panelCode);
-            if (userPanelRelation == null) {
-                userPanelRelation = userPanelRelationDao.save(new UserPanelRelation(userCode, panelCode));
-            }
-            userPanelRelations.add(userPanelRelation);
-        }
-        // 重新分配面板时,删除旧的关系
-        userPanelRelationDao.deleteExcept(userCode, panelCodes);
-        // delete user's PanelInstance before generating new instances?
-        return userPanelRelations;
-    }
-
-    @Override
-    public List<Panel> getByUserCode(@NotEmpty("userCode") String userCode) {
-        List<String> userPanelCodes = userPanelRelationDao.findAllUserPanelCodes(userCode);
-        return panelDao.findIn(userPanelCodes);
-    }
 }

+ 0 - 16
kanban-console/src/main/java/com/uas/kanban/service/impl/UserPanelRelationServiceImpl.java

@@ -1,16 +0,0 @@
-package com.uas.kanban.service.impl;
-
-import com.uas.kanban.base.BaseService;
-import com.uas.kanban.model.UserPanelRelation;
-import org.springframework.stereotype.Service;
-
-/**
- * 用户面板关系(存储分配给用户的面板)
- *
- * @author sunyj
- * @since 2017年9月1日 下午4:46:01
- */
-@Service
-public class UserPanelRelationServiceImpl extends BaseService<UserPanelRelation> {
-
-}

+ 3 - 17
kanban-console/src/main/webapp/WEB-INF/views/console.html

@@ -10,9 +10,9 @@
     <ol>
         <strong><li class="title">用户</li></strong>
         <ol>
-            <li><a target="_blank">user/save?json={"name": "name","password": "password"}</a></li>
+            <li><a target="_blank">user/save?json={"name": "name","password": "password", "panelCodes":["53E04542411", "53E04542412"]}</a></li>
             <li><a target="_blank">user/savePart?json={"name": "name","password": "password"}</a></li>
-            <li><a target="_blank">user/update?json={"code":"4EC2735D343","name": "name","password": "password"}</a></li>
+            <li><a target="_blank">user/update?json={"code":"4EC2735D343","name": "name","password": "password", "panelCodes":["53E04542411", "53E04542412"]}</a></li>
             <li><a target="_blank">user/updatePart?json={"code":"4EC2735D343","name": "name","password": "password"}</a></li>
             <li><a target="_blank">user/delete/4EC2735D343</a></li>
             <li><a target="_blank">user/delete/byCodes?codes=53E04542411&codes=53E04631812</a></li>
@@ -24,18 +24,7 @@
             <li><a target="_blank">user/logout</a></li>
             <li><a target="_blank">user/resetPwd?password=12&newPassword=34</a></li>
             <li><a target="_blank">user/initAdmin?name=admin&password=123456</a></li>
-        </ol>
-        <strong><li class="title">用户面板关系</li></strong>
-        <ol>
-            <li><a target="_blank">userPanelRelation/save?json={"userCode": "4EC2735D343", "panelCode": "4EC2735D344"}</a></li>
-            <li><a target="_blank">userPanelRelation/savePart?json={"userCode": "4EC2735D343", "panelCode": "4EC2735D344"}</a></li>
-            <li><a target="_blank">userPanelRelation/update?json={"code":"506C9FB0311", "userCode": "4EC2735D343", "panelCode": "4EC2735D344"}</a></li>
-            <li><a target="_blank">userPanelRelation/updatePart?json={"code":"506C9FB0311", "userCode": "4EC2735D343", "panelCode": "4EC2735D344"}</a></li>
-            <li><a target="_blank">userPanelRelation/delete/4EC2735D343</a></li>
-            <li><a target="_blank">userPanelRelation/delete/byCodes?codes=53E04542411&codes=53E04631812</a></li>
-            <li><a target="_blank">userPanelRelation/get/all</a></li>
-            <li><a target="_blank">userPanelRelation/get/4EC2735D343</a></li>
-            <li><a target="_blank">userPanelRelation/get?page=1&size=10</a></li>
+            <li><a target="_blank">user/assignPanel?userCode=53E04542411&panelCodes=53E04631812&panelCodes=53E04631813</a></li>
         </ol>
         <strong><li class="title">数据源</li></strong>
         <ol>
@@ -61,9 +50,6 @@
             <li><a target="_blank">panel/get/all</a></li>
             <li><a target="_blank">panel/get/4EC2735D343</a></li>
             <li><a target="_blank">panel/get?page=1&size=10</a></li>
-            <br/>
-            <li><a target="_blank">panel/get/byUser/53E04542411</a></li>
-            <li><a target="_blank">panel/assignPanel?userCode=53E04542411&panelCodes=53E04631812&panelCodes=53E04631813</a></li>
         </ol>
         <strong><li class="title">参数</li></strong>
         <ol>