SpringBoot新闻管理系统——用户登录

1 用JPA自动建表

使用jpa可以用注解的方式将实体类直接映射到数据库中。所以在建表的时候只用编写实体类:

省略getter setter
首先在类的最前面加上@Entity标明它是一个实体类,@Table注解告诉jpa映射到表的名字。
@Id和@GeneratedValue(strategy = GenerationType.IDENTITY)分别用来标识出主键和自动递增或递减。添加@OneToMany(mappedBy = “user”)这样的注解之后就可以避免添加很多中间表。

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

    @Id  //主键标识
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    private String password;
    private String email;
    private String avatar;
    private String nickname;

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    private Integer type;
    @Temporal(TemporalType.TIMESTAMP) //指定时间格式
    private Date createTime;
    @Temporal(TemporalType.TIMESTAMP)
    private Date updateTime;
    @OneToMany(mappedBy = "user")//一对多
    private List<News> newsList= new ArrayList<>();

运行之后获得的数据表如下:
在这里插入图片描述

2 编写dao层接口

使用JPA规范可以不用自己写sql语句,使用封装好的接口就可以了。自己定义的接口也会帮我们自动实现。这里根据用户名和密码查找数据库中的对应用户对象:

public interface UserRepository extends JpaRepository<User,Long> {
    User findByUsernameAndPassword(String username,String password);
}

3 编写服务层接口和实现

接口

public interface UserService {
    User checkUsers(String username,String Password);
}

实现:直接调用dao层接口即可

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    public UserRepository userRepository;

    @Override
    public User checkUsers(String username, String password) {
        return userRepository.findByUsernameAndPassword(username,password);
    }
}

4 编写Controller

首先加上Controller注解,建立映射到admin。当用户进入/admin时就跳转到admin/login界面
在login的Controller中,由于用户要提交包含其账号和密码的表单,用PostMapping进行映射。获取用户提供的表单信息,调用服务层查找用户,如果找到了用户,将用户存在session中,跳转到admin的首页。如果没有查找到用户,重定向到登录页面。登出操作就是将用户信息从session中移除。


@Controller
@RequestMapping("/admin")
public class LoginController {
    @Autowired
    private UserService userService;

    @GetMapping
    public String loginPage(){
        return "admin/login";
    }

    @PostMapping("/login")
    public String login(@RequestParam String username, @RequestParam String password,
                        HttpSession session, RedirectAttributes attributes){
        User user = userService.checkUsers(username,password);
        if(user!=null){
            user.setPassword(null);
            session.setAttribute("user",user);
            return "admin/index";
        }else {
            attributes.addFlashAttribute("message","用户名或密码错误");
            return "redirect:/admin";
        }
    }

    @GetMapping("/logout")
    public String logout(HttpSession session){
        session.removeAttribute("user");
        return "redirect:/admin";
    }
}

5 编写html

主要是提交表单部分,提交表单映射到admin.login。name中指定了传递参数的形式和值

<form class="ui large form" method="post" action="#" th:action="@{/admin/login}">
           <div class="ui  segment">
             <div class="field">
               <div class="ui left icon input">
                 <i class="user icon"></i>
                 <input type="text" name="username" placeholder="用户名">
               </div>
             </div>
             <div class="field">
               <div class="ui left icon input">
                 <i class="lock icon"></i>
                 <input type="password" name="password" placeholder="密码">
               </div>
             </div>
             <button class="ui fluid large teal submit button">登   录</button>
           </div>

           <div class="ui error mini message"></div>
           <div class="ui mini negative message" th:unless="${#strings.isEmpty(message)}" th:text="${message}">111</div>

         </form>

6 测试

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42189888/article/details/107633733