initial commit
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
package com.auth.frontserver;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
@SpringBootApplication
|
||||
public class FrontServerApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(FrontServerApplication.class, args);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.auth.frontserver.config;
|
||||
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
|
||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||
|
||||
@Configuration
|
||||
public class WebConfig implements WebMvcConfigurer {
|
||||
@Override
|
||||
public void addViewControllers(ViewControllerRegistry registry) {
|
||||
registry.addViewController("/").setViewName("main.html");
|
||||
registry.addViewController("/main").setViewName("main.html");
|
||||
registry.addViewController("/signup").setViewName("signup.html");
|
||||
registry.addViewController("/login").setViewName("login.html");
|
||||
registry.addViewController("/signup-success").setViewName("signup-sucess.html");
|
||||
registry.addViewController("/signup").setViewName("signup.html");
|
||||
registry.addViewController("/user-manage").setViewName("user-manage.html");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package com.auth.frontserver.controller;
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
|
||||
@Controller
|
||||
public class UserManageController {
|
||||
}
|
||||
7
front-web/src/main/resources/application.yml
Normal file
7
front-web/src/main/resources/application.yml
Normal file
@@ -0,0 +1,7 @@
|
||||
server:
|
||||
port: 8030
|
||||
|
||||
#spring:
|
||||
# web:
|
||||
# resources:
|
||||
# static-locations: classpath:/static/
|
||||
100
front-web/src/main/resources/static/css/dashboard.css
Normal file
100
front-web/src/main/resources/static/css/dashboard.css
Normal file
@@ -0,0 +1,100 @@
|
||||
body {
|
||||
font-size: .875rem;
|
||||
}
|
||||
|
||||
.feather {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
vertical-align: text-bottom;
|
||||
}
|
||||
|
||||
/*
|
||||
* Sidebar
|
||||
*/
|
||||
|
||||
.sidebar {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
/* rtl:raw:
|
||||
right: 0;
|
||||
*/
|
||||
bottom: 0;
|
||||
/* rtl:remove */
|
||||
left: 0;
|
||||
z-index: 100; /* Behind the navbar */
|
||||
padding: 48px 0 0; /* Height of navbar */
|
||||
box-shadow: inset -1px 0 0 rgba(0, 0, 0, .1);
|
||||
}
|
||||
|
||||
@media (max-width: 767.98px) {
|
||||
.sidebar {
|
||||
top: 5rem;
|
||||
}
|
||||
}
|
||||
|
||||
.sidebar-sticky {
|
||||
position: relative;
|
||||
top: 0;
|
||||
height: calc(100vh - 48px);
|
||||
padding-top: .5rem;
|
||||
overflow-x: hidden;
|
||||
overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */
|
||||
}
|
||||
|
||||
.sidebar .nav-link {
|
||||
font-weight: 500;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.sidebar .nav-link .feather {
|
||||
margin-right: 4px;
|
||||
color: #727272;
|
||||
}
|
||||
|
||||
.sidebar .nav-link.active {
|
||||
color: #007bff;
|
||||
}
|
||||
|
||||
.sidebar .nav-link:hover .feather,
|
||||
.sidebar .nav-link.active .feather {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
.sidebar-heading {
|
||||
font-size: .75rem;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
/*
|
||||
* Navbar
|
||||
*/
|
||||
|
||||
.navbar-brand {
|
||||
padding-top: .75rem;
|
||||
padding-bottom: .75rem;
|
||||
font-size: 1rem;
|
||||
background-color: rgba(0, 0, 0, .25);
|
||||
box-shadow: inset -1px 0 0 rgba(0, 0, 0, .25);
|
||||
}
|
||||
|
||||
.navbar .navbar-toggler {
|
||||
top: .25rem;
|
||||
right: 1rem;
|
||||
}
|
||||
|
||||
.navbar .form-control {
|
||||
padding: .75rem 1rem;
|
||||
border-width: 0;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.form-control-dark {
|
||||
color: #fff;
|
||||
background-color: rgba(255, 255, 255, .1);
|
||||
border-color: rgba(255, 255, 255, .1);
|
||||
}
|
||||
|
||||
.form-control-dark:focus {
|
||||
border-color: transparent;
|
||||
box-shadow: 0 0 0 3px rgba(255, 255, 255, .25);
|
||||
}
|
||||
96
front-web/src/main/resources/static/css/dashboard.rtl.css
Normal file
96
front-web/src/main/resources/static/css/dashboard.rtl.css
Normal file
@@ -0,0 +1,96 @@
|
||||
body {
|
||||
font-size: .875rem;
|
||||
}
|
||||
|
||||
.feather {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
vertical-align: text-bottom;
|
||||
}
|
||||
|
||||
/*
|
||||
* Sidebar
|
||||
*/
|
||||
|
||||
.sidebar {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
z-index: 100; /* Behind the navbar */
|
||||
padding: 48px 0 0; /* Height of navbar */
|
||||
box-shadow: inset 1px 0 0 rgba(0, 0, 0, .1);
|
||||
}
|
||||
|
||||
@media (max-width: 767.98px) {
|
||||
.sidebar {
|
||||
top: 5rem;
|
||||
}
|
||||
}
|
||||
|
||||
.sidebar-sticky {
|
||||
position: relative;
|
||||
top: 0;
|
||||
height: calc(100vh - 48px);
|
||||
padding-top: .5rem;
|
||||
overflow-x: hidden;
|
||||
overflow-y: auto; /* Scrollable contents if viewport is shorter than content. */
|
||||
}
|
||||
|
||||
.sidebar .nav-link {
|
||||
font-weight: 500;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.sidebar .nav-link .feather {
|
||||
margin-left: 4px;
|
||||
color: #727272;
|
||||
}
|
||||
|
||||
.sidebar .nav-link.active {
|
||||
color: #007bff;
|
||||
}
|
||||
|
||||
.sidebar .nav-link:hover .feather,
|
||||
.sidebar .nav-link.active .feather {
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
.sidebar-heading {
|
||||
font-size: .75rem;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
/*
|
||||
* Navbar
|
||||
*/
|
||||
|
||||
.navbar-brand {
|
||||
padding-top: .75rem;
|
||||
padding-bottom: .75rem;
|
||||
font-size: 1rem;
|
||||
background-color: rgba(0, 0, 0, .25);
|
||||
box-shadow: inset 1px 0 0 rgba(0, 0, 0, .25);
|
||||
}
|
||||
|
||||
.navbar .navbar-toggler {
|
||||
top: .25rem;
|
||||
left: 1rem;
|
||||
}
|
||||
|
||||
.navbar .form-control {
|
||||
padding: .75rem 1rem;
|
||||
border-width: 0;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.form-control-dark {
|
||||
color: #fff;
|
||||
background-color: rgba(255, 255, 255, .1);
|
||||
border-color: rgba(255, 255, 255, .1);
|
||||
}
|
||||
|
||||
.form-control-dark:focus {
|
||||
border-color: transparent;
|
||||
box-shadow: 0 0 0 3px rgba(255, 255, 255, .25);
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
.container {
|
||||
max-width: 960px;
|
||||
}
|
||||
42
front-web/src/main/resources/static/css/signin.css
Normal file
42
front-web/src/main/resources/static/css/signin.css
Normal file
@@ -0,0 +1,42 @@
|
||||
html,
|
||||
body {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding-top: 40px;
|
||||
padding-bottom: 40px;
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
|
||||
.form-signin {
|
||||
width: 100%;
|
||||
max-width: 330px;
|
||||
padding: 15px;
|
||||
margin: auto;
|
||||
}
|
||||
.form-signin .checkbox {
|
||||
font-weight: 400;
|
||||
}
|
||||
.form-signin .form-control {
|
||||
position: relative;
|
||||
box-sizing: border-box;
|
||||
height: auto;
|
||||
padding: 10px;
|
||||
font-size: 16px;
|
||||
}
|
||||
.form-signin .form-control:focus {
|
||||
z-index: 2;
|
||||
}
|
||||
.form-signin input[type="email"] {
|
||||
margin-bottom: -1px;
|
||||
border-bottom-right-radius: 0;
|
||||
border-bottom-left-radius: 0;
|
||||
}
|
||||
.form-signin input[type="password"] {
|
||||
margin-bottom: 10px;
|
||||
border-top-left-radius: 0;
|
||||
border-top-right-radius: 0;
|
||||
}
|
||||
3
front-web/src/main/resources/static/css/signup.css
Normal file
3
front-web/src/main/resources/static/css/signup.css
Normal file
@@ -0,0 +1,3 @@
|
||||
.container {
|
||||
max-width: 960px;
|
||||
}
|
||||
91
front-web/src/main/resources/static/css/signup.html
Normal file
91
front-web/src/main/resources/static/css/signup.html
Normal file
@@ -0,0 +1,91 @@
|
||||
<!doctype html>
|
||||
<html lang="ko">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
|
||||
<link rel="stylesheet" type="text/css" href="css/signup.css">
|
||||
<script src="js\form-validation.js" type="text/javascript" charset="UTF-8"></script>
|
||||
<title>Soulmates</title>
|
||||
</head>
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" href="#">Soulmates</a>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarsExampleDefault" aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse" id="navbarsExampleDefault">
|
||||
<ul class="navbar-nav me-auto mb-2 mb-md-0">
|
||||
<li class="nav-item active">
|
||||
<a class="nav-link" aria-current="page" href="#">Home</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<main class="container">
|
||||
<div class="container" style= "position: absolute; top: 10%;">
|
||||
<main>
|
||||
<div class="py-5 text-center" style= "position: absolute; left: 37%;">
|
||||
<h2>[Soulmates] 회원가입 페이지 </h2>
|
||||
<p class="lead"></p>
|
||||
</div>
|
||||
<div class="row g-3" style="position: absolute; left: 33%; max-width: 1000px; min-width: 800px; margin-top: 100px;">
|
||||
<div class="col-md-7 col-lg-8">
|
||||
<form class="needs-validation" novalidate>
|
||||
<div class="row g-3">
|
||||
<div class="col-sm-6">
|
||||
<label for="firstName" class="form-label">First name (성)</label>
|
||||
<input type="text" class="form-control" id="firstName" placeholder="(예시) 김" value="" required>
|
||||
<div class="invalid-feedback">
|
||||
Valid first name is required.
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<label for="lastName" class="form-label">Last name</label>
|
||||
<input type="text" class="form-control" id="lastName" placeholder="(예시) 현수" value="" required>
|
||||
<div class="invalid-feedback">
|
||||
Valid last name is required.
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<label for="email" class="form-label">Email <span class="text-muted"></span></label>
|
||||
<input type="email" class="form-control" id="email" placeholder="you@example.com">
|
||||
<div class="invalid-feedback">
|
||||
Please enter a valid email address
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<label for="address" class="form-label">password</label>
|
||||
<input type="text" class="form-control" id="address" placeholder="비밀번호" required>
|
||||
<div class="invalid-feedback">
|
||||
Please enter your Password
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<label for="address" class="form-label">password [재확인] </label>
|
||||
<input type="text" class="form-control" id="address" placeholder="비밀번호 재확인" required>
|
||||
<div class="invalid-feedback">
|
||||
Please enter your Password
|
||||
</div>
|
||||
</div>
|
||||
<hr class="my-4">
|
||||
<div class="form-check">
|
||||
<input type="checkbox" class="form-check-input" id="same-address">
|
||||
<label class="form-check-label" for="same-address">개인정보 수집 이용동의 (필수)</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input type="checkbox" class="form-check-input" id="save-info">
|
||||
<label class="form-check-label" for="save-info">마케팅 활용 및 광고성 정보 수신 동의 (선택)</label>
|
||||
</div>
|
||||
<hr class="my-4">
|
||||
<button class="w-100 btn btn-primary btn-lg" type="submit">회원가입</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,3 @@
|
||||
body {
|
||||
padding-top: 5rem;
|
||||
}
|
||||
114
front-web/src/main/resources/static/js/jquery.cookie.js
Normal file
114
front-web/src/main/resources/static/js/jquery.cookie.js
Normal file
@@ -0,0 +1,114 @@
|
||||
/*!
|
||||
* jQuery Cookie Plugin v1.4.1
|
||||
* https://github.com/carhartl/jquery-cookie
|
||||
*
|
||||
* Copyright 2006, 2014 Klaus Hartl
|
||||
* Released under the MIT license
|
||||
*/
|
||||
(function (factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD (Register as an anonymous module)
|
||||
define(['jquery'], factory);
|
||||
} else if (typeof exports === 'object') {
|
||||
// Node/CommonJS
|
||||
module.exports = factory(require('jquery'));
|
||||
} else {
|
||||
// Browser globals
|
||||
factory(jQuery);
|
||||
}
|
||||
}(function ($) {
|
||||
|
||||
var pluses = /\+/g;
|
||||
|
||||
function encode(s) {
|
||||
return config.raw ? s : encodeURIComponent(s);
|
||||
}
|
||||
|
||||
function decode(s) {
|
||||
return config.raw ? s : decodeURIComponent(s);
|
||||
}
|
||||
|
||||
function stringifyCookieValue(value) {
|
||||
return encode(config.json ? JSON.stringify(value) : String(value));
|
||||
}
|
||||
|
||||
function parseCookieValue(s) {
|
||||
if (s.indexOf('"') === 0) {
|
||||
// This is a quoted cookie as according to RFC2068, unescape...
|
||||
s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
|
||||
}
|
||||
|
||||
try {
|
||||
// Replace server-side written pluses with spaces.
|
||||
// If we can't decode the cookie, ignore it, it's unusable.
|
||||
// If we can't parse the cookie, ignore it, it's unusable.
|
||||
s = decodeURIComponent(s.replace(pluses, ' '));
|
||||
return config.json ? JSON.parse(s) : s;
|
||||
} catch(e) {}
|
||||
}
|
||||
|
||||
function read(s, converter) {
|
||||
var value = config.raw ? s : parseCookieValue(s);
|
||||
return $.isFunction(converter) ? converter(value) : value;
|
||||
}
|
||||
|
||||
var config = $.cookie = function (key, value, options) {
|
||||
|
||||
// Write
|
||||
|
||||
if (arguments.length > 1 && !$.isFunction(value)) {
|
||||
options = $.extend({}, config.defaults, options);
|
||||
|
||||
if (typeof options.expires === 'number') {
|
||||
var days = options.expires, t = options.expires = new Date();
|
||||
t.setMilliseconds(t.getMilliseconds() + days * 864e+5);
|
||||
}
|
||||
|
||||
return (document.cookie = [
|
||||
encode(key), '=', stringifyCookieValue(value),
|
||||
options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
|
||||
options.path ? '; path=' + options.path : '',
|
||||
options.domain ? '; domain=' + options.domain : '',
|
||||
options.secure ? '; secure' : ''
|
||||
].join(''));
|
||||
}
|
||||
|
||||
// Read
|
||||
|
||||
var result = key ? undefined : {},
|
||||
// To prevent the for loop in the first place assign an empty array
|
||||
// in case there are no cookies at all. Also prevents odd result when
|
||||
// calling $.cookie().
|
||||
cookies = document.cookie ? document.cookie.split('; ') : [],
|
||||
i = 0,
|
||||
l = cookies.length;
|
||||
|
||||
for (; i < l; i++) {
|
||||
var parts = cookies[i].split('='),
|
||||
name = decode(parts.shift()),
|
||||
cookie = parts.join('=');
|
||||
|
||||
if (key === name) {
|
||||
// If second argument (value) is a function it's a converter...
|
||||
result = read(cookie, value);
|
||||
break;
|
||||
}
|
||||
|
||||
// Prevent storing a cookie that we couldn't decode.
|
||||
if (!key && (cookie = read(cookie)) !== undefined) {
|
||||
result[name] = cookie;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
config.defaults = {};
|
||||
|
||||
$.removeCookie = function (key, options) {
|
||||
// Must not alter options, thus extending a fresh object...
|
||||
$.cookie(key, '', $.extend({}, options, { expires: -1 }));
|
||||
return !$.cookie(key);
|
||||
};
|
||||
|
||||
}));
|
||||
30
front-web/src/main/resources/static/js/login.js
Normal file
30
front-web/src/main/resources/static/js/login.js
Normal file
@@ -0,0 +1,30 @@
|
||||
$(function() {
|
||||
login();
|
||||
})
|
||||
|
||||
function login() {
|
||||
$("#signin").click(function(event) {
|
||||
event.preventDefault();
|
||||
var email = $("#inputEmail").val();
|
||||
var password = $("#inputPassword").val();
|
||||
|
||||
$.ajax({
|
||||
url: "http://localhost:8090/api/login",
|
||||
data: JSON.stringify({
|
||||
"email": email,
|
||||
"password": password
|
||||
}),
|
||||
contentType: "application/json",
|
||||
type: "post",
|
||||
dataType: "json",
|
||||
success: function(data) {
|
||||
localStorage.setItem('accessToken', data.access_token);
|
||||
localStorage.setItem('refreshToken', data.refresh_token);
|
||||
location.href = "./main.html";
|
||||
},
|
||||
error: function() {
|
||||
alert("로그인에 실패했습니다. 입력하신 정보를 다시 확인해주세요.");
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
43
front-web/src/main/resources/static/js/signup.js
Normal file
43
front-web/src/main/resources/static/js/signup.js
Normal file
@@ -0,0 +1,43 @@
|
||||
$(function() {
|
||||
validateSignUp();
|
||||
})
|
||||
|
||||
function validateSignUp() {
|
||||
$("#register").click(function(event) {
|
||||
event.preventDefault();
|
||||
|
||||
var name = $("#name").val();
|
||||
var email = $("#email").val();
|
||||
var password = $("#password").val();
|
||||
var cpassword = $("#cpassword").val();
|
||||
|
||||
var emailRule = /^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$/i;
|
||||
var passwdRule = /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,20}$/;
|
||||
if (name === '' || email === '' || password === '' || cpassword === '') {
|
||||
alert("회원가입 정보를 모두 입력해주세요");
|
||||
} else if (!(password).match(cpassword)) {
|
||||
alert("패스워드가 일치하지 않습니다.");
|
||||
} else if (!emailRule.test(email)) {
|
||||
alert("이메일 형식이 올바르지 않습니다.");
|
||||
} else if (!passwdRule.test(password)) {
|
||||
alert("비밀번호는 영문 대,소문자와 숫자, 특수기호가 적어도 1개 이상씩 포함된 8자 ~ 20자의 비밀번호여야 합니다.");
|
||||
} else {
|
||||
$.ajax({
|
||||
url: "http://localhost:8090/api/signup",
|
||||
data: JSON.stringify({
|
||||
"email": email,
|
||||
"name": name,
|
||||
"password": password
|
||||
}),
|
||||
contentType: "application/json",
|
||||
type: "post",
|
||||
success: function() {
|
||||
location.href = "./signup-success.html";
|
||||
},
|
||||
error: function(){
|
||||
alert("회원가입실패했습니다. 입력하신 정보를 다시 확인해주세요.");
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
31
front-web/src/main/resources/static/js/user-manage.js
Normal file
31
front-web/src/main/resources/static/js/user-manage.js
Normal file
@@ -0,0 +1,31 @@
|
||||
$(function() {
|
||||
getUsersInfo(20, 0, "name", "DESC");
|
||||
})
|
||||
|
||||
|
||||
function getUsersInfo(size, page, column, direction) {
|
||||
var accessToken = localStorage.getItem('accessToken');
|
||||
|
||||
$.ajax({
|
||||
url: "http://localhost:8090/api/user?page=" + page + "&size=" + size + "&sortDirection=" + direction + "&sortColumn=" + column,
|
||||
type: "GET",
|
||||
dataType: 'json',
|
||||
headers: {"Authorization": 'Bearer ' + accessToken},
|
||||
success: function(result) {
|
||||
addUsersInfoAll(result);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function addUsersInfoAll(userInfo) {
|
||||
var source = $("#user-template").html();
|
||||
var template = Handlebars.compile(source);
|
||||
var resultHTML = "";
|
||||
|
||||
for (var i = 0; i < userInfo.content.length; i++) {
|
||||
resultHTML += source.replace("{name}", userInfo.content[i].name)
|
||||
.replace("{email}", userInfo.content[i].email)
|
||||
.replace("{createDt}", userInfo.content[i].createDt)
|
||||
}
|
||||
$("#userInfoTable").append(resultHTML);
|
||||
}
|
||||
53
front-web/src/main/resources/static/login.html
Normal file
53
front-web/src/main/resources/static/login.html
Normal file
@@ -0,0 +1,53 @@
|
||||
<!doctype html>
|
||||
<html lang="ko">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW" crossorigin="anonymous"></script>
|
||||
<link rel="stylesheet" type="text/css" href="css/signin.css">
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
|
||||
<script src="js\jquery.cookie.js" type="text/javascript"></script>
|
||||
<script src="js\login.js" type="text/javascript" charset="UTF-8"></script>
|
||||
<title>Soulmates</title>
|
||||
</head>
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" href="./main">Soulmates</a>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarsExampleDefault" aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse" id="navbarsExampleDefault">
|
||||
<ul class="navbar-nav me-auto mb-2 mb-md-0">
|
||||
<li class="nav-item active">
|
||||
<a class="nav-link" aria-current="page" href="./main">Home</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main class="container">
|
||||
|
||||
<div class="form-signin">
|
||||
<form>
|
||||
<h1 class="h3 mb-3 fw-normal">Please Sign in</h1>
|
||||
<label for="inputEmail" class="visually-hidden">Email address</label>
|
||||
<input type="email" id="inputEmail" class="form-control" placeholder="Email address" required autofocus>
|
||||
<label for="inputPassword" class="visually-hidden">Password</label>
|
||||
<input type="password" id="inputPassword" class="form-control" placeholder="Password" required>
|
||||
<button class="w-100 btn btn-lg btn-primary" id="signin" type="submit">Sign in</button>
|
||||
<div class="checkbox mb-3">
|
||||
<button type="button" class="btn btn-outline-primary" style="margin-top: 10px" onclick="location.href='/signup'" >Sign up</button>
|
||||
</div>
|
||||
<p class="mt-5 mb-3 text-muted">© 2020 by hyeonsu</p>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
</main><!-- /.container -->
|
||||
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
47
front-web/src/main/resources/static/main.html
Normal file
47
front-web/src/main/resources/static/main.html
Normal file
@@ -0,0 +1,47 @@
|
||||
<!doctype html>
|
||||
<html lang="ko">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" type="text/css" href="css/form-validation.css">
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
|
||||
<link rel="stylesheet" type="text/css" href="css/signup.css">
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
|
||||
<script src="js\jquery.cookie.js" type="text/javascript" charset="UTF-8"></script>
|
||||
<title>Soulmates</title>
|
||||
</head>
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" href="./main">Soulmates</a>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarsExampleDefault" aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse" id="navbarsExampleDefault">
|
||||
<ul class="navbar-nav me-auto mb-2 mb-md-0">
|
||||
<li class="nav-item active">
|
||||
<a class="nav-link" aria-current="page" href="./main">Home</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<main>
|
||||
|
||||
<section class="py-5 text-center container" style="position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%);">
|
||||
<div class="row py-lg-5">
|
||||
<div class="col-lg-6 col-md-8 mx-auto">
|
||||
<h1 class="fw-light">회원관리 시스템</h1>
|
||||
<p class="lead text-muted">안녕하세요! 소울메이츠 관리자들을 위한 회원관리 페이지입니다. 본 서비스는 관리자 권한을 가진 사용자만 접근 가능합니다.</p>
|
||||
<p>
|
||||
<a href="/user-manage" class="btn btn-primary my-2">회원관리 시작하기</a>
|
||||
<a href="/login" class="btn btn-secondary my-2" style="margin-left: 50px">로그인 하기</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</main>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
46
front-web/src/main/resources/static/signup-success.html
Normal file
46
front-web/src/main/resources/static/signup-success.html
Normal file
@@ -0,0 +1,46 @@
|
||||
<!doctype html>
|
||||
<html lang="ko">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" type="text/css" href="css/form-validation.css">
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
|
||||
<link rel="stylesheet" type="text/css" href="css/signup.css">
|
||||
<script src="js\jquery.cookie.js" type="text/javascript" charset="UTF-8"></script>
|
||||
<title>Soulmates</title>
|
||||
</head>
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" href="/main">Soulmates</a>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarsExampleDefault" aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse" id="navbarsExampleDefault">
|
||||
<ul class="navbar-nav me-auto mb-2 mb-md-0">
|
||||
<li class="nav-item active">
|
||||
<a class="nav-link" aria-current="page" href="/main">Home</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main>
|
||||
|
||||
<section class="py-5 text-center container" style="position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%);">
|
||||
<div class="row py-lg-5">
|
||||
<div class="col-lg-6 col-md-8 mx-auto">
|
||||
<h1 class="fw-light">이메일 인증 URL 전송</h1>
|
||||
<p class="lead text-muted">입력하신 이메일을 확인해주세요. </br> 전송된 URL에 접속하셔야 계정이 활성화가 됩니다.</p>
|
||||
<p>
|
||||
<a href="/main" class="btn btn-primary my-2">홈으로 가기</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</main>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
90
front-web/src/main/resources/static/signup.html
Normal file
90
front-web/src/main/resources/static/signup.html
Normal file
@@ -0,0 +1,90 @@
|
||||
<!doctype html>
|
||||
<html lang="ko">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" type="text/css" href="css/form-validation.css">
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
|
||||
<link rel="stylesheet" type="text/css" href="css/signup.css">
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
|
||||
<script src="js\jquery.cookie.js" type="text/javascript" charset="UTF-8"></script>
|
||||
<script src="js\signup.js" type="text/javascript" charset="UTF-8"></script>
|
||||
<title>Soulmates</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" href="/main">Soulmates</a>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarsExampleDefault" aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse" id="navbarsExampleDefault">
|
||||
<ul class="navbar-nav me-auto mb-2 mb-md-0">
|
||||
<li class="nav-item active">
|
||||
<a class="nav-link" aria-current="page" href="/main">Home</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<main class="container">
|
||||
<div class="container" style="position: absolute; top: 10%;">
|
||||
<main>
|
||||
<div class="py-5 text-center" style="position: absolute; left: 47%;">
|
||||
<h2> 회원가입 페이지 </h2>
|
||||
<p class="lead"></p>
|
||||
</div>
|
||||
<div class="row g-3" style="position: absolute; left: 33%; max-width: 1000px; min-width: 800px; margin-top: 100px;">
|
||||
<div class="col-md-7 col-lg-8">
|
||||
<form class="needs-validation" novalidate>
|
||||
<div class="row g-3">
|
||||
<div class="col-sm-6">
|
||||
<label for="firstName" class="form-label">이름</label>
|
||||
<input type="text" class="form-control" id="name" placeholder="홍길동" value="" required>
|
||||
<div class="invalid-feedback">
|
||||
Valid first name is required.
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<label for="email" class="form-label">Email <span class="text-muted"></span></label>
|
||||
<input type="email" class="form-control" id="email" placeholder="you@example.com">
|
||||
<div class="invalid-feedback">
|
||||
Please enter a valid email address
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<label for="password" class="form-label">password</label>
|
||||
<input type="password" class="form-control" id="password" class="password" placeholder="비밀번호" required>
|
||||
<div class="invalid-feedback">
|
||||
Please enter your Password
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<label for="cpassword" class="form-label">password 재확인 </label>
|
||||
<input type="password" class="form-control" id="cpassword" class="cpassword" placeholder="비밀번호 재확인" required>
|
||||
<div class="invalid-feedback">
|
||||
Please enter your Password
|
||||
</div>
|
||||
</div>
|
||||
<hr class="my-4">
|
||||
<div class="form-check">
|
||||
<input type="checkbox" class="form-check-input" id="same-address">
|
||||
<label class="form-check-label" for="same-address">개인정보 수집 이용동의 (필수)</label>
|
||||
</div>
|
||||
<div class="form-check">
|
||||
<input type="checkbox" class="form-check-input" id="save-info">
|
||||
<label class="form-check-label" for="save-info">마케팅 활용 및 광고성 정보 수신 동의 (선택)</label>
|
||||
</div>
|
||||
<hr class="my-4">
|
||||
<button class="w-100 btn btn-primary btn-lg" type="submit" id ="register">이메일 인증 후 회원가입</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
</main>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
84
front-web/src/main/resources/static/user-manage.html
Normal file
84
front-web/src/main/resources/static/user-manage.html
Normal file
@@ -0,0 +1,84 @@
|
||||
<!doctype html>
|
||||
<html lang="ko">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW" crossorigin="anonymous"></script>
|
||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
|
||||
<script src="js\jquery.cookie.js" type="text/javascript" charset="UTF-8"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/handlebars@latest/dist/handlebars.js"></script>
|
||||
<script src="js\user-manage.js" type="text/javascript" charset="UTF-8"></script>
|
||||
<title>Soulmates</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<header class="navbar navbar-dark sticky-top bg-dark flex-md-nowrap p-0 shadow">
|
||||
<a class="navbar-brand col-md-3 col-lg-2 me-0 px-3" href="/main">Soulmates</a>
|
||||
<button class="navbar-toggler position-absolute d-md-none collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#sidebarMenu" aria-controls="sidebarMenu" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<input class="form-control form-control-dark w-100" type="text" placeholder="Search" aria-label="Search">
|
||||
<ul class="navbar-nav px-3">
|
||||
<li class="nav-item text-nowrap">
|
||||
</li>
|
||||
</ul>
|
||||
</header>
|
||||
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<nav id="sidebarMenu" class="col-md-3 col-lg-2 d-md-block bg-light sidebar collapse">
|
||||
<div class="position-sticky pt-3">
|
||||
<ul class="nav flex-column">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link active" aria-current="page" href="#">
|
||||
<span data-feather="home"></span>
|
||||
사용자 관리
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="#">
|
||||
<span data-feather="bar-chart-2"></span>
|
||||
Reports
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main class="col-md-9 ms-sm-auto col-lg-10 px-md-4">
|
||||
<div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
|
||||
<h1 class="h2">사용자 관리</h1>
|
||||
</div>
|
||||
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped table-sm" id = "userInfoTable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>이름</th>
|
||||
<th>email</th>
|
||||
<th>생성일</th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script id="user-template" type="text/x-handlebars-template">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>{name}</td>
|
||||
<td>{email}</td>
|
||||
<td>{createDt}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</script>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user