当前位置: 首页 > 知识库问答 >
问题:

如何将用户添加到团队到管理页面

锺离声
2023-03-14

我不明白如何在管理页面上实现向团队添加用户。我在控制器中编写了add方法,我不明白如何在界面中显示所有内容。需要两个列表,一个是所有团队的列表,另一个是所有用户的列表,然后保存吗?开始学习百里香和很多奇怪的东西。

admin.html

 </head>
    <body>

    <h1>Admin page </h1>

    <!--
    <form action="#" th:action="@{/admin}" th:object="${team}" method="post">
        <p>Add Team: <input type="text" th:field="*{name}" /></p>
        <p><input type="submit" value="addTeam" />

    </form>
    -->

    <form th:action="@{/logout}" method="post">
        <input type="submit" value="Sign Out"/>


    </form>

    </body>
    </html>

用户

 @Entity
    @Table(name="users")
    public class Users {
        @Id
        @Column(name="email",unique = true, nullable = false,length = 200)
        String email;

        @Column(name="name",nullable = false,length = 200)
        String name;

        @Column(name="password",nullable = false,length = 128)
        @JsonIgnore 
        String password;


        @Column(name = "avatar", nullable = true)
        String avatar;

        @ManyToOne
        @JoinColumn(name="team_id", nullable=true)
        Team team;

        @ManyToOne
        @JoinColumn(name="role", nullable=false)
        @JsonIgnore        
        Role role;

        public Users() {
        }

         get und set
    }

团队

 Entity
    @Table(name="team")
    public class Team  {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY) 
        Long id;

        @Column
        String name;

        @Column
        String url;

        @Lob
        @Column(name = "avatar",nullable = true,columnDefinition="BLOB")
        String avatar;


        @OneToMany(mappedBy="team",cascade = CascadeType.ALL, orphanRemoval = true)
        @JsonIgnore
        Set<Users> users = new HashSet<>();

        public Team() {
        }
     get und set

管理员控制器

@控制器//RestController公共类AdminController{

    .....

     @GetMapping("/admin/team")
        List<Team> allTeams() {
          return teamRepository.findAll();
        }

     @RequestMapping(value = "/admin/team/{id}/user/{email}", method = RequestMethod.POST,produces = { MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE })
        public Users addUserToTeam(
                @PathVariable long id,@PathVariable String  email)  {
                Team team = teamRepository.findById(id).orElseThrow(() -> new NoSuchTeamException("Team not found"));
                Users user = userRpRepository.findById(email).orElseThrow(() -> new NoSuchUserException("User not found"));
                user.setTeam(team);
                user  = userRpRepository.save(user);
            return user;




 @RequestMapping(value = "/admin", method = RequestMethod.GET)
        public String adminPage(Model model) {
            model.addAttribute("admin",new Team());
            return "admin";
        }
            }

共有1个答案

咸皓
2023-03-14

从RMDB结构来看,更好的方法是在用户和团队之间创建链接表。

用户

@Entity
@Table(name = "user")
public class User {

    @Id
    @Column(name = "email", length = 200) //@Id controls nullable and unique
    private String email;

    @Column(name = "name", nullable = false, length = 200)
    private String name;

    @Column(name = "password", nullable = false, length = 128)
    @JsonIgnore 
    private String password;

    @Column(name = "avatar", nullable = true)
    private String avatar;

    @ManyToMany(cascade = CascadeType.ALL) //by default fetch - LAZY
    @JoinTable(name = "user_team", joinColumn = @JoinColumn(name = "user_id",
            foreignKey = @ForeignKey(name = "fk_user_team__user"), nullable = false),
            inverseJoinColumns = @JoinColumn(name = "team_id",
            foreignKey = @ForeignKey(name = "fk_user_team_team"), nullable = false))
    private Set<Team> teams;
}

团队

@Entity
@Table(name = "team")
public class Team {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id;

    @Column
    private String name;

    @Column
    private String url;

    @Lob
    @Column(name = "avatar", nullable = true, columnDefinition = "BLOB")
    private String avatar;


