完成登录与注册;添加用户信息部分
This commit is contained in:
parent
95d59748b0
commit
c70895dcc6
@ -8,6 +8,10 @@ import javax.validation.constraints.NotEmpty;
|
|||||||
@Data
|
@Data
|
||||||
public class RegisterForm {
|
public class RegisterForm {
|
||||||
|
|
||||||
|
@NotEmpty
|
||||||
|
@Length(min = 4, max = 16)
|
||||||
|
private String nickName;
|
||||||
|
|
||||||
@NotEmpty
|
@NotEmpty
|
||||||
@Length(min = 6, max = 24)
|
@Length(min = 6, max = 24)
|
||||||
private String username;
|
private String username;
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
package com.bktus.iserver.configure;
|
package com.bktus.iserver.configure;
|
||||||
|
|
||||||
import com.bktus.iserver.configure.security.IServerPasswordEncoder;
|
import com.bktus.iserver.configure.security.*;
|
||||||
import com.bktus.iserver.configure.security.IServerSecurityAuthenticationProvider;
|
|
||||||
import com.bktus.iserver.configure.security.IServerUsernamePasswordAuthenticationFilter;
|
|
||||||
import com.bktus.iserver.service.IServerUserDetailService;
|
import com.bktus.iserver.service.IServerUserDetailService;
|
||||||
import com.bktus.iserver.service.IUserService;
|
import com.bktus.iserver.service.IUserService;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
@ -28,6 +26,12 @@ public class CustomWebSecurityConfig extends WebSecurityConfigurerAdapter {
|
|||||||
@Resource
|
@Resource
|
||||||
private IServerPasswordEncoder passwordEncoder;
|
private IServerPasswordEncoder passwordEncoder;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IServerAuthenticationSuccessHandler successHandler;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IServerAuthenticationFailureHandler failureHandler;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void configure(HttpSecurity http) throws Exception {
|
protected void configure(HttpSecurity http) throws Exception {
|
||||||
http.
|
http.
|
||||||
@ -59,7 +63,6 @@ public class CustomWebSecurityConfig extends WebSecurityConfigurerAdapter {
|
|||||||
web
|
web
|
||||||
.ignoring()
|
.ignoring()
|
||||||
.antMatchers(
|
.antMatchers(
|
||||||
"/",
|
|
||||||
"/build/**",
|
"/build/**",
|
||||||
"/dist/**",
|
"/dist/**",
|
||||||
"/plugins/**",
|
"/plugins/**",
|
||||||
@ -72,6 +75,8 @@ public class CustomWebSecurityConfig extends WebSecurityConfigurerAdapter {
|
|||||||
IServerUsernamePasswordAuthenticationFilter authenticationFilter() throws Exception {
|
IServerUsernamePasswordAuthenticationFilter authenticationFilter() throws Exception {
|
||||||
IServerUsernamePasswordAuthenticationFilter filter = new IServerUsernamePasswordAuthenticationFilter();
|
IServerUsernamePasswordAuthenticationFilter filter = new IServerUsernamePasswordAuthenticationFilter();
|
||||||
filter.setAllowSessionCreation(true);
|
filter.setAllowSessionCreation(true);
|
||||||
|
filter.setAuthenticationSuccessHandler(successHandler);
|
||||||
|
filter.setAuthenticationFailureHandler(failureHandler);
|
||||||
filter.setRequiresAuthenticationRequestMatcher(
|
filter.setRequiresAuthenticationRequestMatcher(
|
||||||
new AntPathRequestMatcher("/login", "POST"));
|
new AntPathRequestMatcher("/login", "POST"));
|
||||||
|
|
||||||
|
@ -0,0 +1,19 @@
|
|||||||
|
package com.bktus.iserver.configure.security;
|
||||||
|
|
||||||
|
import org.springframework.security.core.AuthenticationException;
|
||||||
|
import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class IServerAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {
|
||||||
|
@Override
|
||||||
|
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception)
|
||||||
|
throws IOException, ServletException {
|
||||||
|
super.onAuthenticationFailure(request, response, exception);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
package com.bktus.iserver.configure.security;
|
||||||
|
|
||||||
|
import com.bktus.iserver.model.User;
|
||||||
|
import com.bktus.iserver.service.IUserService;
|
||||||
|
import org.springframework.security.core.Authentication;
|
||||||
|
import org.springframework.security.core.context.SecurityContext;
|
||||||
|
import org.springframework.security.core.context.SecurityContextHolder;
|
||||||
|
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import javax.servlet.http.HttpSession;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class IServerAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
|
||||||
|
@Resource
|
||||||
|
IUserService userService;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
|
||||||
|
throws ServletException, IOException {
|
||||||
|
|
||||||
|
// 添加Session
|
||||||
|
HttpSession session = request.getSession();
|
||||||
|
SecurityContext securityContext = SecurityContextHolder.getContext();
|
||||||
|
session.setAttribute("SPRING_SECURITY_CONTEXT", securityContext);
|
||||||
|
|
||||||
|
User user = (User) authentication.getPrincipal();
|
||||||
|
user.getUserInfo().setLoginDate(new Date());
|
||||||
|
userService.save(user);
|
||||||
|
|
||||||
|
super.onAuthenticationSuccess(request, response, authentication);
|
||||||
|
}
|
||||||
|
}
|
@ -35,7 +35,7 @@ public class IServerSecurityAuthenticationProvider implements AuthenticationProv
|
|||||||
throw new BadCredentialsException("Password IS Uncorrected");
|
throw new BadCredentialsException("Password IS Uncorrected");
|
||||||
}
|
}
|
||||||
|
|
||||||
return new UsernamePasswordAuthenticationToken(username, password, details.getAuthorities());
|
return new UsernamePasswordAuthenticationToken(details, password, details.getAuthorities());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -0,0 +1,14 @@
|
|||||||
|
package com.bktus.iserver.controller;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
|
||||||
|
@Controller
|
||||||
|
@RequestMapping(value = "/error")
|
||||||
|
public class ErrorController {
|
||||||
|
|
||||||
|
@RequestMapping(value = "/")
|
||||||
|
public String printErrorView(){
|
||||||
|
return "500";
|
||||||
|
}
|
||||||
|
}
|
@ -1,14 +1,25 @@
|
|||||||
package com.bktus.iserver.controller;
|
package com.bktus.iserver.controller;
|
||||||
|
|
||||||
|
import com.bktus.iserver.model.User;
|
||||||
|
import org.apache.tomcat.util.descriptor.web.ContextHandler;
|
||||||
|
import org.springframework.security.core.Authentication;
|
||||||
|
import org.springframework.security.core.context.SecurityContext;
|
||||||
|
import org.springframework.security.core.context.SecurityContextHolder;
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.ui.Model;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
|
||||||
|
import java.security.Principal;
|
||||||
|
|
||||||
@Controller
|
@Controller
|
||||||
@RequestMapping(value = "/")
|
@RequestMapping(value = "/")
|
||||||
public class IndexController {
|
public class IndexController {
|
||||||
|
|
||||||
@RequestMapping(value = "/")
|
@RequestMapping(value = "/")
|
||||||
public String indexView(){
|
public String indexView(Model model, Authentication authentication){
|
||||||
|
User user = (User) authentication.getPrincipal();
|
||||||
|
model.addAttribute("username", authentication.getName());
|
||||||
|
model.addAttribute("nickname", user.getUserInfo().getNickName());
|
||||||
return "index";
|
return "index";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@ import org.springframework.web.bind.annotation.PostMapping;
|
|||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
@Controller
|
@Controller
|
||||||
@RequestMapping(value = "/register")
|
@RequestMapping(value = "/register")
|
||||||
@ -35,7 +36,8 @@ public class RegisterController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
User user = userService.createUser(registerForm.getUsername(), registerForm.getPassword());
|
User user = userService.createUser(registerForm.getUsername(), registerForm.getPassword());
|
||||||
|
user.getUserInfo().setRegisterDate(new Date());
|
||||||
|
user.getUserInfo().setNickName(registerForm.getNickName());
|
||||||
userService.save(user);
|
userService.save(user);
|
||||||
|
|
||||||
return "login";
|
return "login";
|
||||||
|
@ -0,0 +1,23 @@
|
|||||||
|
package com.bktus.iserver.controller;
|
||||||
|
|
||||||
|
import com.bktus.iserver.model.User;
|
||||||
|
import org.springframework.security.core.Authentication;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.ui.Model;
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
|
||||||
|
@Controller
|
||||||
|
@RequestMapping("/user")
|
||||||
|
public class UserController {
|
||||||
|
|
||||||
|
@RequestMapping(value = "profile/{username}")
|
||||||
|
public String printProfileView(Model model, @PathVariable String username, Authentication authentication){
|
||||||
|
User user = (User) authentication.getPrincipal();
|
||||||
|
model.addAttribute("username", user.getUsername());
|
||||||
|
model.addAttribute("nickname", user.getUserInfo().getNickName());
|
||||||
|
model.addAttribute("user", user);
|
||||||
|
return "profile";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -27,6 +27,9 @@ public class User implements UserDetails {
|
|||||||
|
|
||||||
private boolean enabled = true;
|
private boolean enabled = true;
|
||||||
|
|
||||||
|
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
|
||||||
|
private UserInfo userInfo = new UserInfo();
|
||||||
|
|
||||||
@ManyToMany(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
|
@ManyToMany(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
|
||||||
private Set<Role> roles = new HashSet<>();
|
private Set<Role> roles = new HashSet<>();
|
||||||
|
|
||||||
|
21
src/main/java/com/bktus/iserver/model/UserInfo.java
Normal file
21
src/main/java/com/bktus/iserver/model/UserInfo.java
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
package com.bktus.iserver.model;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import javax.persistence.*;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@Entity
|
||||||
|
@Table(name = "user_info")
|
||||||
|
public class UserInfo {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||||
|
private int id;
|
||||||
|
|
||||||
|
private String nickName = "";
|
||||||
|
|
||||||
|
private Date registerDate;
|
||||||
|
|
||||||
|
private Date loginDate;
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
server.port=8080
|
server.port=80
|
||||||
|
|
||||||
spring.thymeleaf.prefix=classpath:templates/
|
spring.thymeleaf.prefix=classpath:templates/
|
||||||
spring.thymeleaf.suffix=.html
|
spring.thymeleaf.suffix=.html
|
||||||
|
@ -9,19 +9,19 @@
|
|||||||
|
|
||||||
<th:block th:fragment="sidebar-head">
|
<th:block th:fragment="sidebar-head">
|
||||||
<a href="index3.html" class="brand-link">
|
<a href="index3.html" class="brand-link">
|
||||||
<img src="dist/img/AdminLTELogo.png" alt="AdminLTE Logo" class="brand-image img-circle elevation-3"
|
<img th:src="@{/dist/img/AdminLTELogo.png}" alt="AdminLTE Logo" class="brand-image img-circle elevation-3"
|
||||||
style="opacity: .8">
|
style="opacity: .8">
|
||||||
<span class="brand-text font-weight-light">IServer</span>
|
<span class="brand-text font-weight-light">IServer</span>
|
||||||
</a>
|
</a>
|
||||||
</th:block>
|
</th:block>
|
||||||
|
|
||||||
<th:block th:fragment="sidebar-user-pannel">
|
<th:block th:fragment="sidebar-user-pannel(username, nickname)">
|
||||||
<div class="user-panel mt-3 pb-3 mb-3 d-flex">
|
<div class="user-panel mt-3 pb-3 mb-3 d-flex">
|
||||||
<div class="image">
|
<div class="image">
|
||||||
<img src="dist/img/user2-160x160.jpg" class="img-circle elevation-2" alt="User Image">
|
<img th:src="@{/dist/img/user2-160x160.jpg}" class="img-circle elevation-2" alt="User Image">
|
||||||
</div>
|
</div>
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<a href="#" class="d-block">Alexander Pierce</a>
|
<a th:href="@{'/user/profile/' + ${username}} " href="#" class="d-block"><span th:text="${nickname}"></span></a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</th:block>
|
</th:block>
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
<!-- /.navbar -->
|
<!-- /.navbar -->
|
||||||
|
|
||||||
<!-- Main Sidebar Container -->
|
<!-- Main Sidebar Container -->
|
||||||
<th:block th:include="layout::sidebar"></th:block>
|
<th:block th:include="layout::sidebar(${username}, ${nickname})"></th:block>
|
||||||
|
|
||||||
<!-- Content Wrapper. Contains page content -->
|
<!-- Content Wrapper. Contains page content -->
|
||||||
<div class="content-wrapper">
|
<div class="content-wrapper">
|
||||||
|
@ -159,7 +159,7 @@
|
|||||||
</nav>
|
</nav>
|
||||||
</th:block>
|
</th:block>
|
||||||
|
|
||||||
<th:block th:fragment="sidebar">
|
<th:block th:fragment="sidebar(username, nickname)">
|
||||||
<aside class="main-sidebar sidebar-dark-primary elevation-4">
|
<aside class="main-sidebar sidebar-dark-primary elevation-4">
|
||||||
<!-- Brand Logo -->
|
<!-- Brand Logo -->
|
||||||
<th:block th:include="component::sidebar-head"></th:block>
|
<th:block th:include="component::sidebar-head"></th:block>
|
||||||
@ -167,7 +167,7 @@
|
|||||||
<!-- Sidebar -->
|
<!-- Sidebar -->
|
||||||
<div class="sidebar">
|
<div class="sidebar">
|
||||||
<!-- Sidebar user panel (optional) -->
|
<!-- Sidebar user panel (optional) -->
|
||||||
<th:block th:include="component::sidebar-user-pannel" ></th:block>
|
<th:block th:include="component::sidebar-user-pannel(${username}, ${nickname})" ></th:block>
|
||||||
<!-- Sidebar Menu -->
|
<!-- Sidebar Menu -->
|
||||||
<th:block th:include="component::sidebar-menu"></th:block>
|
<th:block th:include="component::sidebar-menu"></th:block>
|
||||||
<!-- /.sidebar-menu -->
|
<!-- /.sidebar-menu -->
|
||||||
|
436
src/main/resources/templates/profile.html
Normal file
436
src/main/resources/templates/profile.html
Normal file
@ -0,0 +1,436 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh-cn"
|
||||||
|
xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<title>AdminLTE 3 | User Profile</title>
|
||||||
|
<!-- Tell the browser to be responsive to screen width -->
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
|
||||||
|
<!-- Font Awesome -->
|
||||||
|
<link rel="stylesheet" href="../../plugins/fontawesome-free/css/all.min.css">
|
||||||
|
<!-- Ionicons -->
|
||||||
|
<link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
|
||||||
|
<!-- Theme style -->
|
||||||
|
<link rel="stylesheet" href="../../dist/css/adminlte.min.css">
|
||||||
|
<!-- Google Font: Source Sans Pro -->
|
||||||
|
<link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
<body class="hold-transition sidebar-mini">
|
||||||
|
<div class="wrapper">
|
||||||
|
<!-- Navbar -->
|
||||||
|
<th:block th:include="layout::navbar"></th:block>
|
||||||
|
<!-- /.navbar -->
|
||||||
|
|
||||||
|
<!-- Main Sidebar Container -->
|
||||||
|
<th:block th:include="layout::sidebar(${username}, ${nickname})"></th:block>
|
||||||
|
|
||||||
|
<!-- Content Wrapper. Contains page content -->
|
||||||
|
<div class="content-wrapper">
|
||||||
|
<!-- Content Header (Page header) -->
|
||||||
|
<section class="content-header">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row mb-2">
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<h1>Profile</h1>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<ol class="breadcrumb float-sm-right">
|
||||||
|
<li class="breadcrumb-item"><a href="#">Home</a></li>
|
||||||
|
<li class="breadcrumb-item active">User Profile</li>
|
||||||
|
</ol>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div><!-- /.container-fluid -->
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Main content -->
|
||||||
|
<section class="content">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-3">
|
||||||
|
|
||||||
|
<!-- Profile Image -->
|
||||||
|
<div class="card card-primary card-outline">
|
||||||
|
<div class="card-body box-profile">
|
||||||
|
<div class="text-center">
|
||||||
|
<img class="profile-user-img img-fluid img-circle"
|
||||||
|
src="../../dist/img/user4-128x128.jpg"
|
||||||
|
alt="User profile picture">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h3 class="profile-username text-center" th:text="${nickname}"></h3>
|
||||||
|
|
||||||
|
<p class="text-muted text-center" th:text="${username}"></p>
|
||||||
|
|
||||||
|
<ul class="list-group list-group-unbordered mb-3">
|
||||||
|
<li class="list-group-item">
|
||||||
|
<b>注册时间</b> <a class="float-right" th:text="${user.getUserInfo().getRegisterDate()}"></a>
|
||||||
|
</li>
|
||||||
|
<li class="list-group-item">
|
||||||
|
<b>登录时间</b> <a class="float-right" th:text="${user.getUserInfo().getLoginDate()}"></a>
|
||||||
|
</li>
|
||||||
|
<li class="list-group-item">
|
||||||
|
<b>Friends</b> <a class="float-right">13,287</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<a href="#" class="btn btn-primary btn-block"><b>Follow</b></a>
|
||||||
|
</div>
|
||||||
|
<!-- /.card-body -->
|
||||||
|
</div>
|
||||||
|
<!-- /.card -->
|
||||||
|
|
||||||
|
<!-- About Me Box -->
|
||||||
|
<div class="card card-primary">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title">About Me</h3>
|
||||||
|
</div>
|
||||||
|
<!-- /.card-header -->
|
||||||
|
<div class="card-body">
|
||||||
|
<strong><i class="fas fa-book mr-1"></i> Education</strong>
|
||||||
|
|
||||||
|
<p class="text-muted">
|
||||||
|
B.S. in Computer Science from the University of Tennessee at Knoxville
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<strong><i class="fas fa-map-marker-alt mr-1"></i> Location</strong>
|
||||||
|
|
||||||
|
<p class="text-muted">Malibu, California</p>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<strong><i class="fas fa-pencil-alt mr-1"></i> Skills</strong>
|
||||||
|
|
||||||
|
<p class="text-muted">
|
||||||
|
<span class="tag tag-danger">UI Design</span>
|
||||||
|
<span class="tag tag-success">Coding</span>
|
||||||
|
<span class="tag tag-info">Javascript</span>
|
||||||
|
<span class="tag tag-warning">PHP</span>
|
||||||
|
<span class="tag tag-primary">Node.js</span>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<strong><i class="far fa-file-alt mr-1"></i> Notes</strong>
|
||||||
|
|
||||||
|
<p class="text-muted">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam fermentum enim neque.</p>
|
||||||
|
</div>
|
||||||
|
<!-- /.card-body -->
|
||||||
|
</div>
|
||||||
|
<!-- /.card -->
|
||||||
|
</div>
|
||||||
|
<!-- /.col -->
|
||||||
|
<div class="col-md-9">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header p-2">
|
||||||
|
<ul class="nav nav-pills">
|
||||||
|
<li class="nav-item"><a class="nav-link active" href="#activity" data-toggle="tab">Activity</a></li>
|
||||||
|
<li class="nav-item"><a class="nav-link" href="#timeline" data-toggle="tab">Timeline</a></li>
|
||||||
|
<li class="nav-item"><a class="nav-link" href="#settings" data-toggle="tab">Settings</a></li>
|
||||||
|
</ul>
|
||||||
|
</div><!-- /.card-header -->
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="tab-content">
|
||||||
|
<div class="active tab-pane" id="activity">
|
||||||
|
<!-- Post -->
|
||||||
|
<div class="post">
|
||||||
|
<div class="user-block">
|
||||||
|
<img class="img-circle img-bordered-sm" src="../../dist/img/user1-128x128.jpg" alt="user image">
|
||||||
|
<span class="username">
|
||||||
|
<a href="#">Jonathan Burke Jr.</a>
|
||||||
|
<a href="#" class="float-right btn-tool"><i class="fas fa-times"></i></a>
|
||||||
|
</span>
|
||||||
|
<span class="description">Shared publicly - 7:30 PM today</span>
|
||||||
|
</div>
|
||||||
|
<!-- /.user-block -->
|
||||||
|
<p>
|
||||||
|
Lorem ipsum represents a long-held tradition for designers,
|
||||||
|
typographers and the like. Some people hate it and argue for
|
||||||
|
its demise, but others ignore the hate as they create awesome
|
||||||
|
tools to help create filler text for everyone from bacon lovers
|
||||||
|
to Charlie Sheen fans.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<a href="#" class="link-black text-sm mr-2"><i class="fas fa-share mr-1"></i> Share</a>
|
||||||
|
<a href="#" class="link-black text-sm"><i class="far fa-thumbs-up mr-1"></i> Like</a>
|
||||||
|
<span class="float-right">
|
||||||
|
<a href="#" class="link-black text-sm">
|
||||||
|
<i class="far fa-comments mr-1"></i> Comments (5)
|
||||||
|
</a>
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<input class="form-control form-control-sm" type="text" placeholder="Type a comment">
|
||||||
|
</div>
|
||||||
|
<!-- /.post -->
|
||||||
|
|
||||||
|
<!-- Post -->
|
||||||
|
<div class="post clearfix">
|
||||||
|
<div class="user-block">
|
||||||
|
<img class="img-circle img-bordered-sm" src="../../dist/img/user7-128x128.jpg" alt="User Image">
|
||||||
|
<span class="username">
|
||||||
|
<a href="#">Sarah Ross</a>
|
||||||
|
<a href="#" class="float-right btn-tool"><i class="fas fa-times"></i></a>
|
||||||
|
</span>
|
||||||
|
<span class="description">Sent you a message - 3 days ago</span>
|
||||||
|
</div>
|
||||||
|
<!-- /.user-block -->
|
||||||
|
<p>
|
||||||
|
Lorem ipsum represents a long-held tradition for designers,
|
||||||
|
typographers and the like. Some people hate it and argue for
|
||||||
|
its demise, but others ignore the hate as they create awesome
|
||||||
|
tools to help create filler text for everyone from bacon lovers
|
||||||
|
to Charlie Sheen fans.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<form class="form-horizontal">
|
||||||
|
<div class="input-group input-group-sm mb-0">
|
||||||
|
<input class="form-control form-control-sm" placeholder="Response">
|
||||||
|
<div class="input-group-append">
|
||||||
|
<button type="submit" class="btn btn-danger">Send</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<!-- /.post -->
|
||||||
|
|
||||||
|
<!-- Post -->
|
||||||
|
<div class="post">
|
||||||
|
<div class="user-block">
|
||||||
|
<img class="img-circle img-bordered-sm" src="../../dist/img/user6-128x128.jpg" alt="User Image">
|
||||||
|
<span class="username">
|
||||||
|
<a href="#">Adam Jones</a>
|
||||||
|
<a href="#" class="float-right btn-tool"><i class="fas fa-times"></i></a>
|
||||||
|
</span>
|
||||||
|
<span class="description">Posted 5 photos - 5 days ago</span>
|
||||||
|
</div>
|
||||||
|
<!-- /.user-block -->
|
||||||
|
<div class="row mb-3">
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<img class="img-fluid" src="../../dist/img/photo1.png" alt="Photo">
|
||||||
|
</div>
|
||||||
|
<!-- /.col -->
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<img class="img-fluid mb-3" src="../../dist/img/photo2.png" alt="Photo">
|
||||||
|
<img class="img-fluid" src="../../dist/img/photo3.jpg" alt="Photo">
|
||||||
|
</div>
|
||||||
|
<!-- /.col -->
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<img class="img-fluid mb-3" src="../../dist/img/photo4.jpg" alt="Photo">
|
||||||
|
<img class="img-fluid" src="../../dist/img/photo1.png" alt="Photo">
|
||||||
|
</div>
|
||||||
|
<!-- /.col -->
|
||||||
|
</div>
|
||||||
|
<!-- /.row -->
|
||||||
|
</div>
|
||||||
|
<!-- /.col -->
|
||||||
|
</div>
|
||||||
|
<!-- /.row -->
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<a href="#" class="link-black text-sm mr-2"><i class="fas fa-share mr-1"></i> Share</a>
|
||||||
|
<a href="#" class="link-black text-sm"><i class="far fa-thumbs-up mr-1"></i> Like</a>
|
||||||
|
<span class="float-right">
|
||||||
|
<a href="#" class="link-black text-sm">
|
||||||
|
<i class="far fa-comments mr-1"></i> Comments (5)
|
||||||
|
</a>
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<input class="form-control form-control-sm" type="text" placeholder="Type a comment">
|
||||||
|
</div>
|
||||||
|
<!-- /.post -->
|
||||||
|
</div>
|
||||||
|
<!-- /.tab-pane -->
|
||||||
|
<div class="tab-pane" id="timeline">
|
||||||
|
<!-- The timeline -->
|
||||||
|
<div class="timeline timeline-inverse">
|
||||||
|
<!-- timeline time label -->
|
||||||
|
<div class="time-label">
|
||||||
|
<span class="bg-danger">
|
||||||
|
10 Feb. 2014
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<!-- /.timeline-label -->
|
||||||
|
<!-- timeline item -->
|
||||||
|
<div>
|
||||||
|
<i class="fas fa-envelope bg-primary"></i>
|
||||||
|
|
||||||
|
<div class="timeline-item">
|
||||||
|
<span class="time"><i class="far fa-clock"></i> 12:05</span>
|
||||||
|
|
||||||
|
<h3 class="timeline-header"><a href="#">Support Team</a> sent you an email</h3>
|
||||||
|
|
||||||
|
<div class="timeline-body">
|
||||||
|
Etsy doostang zoodles disqus groupon greplin oooj voxy zoodles,
|
||||||
|
weebly ning heekya handango imeem plugg dopplr jibjab, movity
|
||||||
|
jajah plickers sifteo edmodo ifttt zimbra. Babblely odeo kaboodle
|
||||||
|
quora plaxo ideeli hulu weebly balihoo...
|
||||||
|
</div>
|
||||||
|
<div class="timeline-footer">
|
||||||
|
<a href="#" class="btn btn-primary btn-sm">Read more</a>
|
||||||
|
<a href="#" class="btn btn-danger btn-sm">Delete</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- END timeline item -->
|
||||||
|
<!-- timeline item -->
|
||||||
|
<div>
|
||||||
|
<i class="fas fa-user bg-info"></i>
|
||||||
|
|
||||||
|
<div class="timeline-item">
|
||||||
|
<span class="time"><i class="far fa-clock"></i> 5 mins ago</span>
|
||||||
|
|
||||||
|
<h3 class="timeline-header border-0"><a href="#">Sarah Young</a> accepted your friend request
|
||||||
|
</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- END timeline item -->
|
||||||
|
<!-- timeline item -->
|
||||||
|
<div>
|
||||||
|
<i class="fas fa-comments bg-warning"></i>
|
||||||
|
|
||||||
|
<div class="timeline-item">
|
||||||
|
<span class="time"><i class="far fa-clock"></i> 27 mins ago</span>
|
||||||
|
|
||||||
|
<h3 class="timeline-header"><a href="#">Jay White</a> commented on your post</h3>
|
||||||
|
|
||||||
|
<div class="timeline-body">
|
||||||
|
Take me to your leader!
|
||||||
|
Switzerland is small and neutral!
|
||||||
|
We are more like Germany, ambitious and misunderstood!
|
||||||
|
</div>
|
||||||
|
<div class="timeline-footer">
|
||||||
|
<a href="#" class="btn btn-warning btn-flat btn-sm">View comment</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- END timeline item -->
|
||||||
|
<!-- timeline time label -->
|
||||||
|
<div class="time-label">
|
||||||
|
<span class="bg-success">
|
||||||
|
3 Jan. 2014
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<!-- /.timeline-label -->
|
||||||
|
<!-- timeline item -->
|
||||||
|
<div>
|
||||||
|
<i class="fas fa-camera bg-purple"></i>
|
||||||
|
|
||||||
|
<div class="timeline-item">
|
||||||
|
<span class="time"><i class="far fa-clock"></i> 2 days ago</span>
|
||||||
|
|
||||||
|
<h3 class="timeline-header"><a href="#">Mina Lee</a> uploaded new photos</h3>
|
||||||
|
|
||||||
|
<div class="timeline-body">
|
||||||
|
<img src="http://placehold.it/150x100" alt="...">
|
||||||
|
<img src="http://placehold.it/150x100" alt="...">
|
||||||
|
<img src="http://placehold.it/150x100" alt="...">
|
||||||
|
<img src="http://placehold.it/150x100" alt="...">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- END timeline item -->
|
||||||
|
<div>
|
||||||
|
<i class="far fa-clock bg-gray"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- /.tab-pane -->
|
||||||
|
|
||||||
|
<div class="tab-pane" id="settings">
|
||||||
|
<form class="form-horizontal">
|
||||||
|
<div class="form-group row">
|
||||||
|
<label for="inputName" class="col-sm-2 col-form-label">Name</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<input type="email" class="form-control" id="inputName" placeholder="Name">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group row">
|
||||||
|
<label for="inputEmail" class="col-sm-2 col-form-label">Email</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<input type="email" class="form-control" id="inputEmail" placeholder="Email">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group row">
|
||||||
|
<label for="inputName2" class="col-sm-2 col-form-label">Name</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<input type="text" class="form-control" id="inputName2" placeholder="Name">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group row">
|
||||||
|
<label for="inputExperience" class="col-sm-2 col-form-label">Experience</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<textarea class="form-control" id="inputExperience" placeholder="Experience"></textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group row">
|
||||||
|
<label for="inputSkills" class="col-sm-2 col-form-label">Skills</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<input type="text" class="form-control" id="inputSkills" placeholder="Skills">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group row">
|
||||||
|
<div class="offset-sm-2 col-sm-10">
|
||||||
|
<div class="checkbox">
|
||||||
|
<label>
|
||||||
|
<input type="checkbox"> I agree to the <a href="#">terms and conditions</a>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group row">
|
||||||
|
<div class="offset-sm-2 col-sm-10">
|
||||||
|
<button type="submit" class="btn btn-danger">Submit</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<!-- /.tab-pane -->
|
||||||
|
</div>
|
||||||
|
<!-- /.tab-content -->
|
||||||
|
</div><!-- /.card-body -->
|
||||||
|
</div>
|
||||||
|
<!-- /.nav-tabs-custom -->
|
||||||
|
</div>
|
||||||
|
<!-- /.col -->
|
||||||
|
</div>
|
||||||
|
<!-- /.row -->
|
||||||
|
</div><!-- /.container-fluid -->
|
||||||
|
</section>
|
||||||
|
<!-- /.content -->
|
||||||
|
</div>
|
||||||
|
<!-- /.content-wrapper -->
|
||||||
|
<footer class="main-footer">
|
||||||
|
<div class="float-right d-none d-sm-block">
|
||||||
|
<b>Version</b> 3.0.2
|
||||||
|
</div>
|
||||||
|
<strong>Copyright © 2014-2019 <a href="http://adminlte.io">AdminLTE.io</a>.</strong> All rights
|
||||||
|
reserved.
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<!-- Control Sidebar -->
|
||||||
|
<aside class="control-sidebar control-sidebar-dark">
|
||||||
|
<!-- Control sidebar content goes here -->
|
||||||
|
</aside>
|
||||||
|
<!-- /.control-sidebar -->
|
||||||
|
</div>
|
||||||
|
<!-- ./wrapper -->
|
||||||
|
|
||||||
|
<!-- jQuery -->
|
||||||
|
<script src="../../plugins/jquery/jquery.min.js"></script>
|
||||||
|
<!-- Bootstrap 4 -->
|
||||||
|
<script src="../../plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
|
||||||
|
<!-- AdminLTE App -->
|
||||||
|
<script src="../../dist/js/adminlte.min.js"></script>
|
||||||
|
<!-- AdminLTE for demo purposes -->
|
||||||
|
<script src="../../dist/js/demo.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -16,6 +16,14 @@
|
|||||||
<p class="login-box-msg">注册来获得属于自己的空间</p>
|
<p class="login-box-msg">注册来获得属于自己的空间</p>
|
||||||
|
|
||||||
<form th:action="@{/register}" th:object="${registerForm}" method="post">
|
<form th:action="@{/register}" th:object="${registerForm}" method="post">
|
||||||
|
<div class="input-group mb-3">
|
||||||
|
<input type="text" class="form-control" placeholder="昵称" th:field="*{nickName}">
|
||||||
|
<div class="input-group-append">
|
||||||
|
<div class="input-group-text">
|
||||||
|
<span class="fas fa-user"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="input-group mb-3">
|
<div class="input-group mb-3">
|
||||||
<input type="text" class="form-control" placeholder="用户名" th:field="*{username}">
|
<input type="text" class="form-control" placeholder="用户名" th:field="*{username}">
|
||||||
<div class="input-group-append">
|
<div class="input-group-append">
|
||||||
|
Loading…
Reference in New Issue
Block a user