    @ManyToMany(cascade = CascadeType.ALL) //by default fetch - LAZY
    @JoinTable(name = "user_team", joinColumn = @JoinColumn(name = "team_id",
            foreignKey = @ForeignKey(name = "fk_user_team__team"), nullable = false),
            inverseJoinColumns = @JoinColumn(name = "user_id",
            foreignKey = @ForeignKey(name = "fk_user_team_user"), nullable = false))
    private Set<User> users;
}

用户团队

@Entity
@Table(name = "user_team", uniqueConstraints =
        @UniqueConstraints(columnNames = {"user_id", "team_id"}, name = "uniq_some")
public class UserTeam {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; //it's easier to create new Long Id key then composite key with user_id and team_id

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "user_id", foreignKey = @ForeignKey(name = "fk_user_team__user"), nullable = false)
    private User user;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "team_id", foreignKey = @ForeignKey(name = "fk_user_team__team"), nullable = false)
    private Team team;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "role_id", nullable = false) //I don't see Role entity but think it has id field
    @JsonIgnore  
    private Role role;
}

通过这种结构,您可以为团队获取所有用户,并为用户获取所有团队。集合是惰性的,因此您需要使用@Transactional,例如,用于适当的服务方法。

这种结构是双向的:如果您在Team对象中向用户集合中添加新用户,JPA将创建新用户。但是...链接表包含一个额外的必需字段role_id,所以在这样的添加中您将获得一个异常。所以最好先创建用户和团队对象,然后创建具有所需角色的UserTeam链接对象(或者设置默认角色,所有新对象都将使用该角色创建)。

 类似资料:
  • 5.3 将内部账户添加到账户管理器 账户管理器是 Android OS 的系统,它集中管理帐户信息,是应用访问在线服务和认证令牌所必需的(帐户名称,密码)。 用户需要提前将账户信息注册到账户管理器,当应用尝试访问在线服务时,账户管理器在获得用户权限后,会自动提供应用认证令牌。 账户管理器的优势在于,应用不需要处理极其敏感的信息和密码。 使用账户管理器 的账户管理功能的结构如下图 5.3-1 所示。

  • 我设法改变了一个玩家的皮肤和它的名字。但是现在我有了一个新问题:我和记分牌团队一起为玩家列表和开销名称工作。现在我把假玩家的名字添加到团队中。它头上的名字变成了“§a”名字,但是在标签列表中,有一个假玩家的白色名字。每个玩家都可以看到,这是一个假玩家。

  • 问题内容: 我有一个运行着某些进程(uwsgi和celery)的docker容器。我想为这些进程以及它们都属于的工作组创建一个celery用户和uwsgi用户,以便分配权限。 我尝试将和添加到我的Dockerfile中,但这会引起问题,因为这些命令会提示您输入(我已在下面的构建中发布了响应)。 将用户添加到Docker容器以便为在该容器中运行的工作人员设置权限的最佳方法是什么? 我的Docker映

  • 我正试图在我的注册功能中为用户分配一个角色。 通过使用以下代码: 当我试图运行上面的代码时,我得到了以下错误。 E/AndroidRuntime:致命异常:AsyncTask#2进程:info,pid:967 java.lang.runtimeException:在Android.os.AsyncTask$3处执行doInBackground()时发生错误。done(AsyncTask.java:

  • 问题内容: 如何使用itext从html源向pdf添加标头? 当前,我们扩展了PdfPageEventHelper并覆盖了这些方法。工作正常,但是当我进入2个以上页面时,它将引发RuntimeWorkerException。 问题答案: 通常, 禁止 在事件中添加内容。这是 禁止 添加内容到的对象。您应该使用而 不是 文档在方法中添加页眉和页脚。此外:通过一遍又一遍地解析HTML,您正在浪费大量C

  • 问题内容: 我在将新的简单XWPFTable添加到XWPFHeader(或Footer)时遇到了严重的麻烦。不幸的是,似乎只有一个人遇到相同的问题(https://bz.apache.org/bugzilla/show_bug.cgi?id=57366#c0)。 有谁有办法实现这一目标? 任何帮助将不胜感激! 亲切的问候… 〜丹尼尔 问题答案: 这可以使用公共XWPFTable insertNew