Showing
187 changed files
with
3671 additions
and
76 deletions
FishBook/.gitignore
0 → 100644
FishBook/FishBook_0522_경희대_박정훈.zip
0 → 100644
No preview for this file type
FishBook/FishBook_0529_경희대_박정훈.zip
0 → 100644
No preview for this file type
FishBook/FishBook_0605_경희대_박정훈.zip
0 → 100644
No preview for this file type
FishBook/FishBook_경희대_박정훈_Ver1.42.zip
0 → 100644
No preview for this file type
FishBook/README.md
0 → 100644
1 | +# FishBook |
FishBook/adminIndex.html
0 → 100644
1 | +<!DOCTYPE html> | ||
2 | +<html lang="ko"> | ||
3 | +<head> | ||
4 | + <meta charset="UTF-8"> | ||
5 | + <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||
6 | + <link rel="stylesheet" href="css/admin-index.css"> | ||
7 | + <title>Fish Book - 관리자 홈페이지</title> | ||
8 | + <script src="js/jquery.js"></script> | ||
9 | + <script src="js/classie.js"></script> | ||
10 | + <script src="js/index.js"></script> | ||
11 | +</head> | ||
12 | +<body> | ||
13 | + <header> | ||
14 | + <a href="index.html"><img id="logo" src="image/fish-logo.png"></a> | ||
15 | + <button id="show-menu">메뉴</button> | ||
16 | + <button id="login" type="submit">로그아웃</button> | ||
17 | + <!-- 로그아웃버튼 수정해야됨 --> | ||
18 | + <input id="search" type="search"> | ||
19 | + </header> | ||
20 | + | ||
21 | + <nav class="menu menu-hide" id="menu"> | ||
22 | + <div> | ||
23 | + <h3>Menu</h3> | ||
24 | + </div> | ||
25 | + <a href="#">게시판 관리</a> | ||
26 | + <a href="#">회원관리</a> | ||
27 | + </nav> | ||
28 | + <section> | ||
29 | + <article id="bookmark-menu"> | ||
30 | + 자주 이용하는 메뉴 | ||
31 | + <pre> | ||
32 | + 1. 글1 | ||
33 | + 2. 글2 | ||
34 | + 3. 글3 | ||
35 | + 4. 글4 | ||
36 | + 5. 글5 | ||
37 | + </pre> | ||
38 | + </article> | ||
39 | + <article id="today"> | ||
40 | + Today 현황 | ||
41 | + <pre> | ||
42 | + 1. 글1 | ||
43 | + 2. 글2 | ||
44 | + 3. 글3 | ||
45 | + 4. 글4 | ||
46 | + 5. 글5 | ||
47 | + </pre> | ||
48 | + </article> | ||
49 | + <article id="offer"> | ||
50 | + 건의사항 | ||
51 | + <pre> | ||
52 | + 1. 글1 | ||
53 | + 2. 글2 | ||
54 | + 3. 글3 | ||
55 | + 4. 글4 | ||
56 | + 5. 글5 | ||
57 | + </pre> | ||
58 | + </article> | ||
59 | + </section> | ||
60 | + <footer> | ||
61 | + <address>경기도 수원시 영통구 영통동</address> | ||
62 | + </footer> | ||
63 | +</body> | ||
64 | +</html> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
FishBook/adminLogin.html
0 → 100644
1 | +<!DOCTYPE html> | ||
2 | +<html lang="ko"> | ||
3 | +<head> | ||
4 | + <meta charset="UTF-8"> | ||
5 | + <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||
6 | + <title>FishBook : 관리자 로그인</title> | ||
7 | + <link rel="stylesheet" href="css/user_login.css"> | ||
8 | +</head> | ||
9 | +<body> | ||
10 | + <div id="wrapper"> | ||
11 | + <div id="header"> | ||
12 | + <h1> | ||
13 | + <a href="#"> | ||
14 | + <img src="image/fish-logo.png" alt="logo"> | ||
15 | + </a> | ||
16 | + </h1> | ||
17 | + </div> | ||
18 | + <div id="container"> | ||
19 | + <div id="content"> | ||
20 | + <form> | ||
21 | + <fieldset class="login_form"> | ||
22 | + <legend class="blind">로그인</legend> | ||
23 | + <div class="input_row" id="id_area"> | ||
24 | + <span class="input_box"> | ||
25 | + <label for="id" id="label_id_area"></label> | ||
26 | + <input type="text" id="id" name="id" class="int" placeholder="아이디" autofocus> | ||
27 | + </span> | ||
28 | + <!-- 취소 버튼--> | ||
29 | + </div> | ||
30 | + <div class="input_row" id="pw_area"> | ||
31 | + <span class="input_box"> | ||
32 | + <label for="pw" id="label_pw_area"></label> | ||
33 | + <input type="text" id="pw" name="pw" class="int" placeholder="비밀번호"> | ||
34 | + </span> | ||
35 | + <!-- 취소 버튼--> | ||
36 | + </div> | ||
37 | + <input type="submit" title="로그인" id="btn_login" alt="로그인" value="로그인"> | ||
38 | + </fieldset> | ||
39 | + </form> | ||
40 | + <div class="find_info"> | ||
41 | + <a href="#">아이디, 비밀번호 찾기</a> | ||
42 | + <a href="#">회원가입</a> | ||
43 | + </div> | ||
44 | + </div> | ||
45 | + </div> | ||
46 | + </div> | ||
47 | +</body> | ||
48 | +</html> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
FishBook/css/admin-index.css
0 → 100644
1 | +* { | ||
2 | + box-sizing: border-box; | ||
3 | + } | ||
4 | + | ||
5 | + a { | ||
6 | + text-decoration: none; | ||
7 | + } | ||
8 | + | ||
9 | + header { | ||
10 | + height: 100px; | ||
11 | + padding: 20px; | ||
12 | + display: block; | ||
13 | + } | ||
14 | + section { | ||
15 | + clear: left; | ||
16 | + display: block; | ||
17 | + height: 50%; | ||
18 | + border: 1px solid #000; | ||
19 | + } | ||
20 | + footer { | ||
21 | + border: 1px solid #000; | ||
22 | + height: 20%; | ||
23 | + } | ||
24 | + | ||
25 | + header img#logo { | ||
26 | + height: 50px; | ||
27 | + vertical-align: middle; | ||
28 | + overflow: hidden; | ||
29 | + | ||
30 | + } | ||
31 | + #search, #login { | ||
32 | + float: right; | ||
33 | + margin: 10px; | ||
34 | + } | ||
35 | + | ||
36 | + | ||
37 | + | ||
38 | + /* 메뉴를 위한 */ | ||
39 | + | ||
40 | + /* 메뉴바 전체 */ | ||
41 | + .menu { | ||
42 | + background: #47a3da; | ||
43 | + position: fixed; | ||
44 | + top: 107px; | ||
45 | + | ||
46 | + width: 200px; | ||
47 | + height: 80%; | ||
48 | + z-index: 1000; | ||
49 | + } | ||
50 | + /* 메뉴바의 Menu */ | ||
51 | + .menu div { | ||
52 | + color: #afdefa; | ||
53 | + font-size: 1.9em; | ||
54 | + padding: 20px; | ||
55 | + margin: 0; | ||
56 | + font-weight: 300; | ||
57 | + background: #0d77b6; | ||
58 | + } | ||
59 | + | ||
60 | + .menu h3 { | ||
61 | + display: inline-block; | ||
62 | + } | ||
63 | + .menu #hide-menu { | ||
64 | + text-align: center; | ||
65 | + } | ||
66 | + | ||
67 | + .menu a { | ||
68 | + display: block; | ||
69 | + color: #fff; | ||
70 | + font-size: 1.1em; | ||
71 | + font-weight: 300; | ||
72 | + | ||
73 | + | ||
74 | + border-bottom: 1px solid #258ecd; | ||
75 | + padding: 1em; | ||
76 | + } | ||
77 | + | ||
78 | + .menu a:hover { | ||
79 | + background: #258ecd; | ||
80 | + } | ||
81 | + | ||
82 | + .menu a:active { | ||
83 | + background: #afdefa; | ||
84 | + color: #47a3da; | ||
85 | + } | ||
86 | + | ||
87 | + /* 메뉴 숨기기 */ | ||
88 | + .menu-hide{ | ||
89 | + left: -200px; | ||
90 | + } | ||
91 | + | ||
92 | + .menu-hide.menu-open { | ||
93 | + left: 0px; | ||
94 | + } | ||
95 | + | ||
96 | + /* | ||
97 | + transition 속성 | ||
98 | + 메뉴바의 변화가 천천히 일어나도록 | ||
99 | + 즉 슬라이드처럼 보이게함 */ | ||
100 | + .menu { | ||
101 | + -webkit-transition: all 0.3s ease; | ||
102 | + -moz-transition: all 0.3s ease; | ||
103 | + transition: all 0.3s ease; | ||
104 | + } | ||
105 | + | ||
106 | + section { | ||
107 | + display: flex; | ||
108 | + /* flex-direction: row; | ||
109 | + flex-wrap: wrap; */ | ||
110 | + flex-flow: row wrap; | ||
111 | + text-align: center; | ||
112 | + | ||
113 | + } | ||
114 | + #bookmark-menu, #today, #offer { | ||
115 | + width: 98%; | ||
116 | + border: 1px solid black; | ||
117 | + background: #ccc; | ||
118 | + | ||
119 | + } | ||
120 | + | ||
121 | + | ||
122 | + | ||
123 | + | ||
124 | + @media screen and (max-width: 360px){ | ||
125 | + #traffic-info, #weather-info, #rainfall-info, #search-fish, #best-post, #newest-post, #board, #map{ | ||
126 | + width: 100%; | ||
127 | + border: 1px solid black; | ||
128 | + background: #ccc; | ||
129 | + | ||
130 | + } | ||
131 | + #search, #login { | ||
132 | + display: none; | ||
133 | + } | ||
134 | + | ||
135 | + } | ||
136 | + @media screen and (min-width: 361px) and (max-width: 768px){ | ||
137 | + #traffic-info, #weather-info, #rainfall-info, #search-fish, #best-post, #newest-post, #board{ | ||
138 | + width: 50%; | ||
139 | + border: 1px solid black; | ||
140 | + background: #ccc; | ||
141 | + } | ||
142 | + #board{ | ||
143 | + width: 100%; | ||
144 | + } | ||
145 | + #map { | ||
146 | + width: 100%; | ||
147 | + border: 1px solid black; | ||
148 | + background: #ccc; | ||
149 | + } | ||
150 | + #search, #login { | ||
151 | + display: none; | ||
152 | + } | ||
153 | + | ||
154 | + } | ||
155 | + @media screen and (min-width: 769px){ | ||
156 | + #traffic-info, #weather-info, #rainfall-info, #search-fish, #best-post, #newest-post, #board{ | ||
157 | + width: 33.333333%; | ||
158 | + border: 1px solid black; | ||
159 | + background: #ccc; | ||
160 | + | ||
161 | + } | ||
162 | + #map { | ||
163 | + width: 66.666666%; | ||
164 | + border: 1px solid black; | ||
165 | + background: #ccc; | ||
166 | + | ||
167 | + } | ||
168 | + } | ||
169 | + | ||
170 | + | ||
171 | + | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
FishBook/css/go-fishing.css
0 → 100644
1 | +* { | ||
2 | + box-sizing: border-box; | ||
3 | +} | ||
4 | + | ||
5 | +a { | ||
6 | + text-decoration: none; | ||
7 | +} | ||
8 | + | ||
9 | +header { | ||
10 | + height: 100px; | ||
11 | + padding: 20px; | ||
12 | + display: block; | ||
13 | +} | ||
14 | +section { | ||
15 | + clear: left; | ||
16 | + display: block; | ||
17 | + height: 50%; | ||
18 | + border: 1px solid #000; | ||
19 | +} | ||
20 | +footer { | ||
21 | + border: 1px solid #000; | ||
22 | + height: 20%; | ||
23 | +} | ||
24 | + | ||
25 | +header img#logo { | ||
26 | + height: 50px; | ||
27 | + vertical-align: middle; | ||
28 | + overflow: hidden; | ||
29 | + | ||
30 | +} | ||
31 | +#search, #login { | ||
32 | + float: right; | ||
33 | + margin: 10px; | ||
34 | +} | ||
35 | + | ||
36 | + | ||
37 | + | ||
38 | +/* 메뉴를 위한 */ | ||
39 | + | ||
40 | +/* 메뉴바 전체 */ | ||
41 | +.menu { | ||
42 | + background: #47a3da; | ||
43 | + position: fixed; | ||
44 | + top: 107px; | ||
45 | + | ||
46 | + width: 200px; | ||
47 | + height: 80%; | ||
48 | + z-index: 1000; | ||
49 | +} | ||
50 | +/* 메뉴바의 Menu */ | ||
51 | +.menu div { | ||
52 | + color: #afdefa; | ||
53 | + font-size: 1.9em; | ||
54 | + padding: 20px; | ||
55 | + margin: 0; | ||
56 | + font-weight: 300; | ||
57 | + background: #0d77b6; | ||
58 | +} | ||
59 | + | ||
60 | +.menu h3 { | ||
61 | + display: inline-block; | ||
62 | +} | ||
63 | +.menu #hide-menu { | ||
64 | + text-align: center; | ||
65 | +} | ||
66 | + | ||
67 | +.menu a { | ||
68 | + display: block; | ||
69 | + color: #fff; | ||
70 | + font-size: 1.1em; | ||
71 | + font-weight: 300; | ||
72 | + | ||
73 | + | ||
74 | + border-bottom: 1px solid #258ecd; | ||
75 | + padding: 1em; | ||
76 | +} | ||
77 | + | ||
78 | +.menu a:hover { | ||
79 | + background: #258ecd; | ||
80 | +} | ||
81 | + | ||
82 | +.menu a:active { | ||
83 | + background: #afdefa; | ||
84 | + color: #47a3da; | ||
85 | +} | ||
86 | + | ||
87 | +/* 메뉴 숨기기 */ | ||
88 | +.menu-hide{ | ||
89 | + left: -200px; | ||
90 | +} | ||
91 | + | ||
92 | +.menu-hide.menu-open { | ||
93 | + left: 0px; | ||
94 | +} | ||
95 | + | ||
96 | +/* | ||
97 | +transition 속성 | ||
98 | +메뉴바의 변화가 천천히 일어나도록 | ||
99 | +즉 슬라이드처럼 보이게함 */ | ||
100 | +.menu { | ||
101 | + -webkit-transition: all 0.3s ease; | ||
102 | + -moz-transition: all 0.3s ease; | ||
103 | + transition: all 0.3s ease; | ||
104 | +} | ||
105 | + | ||
106 | +section { | ||
107 | + display: flex; | ||
108 | + /* flex-direction: row; | ||
109 | + flex-wrap: wrap; */ | ||
110 | + flex-flow: row wrap; | ||
111 | + text-align: center; | ||
112 | + | ||
113 | +} | ||
114 | +#traffic-info, #weather-info, #rainfall-info, #search-fish, #best-post, #newest-post, #board{ | ||
115 | + width: 30.333333%; | ||
116 | + border: 1px solid black; | ||
117 | + background: #ccc; | ||
118 | + | ||
119 | +} | ||
120 | +#map { | ||
121 | + width: 60.666666%; | ||
122 | + border: 1px solid black; | ||
123 | + background: #ccc; | ||
124 | + | ||
125 | +} | ||
126 | + | ||
127 | + | ||
128 | + | ||
129 | + | ||
130 | +@media screen and (max-width: 360px){ | ||
131 | + #traffic-info, #weather-info, #rainfall-info, #search-fish, #best-post, #newest-post, #board, #map{ | ||
132 | + width: 100%; | ||
133 | + border: 1px solid black; | ||
134 | + background: #ccc; | ||
135 | + | ||
136 | + } | ||
137 | + #search, #login { | ||
138 | + display: none; | ||
139 | + } | ||
140 | + | ||
141 | +} | ||
142 | +@media screen and (min-width: 361px) and (max-width: 768px){ | ||
143 | + #weather-info, #rainfall-info { | ||
144 | + width: 50%; | ||
145 | + border: 1px solid black; | ||
146 | + background: #ccc; | ||
147 | + } | ||
148 | + #traffic-info, #fish-inquiry-board { | ||
149 | + width: 100%; | ||
150 | + border: 1px solid black; | ||
151 | + background: #ccc; | ||
152 | + } | ||
153 | + #search, #login { | ||
154 | + display: none; | ||
155 | + } | ||
156 | + | ||
157 | +} | ||
158 | +@media screen and (min-width: 769px){ | ||
159 | + #traffic-info, #weather-info, #rainfall-info, #search-fish, #best-post, #newest-post, #board{ | ||
160 | + width: 33.333333%; | ||
161 | + border: 1px solid black; | ||
162 | + background: #ccc; | ||
163 | + | ||
164 | + } | ||
165 | + #fish-inquiry-board { | ||
166 | + width: 100%; | ||
167 | + border: 1px solid black; | ||
168 | + background: #ccc; | ||
169 | + | ||
170 | + } | ||
171 | +} | ||
172 | + | ||
173 | + |
FishBook/css/index.css
0 → 100644
1 | +* { | ||
2 | + box-sizing: border-box; | ||
3 | +} | ||
4 | + | ||
5 | +a { | ||
6 | + text-decoration: none; | ||
7 | +} | ||
8 | + | ||
9 | +header { | ||
10 | + height: 100px; | ||
11 | + padding: 20px; | ||
12 | + display: block; | ||
13 | +} | ||
14 | +section { | ||
15 | + clear: left; | ||
16 | + display: block; | ||
17 | + height: 50%; | ||
18 | + border: 1px solid #000; | ||
19 | +} | ||
20 | +footer { | ||
21 | + border: 1px solid #000; | ||
22 | + height: 20%; | ||
23 | +} | ||
24 | + | ||
25 | +header img#logo { | ||
26 | + height: 50px; | ||
27 | + vertical-align: middle; | ||
28 | + overflow: hidden; | ||
29 | + | ||
30 | +} | ||
31 | +#search, #login { | ||
32 | + float: right; | ||
33 | + margin: 10px; | ||
34 | +} | ||
35 | + | ||
36 | + | ||
37 | + | ||
38 | +/* 메뉴를 위한 */ | ||
39 | + | ||
40 | +/* 메뉴바 전체 */ | ||
41 | +.menu { | ||
42 | + background: #47a3da; | ||
43 | + position: fixed; | ||
44 | + top: 107px; | ||
45 | + | ||
46 | + width: 200px; | ||
47 | + height: 80%; | ||
48 | + z-index: 1000; | ||
49 | +} | ||
50 | +/* 메뉴바의 Menu */ | ||
51 | +.menu div { | ||
52 | + color: #afdefa; | ||
53 | + font-size: 1.9em; | ||
54 | + padding: 20px; | ||
55 | + margin: 0; | ||
56 | + font-weight: 300; | ||
57 | + background: #0d77b6; | ||
58 | +} | ||
59 | + | ||
60 | +.menu h3 { | ||
61 | + display: inline-block; | ||
62 | +} | ||
63 | +.menu #hide-menu { | ||
64 | + text-align: center; | ||
65 | +} | ||
66 | + | ||
67 | +.menu a { | ||
68 | + display: block; | ||
69 | + color: #fff; | ||
70 | + font-size: 1.1em; | ||
71 | + font-weight: 300; | ||
72 | + | ||
73 | + | ||
74 | + border-bottom: 1px solid #258ecd; | ||
75 | + padding: 1em; | ||
76 | +} | ||
77 | + | ||
78 | +.menu a:hover { | ||
79 | + background: #258ecd; | ||
80 | +} | ||
81 | + | ||
82 | +.menu a:active { | ||
83 | + background: #afdefa; | ||
84 | + color: #47a3da; | ||
85 | +} | ||
86 | + | ||
87 | +/* 메뉴 숨기기 */ | ||
88 | +.menu-hide{ | ||
89 | + left: -200px; | ||
90 | +} | ||
91 | + | ||
92 | +.menu-hide.menu-open { | ||
93 | + left: 0px; | ||
94 | +} | ||
95 | + | ||
96 | +/* | ||
97 | +transition 속성 | ||
98 | +메뉴바의 변화가 천천히 일어나도록 | ||
99 | +즉 슬라이드처럼 보이게함 */ | ||
100 | +.menu { | ||
101 | + -webkit-transition: all 0.3s ease; | ||
102 | + -moz-transition: all 0.3s ease; | ||
103 | + transition: all 0.3s ease; | ||
104 | +} | ||
105 | + | ||
106 | +section { | ||
107 | + display: flex; | ||
108 | + /* flex-direction: row; | ||
109 | + flex-wrap: wrap; */ | ||
110 | + flex-flow: row wrap; | ||
111 | + text-align: center; | ||
112 | + | ||
113 | +} | ||
114 | +#traffic-info, #weather-info, #rainfall-info, #search-fish, #best-post, #newest-post, #board{ | ||
115 | + width: 30.333333%; | ||
116 | + border: 1px solid black; | ||
117 | + background: #ccc; | ||
118 | + | ||
119 | +} | ||
120 | +#map { | ||
121 | + width: 60.666666%; | ||
122 | + border: 1px solid black; | ||
123 | + background: #ccc; | ||
124 | + | ||
125 | +} | ||
126 | + | ||
127 | + | ||
128 | + | ||
129 | + | ||
130 | +@media screen and (max-width: 360px){ | ||
131 | + #traffic-info, #weather-info, #rainfall-info, #search-fish, #best-post, #newest-post, #board, #map{ | ||
132 | + width: 100%; | ||
133 | + border: 1px solid black; | ||
134 | + background: #ccc; | ||
135 | + | ||
136 | + } | ||
137 | + #search, #login { | ||
138 | + display: none; | ||
139 | + } | ||
140 | + | ||
141 | +} | ||
142 | +@media screen and (min-width: 361px) and (max-width: 768px){ | ||
143 | + #traffic-info, #weather-info, #rainfall-info, #search-fish, #best-post, #newest-post, #board{ | ||
144 | + width: 50%; | ||
145 | + border: 1px solid black; | ||
146 | + background: #ccc; | ||
147 | + } | ||
148 | + #board{ | ||
149 | + width: 100%; | ||
150 | + } | ||
151 | + #map { | ||
152 | + width: 100%; | ||
153 | + border: 1px solid black; | ||
154 | + background: #ccc; | ||
155 | + } | ||
156 | + #search, #login { | ||
157 | + display: none; | ||
158 | + } | ||
159 | + | ||
160 | +} | ||
161 | +@media screen and (min-width: 769px){ | ||
162 | + #traffic-info, #weather-info, #rainfall-info, #search-fish, #best-post, #newest-post, #board{ | ||
163 | + width: 33.333333%; | ||
164 | + border: 1px solid black; | ||
165 | + background: #ccc; | ||
166 | + | ||
167 | + } | ||
168 | + #map { | ||
169 | + width: 66.666666%; | ||
170 | + border: 1px solid black; | ||
171 | + background: #ccc; | ||
172 | + | ||
173 | + } | ||
174 | +} | ||
175 | + | ||
176 | + |
FishBook/css/index/index_desktop.css
0 → 100644
File mode changed
FishBook/django/admin_pythonanywhere.txt
0 → 100644
No preview for this file type
No preview for this file type
FishBook/django/fishbook/admins/__init__.py
0 → 100644
File mode changed
FishBook/django/fishbook/admins/admin.py
0 → 100644
1 | +from django.contrib import admin | ||
2 | + | ||
3 | + | ||
4 | +from .models import Admin | ||
5 | + | ||
6 | +@admin.register(Admin) | ||
7 | +class AdminAdmin(admin.ModelAdmin): | ||
8 | + list_display = ( | ||
9 | + 'id', | ||
10 | + 'adminId', | ||
11 | + 'adminPw', | ||
12 | + 'name', | ||
13 | + 'email', | ||
14 | + 'bookmark', | ||
15 | + 'created_at', | ||
16 | + 'updated_at' | ||
17 | + ) | ||
18 | + search_fields = ( | ||
19 | + 'adminId', | ||
20 | + ) | ||
21 | +# Register your models here. |
FishBook/django/fishbook/admins/apps.py
0 → 100644
1 | +# Generated by Django 3.0.6 on 2020-06-08 07:07 | ||
2 | + | ||
3 | +from django.db import migrations, models | ||
4 | + | ||
5 | + | ||
6 | +class Migration(migrations.Migration): | ||
7 | + | ||
8 | + initial = True | ||
9 | + | ||
10 | + dependencies = [ | ||
11 | + ] | ||
12 | + | ||
13 | + operations = [ | ||
14 | + migrations.CreateModel( | ||
15 | + name='Admin', | ||
16 | + fields=[ | ||
17 | + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||
18 | + ('adminId', models.CharField(max_length=20)), | ||
19 | + ('adminPw', models.CharField(max_length=20)), | ||
20 | + ('name', models.CharField(max_length=200)), | ||
21 | + ('email', models.CharField(max_length=50)), | ||
22 | + ('bookmark', models.CharField(max_length=200)), | ||
23 | + ('created_at', models.DateTimeField(auto_now_add=True)), | ||
24 | + ('updated_at', models.DateTimeField(auto_now=True)), | ||
25 | + ], | ||
26 | + ), | ||
27 | + ] |
File mode changed
FishBook/django/fishbook/admins/models.py
0 → 100644
1 | +from django.db import models | ||
2 | + | ||
3 | + | ||
4 | +class Admin(models.Model): | ||
5 | + adminId = models.CharField(max_length=20) | ||
6 | + adminPw = models.CharField(max_length=20) | ||
7 | + name = models.CharField(max_length=200) | ||
8 | + email = models.CharField(max_length=50) | ||
9 | + bookmark = models.CharField(max_length=200) | ||
10 | + created_at = models.DateTimeField(auto_now_add=True) | ||
11 | + updated_at = models.DateTimeField(auto_now=True) | ||
12 | +# Create your models here. |
1 | +{% load static %} | ||
2 | +<!DOCTYPE html> | ||
3 | +<html lang="ko"> | ||
4 | +<head> | ||
5 | + <meta charset="UTF-8"> | ||
6 | + <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||
7 | + <link rel="stylesheet" href="{% static 'css/admin_index.css' %}"> | ||
8 | + <title>Fish Book - 관리자 홈페이지</title> | ||
9 | + <script src="{% static 'js/jquery.js' %}"></script> | ||
10 | + <script src="{% static 'js/classie.js' %}"></script> | ||
11 | + <script src="{% static 'js/index.js' %}"></script> | ||
12 | +</head> | ||
13 | +<body> | ||
14 | + <header> | ||
15 | + <a href="{% url 'adminIndex' %}"><img id="logo" src="{% static 'image/fish-logo.png' %}"></a> | ||
16 | + <button id="show-menu">메뉴</button> | ||
17 | + <button id="login" type="submit">로그아웃</button> | ||
18 | + <input id="search" type="search"> | ||
19 | + </header> | ||
20 | + | ||
21 | + <nav class="menu menu-hide" id="menu"> | ||
22 | + <div> | ||
23 | + <h3>Menu</h3> | ||
24 | + </div> | ||
25 | + <a href="#">게시판 관리</a> | ||
26 | + <a href="#">회원관리</a> | ||
27 | + </nav> | ||
28 | + <section> | ||
29 | + <article id="bookmark-menu"> | ||
30 | + 자주 이용하는 메뉴 | ||
31 | + <pre> | ||
32 | + 1. 글1 | ||
33 | + 2. 글2 | ||
34 | + 3. 글3 | ||
35 | + 4. 글4 | ||
36 | + 5. 글5 | ||
37 | + </pre> | ||
38 | + </article> | ||
39 | + <article id="today"> | ||
40 | + Today 현황 | ||
41 | + <pre> | ||
42 | + 1. 글1 | ||
43 | + 2. 글2 | ||
44 | + 3. 글3 | ||
45 | + 4. 글4 | ||
46 | + 5. 글5 | ||
47 | + </pre> | ||
48 | + </article> | ||
49 | + <article id="offer"> | ||
50 | + 건의사항 | ||
51 | + <pre> | ||
52 | + 1. 글1 | ||
53 | + 2. 글2 | ||
54 | + 3. 글3 | ||
55 | + 4. 글4 | ||
56 | + 5. 글5 | ||
57 | + </pre> | ||
58 | + </article> | ||
59 | + </section> | ||
60 | + <footer> | ||
61 | + <address>경기도 수원시 영통구 영통동</address> | ||
62 | + </footer> | ||
63 | +</body> | ||
64 | +</html> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +{% load static %} | ||
2 | +<!DOCTYPE html> | ||
3 | +<html lang="ko"> | ||
4 | +<head> | ||
5 | + <meta charset="UTF-8"> | ||
6 | + <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||
7 | + <title>FishBook : 관리자 로그인</title> | ||
8 | + <link rel="stylesheet" href="{% static 'css/user_login.css' %}"> | ||
9 | +</head> | ||
10 | +<body> | ||
11 | + <div id="wrapper"> | ||
12 | + <div id="header"> | ||
13 | + <h1> | ||
14 | + <a href="#"> | ||
15 | + <img src="{% static 'image/fish-logo.png' %}" alt="logo"> | ||
16 | + </a> | ||
17 | + </h1> | ||
18 | + </div> | ||
19 | + <div id="container"> | ||
20 | + <div id="content"> | ||
21 | + <form> | ||
22 | + <fieldset class="login_form"> | ||
23 | + <legend class="blind">로그인</legend> | ||
24 | + <div class="input_row" id="id_area"> | ||
25 | + <span class="input_box"> | ||
26 | + <label for="id" id="label_id_area"></label> | ||
27 | + <input type="text" id="id" name="id" class="int" placeholder="아이디" autofocus> | ||
28 | + </span> | ||
29 | + <!-- 취소 버튼--> | ||
30 | + </div> | ||
31 | + <div class="input_row" id="pw_area"> | ||
32 | + <span class="input_box"> | ||
33 | + <label for="pw" id="label_pw_area"></label> | ||
34 | + <input type="text" id="pw" name="pw" class="int" placeholder="비밀번호"> | ||
35 | + </span> | ||
36 | + <!-- 취소 버튼--> | ||
37 | + </div> | ||
38 | + <input type="submit" title="로그인" id="btn_login" alt="로그인" value="로그인"> | ||
39 | + </fieldset> | ||
40 | + </form> | ||
41 | + <div class="find_info"> | ||
42 | + <a href="#">아이디, 비밀번호 찾기</a> | ||
43 | + <a href="#">회원가입</a> | ||
44 | + </div> | ||
45 | + </div> | ||
46 | + </div> | ||
47 | + </div> | ||
48 | +</body> | ||
49 | +</html> | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
FishBook/django/fishbook/admins/tests.py
0 → 100644
FishBook/django/fishbook/admins/views.py
0 → 100644
FishBook/django/fishbook/board/__init__.py
0 → 100644
File mode changed
FishBook/django/fishbook/board/admin.py
0 → 100644
FishBook/django/fishbook/board/apps.py
0 → 100644
1 | +# Generated by Django 3.0.6 on 2020-06-15 11:48 | ||
2 | + | ||
3 | +from django.db import migrations, models | ||
4 | +import django.db.models.deletion | ||
5 | + | ||
6 | + | ||
7 | +class Migration(migrations.Migration): | ||
8 | + | ||
9 | + initial = True | ||
10 | + | ||
11 | + dependencies = [ | ||
12 | + ('users', '0003_remove_user_userid'), | ||
13 | + ] | ||
14 | + | ||
15 | + operations = [ | ||
16 | + migrations.CreateModel( | ||
17 | + name='Board', | ||
18 | + fields=[ | ||
19 | + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||
20 | + ('title', models.CharField(max_length=100)), | ||
21 | + ('content', models.CharField(max_length=2000)), | ||
22 | + ('hit', models.IntegerField(default=0)), | ||
23 | + ('created_at', models.DateTimeField(auto_now_add=True)), | ||
24 | + ('updated_at', models.DateTimeField(auto_now=True)), | ||
25 | + ('groupno', models.IntegerField(default=0)), | ||
26 | + ('orderno', models.IntegerField(default=0)), | ||
27 | + ('depth', models.IntegerField(default=0)), | ||
28 | + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.User')), | ||
29 | + ], | ||
30 | + ), | ||
31 | + ] |
File mode changed
FishBook/django/fishbook/board/models.py
0 → 100644
1 | +from django.db import models | ||
2 | + | ||
3 | +# Create your models here. | ||
4 | +from users.models import User | ||
5 | + | ||
6 | +class Board(models.Model): | ||
7 | + title = models.CharField(max_length=100) | ||
8 | + content = models.CharField(max_length=2000) | ||
9 | + hit = models.IntegerField(default=0) | ||
10 | + created_at = models.DateTimeField(auto_now_add=True) | ||
11 | + updated_at = models.DateTimeField(auto_now=True) | ||
12 | + user = models.ForeignKey(User, to_field='id', on_delete=models.CASCADE) | ||
13 | + groupno = models.IntegerField(default=0) | ||
14 | + orderno = models.IntegerField(default=0) | ||
15 | + depth = models.IntegerField(default=0) | ||
16 | + | ||
17 | +# groupno 컬럼 - 첫 게시글과, 그 게시글의 답글들에게 같은 groupno을 주어서 보여주기 위함 | ||
18 | +# | ||
19 | +# orderno 컬럼 - 같은 groupno의 게시글들을 최신순으로 위로 올리기 위함 | ||
20 | +# | ||
21 | +# depth 컬럼 - 답글들을 한 칸씩 밀려서 보이게 하기 위함 |
1 | +{% load static %} | ||
2 | +{% load mathfilters %} | ||
3 | + | ||
4 | +<!DOCTYPE html> | ||
5 | +<html lang="ko"> | ||
6 | + <head> | ||
7 | + <title>FishBook</title> | ||
8 | + <meta charset="utf-8"> | ||
9 | + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> | ||
10 | + | ||
11 | + <meta name="description" content="" /> | ||
12 | + <meta name="keywords" content="" /> | ||
13 | + <meta name="author" content="JH PARK" /> | ||
14 | + | ||
15 | + <link rel="shortcut icon" href=""> | ||
16 | + <link rel="stylesheet" href="{% static 'assets/css/board.css' %}" /> | ||
17 | + <link rel="stylesheet" href="{% static 'assets/css/main.css' %}" /> | ||
18 | + </head> | ||
19 | + | ||
20 | + <body class="is-preload homepage"> | ||
21 | + <div id="page-wrapper"> | ||
22 | + | ||
23 | + <!-- Header --> | ||
24 | + <div id="header-wrapper"> | ||
25 | + <header id="header" class="container"> | ||
26 | + | ||
27 | + <!-- Logo --> | ||
28 | + <div id="logo"> | ||
29 | + <a href="{% url 'index' %}"><img src="{% static 'images/fish-logo.png' %}" %} style="height: 66px;"></a> | ||
30 | + | ||
31 | + </div> | ||
32 | + | ||
33 | + <!-- Nav --> | ||
34 | + {% include 'share/_navbar.html' %} | ||
35 | + | ||
36 | + </header> | ||
37 | + </div> | ||
38 | + | ||
39 | + <!-- Banner --> | ||
40 | + <!-- | ||
41 | + <div id="banner-wrapper"> | ||
42 | + <div id="banner" class="box container"> | ||
43 | + <div class="row"> | ||
44 | + <div class="col-7 col-12-medium"> | ||
45 | + <h2>Fish Book</h2> | ||
46 | + <p> 낚시 관련 모든 정보를 제공합니다.</p> | ||
47 | + </div> | ||
48 | + <div class="col-5 col-12-medium"> | ||
49 | + <ul> | ||
50 | + <li><a href="#transport" class="button large icon solid fa-arrow-circle-right">Transport</a></li> | ||
51 | + <li><a href="#weather" class="button alt large icon solid fa-arrow-circle-right">Weather</a></li> | ||
52 | + </ul> | ||
53 | + </div> | ||
54 | + </div> | ||
55 | + </div> | ||
56 | + </div> | ||
57 | +--> | ||
58 | + <!-- Features --> | ||
59 | + | ||
60 | + <div class="container"> | ||
61 | + <div class="row"> | ||
62 | + <div class="col-12"> | ||
63 | + <H3>조황문의</H3> | ||
64 | + </div> | ||
65 | + </div> | ||
66 | + </div> | ||
67 | + <!-- Main --> | ||
68 | + <div id="banner-wrapper"> | ||
69 | + <div class="container"> | ||
70 | + <!-- Box --> | ||
71 | + <section class="box feature" id="transport"> | ||
72 | + <div id="board"> | ||
73 | + <form id="search_form" action="{% url 'board:list' %}" method="GET"> | ||
74 | + <input type="text" id="kwd" name="kwd" value="" placeholder="검색"> | ||
75 | + <input type="submit" value="찾기" style="float: right;"> | ||
76 | + </form> | ||
77 | + <table class="tbl-ex"> | ||
78 | + <tr> | ||
79 | + <th>번호</th> | ||
80 | + <th>제목</th> | ||
81 | + <th>글쓴이</th> | ||
82 | + <th>조회수</th> | ||
83 | + <th>작성일</th> | ||
84 | + </tr> | ||
85 | + {% for board in boardlist %} | ||
86 | + <tr> | ||
87 | + <td>[{{current_page|sub:1|mul:10|add:forloop.counter|sub:1|sub:board_count|abs}}]</td> | ||
88 | + {% if board.depth == 0 %} | ||
89 | + <td style="text-align: left;"> | ||
90 | + {% if board.title == '삭제된 글입니다.'%} | ||
91 | + {{board.title}} | ||
92 | + {% else %} | ||
93 | + <a href="{% url 'board:view' board.id page %}?kwd={{kwd}}">{{board.title}}</a> | ||
94 | + {% endif %} | ||
95 | + </td> | ||
96 | + {% else %} | ||
97 | + <td style="text-align: left;padding-left:{{board.depth|mul:15}}px;"> | ||
98 | + {% if board.title == '삭제된 글입니다.'%} | ||
99 | + <img src="{% static 'images/reply.png' %}">{{board.title}} | ||
100 | + {% else %} | ||
101 | + <img src="{% static 'images/reply.png' %}"><a href="{% url 'board:view' board.id page %}?kwd={{kwd}}">{{board.title}}</a> | ||
102 | + {% endif %} | ||
103 | + </td> | ||
104 | + {% endif %} | ||
105 | + <td>{{board.user.email}}</td> | ||
106 | + <td>{{board.hit}}</td> | ||
107 | + <td>{{board.created_at|date:'Y-m-d H:i'}}</td> | ||
108 | + </tr> | ||
109 | + {% endfor %} | ||
110 | + </table> | ||
111 | + | ||
112 | + <!-- pager 추가 --> | ||
113 | + <div class="pager"> | ||
114 | + <ul id="pager"> | ||
115 | + </ul> | ||
116 | + </div> | ||
117 | + <!-- pager 추가 --> | ||
118 | + | ||
119 | + <div class="bottom"> | ||
120 | + <button style="float: right;" onclick="window.location.href='{% url 'board:writeform' page %}'">글쓰기</button> | ||
121 | + </div> | ||
122 | + </div> | ||
123 | + </section> | ||
124 | + </div> | ||
125 | + </div> | ||
126 | + | ||
127 | + <!-- Footer --> | ||
128 | + <div id="footer-wrapper"> | ||
129 | + <footer id="footer" class="container"> | ||
130 | + <div class="row"> | ||
131 | + | ||
132 | + <div class="col-12 col-12-medium col-12-small" > | ||
133 | + | ||
134 | + <!-- Contact --> | ||
135 | + <section class="widget contact last" style="text-align: center;"> | ||
136 | + <h3>Contact Us</h3> | ||
137 | + <ul> | ||
138 | + <li><a href="#" class="icon brands fa-twitter"><span class="label">Twitter</span></a></li> | ||
139 | + <li><a href="#" class="icon brands fa-facebook-f"><span class="label">Facebook</span></a></li> | ||
140 | + <li><a href="#" class="icon brands fa-instagram"><span class="label">Instagram</span></a></li> | ||
141 | + | ||
142 | + </ul> | ||
143 | + <p>경기도 용인시 기흥구 영덕동 덕영대로 1732<br /> | ||
144 | + 010-xxxx-yyyy</p> | ||
145 | + </section> | ||
146 | + | ||
147 | + </div> | ||
148 | + </div> | ||
149 | + <div class="row"> | ||
150 | + <div class="col-12"> | ||
151 | + <div id="copyright"> | ||
152 | + <ul class="menu"> | ||
153 | + <li>© All rights reserved</li> | ||
154 | + </ul> | ||
155 | + </div> | ||
156 | + </div> | ||
157 | + </div> | ||
158 | + </footer> | ||
159 | + </div> | ||
160 | + | ||
161 | + </div> | ||
162 | + | ||
163 | + <!-- Scripts --> | ||
164 | + | ||
165 | + <script type="text/javascript" src="//dapi.kakao.com/v2/maps/sdk.js?appkey=ae75e773f5e261bc9bb0d38c630165d8&libraries=services,clusterer"></script> | ||
166 | + <script src="{% static 'assets/js/jquery.min.js' %}"></script> | ||
167 | + <script src="{% static 'assets/js/jquery.dropotron.min.js' %}"></script> | ||
168 | + <script src="{% static 'assets/js/browser.min.js' %}"></script> | ||
169 | + <script src="{% static 'assets/js/breakpoints.min.js' %}"></script> | ||
170 | + <script src="{% static 'assets/js/util.js' %}"></script> | ||
171 | + <script src="{% static 'assets/js/main.js' %}"></script> | ||
172 | + <script src="{% static 'assets/js/paging.js' %}"></script> | ||
173 | + <script> | ||
174 | + var listCount = {{board_count}}; | ||
175 | + var currentPage = {{current_page}}; | ||
176 | + var kwd = "{{kwd}}"; | ||
177 | + setPage(listCount, currentPage, kwd); | ||
178 | + </script> | ||
179 | + </body> | ||
180 | +</html> |
1 | +{% load static %} | ||
2 | +{% load mathfilters %} | ||
3 | + | ||
4 | +<!DOCTYPE html> | ||
5 | +<html lang="ko"> | ||
6 | + <head> | ||
7 | + <title>FishBook</title> | ||
8 | + <meta charset="utf-8"> | ||
9 | + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> | ||
10 | + | ||
11 | + <meta name="description" content="" /> | ||
12 | + <meta name="keywords" content="" /> | ||
13 | + <meta name="author" content="JH PARK" /> | ||
14 | + | ||
15 | + <link rel="shortcut icon" href=""> | ||
16 | + | ||
17 | + <link rel="stylesheet" href="{% static 'assets/css/main.css' %}" /> | ||
18 | + </head> | ||
19 | + | ||
20 | + <body class="is-preload homepage"> | ||
21 | + <div id="page-wrapper"> | ||
22 | + | ||
23 | + <!-- Header --> | ||
24 | + <div id="header-wrapper"> | ||
25 | + <header id="header" class="container"> | ||
26 | + | ||
27 | + <!-- Logo --> | ||
28 | + <div id="logo"> | ||
29 | + <a href="{% url 'index' %}"><img src="{% static 'images/fish-logo.png' %}" %} style="height: 66px;"></a> | ||
30 | + | ||
31 | + </div> | ||
32 | + | ||
33 | + <!-- Nav --> | ||
34 | + {% include 'share/_navbar.html' %} | ||
35 | + | ||
36 | + </header> | ||
37 | + </div> | ||
38 | + | ||
39 | + <!-- Banner --> | ||
40 | + <!-- | ||
41 | + <div id="banner-wrapper"> | ||
42 | + <div id="banner" class="box container"> | ||
43 | + <div class="row"> | ||
44 | + <div class="col-7 col-12-medium"> | ||
45 | + <h2>Fish Book</h2> | ||
46 | + <p> 낚시 관련 모든 정보를 제공합니다.</p> | ||
47 | + </div> | ||
48 | + <div class="col-5 col-12-medium"> | ||
49 | + <ul> | ||
50 | + <li><a href="#transport" class="button large icon solid fa-arrow-circle-right">Transport</a></li> | ||
51 | + <li><a href="#weather" class="button alt large icon solid fa-arrow-circle-right">Weather</a></li> | ||
52 | + </ul> | ||
53 | + </div> | ||
54 | + </div> | ||
55 | + </div> | ||
56 | + </div> | ||
57 | +--> | ||
58 | + <!-- Features --> | ||
59 | + | ||
60 | + <div class="container"> | ||
61 | + <div class="row"> | ||
62 | + <div class="col-12"> | ||
63 | + <H3>조황문의</H3> | ||
64 | + </div> | ||
65 | + </div> | ||
66 | + </div> | ||
67 | + <!-- Main --> | ||
68 | + <div id="banner-wrapper"> | ||
69 | + <div class="container"> | ||
70 | + | ||
71 | + <!-- Box --> | ||
72 | + <section class="box feature" id="transport"> | ||
73 | + <div id="board"> | ||
74 | + <form class="board-form" method="POST" action="{% url 'board:modify' page%}"> | ||
75 | + {% csrf_token %} | ||
76 | + <table class="tbl-ex"> | ||
77 | + <input type="hidden" name="id" value="{{board.id}}"> | ||
78 | + <tr> | ||
79 | + <th colspan="2">글수정</th> | ||
80 | + </tr> | ||
81 | + <tr> | ||
82 | + <td class="label">제목</td> | ||
83 | + <td><input type="text" name="title" value="{{board.title}}"></td> | ||
84 | + </tr> | ||
85 | + <tr> | ||
86 | + <td class="label">내용</td> | ||
87 | + <td> | ||
88 | + <textarea id="content" name="content">{{board.content}}</textarea> | ||
89 | + </td> | ||
90 | + </tr> | ||
91 | + </table> | ||
92 | + <div class="bottom"> | ||
93 | + <a href="{% url 'board:list' page %}">취소</a> | ||
94 | + <input type="submit" value="수정"> | ||
95 | + </div> | ||
96 | + </form> | ||
97 | + </div> | ||
98 | + </section> | ||
99 | + | ||
100 | + </div> | ||
101 | + </div> | ||
102 | + | ||
103 | + <!-- Footer --> | ||
104 | + <div id="footer-wrapper"> | ||
105 | + <footer id="footer" class="container"> | ||
106 | + <div class="row"> | ||
107 | + | ||
108 | + <div class="col-12 col-12-medium col-12-small" > | ||
109 | + | ||
110 | + <!-- Contact --> | ||
111 | + <section class="widget contact last" style="text-align: center;"> | ||
112 | + <h3>Contact Us</h3> | ||
113 | + <ul> | ||
114 | + <li><a href="#" class="icon brands fa-twitter"><span class="label">Twitter</span></a></li> | ||
115 | + <li><a href="#" class="icon brands fa-facebook-f"><span class="label">Facebook</span></a></li> | ||
116 | + <li><a href="#" class="icon brands fa-instagram"><span class="label">Instagram</span></a></li> | ||
117 | + | ||
118 | + </ul> | ||
119 | + <p>경기도 용인시 기흥구 영덕동 덕영대로 1732<br /> | ||
120 | + 010-xxxx-yyyy</p> | ||
121 | + </section> | ||
122 | + | ||
123 | + </div> | ||
124 | + </div> | ||
125 | + <div class="row"> | ||
126 | + <div class="col-12"> | ||
127 | + <div id="copyright"> | ||
128 | + <ul class="menu"> | ||
129 | + <li>© All rights reserved</li> | ||
130 | + </ul> | ||
131 | + </div> | ||
132 | + </div> | ||
133 | + </div> | ||
134 | + </footer> | ||
135 | + </div> | ||
136 | + | ||
137 | + </div> | ||
138 | + | ||
139 | + <!-- Scripts --> | ||
140 | + | ||
141 | + <script type="text/javascript" src="//dapi.kakao.com/v2/maps/sdk.js?appkey=ae75e773f5e261bc9bb0d38c630165d8&libraries=services,clusterer"></script> | ||
142 | + <script src="{% static 'assets/js/jquery.min.js' %}"></script> | ||
143 | + <script src="{% static 'assets/js/jquery.dropotron.min.js' %}"></script> | ||
144 | + <script src="{% static 'assets/js/browser.min.js' %}"></script> | ||
145 | + <script src="{% static 'assets/js/breakpoints.min.js' %}"></script> | ||
146 | + <script src="{% static 'assets/js/util.js' %}"></script> | ||
147 | + <script src="{% static 'assets/js/main.js' %}"></script> | ||
148 | + </body> | ||
149 | +</html> |
1 | +{% load static %} | ||
2 | +{% load mathfilters %} | ||
3 | + | ||
4 | +<!DOCTYPE html> | ||
5 | +<html lang="ko"> | ||
6 | + <head> | ||
7 | + <title>FishBook</title> | ||
8 | + <meta charset="utf-8"> | ||
9 | + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> | ||
10 | + | ||
11 | + <meta name="description" content="" /> | ||
12 | + <meta name="keywords" content="" /> | ||
13 | + <meta name="author" content="JH PARK" /> | ||
14 | + | ||
15 | + <link rel="shortcut icon" href=""> | ||
16 | + | ||
17 | + <link rel="stylesheet" href="{% static 'assets/css/main.css' %}" /> | ||
18 | + </head> | ||
19 | + | ||
20 | + <body class="is-preload homepage"> | ||
21 | + <div id="page-wrapper"> | ||
22 | + | ||
23 | + <!-- Header --> | ||
24 | + <div id="header-wrapper"> | ||
25 | + <header id="header" class="container"> | ||
26 | + | ||
27 | + <!-- Logo --> | ||
28 | + <div id="logo"> | ||
29 | + <a href="{% url 'index' %}"><img src="{% static 'images/fish-logo.png' %}" %} style="height: 66px;"></a> | ||
30 | + | ||
31 | + </div> | ||
32 | + | ||
33 | + <!-- Nav --> | ||
34 | + {% include 'share/_navbar.html' %} | ||
35 | + | ||
36 | + </header> | ||
37 | + </div> | ||
38 | + | ||
39 | + <!-- Banner --> | ||
40 | + <!-- | ||
41 | + <div id="banner-wrapper"> | ||
42 | + <div id="banner" class="box container"> | ||
43 | + <div class="row"> | ||
44 | + <div class="col-7 col-12-medium"> | ||
45 | + <h2>Fish Book</h2> | ||
46 | + <p> 낚시 관련 모든 정보를 제공합니다.</p> | ||
47 | + </div> | ||
48 | + <div class="col-5 col-12-medium"> | ||
49 | + <ul> | ||
50 | + <li><a href="#transport" class="button large icon solid fa-arrow-circle-right">Transport</a></li> | ||
51 | + <li><a href="#weather" class="button alt large icon solid fa-arrow-circle-right">Weather</a></li> | ||
52 | + </ul> | ||
53 | + </div> | ||
54 | + </div> | ||
55 | + </div> | ||
56 | + </div> | ||
57 | +--> | ||
58 | + <!-- Features --> | ||
59 | + | ||
60 | + <div class="container"> | ||
61 | + <div class="row"> | ||
62 | + <div class="col-12"> | ||
63 | + <H3>조황문의</H3> | ||
64 | + </div> | ||
65 | + </div> | ||
66 | + </div> | ||
67 | + <!-- Main --> | ||
68 | + <div id="banner-wrapper"> | ||
69 | + <div class="container"> | ||
70 | + | ||
71 | + <!-- Box --> | ||
72 | + <section class="box feature" id="transport"> | ||
73 | + <div id="board" class="board-form"> | ||
74 | + <table class="tbl-ex"> | ||
75 | + <tr> | ||
76 | + <th colspan="2">글보기</th> | ||
77 | + </tr> | ||
78 | + <tr> | ||
79 | + <td class="label">제목</td> | ||
80 | + <td>{{board.title}}</td> | ||
81 | + </tr> | ||
82 | + <tr> | ||
83 | + <td class="label">글쓴이</td> | ||
84 | + <td>{{board.user.name}}</td> | ||
85 | + </tr> | ||
86 | + <tr> | ||
87 | + <td class="label">조회수</td> | ||
88 | + <td>{{board.hit}}</td> | ||
89 | + </tr> | ||
90 | + <tr> | ||
91 | + <td class="label">내용</td> | ||
92 | + <td> | ||
93 | + <div class="view-content"> | ||
94 | + {{board.content|linebreaks}} | ||
95 | + </div> | ||
96 | + <div class="bottom"> | ||
97 | + <button style="float: right;" onclick="window.location.href='{% url 'board:list' page %}?kwd={{kwd}}'">글목록</button> | ||
98 | + {% if request.session.authUser is not None %} | ||
99 | + <!--<a href="/board/writeform/{{board.id}}">답글</a>--> | ||
100 | + <button style="float: right;" onclick="window.location.href='{% url 'board:reply_writeform' board.id page %}?kwd={{kwd}}'">답글</button> | ||
101 | + {% if request.session.authUser.email == board.user.email %} | ||
102 | + <button style="float: right;" onclick="window.location.href='{% url 'board:modifyform' board.id page %}'">글수정</button> | ||
103 | + <button style="float: right;" onclick="window.location.href='{% url 'board:delete' board.id page %}?kwd={{kwd}}'">글삭제</button> | ||
104 | + {% endif %} | ||
105 | + {% endif %} | ||
106 | + </div> | ||
107 | + </td> | ||
108 | + </tr> | ||
109 | + </table> | ||
110 | + </div> | ||
111 | + </section> | ||
112 | + </div> | ||
113 | + </div> | ||
114 | + | ||
115 | + <!-- Footer --> | ||
116 | + <div id="footer-wrapper"> | ||
117 | + <footer id="footer" class="container"> | ||
118 | + <div class="row"> | ||
119 | + | ||
120 | + <div class="col-12 col-12-medium col-12-small" > | ||
121 | + | ||
122 | + <!-- Contact --> | ||
123 | + <section class="widget contact last" style="text-align: center;"> | ||
124 | + <h3>Contact Us</h3> | ||
125 | + <ul> | ||
126 | + <li><a href="#" class="icon brands fa-twitter"><span class="label">Twitter</span></a></li> | ||
127 | + <li><a href="#" class="icon brands fa-facebook-f"><span class="label">Facebook</span></a></li> | ||
128 | + <li><a href="#" class="icon brands fa-instagram"><span class="label">Instagram</span></a></li> | ||
129 | + | ||
130 | + </ul> | ||
131 | + <p>경기도 용인시 기흥구 영덕동 덕영대로 1732<br /> | ||
132 | + 010-xxxx-yyyy</p> | ||
133 | + </section> | ||
134 | + | ||
135 | + </div> | ||
136 | + </div> | ||
137 | + <div class="row"> | ||
138 | + <div class="col-12"> | ||
139 | + <div id="copyright"> | ||
140 | + <ul class="menu"> | ||
141 | + <li>© All rights reserved</li> | ||
142 | + </ul> | ||
143 | + </div> | ||
144 | + </div> | ||
145 | + </div> | ||
146 | + </footer> | ||
147 | + </div> | ||
148 | + | ||
149 | + </div> | ||
150 | + | ||
151 | + <!-- Scripts --> | ||
152 | + | ||
153 | + <script type="text/javascript" src="//dapi.kakao.com/v2/maps/sdk.js?appkey=ae75e773f5e261bc9bb0d38c630165d8&libraries=services,clusterer"></script> | ||
154 | + <script src="{% static 'assets/js/jquery.min.js' %}"></script> | ||
155 | + <script src="{% static 'assets/js/jquery.dropotron.min.js' %}"></script> | ||
156 | + <script src="{% static 'assets/js/browser.min.js' %}"></script> | ||
157 | + <script src="{% static 'assets/js/breakpoints.min.js' %}"></script> | ||
158 | + <script src="{% static 'assets/js/util.js' %}"></script> | ||
159 | + <script src="{% static 'assets/js/main.js' %}"></script> | ||
160 | + </body> | ||
161 | +</html> |
1 | +{% load static %} | ||
2 | +{% load mathfilters %} | ||
3 | + | ||
4 | +<!DOCTYPE html> | ||
5 | +<html lang="ko"> | ||
6 | + <head> | ||
7 | + <title>FishBook</title> | ||
8 | + <meta charset="utf-8"> | ||
9 | + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> | ||
10 | + | ||
11 | + <meta name="description" content="" /> | ||
12 | + <meta name="keywords" content="" /> | ||
13 | + <meta name="author" content="JH PARK" /> | ||
14 | + | ||
15 | + <link rel="shortcut icon" href=""> | ||
16 | + | ||
17 | + <link rel="stylesheet" href="{% static 'assets/css/main.css' %}" /> | ||
18 | + </head> | ||
19 | + | ||
20 | + <body class="is-preload homepage"> | ||
21 | + <div id="page-wrapper"> | ||
22 | + | ||
23 | + <!-- Header --> | ||
24 | + <div id="header-wrapper"> | ||
25 | + <header id="header" class="container"> | ||
26 | + | ||
27 | + <!-- Logo --> | ||
28 | + <div id="logo"> | ||
29 | + <a href="{% url 'index' %}"><img src="{% static 'images/fish-logo.png' %}" %} style="height: 66px;"></a> | ||
30 | + | ||
31 | + </div> | ||
32 | + | ||
33 | + <!-- Nav --> | ||
34 | + {% include 'share/_navbar.html' %} | ||
35 | + | ||
36 | + </header> | ||
37 | + </div> | ||
38 | + | ||
39 | + <!-- Banner --> | ||
40 | + <!-- | ||
41 | + <div id="banner-wrapper"> | ||
42 | + <div id="banner" class="box container"> | ||
43 | + <div class="row"> | ||
44 | + <div class="col-7 col-12-medium"> | ||
45 | + <h2>Fish Book</h2> | ||
46 | + <p> 낚시 관련 모든 정보를 제공합니다.</p> | ||
47 | + </div> | ||
48 | + <div class="col-5 col-12-medium"> | ||
49 | + <ul> | ||
50 | + <li><a href="#transport" class="button large icon solid fa-arrow-circle-right">Transport</a></li> | ||
51 | + <li><a href="#weather" class="button alt large icon solid fa-arrow-circle-right">Weather</a></li> | ||
52 | + </ul> | ||
53 | + </div> | ||
54 | + </div> | ||
55 | + </div> | ||
56 | + </div> | ||
57 | +--> | ||
58 | + <!-- Features --> | ||
59 | + | ||
60 | + <div class="container"> | ||
61 | + <div class="row"> | ||
62 | + <div class="col-12"> | ||
63 | + <H3>조황문의</H3> | ||
64 | + </div> | ||
65 | + </div> | ||
66 | + </div> | ||
67 | + <!-- Main --> | ||
68 | + <div id="banner-wrapper"> | ||
69 | + <div class="container"> | ||
70 | + | ||
71 | + <!-- Box --> | ||
72 | + <section class="box feature" id="transport"> | ||
73 | + <div id="board"> | ||
74 | + <!--<form class="board-form" method="post" action="/board/write">--> | ||
75 | + <form class="board-form" method="POST" action="{% url 'board:write' page %}?kwd={{kwd}}"> | ||
76 | + {% csrf_token %} | ||
77 | + {% if no %} | ||
78 | + <input type="hidden" name="no" value="{{no}}"> | ||
79 | + {% else %} | ||
80 | + <input type="hidden" name="no" value="-1"> | ||
81 | + {% endif %} | ||
82 | + <table class="tbl-ex"> | ||
83 | + <tr> | ||
84 | + <th colspan="2">글쓰기</th> | ||
85 | + </tr> | ||
86 | + <tr> | ||
87 | + <td class="label">제목</td> | ||
88 | + <td><input type="text" name="title" value=""></td> | ||
89 | + </tr> | ||
90 | + <tr> | ||
91 | + <td class="label">내용</td> | ||
92 | + <td> | ||
93 | + <textarea id="content" name="content" style="margin-bottom: 15px;" ></textarea> | ||
94 | + | ||
95 | + <div class="bottom"> | ||
96 | + <button style="float: right;" onclick="window.location.href='{% url 'board:list' page %}?kwd={{kwd}}'">취소</button> | ||
97 | + <input style="float: right; font-size: 17px;" type="submit" value="등록"> | ||
98 | + </div> | ||
99 | + </td> | ||
100 | + </tr> | ||
101 | + </table> | ||
102 | + </form> | ||
103 | + </div> | ||
104 | + </section> | ||
105 | + | ||
106 | + </div> | ||
107 | + </div> | ||
108 | + | ||
109 | + <!-- Footer --> | ||
110 | + <div id="footer-wrapper"> | ||
111 | + <footer id="footer" class="container"> | ||
112 | + <div class="row"> | ||
113 | + | ||
114 | + <div class="col-12 col-12-medium col-12-small" > | ||
115 | + | ||
116 | + <!-- Contact --> | ||
117 | + <section class="widget contact last" style="text-align: center;"> | ||
118 | + <h3>Contact Us</h3> | ||
119 | + <ul> | ||
120 | + <li><a href="#" class="icon brands fa-twitter"><span class="label">Twitter</span></a></li> | ||
121 | + <li><a href="#" class="icon brands fa-facebook-f"><span class="label">Facebook</span></a></li> | ||
122 | + <li><a href="#" class="icon brands fa-instagram"><span class="label">Instagram</span></a></li> | ||
123 | + | ||
124 | + </ul> | ||
125 | + <p>경기도 용인시 기흥구 영덕동 덕영대로 1732<br /> | ||
126 | + 010-xxxx-yyyy</p> | ||
127 | + </section> | ||
128 | + | ||
129 | + </div> | ||
130 | + </div> | ||
131 | + <div class="row"> | ||
132 | + <div class="col-12"> | ||
133 | + <div id="copyright"> | ||
134 | + <ul class="menu"> | ||
135 | + <li>© All rights reserved</li> | ||
136 | + </ul> | ||
137 | + </div> | ||
138 | + </div> | ||
139 | + </div> | ||
140 | + </footer> | ||
141 | + </div> | ||
142 | + | ||
143 | + </div> | ||
144 | + | ||
145 | + <!-- Scripts --> | ||
146 | + | ||
147 | + <script type="text/javascript" src="//dapi.kakao.com/v2/maps/sdk.js?appkey=ae75e773f5e261bc9bb0d38c630165d8&libraries=services,clusterer"></script> | ||
148 | + <script src="{% static 'assets/js/jquery.min.js' %}"></script> | ||
149 | + <script src="{% static 'assets/js/jquery.dropotron.min.js' %}"></script> | ||
150 | + <script src="{% static 'assets/js/browser.min.js' %}"></script> | ||
151 | + <script src="{% static 'assets/js/breakpoints.min.js' %}"></script> | ||
152 | + <script src="{% static 'assets/js/util.js' %}"></script> | ||
153 | + <script src="{% static 'assets/js/main.js' %}"></script> | ||
154 | + </body> | ||
155 | +</html> |
FishBook/django/fishbook/board/tests.py
0 → 100644
FishBook/django/fishbook/board/urls.py
0 → 100644
1 | +from django.urls import path | ||
2 | +from .views import list, writeform, write, view, modify, modifyform, delete | ||
3 | + | ||
4 | +app_name = "board" | ||
5 | +urlpatterns = [ | ||
6 | + path('list', list, name="list"), | ||
7 | + path('list/<int:page>', list, name="list"), | ||
8 | + path('writeform/<int:page>', writeform, name="writeform"), | ||
9 | + path('writeform/<int:no>/<int:page>', writeform, name="reply_writeform"), | ||
10 | + path('write/<int:page>', write, name="write"), | ||
11 | + path('<int:no>/<int:page>', view, name="view"), | ||
12 | + path('modify/<int:no>/<int:page>', modifyform, name="modifyform"), | ||
13 | + path('modify/<int:page>', modify, name="modify"), | ||
14 | + path('delete/<int:no>/<int:page>', delete, name="delete"), | ||
15 | +] |
FishBook/django/fishbook/board/views.py
0 → 100644
1 | +import datetime | ||
2 | + | ||
3 | +from django.db.models import F, Max | ||
4 | +from django.shortcuts import render | ||
5 | +from django.http import HttpResponseRedirect, HttpResponse | ||
6 | + | ||
7 | +from .models import Board | ||
8 | +from users.models import User | ||
9 | +import json | ||
10 | +import pdb | ||
11 | + | ||
12 | +PAGESIZE=10 | ||
13 | +# Create your views here. | ||
14 | + | ||
15 | +def list(request, page=1): | ||
16 | + kwd = request.GET.get('kwd') | ||
17 | + if kwd == None or kwd == '' or kwd == 'null': | ||
18 | + start = (page - 1) * PAGESIZE | ||
19 | + board_count = Board.objects.count() | ||
20 | + boardlist = Board.objects.all().order_by('-groupno', 'orderno')[start:start+PAGESIZE] | ||
21 | + else: | ||
22 | + start = (page - 1) * PAGESIZE | ||
23 | + board_count = Board.objects.filter(title__contains=kwd).count() | ||
24 | + boardlist = Board.objects.filter(title__contains=kwd).order_by('-groupno', 'orderno')[start:start+PAGESIZE] | ||
25 | + | ||
26 | + data = { | ||
27 | + 'boardlist': boardlist, | ||
28 | + 'board_count': board_count, | ||
29 | + 'current_page': page, | ||
30 | + 'page': page, | ||
31 | + } | ||
32 | + | ||
33 | + kwd = request.GET.get('kwd') | ||
34 | + if kwd is None: | ||
35 | + data['kwd'] = json.dumps(kwd) | ||
36 | + else: | ||
37 | + data['kwd'] = kwd | ||
38 | + | ||
39 | + return render(request, 'board/list.html', data) | ||
40 | + | ||
41 | +# 게시글 작성 | ||
42 | + | ||
43 | +def writeform(request, no=-1, page=1): | ||
44 | + # 인증 | ||
45 | + authuser = request.session.get('authUser') | ||
46 | + if authuser is None: | ||
47 | + return HttpResponseRedirect('board/list') | ||
48 | + | ||
49 | + if no == -1: | ||
50 | + return render(request, 'board/write.html', {"page":page}) | ||
51 | + else: | ||
52 | + data = {"no":no, "page":page} | ||
53 | + kwd = request.GET.get('kwd') | ||
54 | + if kwd is None: | ||
55 | + data['kwd'] = json.dumps(kwd) | ||
56 | + else: | ||
57 | + data['kwd'] = kwd | ||
58 | + return render(request, 'board/write.html', data) | ||
59 | + | ||
60 | +def write(request, page=1): | ||
61 | + # 인증 | ||
62 | + authuser = request.session.get('authUser') | ||
63 | + if authuser is None: | ||
64 | + return HttpResponseRedirect('board/list') | ||
65 | + | ||
66 | + board = Board() | ||
67 | + board.title = request.POST.get('title') | ||
68 | + board.content = request.POST.get('content') | ||
69 | + board.user = User.objects.get(email=request.session['authUser']['email']) | ||
70 | + | ||
71 | + # 새글 작성하기 | ||
72 | + if request.POST.get('no') == '-1': | ||
73 | + value = Board.objects.aggregate(max_groupno=Max('groupno')) | ||
74 | + if value.get('max_groupno') is None: | ||
75 | + value['max_groupno'] = 0 | ||
76 | + board.groupno = value.get('max_groupno') + 1 | ||
77 | + board.save() | ||
78 | + else: | ||
79 | + board2 = Board.objects.get(id=request.POST.get('no')) | ||
80 | + Board.objects.filter(orderno__gte=board2.orderno+1).update(orderno=F('orderno')+1) | ||
81 | + board.groupno = board2.groupno | ||
82 | + board.orderno = board2.orderno + 1 | ||
83 | + board.depth = board2.depth + 1 | ||
84 | + board.save() | ||
85 | + data = { | ||
86 | + 'page': 1 | ||
87 | + } | ||
88 | + kwd = request.GET.get('kwd') | ||
89 | + print(kwd, "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@") | ||
90 | + if kwd is None: | ||
91 | + data['kwd'] = json.dumps(kwd) | ||
92 | + else: | ||
93 | + data['kwd'] = kwd | ||
94 | + # if kwd is '': | ||
95 | + # return HttpResponseRedirect(f'/board/list/{page}') | ||
96 | + return HttpResponseRedirect(f'/board/list/{page}?kwd={kwd}') | ||
97 | +# 상세보기 | ||
98 | +def view(request, no=0, page=1): | ||
99 | + if no == 0: | ||
100 | + return HttpResponseRedirect('list') | ||
101 | + | ||
102 | + board = Board.objects.filter(id=no) | ||
103 | + | ||
104 | + data = { | ||
105 | + 'board':board[0], | ||
106 | + 'page': page, | ||
107 | + } | ||
108 | + | ||
109 | + kwd = request.GET.get('kwd') | ||
110 | + if kwd is None: | ||
111 | + data['kwd'] = json.dumps(kwd) | ||
112 | + else: | ||
113 | + data['kwd'] = kwd | ||
114 | + | ||
115 | + response = render(request, 'board/view.html', data) | ||
116 | + | ||
117 | + if request.session.get('authUser') is None: | ||
118 | + cookie_name = 'hit' | ||
119 | + else: | ||
120 | + cookie_name = f'hit:{request.session["authUser"]["email"]}' | ||
121 | + cookie_name = cookie_name[:cookie_name.find('@')] | ||
122 | + | ||
123 | + tomorrow = datetime.datetime.replace(datetime.datetime.now(), hour=23, minute=59, second=0) | ||
124 | + expires = datetime.datetime.strftime(tomorrow, "%a, %d-%b-%Y %H:%M:%S GMT") | ||
125 | + | ||
126 | + if request.COOKIES.get(cookie_name) is not None: | ||
127 | + cookies = request.COOKIES.get(cookie_name) | ||
128 | + cookies_list = cookies.split('|') | ||
129 | + if str(no) not in cookies_list: | ||
130 | + response.set_cookie(cookie_name, cookies + f'|{no}', expires=expires) | ||
131 | + board.update(hit=F('hit')+1) | ||
132 | + return response | ||
133 | + else: | ||
134 | + response.set_cookie(cookie_name, no, expires=expires) | ||
135 | + board.update(hit=F('hit')+1) | ||
136 | + return response | ||
137 | + | ||
138 | + return render(request, 'board/view.html', data) | ||
139 | + | ||
140 | +# 수정 및 삭제 | ||
141 | +def modifyform(request, no=0, page=1): | ||
142 | + board = Board.objects.filter(id=no)[0] | ||
143 | + authuser = request.session.get('authUser') | ||
144 | + if authuser is None or board.user.email != authuser['email']: | ||
145 | + return HttpResponseRedirect('board/list') | ||
146 | + | ||
147 | + data = { | ||
148 | + 'board': board, | ||
149 | + 'page': page, | ||
150 | + } | ||
151 | + | ||
152 | + kwd = request.GET.get('kwd') | ||
153 | + if kwd is None: | ||
154 | + data['kwd'] = json.dumps(kwd) | ||
155 | + else: | ||
156 | + data['kwd'] = kwd | ||
157 | + | ||
158 | + return render(request, 'board/modify.html', data) | ||
159 | + | ||
160 | +def modify(request, page=1): | ||
161 | + board_id = request.POST['id'] | ||
162 | + board = Board.objects.get(id=board_id) | ||
163 | + authuser = request.session.get('authUser') | ||
164 | + if authuser is None or board.user.email != authuser['email']: | ||
165 | + return HttpResponseRedirect('board/list') | ||
166 | + | ||
167 | + board.title = request.POST.get('title') | ||
168 | + board.content = request.POST.get('content') | ||
169 | + board.save() | ||
170 | + data = { | ||
171 | + 'board': board, | ||
172 | + 'page': page, | ||
173 | + } | ||
174 | + | ||
175 | + kwd = request.GET.get('kwd') | ||
176 | + if kwd is None: | ||
177 | + data['kwd'] = json.dumps(kwd) | ||
178 | + else: | ||
179 | + data['kwd'] = kwd | ||
180 | + | ||
181 | + return HttpResponseRedirect(f'/board/{board_id}/{page}', data) | ||
182 | + | ||
183 | +def delete(request, no=0, page=1): | ||
184 | + board = Board.objects.get(id=no) | ||
185 | + | ||
186 | + authuser = request.session.get('authUser') | ||
187 | + if authuser is None or board.user.email != authuser['email']: | ||
188 | + return HttpResponseRedirect('board/list') | ||
189 | + | ||
190 | + board.title = "삭제된 글입니다." | ||
191 | + board.save() | ||
192 | + return HttpResponseRedirect(f'/board/list/{page}') |
File mode changed
FishBook/django/fishbook/fishbook/asgi.py
0 → 100644
1 | +""" | ||
2 | +ASGI config for fishbook project. | ||
3 | + | ||
4 | +It exposes the ASGI callable as a module-level variable named ``application``. | ||
5 | + | ||
6 | +For more information on this file, see | ||
7 | +https://docs.djangoproject.com/en/3.0/howto/deployment/asgi/ | ||
8 | +""" | ||
9 | + | ||
10 | +import os | ||
11 | + | ||
12 | +from django.core.asgi import get_asgi_application | ||
13 | + | ||
14 | +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'fishbook.settings') | ||
15 | + | ||
16 | +application = get_asgi_application() |
1 | +""" | ||
2 | +Django settings for fishbook project. | ||
3 | + | ||
4 | +Generated by 'django-admin startproject' using Django 3.0.6. | ||
5 | + | ||
6 | +For more information on this file, see | ||
7 | +https://docs.djangoproject.com/en/3.0/topics/settings/ | ||
8 | + | ||
9 | +For the full list of settings and their values, see | ||
10 | +https://docs.djangoproject.com/en/3.0/ref/settings/ | ||
11 | +""" | ||
12 | + | ||
13 | +import os | ||
14 | + | ||
15 | +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) | ||
16 | +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | ||
17 | + | ||
18 | + | ||
19 | +# Quick-start development settings - unsuitable for production | ||
20 | +# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/ | ||
21 | + | ||
22 | +# SECURITY WARNING: keep the secret key used in production secret! | ||
23 | +SECRET_KEY = 'pe76_ye$6ja3%@rs#df5h3@%o*^(@sgi9w#76x2ce9pu7*v#+)' | ||
24 | + | ||
25 | +# SECURITY WARNING: don't run with debug turned on in production! | ||
26 | +DEBUG = True | ||
27 | + | ||
28 | +ALLOWED_HOSTS = '*' | ||
29 | + | ||
30 | + | ||
31 | +# Application definition | ||
32 | + | ||
33 | +INSTALLED_APPS = [ | ||
34 | + 'django.contrib.admin', | ||
35 | + 'django.contrib.auth', | ||
36 | + 'django.contrib.contenttypes', | ||
37 | + 'django.contrib.sessions', | ||
38 | + 'django.contrib.messages', | ||
39 | + 'django.contrib.staticfiles', | ||
40 | + 'posts', | ||
41 | + 'admins', | ||
42 | + 'users', | ||
43 | + 'mathfilters', | ||
44 | + 'board', | ||
45 | +] | ||
46 | + | ||
47 | +MIDDLEWARE = [ | ||
48 | + 'django.middleware.security.SecurityMiddleware', | ||
49 | + 'django.contrib.sessions.middleware.SessionMiddleware', | ||
50 | + 'django.middleware.common.CommonMiddleware', | ||
51 | + 'django.middleware.csrf.CsrfViewMiddleware', | ||
52 | + 'django.contrib.auth.middleware.AuthenticationMiddleware', | ||
53 | + 'django.contrib.messages.middleware.MessageMiddleware', | ||
54 | + 'django.middleware.clickjacking.XFrameOptionsMiddleware', | ||
55 | +] | ||
56 | + | ||
57 | +ROOT_URLCONF = 'fishbook.urls' | ||
58 | + | ||
59 | +TEMPLATES = [ | ||
60 | + { | ||
61 | + 'BACKEND': 'django.template.backends.django.DjangoTemplates', | ||
62 | + 'DIRS': [os.path.join(BASE_DIR, 'fishbook', 'templates')], | ||
63 | + 'APP_DIRS': True, | ||
64 | + 'OPTIONS': { | ||
65 | + 'context_processors': [ | ||
66 | + 'django.template.context_processors.debug', | ||
67 | + 'django.template.context_processors.request', | ||
68 | + 'django.contrib.auth.context_processors.auth', | ||
69 | + 'django.contrib.messages.context_processors.messages', | ||
70 | + ], | ||
71 | + }, | ||
72 | + }, | ||
73 | +] | ||
74 | + | ||
75 | +WSGI_APPLICATION = 'fishbook.wsgi.application' | ||
76 | + | ||
77 | + | ||
78 | +# Database | ||
79 | +# https://docs.djangoproject.com/en/3.0/ref/settings/#databases | ||
80 | + | ||
81 | +DATABASES = { | ||
82 | + 'default': { | ||
83 | + 'ENGINE': 'django.db.backends.sqlite3', | ||
84 | + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), | ||
85 | + } | ||
86 | +} | ||
87 | + | ||
88 | + | ||
89 | +# Password validation | ||
90 | +# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators | ||
91 | + | ||
92 | +AUTH_PASSWORD_VALIDATORS = [ | ||
93 | + { | ||
94 | + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', | ||
95 | + }, | ||
96 | + { | ||
97 | + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', | ||
98 | + }, | ||
99 | + { | ||
100 | + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', | ||
101 | + }, | ||
102 | + { | ||
103 | + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', | ||
104 | + }, | ||
105 | +] | ||
106 | + | ||
107 | +# 브라우저 닫으면 session 없애기 | ||
108 | +SESSION_EXPIRE_AT_BROWSER_CLOSE = True | ||
109 | + | ||
110 | +# update되면 session바로 반영 | ||
111 | +SESSION_SAVE_EVERY_REQUEST = True | ||
112 | + | ||
113 | +# Internationalization | ||
114 | +# https://docs.djangoproject.com/en/3.0/topics/i18n/ | ||
115 | + | ||
116 | +LANGUAGE_CODE = 'ko' | ||
117 | + | ||
118 | +TIME_ZONE = 'Asia/Seoul' | ||
119 | + | ||
120 | +USE_I18N = True | ||
121 | + | ||
122 | +USE_L10N = True | ||
123 | + | ||
124 | +USE_TZ = True | ||
125 | + | ||
126 | + | ||
127 | +# Static files (CSS, JavaScript, Images) | ||
128 | +# https://docs.djangoproject.com/en/3.0/howto/static-files/ | ||
129 | + | ||
130 | +STATIC_URL = '/static/' | ||
131 | + | ||
132 | +STATICFILES_DIRS = [ | ||
133 | + os.path.join(BASE_DIR, 'fishbook', 'static') | ||
134 | +] | ||
135 | +STATIC_ROOT = os.path.join(BASE_DIR, 'static') |
1 | +/* #board { margin:20px auto; width:550px; } | ||
2 | + | ||
3 | + | ||
4 | +#search_form { | ||
5 | + width:100%; | ||
6 | + margin:50px auto 20px auto; | ||
7 | + text-align:center; | ||
8 | +} | ||
9 | + | ||
10 | +input[type="text"] { | ||
11 | + padding:5px; | ||
12 | + border:1px solid #aaa | ||
13 | +} | ||
14 | + | ||
15 | +input[type="submit"] { | ||
16 | + padding:5px; | ||
17 | + border:1px solid #aaa; | ||
18 | + background-color: #aaa; | ||
19 | + font-weight:bold; | ||
20 | + color:#fff; | ||
21 | +} | ||
22 | + | ||
23 | +input#kwd { | ||
24 | + width:250px; | ||
25 | +} | ||
26 | + | ||
27 | + | ||
28 | +.board-form { | ||
29 | + margin-top:30px | ||
30 | +} | ||
31 | + | ||
32 | +.tbl-ex { | ||
33 | + width:100%; | ||
34 | + margin:10px auto; | ||
35 | + border-collapse:collapse; | ||
36 | + border-bottom:2px solid #333; | ||
37 | +} | ||
38 | + | ||
39 | +.tbl-ex th, | ||
40 | +.tbl-ex td { | ||
41 | + padding:8px; | ||
42 | + text-align:center; | ||
43 | +} | ||
44 | + | ||
45 | +.tbl-ex th { | ||
46 | + border-top:2px solid #333; | ||
47 | + border-bottom:2px solid #333; | ||
48 | + background-color:#999; | ||
49 | + font-size:1.1em; | ||
50 | + color:#fff | ||
51 | +} | ||
52 | + | ||
53 | +.tbl-ex td { | ||
54 | + border-top:1px dotted #333; | ||
55 | + border-bottom:1px dotted #333; | ||
56 | +} | ||
57 | + | ||
58 | +.board-form .tbl-ex td { | ||
59 | + text-align:left | ||
60 | +} | ||
61 | + | ||
62 | +.board-form .tbl-ex td.label { | ||
63 | + text-align:right; | ||
64 | + font-weight:bold; | ||
65 | + width:60px; | ||
66 | +} | ||
67 | + | ||
68 | +.board-form .tbl-ex input[ name='title' ] { | ||
69 | + width: 480px; | ||
70 | +} | ||
71 | + | ||
72 | +.board-form .tbl-ex textarea#content { | ||
73 | + width: 470px; | ||
74 | + height: 200px; | ||
75 | + padding: 10px; | ||
76 | + resize: none; | ||
77 | + outline: none; | ||
78 | +} */ | ||
79 | + | ||
80 | +.board-form select { | ||
81 | + padding:5px; | ||
82 | +} | ||
83 | + | ||
84 | +tr.even td { background-color:#e8ecf6 } | ||
85 | + | ||
86 | +.tbl-ex a { text-decoration:none; font-weight:bold; } | ||
87 | + | ||
88 | +div.bottom { | ||
89 | + width:100%; | ||
90 | + height:50px; | ||
91 | + margin:20px auto; | ||
92 | +} | ||
93 | + | ||
94 | +div.bottom a { | ||
95 | + text-decoration:none; | ||
96 | + dispaly:block; | ||
97 | +} | ||
98 | +/* | ||
99 | +a#new-book { | ||
100 | + float:right; | ||
101 | + padding:10px 20px 10px 20px ; | ||
102 | + border:1px solid #555; | ||
103 | + font-weight:bold; | ||
104 | + background-color:#E8ECF6; | ||
105 | + color:#111 | ||
106 | +} */ | ||
107 | +/* | ||
108 | +.board-form .bottom a, | ||
109 | +.board-form .bottom input[type="submit"] { | ||
110 | + float:right; | ||
111 | + padding:10px 20px 10px 20px; | ||
112 | + border:1px solid #555; | ||
113 | + font-weight:bold; | ||
114 | + background-color:#E8ECF6; | ||
115 | + color:#111; | ||
116 | + cursor: pointer | ||
117 | +} */ | ||
118 | + | ||
119 | +.board-form .bottom a { | ||
120 | + margin-left: 10px; | ||
121 | + padding:10px 20px 11px 20px | ||
122 | +} | ||
123 | + | ||
124 | +a.del { | ||
125 | + display:block; | ||
126 | + width:20px; | ||
127 | + height:20px; | ||
128 | + background:url("/mysite2/assets/images/recycle.png") no-repeat 0 0; | ||
129 | + font-size:0; | ||
130 | +} | ||
131 | + | ||
132 | +/* | ||
133 | + 게시판 리스트 페이징 | ||
134 | +*/ | ||
135 | +div.pager { | ||
136 | + width:100%; | ||
137 | + text-align:center; | ||
138 | +} | ||
139 | +div.pager ul { | ||
140 | + height:20px; | ||
141 | + margin:10px auto; | ||
142 | +} | ||
143 | +div.pager ul li { color:#ddd; display:inline-block; margin:5px 0; width:20px ; font-weight:bold; } | ||
144 | +div.pager ul li.selected { font-size:16px; text-decoration: underline; color:#f40808 } | ||
145 | +div.pager ul li a, | ||
146 | +div.pager ul li a:visited, | ||
147 | +div.pager ul li a:link, | ||
148 | +div.pager ul li a:active { text-decoration: none; color:#555 } | ||
149 | +div.pager ul li a:hover { text-decoration: none; color:#f00 } |
This diff is collapsed. Click to expand it.

3.45 KB
This diff is collapsed. Click to expand it.
1 | +fieldset { | ||
2 | + border-style: none; | ||
3 | +} | ||
4 | + | ||
5 | +#btn_login, #btn_join { | ||
6 | + font-size: 18px; | ||
7 | + font-weight: 700; | ||
8 | + line-height: 1em; | ||
9 | + width: 100%; | ||
10 | + height: 3em; | ||
11 | + margin: 16px 0 7px; | ||
12 | + text-align: center; | ||
13 | + color: #fff; | ||
14 | + border: none; | ||
15 | + border-radius: 0; | ||
16 | + background-color: #03aac7; | ||
17 | +} | ||
18 | +#header { | ||
19 | + box-sizing: border-box; | ||
20 | + height: 30%; | ||
21 | + padding: 46px 0 0; | ||
22 | + text-align: center; | ||
23 | +} | ||
24 | + | ||
25 | +.blind { | ||
26 | + overflow: hidden; | ||
27 | + height: 0px; | ||
28 | +} | ||
29 | +.error_next_box { | ||
30 | + margin: 0 0 8px 0; | ||
31 | +} | ||
32 | +.find_info { | ||
33 | + font-size: 12px; | ||
34 | + padding-top: 6px; | ||
35 | + text-align: center; | ||
36 | + color: #8e8e8e; | ||
37 | + border-top: 1px solid #e4e4e5; | ||
38 | +} | ||
39 | +.input_row { | ||
40 | + height: 29px; | ||
41 | + margin: 0 0 8px; | ||
42 | + padding: 5px 11px 5px 11px; | ||
43 | + border: solid 1px #dadada; | ||
44 | + background: #fff; | ||
45 | +} | ||
46 | +.int { | ||
47 | + padding: 7px 0 6px; | ||
48 | + width: 100%; | ||
49 | + height: 16px; | ||
50 | + border: none; | ||
51 | +} | ||
52 | +.wrapper { | ||
53 | + width: 96%; | ||
54 | + height: 96%; | ||
55 | + margin: 0 auto; | ||
56 | +} | ||
57 | + | ||
58 | +@media screen and (max-width: 360px){ | ||
59 | + #content { | ||
60 | + width: 200px; | ||
61 | + height: 70%; | ||
62 | + margin: 0 auto; | ||
63 | + } | ||
64 | + #header img { | ||
65 | + display: inline-block; | ||
66 | + width: 120px; | ||
67 | + height: 48px; | ||
68 | + } | ||
69 | +} | ||
70 | +@media screen and (min-width: 361px) and (max-width: 768px){ | ||
71 | + #content { | ||
72 | + width: 330px; | ||
73 | + height: 70%; | ||
74 | + margin: 0 auto; | ||
75 | + } | ||
76 | + #header img { | ||
77 | + display: inline-block; | ||
78 | + width: 150px; | ||
79 | + height: 60px; | ||
80 | + } | ||
81 | +} | ||
82 | +@media screen and (min-width: 769px){ | ||
83 | + #content { | ||
84 | + width: 700px; | ||
85 | + height: 70%; | ||
86 | + margin: 0 auto; | ||
87 | + } | ||
88 | + #header img { | ||
89 | + display: inline-block; | ||
90 | + width: 150px; | ||
91 | + height: 60px; | ||
92 | + } | ||
93 | +} | ||
94 | + | ||
95 | + | ||
96 | + |
1 | a { | 1 | a { |
2 | text-decoration: none; | 2 | text-decoration: none; |
3 | -} | 3 | + color: #848485; |
4 | -body { | ||
5 | - background-color: #fff; | ||
6 | - height: 100%; | ||
7 | - display: block; | ||
8 | - position: relative; | ||
9 | -} | ||
10 | -div { | ||
11 | - display: block; | ||
12 | } | 4 | } |
13 | fieldset { | 5 | fieldset { |
14 | border-style: none; | 6 | border-style: none; |
15 | - margin-block-start: 0.67em; | ||
16 | - margin-block-end: 0.67em; | ||
17 | - margin-inline-start: 2px; | ||
18 | - margin-inline-end: 2px; | ||
19 | - padding-block-start: 0.35em; | ||
20 | - padding-block-end: 0.625em; | ||
21 | - padding-inline-start: 0.75em; | ||
22 | - padding-inline-end: 0.75em; | ||
23 | - min-inline-size: min-content; | ||
24 | -} | ||
25 | -form { | ||
26 | - display: block; | ||
27 | -} | ||
28 | -html { | ||
29 | - display: block; | ||
30 | - height: 100%; | ||
31 | -} | ||
32 | -legend { | ||
33 | - border-style: none; | ||
34 | -} | ||
35 | -h1 { | ||
36 | - display: block; | ||
37 | - margin-block-start: 0.67em; | ||
38 | - margin-block-end: 0.67em; | ||
39 | - margin-inline-start: 0px; | ||
40 | - margin-inline-end: 0px; | ||
41 | } | 7 | } |
42 | 8 | ||
43 | -#header { | ||
44 | - position: relative; | ||
45 | - box-sizing: border-box; | ||
46 | - height: 30%; | ||
47 | - padding: 46px 0 0; | ||
48 | -} | ||
49 | -#header .h_logo { | ||
50 | - display: block; | ||
51 | - width: 130px; | ||
52 | - height: 25px; | ||
53 | - margin: 0 auto; | ||
54 | - color: transparent; | ||
55 | - | ||
56 | -} | ||
57 | -#header .h_logo #h_logo_img { | ||
58 | - display: block; | ||
59 | - width: 130px; | ||
60 | - height: 60px; | ||
61 | - margin: 0 auto; | ||
62 | - color: transparent; | ||
63 | -} | ||
64 | - | ||
65 | -#container { | ||
66 | - margin:0 10px; | ||
67 | - padding-bottom: 31px; | ||
68 | -} | ||
69 | -#container, #header { | ||
70 | - margin: 0 10px; | ||
71 | -} | ||
72 | #btn_login, #btn_join { | 9 | #btn_login, #btn_join { |
73 | font-size: 18px; | 10 | font-size: 18px; |
74 | font-weight: 700; | 11 | font-weight: 700; |
... | @@ -79,17 +16,18 @@ h1 { | ... | @@ -79,17 +16,18 @@ h1 { |
79 | text-align: center; | 16 | text-align: center; |
80 | color: #fff; | 17 | color: #fff; |
81 | border: none; | 18 | border: none; |
82 | - border-radius: 0; | ||
83 | background-color: #03aac7; | 19 | background-color: #03aac7; |
84 | } | 20 | } |
21 | +#header { | ||
22 | + box-sizing: border-box; | ||
23 | + height: 30%; | ||
24 | + padding: 46px 0 0; | ||
25 | + text-align: center; | ||
26 | +} | ||
85 | 27 | ||
86 | .blind { | 28 | .blind { |
87 | - position: absolute; | ||
88 | overflow: hidden; | 29 | overflow: hidden; |
89 | - clip: rect(0 0 0 0); | 30 | + height: 0px; |
90 | - width: 1px; | ||
91 | - height: 1px; | ||
92 | - margin: -1px; | ||
93 | } | 31 | } |
94 | .find_info { | 32 | .find_info { |
95 | font-size: 12px; | 33 | font-size: 12px; |
... | @@ -99,19 +37,57 @@ h1 { | ... | @@ -99,19 +37,57 @@ h1 { |
99 | border-top: 1px solid #e4e4e5; | 37 | border-top: 1px solid #e4e4e5; |
100 | } | 38 | } |
101 | .input_row { | 39 | .input_row { |
102 | - position: relative; | ||
103 | height: 29px; | 40 | height: 29px; |
104 | - overflow: hidden; | ||
105 | margin: 0 0 8px; | 41 | margin: 0 0 8px; |
106 | - padding: 5px 39px 5px 11px; | 42 | + padding: 5px 11px 5px 11px; |
107 | border: solid 1px #dadada; | 43 | border: solid 1px #dadada; |
108 | background: #fff; | 44 | background: #fff; |
109 | } | 45 | } |
110 | .int { | 46 | .int { |
111 | - line-height: 16px; | ||
112 | padding: 7px 0 6px; | 47 | padding: 7px 0 6px; |
113 | width: 100%; | 48 | width: 100%; |
114 | height: 16px; | 49 | height: 16px; |
115 | border: none; | 50 | border: none; |
116 | - background: #fff; | ||
117 | -} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
51 | +} | ||
52 | +.wrapper { | ||
53 | + width: 96%; | ||
54 | + margin: 0 auto; | ||
55 | +} | ||
56 | + | ||
57 | + | ||
58 | +@media screen and (max-width: 360px){ | ||
59 | + #content { | ||
60 | + width: 200px; | ||
61 | + margin: 0 auto; | ||
62 | + } | ||
63 | + #header img { | ||
64 | + display: inline-block; | ||
65 | + width: 120px; | ||
66 | + height: 48px; | ||
67 | + } | ||
68 | +} | ||
69 | +@media screen and (min-width: 361px) and (max-width: 768px){ | ||
70 | + #content { | ||
71 | + width: 330px; | ||
72 | + margin: 0 auto; | ||
73 | + } | ||
74 | + #header img { | ||
75 | + display: inline-block; | ||
76 | + width: 150px; | ||
77 | + height: 60px; | ||
78 | + } | ||
79 | +} | ||
80 | +@media screen and (min-width: 769px){ | ||
81 | + #content { | ||
82 | + width: 700px; | ||
83 | + margin: 0 auto; | ||
84 | + } | ||
85 | + #header img { | ||
86 | + display: inline-block; | ||
87 | + width: 150px; | ||
88 | + height: 60px; | ||
89 | + } | ||
90 | +} | ||
91 | + | ||
92 | + | ||
93 | + | ... | ... |
1 | +/* breakpoints.js v1.0 | @ajlkn | MIT licensed */ | ||
2 | +var breakpoints=function(){"use strict";function e(e){t.init(e)}var t={list:null,media:{},events:[],init:function(e){t.list=e,window.addEventListener("resize",t.poll),window.addEventListener("orientationchange",t.poll),window.addEventListener("load",t.poll),window.addEventListener("fullscreenchange",t.poll)},active:function(e){var n,a,s,i,r,d,c;if(!(e in t.media)){if(">="==e.substr(0,2)?(a="gte",n=e.substr(2)):"<="==e.substr(0,2)?(a="lte",n=e.substr(2)):">"==e.substr(0,1)?(a="gt",n=e.substr(1)):"<"==e.substr(0,1)?(a="lt",n=e.substr(1)):"!"==e.substr(0,1)?(a="not",n=e.substr(1)):(a="eq",n=e),n&&n in t.list)if(i=t.list[n],Array.isArray(i)){if(r=parseInt(i[0]),d=parseInt(i[1]),isNaN(r)){if(isNaN(d))return;c=i[1].substr(String(d).length)}else c=i[0].substr(String(r).length);if(isNaN(r))switch(a){case"gte":s="screen";break;case"lte":s="screen and (max-width: "+d+c+")";break;case"gt":s="screen and (min-width: "+(d+1)+c+")";break;case"lt":s="screen and (max-width: -1px)";break;case"not":s="screen and (min-width: "+(d+1)+c+")";break;default:s="screen and (max-width: "+d+c+")"}else if(isNaN(d))switch(a){case"gte":s="screen and (min-width: "+r+c+")";break;case"lte":s="screen";break;case"gt":s="screen and (max-width: -1px)";break;case"lt":s="screen and (max-width: "+(r-1)+c+")";break;case"not":s="screen and (max-width: "+(r-1)+c+")";break;default:s="screen and (min-width: "+r+c+")"}else switch(a){case"gte":s="screen and (min-width: "+r+c+")";break;case"lte":s="screen and (max-width: "+d+c+")";break;case"gt":s="screen and (min-width: "+(d+1)+c+")";break;case"lt":s="screen and (max-width: "+(r-1)+c+")";break;case"not":s="screen and (max-width: "+(r-1)+c+"), screen and (min-width: "+(d+1)+c+")";break;default:s="screen and (min-width: "+r+c+") and (max-width: "+d+c+")"}}else s="("==i.charAt(0)?"screen and "+i:i;t.media[e]=!!s&&s}return t.media[e]!==!1&&window.matchMedia(t.media[e]).matches},on:function(e,n){t.events.push({query:e,handler:n,state:!1}),t.active(e)&&n()},poll:function(){var e,n;for(e=0;e<t.events.length;e++)n=t.events[e],t.active(n.query)?n.state||(n.state=!0,n.handler()):n.state&&(n.state=!1)}};return e._=t,e.on=function(e,n){t.on(e,n)},e.active=function(e){return t.active(e)},e}();!function(e,t){"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?module.exports=t():e.breakpoints=t()}(this,function(){return breakpoints}); |
1 | +/* browser.js v1.0 | @ajlkn | MIT licensed */ | ||
2 | +var browser=function(){"use strict";var e={name:null,version:null,os:null,osVersion:null,touch:null,mobile:null,_canUse:null,canUse:function(n){e._canUse||(e._canUse=document.createElement("div"));var o=e._canUse.style,r=n.charAt(0).toUpperCase()+n.slice(1);return n in o||"Moz"+r in o||"Webkit"+r in o||"O"+r in o||"ms"+r in o},init:function(){var n,o,r,i,t=navigator.userAgent;for(n="other",o=0,r=[["firefox",/Firefox\/([0-9\.]+)/],["bb",/BlackBerry.+Version\/([0-9\.]+)/],["bb",/BB[0-9]+.+Version\/([0-9\.]+)/],["opera",/OPR\/([0-9\.]+)/],["opera",/Opera\/([0-9\.]+)/],["edge",/Edge\/([0-9\.]+)/],["safari",/Version\/([0-9\.]+).+Safari/],["chrome",/Chrome\/([0-9\.]+)/],["ie",/MSIE ([0-9]+)/],["ie",/Trident\/.+rv:([0-9]+)/]],i=0;i<r.length;i++)if(t.match(r[i][1])){n=r[i][0],o=parseFloat(RegExp.$1);break}for(e.name=n,e.version=o,n="other",o=0,r=[["ios",/([0-9_]+) like Mac OS X/,function(e){return e.replace("_",".").replace("_","")}],["ios",/CPU like Mac OS X/,function(e){return 0}],["wp",/Windows Phone ([0-9\.]+)/,null],["android",/Android ([0-9\.]+)/,null],["mac",/Macintosh.+Mac OS X ([0-9_]+)/,function(e){return e.replace("_",".").replace("_","")}],["windows",/Windows NT ([0-9\.]+)/,null],["bb",/BlackBerry.+Version\/([0-9\.]+)/,null],["bb",/BB[0-9]+.+Version\/([0-9\.]+)/,null],["linux",/Linux/,null],["bsd",/BSD/,null],["unix",/X11/,null]],i=0;i<r.length;i++)if(t.match(r[i][1])){n=r[i][0],o=parseFloat(r[i][2]?r[i][2](RegExp.$1):RegExp.$1);break}e.os=n,e.osVersion=o,e.touch="wp"==e.os?navigator.msMaxTouchPoints>0:!!("ontouchstart"in window),e.mobile="wp"==e.os||"android"==e.os||"ios"==e.os||"bb"==e.os}};return e.init(),e}();!function(e,n){"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?module.exports=n():e.browser=n()}(this,function(){return browser}); |
1 | + | ||
2 | +$(function(){ | ||
3 | + /*이메일 중복 or 탈퇴 확인*/ | ||
4 | + | ||
5 | + /*이메일 형식 확인 */ | ||
6 | + $("#email").keyup(function(){ | ||
7 | + | ||
8 | + var email = $('#email').val() | ||
9 | + | ||
10 | + $.ajax({ | ||
11 | + url:'/users/api/checkemail?email='+email, | ||
12 | + type:'get', | ||
13 | + dataType:'json', | ||
14 | + success:function(response){ | ||
15 | + if(response.result != 'success'){ | ||
16 | + console.error(response.data) | ||
17 | + return; | ||
18 | + } | ||
19 | + if(response.data == 'exist'){ | ||
20 | + $("#email_msg").text("이미 사용중인 이메일입니다.") | ||
21 | + .attr("style", "color: red; font-size:15px;"); | ||
22 | + $("#btn_join").attr("email_check_result", "fail"); | ||
23 | + $('#email').val('').focus(); | ||
24 | + return; | ||
25 | + } else{ | ||
26 | + if (validateEmail($.trim($("#email").val()))){ | ||
27 | + $("#email_msg").text("사용 가능한 이메일 입니다.") | ||
28 | + .attr("style", "color: green; font-size:15px") | ||
29 | + $("#btn_join").attr("email_check_result", "success"); | ||
30 | + | ||
31 | + } else { | ||
32 | + $("#email_msg").text("이메일 형식이 틀렸습니다.") | ||
33 | + .attr("style", "color: red; font-size:15px;"); | ||
34 | + $("#btn_join").attr("email_check_result", "fail"); | ||
35 | + } | ||
36 | + return; | ||
37 | + } | ||
38 | + // console.log(response) | ||
39 | + }, | ||
40 | + error : function(xhr, error){ | ||
41 | + alert("서버와의 통신에서 문제가 발생했습니다."); | ||
42 | + console.error("error : " + error); | ||
43 | + } | ||
44 | + }) | ||
45 | + }); | ||
46 | + | ||
47 | + /*id 형식 확인 */ | ||
48 | +// $("#id").keyup(function(){ | ||
49 | +// if(validateId($.trim($("#id").val()))){ | ||
50 | +// $("#id_msg").text("사용 가능한 아이디입니다.") | ||
51 | +// .attr("style", "color: green; font-size:15px"); | ||
52 | +// } else{ | ||
53 | +// $("#id_msg").text("5자리 이상 입력") | ||
54 | +// .attr("style", "color: red; font-size:15px"); | ||
55 | +// } | ||
56 | +// }); | ||
57 | + /* 비밀번호 형식 확인 */ | ||
58 | + // 비밀번호 규칙 정규식 | ||
59 | +// : 숫자, 특문 각 1회 이상, 영문은 2개 이상 사용하여 8자리 이상 입력 | ||
60 | + $("#pw").keyup(function(){ | ||
61 | + if(validatePassword($.trim($("#pw").val()))){ | ||
62 | + $("#pw_msg").text("사용 가능한 비밀번호입니다.") | ||
63 | + .attr("style", "color: green; font-size:15px"); | ||
64 | + $("#btn_join").attr("pw_check_result", "success"); | ||
65 | + } else{ | ||
66 | + $("#pw_msg").text("숫자, 특수문자 각 1회 이상, 영문은 2개 이상 사용하여 8자리 이상 입력") | ||
67 | + .attr("style", "color: red; font-size:15px"); | ||
68 | + $("#btn_join").attr("pw_check_result", "fail"); | ||
69 | + } | ||
70 | +}); | ||
71 | + | ||
72 | + | ||
73 | + | ||
74 | + /*비밀번호 재확인*/ | ||
75 | + $("#pw_check, #pw").keyup(function(){ | ||
76 | + if($("#pw").val()==$('#pw_check').val()){ | ||
77 | + $("#pw_check_msg").text("비밀번호가 일치합니다.") | ||
78 | + .attr("style", "color: green; font-size:15px"); | ||
79 | + | ||
80 | + $("#btn_join").attr("pw_check_check_result", "success"); | ||
81 | + } else{ | ||
82 | + $("#pw_check_msg").text("비밀번호가 일치하지 않습니다.") | ||
83 | + .attr("style", "color: red; font-size:15px"); | ||
84 | + $("#btn_join").attr("pw_check_check_result", "fail"); | ||
85 | + | ||
86 | + } | ||
87 | + }); | ||
88 | + | ||
89 | + $('#join_f').submit(function() { | ||
90 | + if($("#btn_join").attr("email_check_result") == "fail") { | ||
91 | + | ||
92 | + $("#email_msg").text("사용 가능한 이메일을 입력해주세요.") | ||
93 | + .attr("style", "color: red; font-size:15px;"); | ||
94 | + $("#email").focus(); | ||
95 | + return false; | ||
96 | + } | ||
97 | + if($("#btn_join").attr("pw_check_result") == "fail") { | ||
98 | + | ||
99 | + $("#pw_msg").text("비밀번호를 확인해주세요.") | ||
100 | + .attr("style", "color: red; font-size:15px"); | ||
101 | + $("#pw").focus(); | ||
102 | + return false; | ||
103 | + } | ||
104 | + | ||
105 | + if($("#btn_join").attr("pw_check_check_result") == "fail") { | ||
106 | + | ||
107 | + $("#pw_check_msg").text("비밀번호를 확인해주세요.") | ||
108 | + .attr("style", "color: red; font-size:15px"); | ||
109 | + $("#pw_check").focus(); | ||
110 | + return false; | ||
111 | + } | ||
112 | + }); | ||
113 | + | ||
114 | + /*Ajax */ | ||
115 | + var $form = $("#join_f"); | ||
116 | + | ||
117 | + // | ||
118 | + // $form.on("submit", function(e){ | ||
119 | + // e.preventDefault(); | ||
120 | + // var newUser = $form.serialize(); | ||
121 | + // | ||
122 | + // $.ajax({ | ||
123 | + // type:"POST", | ||
124 | + // url: "js/user.json", | ||
125 | + // data:newUser, | ||
126 | + // success:function(res){ | ||
127 | + // if (validateEmail($.trim($("#email").val()))){ | ||
128 | + // $(".input_row #email") | ||
129 | + // .attr("style", "border: 1px solid green;") | ||
130 | + // } else { | ||
131 | + // $(".input_row #email") | ||
132 | + // .attr("style", "border: 1px solid red;") | ||
133 | + // .focus(); | ||
134 | + // } | ||
135 | + // }, | ||
136 | + // error:function(){ | ||
137 | + // if (validateEmail($.trim($("#email").val()))){ | ||
138 | + // $(".input_row #email") | ||
139 | + // .attr("style", "border: 1px solid green;") | ||
140 | + // } else { | ||
141 | + // $(".input_row #email") | ||
142 | + // .attr("style", "border: 1px solid red;") | ||
143 | + // .focus(); | ||
144 | + // } | ||
145 | + // } | ||
146 | + // }); | ||
147 | + // }); | ||
148 | + | ||
149 | + | ||
150 | + /* 정규표현식을 이용하여 email형식에 맞는지 확인하는 함수*/ | ||
151 | + function validateEmail(email) { | ||
152 | + var re = /^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i; | ||
153 | + return re.test(email); | ||
154 | + } | ||
155 | + /* 정규표현식을 이용하여 id형식에 맞는지 확인하는 함수*/ | ||
156 | + function validateId(id) { | ||
157 | + var re = /[a-zA-Z0-9]{5,}/i; | ||
158 | + return re.test(id); | ||
159 | +} | ||
160 | + /* 정규표현식을 이용하여 password형식에 맞는지 확인하는 함수*/ | ||
161 | + // : 숫자, 특문 각 1회 이상, 영문은 2개 이상 사용하여 8자리 이상 입력 | ||
162 | + function validatePassword(pw) { | ||
163 | + var re = /(?=.*\d{1,50})(?=.*[~`!@#$%\^&*()-+=]{1,50})(?=.*[a-zA-Z]{2,50}).{8,50}$/; | ||
164 | + return re.test(pw); | ||
165 | +} | ||
166 | +}); |
1 | +/* jquery.dropotron.js v1.4.3 | (c) @ajlkn | github.com/ajlkn/jquery.dropotron | MIT licensed */ | ||
2 | +!function(e){e.fn.disableSelection_dropotron=function(){return e(this).css("user-select","none").css("-khtml-user-select","none").css("-moz-user-select","none").css("-o-user-select","none").css("-webkit-user-select","none")},e.fn.dropotron=function(t){if(0==this.length)return e(this);if(this.length>1)for(var o=0;o<this.length;o++)e(this[o]).dropotron(t);return e.dropotron(e.extend({selectorParent:e(this)},t))},e.dropotron=function(t){var o=e.extend({selectorParent:null,baseZIndex:1e3,menuClass:"dropotron",expandMode:"hover",hoverDelay:150,hideDelay:250,openerClass:"opener",openerActiveClass:"active",submenuClassPrefix:"level-",mode:"fade",speed:"fast",easing:"swing",alignment:"left",offsetX:0,offsetY:0,globalOffsetY:0,IEOffsetX:0,IEOffsetY:0,noOpenerFade:!0,detach:!0,cloneOnDetach:!0},t),n=o.selectorParent,s=n.find("ul"),i=e("body"),a=e("body,html"),l=e(window),r=!1,d=null,c=null;n.on("doCollapseAll",function(){s.trigger("doCollapse")}),s.each(function(){var t=e(this),n=t.parent();o.hideDelay>0&&t.add(n).on("mouseleave",function(e){window.clearTimeout(c),c=window.setTimeout(function(){t.trigger("doCollapse")},o.hideDelay)}),t.disableSelection_dropotron().hide().addClass(o.menuClass).css("position","absolute").on("mouseenter",function(e){window.clearTimeout(c)}).on("doExpand",function(){if(t.is(":visible"))return!1;window.clearTimeout(c),s.each(function(){var t=e(this);e.contains(t.get(0),n.get(0))||t.trigger("doCollapse")});var i,a,d,f,u=n.offset(),p=n.position(),h=(n.parent().position(),n.outerWidth()),g=t.outerWidth(),v=t.css("z-index")==o.baseZIndex;if(v){switch(i=o.detach?u:p,f=i.top+n.outerHeight()+o.globalOffsetY,a=o.alignment,t.removeClass("left").removeClass("right").removeClass("center"),o.alignment){case"right":d=i.left-g+h,0>d&&(d=i.left,a="left");break;case"center":d=i.left-Math.floor((g-h)/2),0>d?(d=i.left,a="left"):d+g>l.width()&&(d=i.left-g+h,a="right");break;case"left":default:d=i.left,d+g>l.width()&&(d=i.left-g+h,a="right")}t.addClass(a)}else switch("relative"==n.css("position")||"absolute"==n.css("position")?(f=o.offsetY,d=-1*p.left):(f=p.top+o.offsetY,d=0),o.alignment){case"right":d+=-1*n.parent().outerWidth()+o.offsetX;break;case"center":case"left":default:d+=n.parent().outerWidth()+o.offsetX}navigator.userAgent.match(/MSIE ([0-9]+)\./)&&RegExp.$1<8&&(d+=o.IEOffsetX,f+=o.IEOffsetY),t.css("left",d+"px").css("top",f+"px").css("opacity","0.01").show();var C=!1;switch(d="relative"==n.css("position")||"absolute"==n.css("position")?-1*p.left:0,t.offset().left<0?(d+=n.parent().outerWidth()-o.offsetX,C=!0):t.offset().left+g>l.width()&&(d+=-1*n.parent().outerWidth()-o.offsetX,C=!0),C&&t.css("left",d+"px"),t.hide().css("opacity","1"),o.mode){case"zoom":r=!0,n.addClass(o.openerActiveClass),t.animate({width:"toggle",height:"toggle"},o.speed,o.easing,function(){r=!1});break;case"slide":r=!0,n.addClass(o.openerActiveClass),t.animate({height:"toggle"},o.speed,o.easing,function(){r=!1});break;case"fade":if(r=!0,v&&!o.noOpenerFade){var C;C="slow"==o.speed?80:"fast"==o.speed?40:Math.floor(o.speed/2),n.fadeTo(C,.01,function(){n.addClass(o.openerActiveClass),n.fadeTo(o.speed,1),t.fadeIn(o.speed,function(){r=!1})})}else n.addClass(o.openerActiveClass),n.fadeTo(o.speed,1),t.fadeIn(o.speed,function(){r=!1});break;case"instant":default:n.addClass(o.openerActiveClass),t.show()}return!1}).on("doCollapse",function(){return t.is(":visible")?(t.hide(),n.removeClass(o.openerActiveClass),t.find("."+o.openerActiveClass).removeClass(o.openerActiveClass),t.find("ul").hide(),!1):!1}).on("doToggle",function(e){return t.is(":visible")?t.trigger("doCollapse"):t.trigger("doExpand"),!1}),n.disableSelection_dropotron().addClass("opener").css("cursor","pointer").on("click touchend",function(e){r||(e.preventDefault(),e.stopPropagation(),t.trigger("doToggle"))}),"hover"==o.expandMode&&n.hover(function(e){r||(d=window.setTimeout(function(){t.trigger("doExpand")},o.hoverDelay))},function(e){window.clearTimeout(d)})}),s.find("a").css("display","block").on("click touchend",function(t){r||e(this).attr("href").length<1&&t.preventDefault()}),n.find("li").css("white-space","nowrap").each(function(){var t=e(this),o=t.children("a"),s=t.children("ul"),i=o.attr("href");o.on("click touchend",function(e){0==i.length||"#"==i?e.preventDefault():e.stopPropagation()}),o.length>0&&0==s.length&&t.on("click touchend",function(e){r||(n.trigger("doCollapseAll"),e.stopPropagation())})}),n.children("li").each(function(){var t,n=e(this),s=n.children("ul");if(s.length>0){o.detach&&(o.cloneOnDetach&&(t=s.clone(),t.attr("class","").hide().appendTo(s.parent())),s.detach().appendTo(i));for(var a=o.baseZIndex,l=1,r=s;r.length>0;l++)r.css("z-index",a++),o.submenuClassPrefix&&r.addClass(o.submenuClassPrefix+(a-1-o.baseZIndex)),r=r.find("> li > ul")}}),l.on("scroll",function(){n.trigger("doCollapseAll")}).on("keypress",function(e){r||27!=e.keyCode||(e.preventDefault(),n.trigger("doCollapseAll"))}),a.on("click touchend",function(){r||n.trigger("doCollapseAll")})}}(jQuery); |
This diff is collapsed. Click to expand it.
1 | +/* | ||
2 | + Verti by HTML5 UP | ||
3 | + html5up.net | @ajlkn | ||
4 | + Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) | ||
5 | +*/ | ||
6 | + | ||
7 | +(function($) { | ||
8 | + | ||
9 | + var $window = $(window), | ||
10 | + $body = $('body'); | ||
11 | + | ||
12 | + // Breakpoints. | ||
13 | + breakpoints({ | ||
14 | + xlarge: [ '1281px', '1680px' ], | ||
15 | + large: [ '981px', '1280px' ], | ||
16 | + medium: [ '737px', '980px' ], | ||
17 | + small: [ null, '736px' ] | ||
18 | + }); | ||
19 | + | ||
20 | + // Play initial animations on page load. | ||
21 | + $window.on('load', function() { | ||
22 | + window.setTimeout(function() { | ||
23 | + $body.removeClass('is-preload'); | ||
24 | + }, 100); | ||
25 | + }); | ||
26 | + | ||
27 | + // Dropdowns. | ||
28 | + $('#nav > ul').dropotron({ | ||
29 | + mode: 'fade', | ||
30 | + noOpenerFade: true, | ||
31 | + speed: 300 | ||
32 | + }); | ||
33 | + | ||
34 | + // Nav. | ||
35 | + | ||
36 | + // Toggle. | ||
37 | + $( | ||
38 | + '<div id="navToggle">' + | ||
39 | + '<a href="#navPanel" class="toggle"></a>' + | ||
40 | + '</div>' | ||
41 | + ) | ||
42 | + .appendTo($body); | ||
43 | + | ||
44 | + // Panel. | ||
45 | + $( | ||
46 | + '<div id="navPanel">' + | ||
47 | + '<nav>' + | ||
48 | + $('#nav').navList() + | ||
49 | + '</nav>' + | ||
50 | + '</div>' | ||
51 | + ) | ||
52 | + .appendTo($body) | ||
53 | + .panel({ | ||
54 | + delay: 500, | ||
55 | + hideOnClick: true, | ||
56 | + hideOnSwipe: true, | ||
57 | + resetScroll: true, | ||
58 | + resetForms: true, | ||
59 | + side: 'left', | ||
60 | + target: $body, | ||
61 | + visibleClass: 'navPanel-visible' | ||
62 | + }); | ||
63 | + | ||
64 | +})(jQuery); | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +function setPage(listCount, currentPage, kwd) { | ||
2 | + var kwd = kwd; // 검색어 | ||
3 | + var listCount = listCount; // 전체 게시글 수 | ||
4 | + var pageCount = (parseInt( listCount/ 10) + 1); // 페이지 개수 | ||
5 | + var currentPage = currentPage; // 현재 페이지 | ||
6 | + var endPage = (parseInt(pageCount/10 + 1) * 5)+1; // 최종 페이지 | ||
7 | + var displayPage = parseInt((currentPage + 4 ) / 5 ) * 5; // 밑에 보여줄 페이지 | ||
8 | + | ||
9 | + /* 게시글 수가 페이지 수와 딱 맞을 땐 다음 페이지 안보이게*/ | ||
10 | + if(parseInt( listCount% 10)==0){ | ||
11 | + pageCount -=1; | ||
12 | + }; | ||
13 | + console.log("listCount", listCount); | ||
14 | + console.log("pageCount", pageCount); | ||
15 | + console.log("currentPage", currentPage); | ||
16 | + console.log("endPage", endPage); | ||
17 | + console.log("displayPage", displayPage); | ||
18 | + | ||
19 | + var pager = $('#pager'); | ||
20 | + if(currentPage <= 5){ | ||
21 | + pager.prepend('<li>◀</li>'); | ||
22 | + }else{ | ||
23 | + pager.append('<li><a href=/board/list/'+(displayPage-5)+'?kwd='+kwd+'>'+'◀'+'</li>'); | ||
24 | + } | ||
25 | + | ||
26 | + for (var i = displayPage-4; i <= displayPage; i++) { | ||
27 | + if(i==currentPage){ | ||
28 | + pager.append('<li class="selected">'+i+'</li>') | ||
29 | + continue; | ||
30 | + }else if(i>pageCount){ | ||
31 | + pager.append('<li>'+i+'</li>') | ||
32 | + continue; | ||
33 | + } | ||
34 | + pager.append('<li><a href=/board/list/'+i+'?kwd='+kwd+'>'+i+'</li>'); | ||
35 | + } | ||
36 | + | ||
37 | + var nextPage = displayPage+1 | ||
38 | + | ||
39 | + if(currentPage < endPage && endPage < pageCount){ | ||
40 | + pager.append('<li><a href=/board/list/'+nextPage+ '?kwd='+kwd+'>'+'▶'+'</li>'); | ||
41 | + }else{ | ||
42 | + pager.append('<li>'+'▶'+'</li>'); | ||
43 | + } | ||
44 | + | ||
45 | +} |
1 | + | ||
2 | +$(function(){ | ||
3 | + /*이메일 중복 or 탈퇴 확인*/ | ||
4 | + | ||
5 | + | ||
6 | + /* 비밀번호 형식 확인 */ | ||
7 | + // 비밀번호 규칙 정규식 | ||
8 | +// : 숫자, 특문 각 1회 이상, 영문은 2개 이상 사용하여 8자리 이상 입력 | ||
9 | +$("#pw").keyup(function(){ | ||
10 | + if(validatePassword($.trim($("#pw").val()))){ | ||
11 | + $("#btn_join").attr("pw_check_result", "success"); | ||
12 | + $("#pw_msg").text(""); | ||
13 | + } else{ | ||
14 | + $("#pw_msg").text("숫자, 특수문자 각 1회 이상, 영문은 2개 이상 사용하여 8자리 이상 입력") | ||
15 | + .attr("style", "color: red; font-size:15px"); | ||
16 | + $("#btn_join").attr("pw_check_result", "fail"); | ||
17 | + } | ||
18 | +}); | ||
19 | + | ||
20 | + $("#new_pw").keyup(function(){ | ||
21 | + if(validatePassword($.trim($("#new_pw").val()))){ | ||
22 | + $("#new_pw_msg").text("사용 가능한 비밀번호입니다.") | ||
23 | + .attr("style", "color: green; font-size:15px"); | ||
24 | + $("#btn_join").attr("new_pw_check_result", "success"); | ||
25 | + } else{ | ||
26 | + $("#new_pw_msg").text("숫자, 특수문자 각 1회 이상, 영문은 2개 이상 사용하여 8자리 이상 입력") | ||
27 | + .attr("style", "color: red; font-size:15px"); | ||
28 | + $("#btn_join").attr("new_pw_check_result", "fail"); | ||
29 | + } | ||
30 | +}); | ||
31 | + | ||
32 | + | ||
33 | + | ||
34 | + /*비밀번호 재확인*/ | ||
35 | + $("#new_pw_check, #new_pw").keyup(function(){ | ||
36 | + if($("#new_pw").val()==$('#new_pw_check').val()){ | ||
37 | + $("#new_pw_check_msg").text("비밀번호가 일치합니다.") | ||
38 | + .attr("style", "color: green; font-size:15px"); | ||
39 | + | ||
40 | + $("#btn_join").attr("new_pw_check_check_result", "success"); | ||
41 | + } else{ | ||
42 | + $("#new_pw_check_msg").text("비밀번호가 일치하지 않습니다.") | ||
43 | + .attr("style", "color: red; font-size:15px"); | ||
44 | + $("#btn_join").attr("new_pw_check_check_result", "fail"); | ||
45 | + | ||
46 | + } | ||
47 | + }); | ||
48 | + | ||
49 | + $('#join_f').submit(function() { | ||
50 | + if($("#btn_join").attr("pw_check_result") == "fail") { | ||
51 | + | ||
52 | + $("#pw_msg").text("비밀번호를 확인해주세요.") | ||
53 | + .attr("style", "color: red; font-size:15px"); | ||
54 | + $("#pw").focus(); | ||
55 | + return false; | ||
56 | + } | ||
57 | + if($("#btn_join").attr("new_pw_check_result") == "fail") { | ||
58 | + | ||
59 | + $("#new_pw_msg").text("비밀번호를 확인해주세요.") | ||
60 | + .attr("style", "color: red; font-size:15px"); | ||
61 | + $("#new_pw").focus(); | ||
62 | + return false; | ||
63 | + } | ||
64 | + | ||
65 | + if($("#btn_join").attr("new_pw_check_check_result") == "fail") { | ||
66 | + | ||
67 | + $("#new_pw_check_msg").text("비밀번호가 일치하는 확인해주세요.") | ||
68 | + .attr("style", "color: red; font-size:15px"); | ||
69 | + $("#new_pw_check").focus(); | ||
70 | + return false; | ||
71 | + } | ||
72 | + }); | ||
73 | + | ||
74 | + /*Ajax */ | ||
75 | + var $form = $("#join_f"); | ||
76 | + | ||
77 | + // | ||
78 | + // $form.on("submit", function(e){ | ||
79 | + // e.preventDefault(); | ||
80 | + // var newUser = $form.serialize(); | ||
81 | + // | ||
82 | + // $.ajax({ | ||
83 | + // type:"POST", | ||
84 | + // url: "js/user.json", | ||
85 | + // data:newUser, | ||
86 | + // success:function(res){ | ||
87 | + // if (validateEmail($.trim($("#email").val()))){ | ||
88 | + // $(".input_row #email") | ||
89 | + // .attr("style", "border: 1px solid green;") | ||
90 | + // } else { | ||
91 | + // $(".input_row #email") | ||
92 | + // .attr("style", "border: 1px solid red;") | ||
93 | + // .focus(); | ||
94 | + // } | ||
95 | + // }, | ||
96 | + // error:function(){ | ||
97 | + // if (validateEmail($.trim($("#email").val()))){ | ||
98 | + // $(".input_row #email") | ||
99 | + // .attr("style", "border: 1px solid green;") | ||
100 | + // } else { | ||
101 | + // $(".input_row #email") | ||
102 | + // .attr("style", "border: 1px solid red;") | ||
103 | + // .focus(); | ||
104 | + // } | ||
105 | + // } | ||
106 | + // }); | ||
107 | + // }); | ||
108 | + | ||
109 | + | ||
110 | + /* 정규표현식을 이용하여 email형식에 맞는지 확인하는 함수*/ | ||
111 | + function validateEmail(email) { | ||
112 | + var re = /^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i; | ||
113 | + return re.test(email); | ||
114 | + } | ||
115 | + /* 정규표현식을 이용하여 id형식에 맞는지 확인하는 함수*/ | ||
116 | + function validateId(id) { | ||
117 | + var re = /[a-zA-Z0-9]{5,}/i; | ||
118 | + return re.test(id); | ||
119 | +} | ||
120 | + /* 정규표현식을 이용하여 password형식에 맞는지 확인하는 함수*/ | ||
121 | + // : 숫자, 특문 각 1회 이상, 영문은 2개 이상 사용하여 8자리 이상 입력 | ||
122 | + function validatePassword(pw) { | ||
123 | + var re = /(?=.*\d{1,50})(?=.*[~`!@#$%\^&*()-+=]{1,50})(?=.*[a-zA-Z]{2,50}).{8,50}$/; | ||
124 | + return re.test(pw); | ||
125 | +} | ||
126 | +}); |
This diff is collapsed. Click to expand it.
1 | +// breakpoints.scss v1.0 | @ajlkn | MIT licensed */ | ||
2 | + | ||
3 | +// Vars. | ||
4 | + | ||
5 | + /// Breakpoints. | ||
6 | + /// @var {list} | ||
7 | + $breakpoints: () !global; | ||
8 | + | ||
9 | +// Mixins. | ||
10 | + | ||
11 | + /// Sets breakpoints. | ||
12 | + /// @param {map} $x Breakpoints. | ||
13 | + @mixin breakpoints($x: ()) { | ||
14 | + $breakpoints: $x !global; | ||
15 | + } | ||
16 | + | ||
17 | + /// Wraps @content in a @media block targeting a specific orientation. | ||
18 | + /// @param {string} $orientation Orientation. | ||
19 | + @mixin orientation($orientation) { | ||
20 | + @media screen and (orientation: #{$orientation}) { | ||
21 | + @content; | ||
22 | + } | ||
23 | + } | ||
24 | + | ||
25 | + /// Wraps @content in a @media block using a given query. | ||
26 | + /// @param {string} $query Query. | ||
27 | + @mixin breakpoint($query: null) { | ||
28 | + | ||
29 | + $breakpoint: null; | ||
30 | + $op: null; | ||
31 | + $media: null; | ||
32 | + | ||
33 | + // Determine operator, breakpoint. | ||
34 | + | ||
35 | + // Greater than or equal. | ||
36 | + @if (str-slice($query, 0, 2) == '>=') { | ||
37 | + | ||
38 | + $op: 'gte'; | ||
39 | + $breakpoint: str-slice($query, 3); | ||
40 | + | ||
41 | + } | ||
42 | + | ||
43 | + // Less than or equal. | ||
44 | + @elseif (str-slice($query, 0, 2) == '<=') { | ||
45 | + | ||
46 | + $op: 'lte'; | ||
47 | + $breakpoint: str-slice($query, 3); | ||
48 | + | ||
49 | + } | ||
50 | + | ||
51 | + // Greater than. | ||
52 | + @elseif (str-slice($query, 0, 1) == '>') { | ||
53 | + | ||
54 | + $op: 'gt'; | ||
55 | + $breakpoint: str-slice($query, 2); | ||
56 | + | ||
57 | + } | ||
58 | + | ||
59 | + // Less than. | ||
60 | + @elseif (str-slice($query, 0, 1) == '<') { | ||
61 | + | ||
62 | + $op: 'lt'; | ||
63 | + $breakpoint: str-slice($query, 2); | ||
64 | + | ||
65 | + } | ||
66 | + | ||
67 | + // Not. | ||
68 | + @elseif (str-slice($query, 0, 1) == '!') { | ||
69 | + | ||
70 | + $op: 'not'; | ||
71 | + $breakpoint: str-slice($query, 2); | ||
72 | + | ||
73 | + } | ||
74 | + | ||
75 | + // Equal. | ||
76 | + @else { | ||
77 | + | ||
78 | + $op: 'eq'; | ||
79 | + $breakpoint: $query; | ||
80 | + | ||
81 | + } | ||
82 | + | ||
83 | + // Build media. | ||
84 | + @if ($breakpoint and map-has-key($breakpoints, $breakpoint)) { | ||
85 | + | ||
86 | + $a: map-get($breakpoints, $breakpoint); | ||
87 | + | ||
88 | + // Range. | ||
89 | + @if (type-of($a) == 'list') { | ||
90 | + | ||
91 | + $x: nth($a, 1); | ||
92 | + $y: nth($a, 2); | ||
93 | + | ||
94 | + // Max only. | ||
95 | + @if ($x == null) { | ||
96 | + | ||
97 | + // Greater than or equal (>= 0 / anything) | ||
98 | + @if ($op == 'gte') { | ||
99 | + $media: 'screen'; | ||
100 | + } | ||
101 | + | ||
102 | + // Less than or equal (<= y) | ||
103 | + @elseif ($op == 'lte') { | ||
104 | + $media: 'screen and (max-width: ' + $y + ')'; | ||
105 | + } | ||
106 | + | ||
107 | + // Greater than (> y) | ||
108 | + @elseif ($op == 'gt') { | ||
109 | + $media: 'screen and (min-width: ' + ($y + 1) + ')'; | ||
110 | + } | ||
111 | + | ||
112 | + // Less than (< 0 / invalid) | ||
113 | + @elseif ($op == 'lt') { | ||
114 | + $media: 'screen and (max-width: -1px)'; | ||
115 | + } | ||
116 | + | ||
117 | + // Not (> y) | ||
118 | + @elseif ($op == 'not') { | ||
119 | + $media: 'screen and (min-width: ' + ($y + 1) + ')'; | ||
120 | + } | ||
121 | + | ||
122 | + // Equal (<= y) | ||
123 | + @else { | ||
124 | + $media: 'screen and (max-width: ' + $y + ')'; | ||
125 | + } | ||
126 | + | ||
127 | + } | ||
128 | + | ||
129 | + // Min only. | ||
130 | + @else if ($y == null) { | ||
131 | + | ||
132 | + // Greater than or equal (>= x) | ||
133 | + @if ($op == 'gte') { | ||
134 | + $media: 'screen and (min-width: ' + $x + ')'; | ||
135 | + } | ||
136 | + | ||
137 | + // Less than or equal (<= inf / anything) | ||
138 | + @elseif ($op == 'lte') { | ||
139 | + $media: 'screen'; | ||
140 | + } | ||
141 | + | ||
142 | + // Greater than (> inf / invalid) | ||
143 | + @elseif ($op == 'gt') { | ||
144 | + $media: 'screen and (max-width: -1px)'; | ||
145 | + } | ||
146 | + | ||
147 | + // Less than (< x) | ||
148 | + @elseif ($op == 'lt') { | ||
149 | + $media: 'screen and (max-width: ' + ($x - 1) + ')'; | ||
150 | + } | ||
151 | + | ||
152 | + // Not (< x) | ||
153 | + @elseif ($op == 'not') { | ||
154 | + $media: 'screen and (max-width: ' + ($x - 1) + ')'; | ||
155 | + } | ||
156 | + | ||
157 | + // Equal (>= x) | ||
158 | + @else { | ||
159 | + $media: 'screen and (min-width: ' + $x + ')'; | ||
160 | + } | ||
161 | + | ||
162 | + } | ||
163 | + | ||
164 | + // Min and max. | ||
165 | + @else { | ||
166 | + | ||
167 | + // Greater than or equal (>= x) | ||
168 | + @if ($op == 'gte') { | ||
169 | + $media: 'screen and (min-width: ' + $x + ')'; | ||
170 | + } | ||
171 | + | ||
172 | + // Less than or equal (<= y) | ||
173 | + @elseif ($op == 'lte') { | ||
174 | + $media: 'screen and (max-width: ' + $y + ')'; | ||
175 | + } | ||
176 | + | ||
177 | + // Greater than (> y) | ||
178 | + @elseif ($op == 'gt') { | ||
179 | + $media: 'screen and (min-width: ' + ($y + 1) + ')'; | ||
180 | + } | ||
181 | + | ||
182 | + // Less than (< x) | ||
183 | + @elseif ($op == 'lt') { | ||
184 | + $media: 'screen and (max-width: ' + ($x - 1) + ')'; | ||
185 | + } | ||
186 | + | ||
187 | + // Not (< x and > y) | ||
188 | + @elseif ($op == 'not') { | ||
189 | + $media: 'screen and (max-width: ' + ($x - 1) + '), screen and (min-width: ' + ($y + 1) + ')'; | ||
190 | + } | ||
191 | + | ||
192 | + // Equal (>= x and <= y) | ||
193 | + @else { | ||
194 | + $media: 'screen and (min-width: ' + $x + ') and (max-width: ' + $y + ')'; | ||
195 | + } | ||
196 | + | ||
197 | + } | ||
198 | + | ||
199 | + } | ||
200 | + | ||
201 | + // String. | ||
202 | + @else { | ||
203 | + | ||
204 | + // Missing a media type? Prefix with "screen". | ||
205 | + @if (str-slice($a, 0, 1) == '(') { | ||
206 | + $media: 'screen and ' + $a; | ||
207 | + } | ||
208 | + | ||
209 | + // Otherwise, use as-is. | ||
210 | + @else { | ||
211 | + $media: $a; | ||
212 | + } | ||
213 | + | ||
214 | + } | ||
215 | + | ||
216 | + } | ||
217 | + | ||
218 | + // Output. | ||
219 | + @media #{$media} { | ||
220 | + @content; | ||
221 | + } | ||
222 | + | ||
223 | + } | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +/// Removes a specific item from a list. | ||
2 | +/// @author Hugo Giraudel | ||
3 | +/// @param {list} $list List. | ||
4 | +/// @param {integer} $index Index. | ||
5 | +/// @return {list} Updated list. | ||
6 | +@function remove-nth($list, $index) { | ||
7 | + | ||
8 | + $result: null; | ||
9 | + | ||
10 | + @if type-of($index) != number { | ||
11 | + @warn "$index: #{quote($index)} is not a number for `remove-nth`."; | ||
12 | + } | ||
13 | + @else if $index == 0 { | ||
14 | + @warn "List index 0 must be a non-zero integer for `remove-nth`."; | ||
15 | + } | ||
16 | + @else if abs($index) > length($list) { | ||
17 | + @warn "List index is #{$index} but list is only #{length($list)} item long for `remove-nth`."; | ||
18 | + } | ||
19 | + @else { | ||
20 | + | ||
21 | + $result: (); | ||
22 | + $index: if($index < 0, length($list) + $index + 1, $index); | ||
23 | + | ||
24 | + @for $i from 1 through length($list) { | ||
25 | + | ||
26 | + @if $i != $index { | ||
27 | + $result: append($result, nth($list, $i)); | ||
28 | + } | ||
29 | + | ||
30 | + } | ||
31 | + | ||
32 | + } | ||
33 | + | ||
34 | + @return $result; | ||
35 | + | ||
36 | +} | ||
37 | + | ||
38 | +/// Gets a value from a map. | ||
39 | +/// @author Hugo Giraudel | ||
40 | +/// @param {map} $map Map. | ||
41 | +/// @param {string} $keys Key(s). | ||
42 | +/// @return {string} Value. | ||
43 | +@function val($map, $keys...) { | ||
44 | + | ||
45 | + @if nth($keys, 1) == null { | ||
46 | + $keys: remove-nth($keys, 1); | ||
47 | + } | ||
48 | + | ||
49 | + @each $key in $keys { | ||
50 | + $map: map-get($map, $key); | ||
51 | + } | ||
52 | + | ||
53 | + @return $map; | ||
54 | + | ||
55 | +} | ||
56 | + | ||
57 | +/// Gets a duration value. | ||
58 | +/// @param {string} $keys Key(s). | ||
59 | +/// @return {string} Value. | ||
60 | +@function _duration($keys...) { | ||
61 | + @return val($duration, $keys...); | ||
62 | +} | ||
63 | + | ||
64 | +/// Gets a font value. | ||
65 | +/// @param {string} $keys Key(s). | ||
66 | +/// @return {string} Value. | ||
67 | +@function _font($keys...) { | ||
68 | + @return val($font, $keys...); | ||
69 | +} | ||
70 | + | ||
71 | +/// Gets a misc value. | ||
72 | +/// @param {string} $keys Key(s). | ||
73 | +/// @return {string} Value. | ||
74 | +@function _misc($keys...) { | ||
75 | + @return val($misc, $keys...); | ||
76 | +} | ||
77 | + | ||
78 | +/// Gets a palette value. | ||
79 | +/// @param {string} $keys Key(s). | ||
80 | +/// @return {string} Value. | ||
81 | +@function _palette($keys...) { | ||
82 | + @return val($palette, $keys...); | ||
83 | +} | ||
84 | + | ||
85 | +/// Gets a size value. | ||
86 | +/// @param {string} $keys Key(s). | ||
87 | +/// @return {string} Value. | ||
88 | +@function _size($keys...) { | ||
89 | + @return val($size, $keys...); | ||
90 | +} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +// html-grid.scss v1.0 | @ajlkn | MIT licensed */ | ||
2 | + | ||
3 | +// Mixins. | ||
4 | + | ||
5 | + /// Initializes the current element as an HTML grid. | ||
6 | + /// @param {mixed} $gutters Gutters (either a single number to set both column/row gutters, or a list to set them individually). | ||
7 | + /// @param {mixed} $suffix Column class suffix (optional; either a single suffix or a list). | ||
8 | + @mixin html-grid($gutters: 1.5em, $suffix: '') { | ||
9 | + | ||
10 | + // Initialize. | ||
11 | + $cols: 12; | ||
12 | + $multipliers: 0, 0.25, 0.5, 1, 1.50, 2.00; | ||
13 | + $unit: 100% / $cols; | ||
14 | + | ||
15 | + // Suffixes. | ||
16 | + $suffixes: null; | ||
17 | + | ||
18 | + @if (type-of($suffix) == 'list') { | ||
19 | + $suffixes: $suffix; | ||
20 | + } | ||
21 | + @else { | ||
22 | + $suffixes: ($suffix); | ||
23 | + } | ||
24 | + | ||
25 | + // Gutters. | ||
26 | + $guttersCols: null; | ||
27 | + $guttersRows: null; | ||
28 | + | ||
29 | + @if (type-of($gutters) == 'list') { | ||
30 | + | ||
31 | + $guttersCols: nth($gutters, 1); | ||
32 | + $guttersRows: nth($gutters, 2); | ||
33 | + | ||
34 | + } | ||
35 | + @else { | ||
36 | + | ||
37 | + $guttersCols: $gutters; | ||
38 | + $guttersRows: 0; | ||
39 | + | ||
40 | + } | ||
41 | + | ||
42 | + // Row. | ||
43 | + display: flex; | ||
44 | + flex-wrap: wrap; | ||
45 | + box-sizing: border-box; | ||
46 | + align-items: stretch; | ||
47 | + | ||
48 | + // Columns. | ||
49 | + > * { | ||
50 | + box-sizing: border-box; | ||
51 | + } | ||
52 | + | ||
53 | + // Gutters. | ||
54 | + &.gtr-uniform { | ||
55 | + > * { | ||
56 | + > :last-child { | ||
57 | + margin-bottom: 0; | ||
58 | + } | ||
59 | + } | ||
60 | + } | ||
61 | + | ||
62 | + // Alignment. | ||
63 | + &.aln-left { | ||
64 | + justify-content: flex-start; | ||
65 | + } | ||
66 | + | ||
67 | + &.aln-center { | ||
68 | + justify-content: center; | ||
69 | + } | ||
70 | + | ||
71 | + &.aln-right { | ||
72 | + justify-content: flex-end; | ||
73 | + } | ||
74 | + | ||
75 | + &.aln-top { | ||
76 | + align-items: flex-start; | ||
77 | + } | ||
78 | + | ||
79 | + &.aln-middle { | ||
80 | + align-items: center; | ||
81 | + } | ||
82 | + | ||
83 | + &.aln-bottom { | ||
84 | + align-items: flex-end; | ||
85 | + } | ||
86 | + | ||
87 | + // Step through suffixes. | ||
88 | + @each $suffix in $suffixes { | ||
89 | + | ||
90 | + // Suffix. | ||
91 | + @if ($suffix != '') { | ||
92 | + $suffix: '-' + $suffix; | ||
93 | + } | ||
94 | + @else { | ||
95 | + $suffix: ''; | ||
96 | + } | ||
97 | + | ||
98 | + // Row. | ||
99 | + | ||
100 | + // Important. | ||
101 | + > .imp#{$suffix} { | ||
102 | + order: -1; | ||
103 | + } | ||
104 | + | ||
105 | + // Columns, offsets. | ||
106 | + @for $i from 1 through $cols { | ||
107 | + > .col-#{$i}#{$suffix} { | ||
108 | + width: $unit * $i; | ||
109 | + } | ||
110 | + | ||
111 | + > .off-#{$i}#{$suffix} { | ||
112 | + margin-left: $unit * $i; | ||
113 | + } | ||
114 | + } | ||
115 | + | ||
116 | + // Step through multipliers. | ||
117 | + @each $multiplier in $multipliers { | ||
118 | + | ||
119 | + // Gutters. | ||
120 | + $class: null; | ||
121 | + | ||
122 | + @if ($multiplier != 1) { | ||
123 | + $class: '.gtr-' + ($multiplier * 100); | ||
124 | + } | ||
125 | + | ||
126 | + &#{$class} { | ||
127 | + margin-top: ($guttersRows * $multiplier * -1); | ||
128 | + margin-left: ($guttersCols * $multiplier * -1); | ||
129 | + | ||
130 | + > * { | ||
131 | + padding: ($guttersRows * $multiplier) 0 0 ($guttersCols * $multiplier); | ||
132 | + } | ||
133 | + | ||
134 | + // Uniform. | ||
135 | + &.gtr-uniform { | ||
136 | + margin-top: $guttersCols * $multiplier * -1; | ||
137 | + | ||
138 | + > * { | ||
139 | + padding-top: $guttersCols * $multiplier; | ||
140 | + } | ||
141 | + } | ||
142 | + | ||
143 | + } | ||
144 | + | ||
145 | + } | ||
146 | + | ||
147 | + } | ||
148 | + | ||
149 | + } | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +/// Makes an element's :before pseudoelement a FontAwesome icon. | ||
2 | +/// @param {string} $content Optional content value to use. | ||
3 | +/// @param {string} $category Optional category to use. | ||
4 | +/// @param {string} $where Optional pseudoelement to target (before or after). | ||
5 | +@mixin icon($content: false, $category: regular, $where: before) { | ||
6 | + | ||
7 | + text-decoration: none; | ||
8 | + | ||
9 | + &:#{$where} { | ||
10 | + | ||
11 | + @if $content { | ||
12 | + content: $content; | ||
13 | + } | ||
14 | + | ||
15 | + -moz-osx-font-smoothing: grayscale; | ||
16 | + -webkit-font-smoothing: antialiased; | ||
17 | + display: inline-block; | ||
18 | + font-style: normal; | ||
19 | + font-variant: normal; | ||
20 | + text-rendering: auto; | ||
21 | + line-height: 1; | ||
22 | + text-transform: none !important; | ||
23 | + | ||
24 | + @if ($category == brands) { | ||
25 | + font-family: 'Font Awesome 5 Brands'; | ||
26 | + } | ||
27 | + @elseif ($category == solid) { | ||
28 | + font-family: 'Font Awesome 5 Free'; | ||
29 | + font-weight: 900; | ||
30 | + } | ||
31 | + @else { | ||
32 | + font-family: 'Font Awesome 5 Free'; | ||
33 | + font-weight: 400; | ||
34 | + } | ||
35 | + | ||
36 | + } | ||
37 | + | ||
38 | +} | ||
39 | + | ||
40 | +/// Applies padding to an element, taking the current element-margin value into account. | ||
41 | +/// @param {mixed} $tb Top/bottom padding. | ||
42 | +/// @param {mixed} $lr Left/right padding. | ||
43 | +/// @param {list} $pad Optional extra padding (in the following order top, right, bottom, left) | ||
44 | +/// @param {bool} $important If true, adds !important. | ||
45 | +@mixin padding($tb, $lr, $pad: (0,0,0,0), $important: null) { | ||
46 | + | ||
47 | + @if $important { | ||
48 | + $important: '!important'; | ||
49 | + } | ||
50 | + | ||
51 | + $x: 0.1em; | ||
52 | + | ||
53 | + @if unit(_size(element-margin)) == 'rem' { | ||
54 | + $x: 0.1rem; | ||
55 | + } | ||
56 | + | ||
57 | + padding: ($tb + nth($pad,1)) ($lr + nth($pad,2)) max($x, $tb - _size(element-margin) + nth($pad,3)) ($lr + nth($pad,4)) #{$important}; | ||
58 | + | ||
59 | +} | ||
60 | + | ||
61 | +/// Encodes a SVG data URL so IE doesn't choke (via codepen.io/jakob-e/pen/YXXBrp). | ||
62 | +/// @param {string} $svg SVG data URL. | ||
63 | +/// @return {string} Encoded SVG data URL. | ||
64 | +@function svg-url($svg) { | ||
65 | + | ||
66 | + $svg: str-replace($svg, '"', '\''); | ||
67 | + $svg: str-replace($svg, '%', '%25'); | ||
68 | + $svg: str-replace($svg, '<', '%3C'); | ||
69 | + $svg: str-replace($svg, '>', '%3E'); | ||
70 | + $svg: str-replace($svg, '&', '%26'); | ||
71 | + $svg: str-replace($svg, '#', '%23'); | ||
72 | + $svg: str-replace($svg, '{', '%7B'); | ||
73 | + $svg: str-replace($svg, '}', '%7D'); | ||
74 | + $svg: str-replace($svg, ';', '%3B'); | ||
75 | + | ||
76 | + @return url("data:image/svg+xml;charset=utf8,#{$svg}"); | ||
77 | + | ||
78 | +} | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +// Misc. | ||
2 | + $misc: ( | ||
3 | + z-index-base: 10000 | ||
4 | + ); | ||
5 | + | ||
6 | +// Duration. | ||
7 | + $duration: ( | ||
8 | + navPanel: 0.5s | ||
9 | + ); | ||
10 | + | ||
11 | +// Size. | ||
12 | + $size: ( | ||
13 | + navPanel: 275px | ||
14 | + ); | ||
15 | + | ||
16 | +// Font. | ||
17 | + $font: ( | ||
18 | + ); | ||
19 | + | ||
20 | +// Palette. | ||
21 | + $palette: ( | ||
22 | + ); | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
1 | +// vendor.scss v1.0 | @ajlkn | MIT licensed */ | ||
2 | + | ||
3 | +// Vars. | ||
4 | + | ||
5 | + /// Vendor prefixes. | ||
6 | + /// @var {list} | ||
7 | + $vendor-prefixes: ( | ||
8 | + '-moz-', | ||
9 | + '-webkit-', | ||
10 | + '-ms-', | ||
11 | + '' | ||
12 | + ); | ||
13 | + | ||
14 | + /// Properties that should be vendorized. | ||
15 | + /// Data via caniuse.com, github.com/postcss/autoprefixer, and developer.mozilla.org | ||
16 | + /// @var {list} | ||
17 | + $vendor-properties: ( | ||
18 | + | ||
19 | + // Animation. | ||
20 | + 'animation', | ||
21 | + 'animation-delay', | ||
22 | + 'animation-direction', | ||
23 | + 'animation-duration', | ||
24 | + 'animation-fill-mode', | ||
25 | + 'animation-iteration-count', | ||
26 | + 'animation-name', | ||
27 | + 'animation-play-state', | ||
28 | + 'animation-timing-function', | ||
29 | + | ||
30 | + // Appearance. | ||
31 | + 'appearance', | ||
32 | + | ||
33 | + // Backdrop filter. | ||
34 | + 'backdrop-filter', | ||
35 | + | ||
36 | + // Background image options. | ||
37 | + 'background-clip', | ||
38 | + 'background-origin', | ||
39 | + 'background-size', | ||
40 | + | ||
41 | + // Box sizing. | ||
42 | + 'box-sizing', | ||
43 | + | ||
44 | + // Clip path. | ||
45 | + 'clip-path', | ||
46 | + | ||
47 | + // Filter effects. | ||
48 | + 'filter', | ||
49 | + | ||
50 | + // Flexbox. | ||
51 | + 'align-content', | ||
52 | + 'align-items', | ||
53 | + 'align-self', | ||
54 | + 'flex', | ||
55 | + 'flex-basis', | ||
56 | + 'flex-direction', | ||
57 | + 'flex-flow', | ||
58 | + 'flex-grow', | ||
59 | + 'flex-shrink', | ||
60 | + 'flex-wrap', | ||
61 | + 'justify-content', | ||
62 | + 'order', | ||
63 | + | ||
64 | + // Font feature. | ||
65 | + 'font-feature-settings', | ||
66 | + 'font-language-override', | ||
67 | + 'font-variant-ligatures', | ||
68 | + | ||
69 | + // Font kerning. | ||
70 | + 'font-kerning', | ||
71 | + | ||
72 | + // Fragmented borders and backgrounds. | ||
73 | + 'box-decoration-break', | ||
74 | + | ||
75 | + // Grid layout. | ||
76 | + 'grid-column', | ||
77 | + 'grid-column-align', | ||
78 | + 'grid-column-end', | ||
79 | + 'grid-column-start', | ||
80 | + 'grid-row', | ||
81 | + 'grid-row-align', | ||
82 | + 'grid-row-end', | ||
83 | + 'grid-row-start', | ||
84 | + 'grid-template-columns', | ||
85 | + 'grid-template-rows', | ||
86 | + | ||
87 | + // Hyphens. | ||
88 | + 'hyphens', | ||
89 | + 'word-break', | ||
90 | + | ||
91 | + // Masks. | ||
92 | + 'mask', | ||
93 | + 'mask-border', | ||
94 | + 'mask-border-outset', | ||
95 | + 'mask-border-repeat', | ||
96 | + 'mask-border-slice', | ||
97 | + 'mask-border-source', | ||
98 | + 'mask-border-width', | ||
99 | + 'mask-clip', | ||
100 | + 'mask-composite', | ||
101 | + 'mask-image', | ||
102 | + 'mask-origin', | ||
103 | + 'mask-position', | ||
104 | + 'mask-repeat', | ||
105 | + 'mask-size', | ||
106 | + | ||
107 | + // Multicolumn. | ||
108 | + 'break-after', | ||
109 | + 'break-before', | ||
110 | + 'break-inside', | ||
111 | + 'column-count', | ||
112 | + 'column-fill', | ||
113 | + 'column-gap', | ||
114 | + 'column-rule', | ||
115 | + 'column-rule-color', | ||
116 | + 'column-rule-style', | ||
117 | + 'column-rule-width', | ||
118 | + 'column-span', | ||
119 | + 'column-width', | ||
120 | + 'columns', | ||
121 | + | ||
122 | + // Object fit. | ||
123 | + 'object-fit', | ||
124 | + 'object-position', | ||
125 | + | ||
126 | + // Regions. | ||
127 | + 'flow-from', | ||
128 | + 'flow-into', | ||
129 | + 'region-fragment', | ||
130 | + | ||
131 | + // Scroll snap points. | ||
132 | + 'scroll-snap-coordinate', | ||
133 | + 'scroll-snap-destination', | ||
134 | + 'scroll-snap-points-x', | ||
135 | + 'scroll-snap-points-y', | ||
136 | + 'scroll-snap-type', | ||
137 | + | ||
138 | + // Shapes. | ||
139 | + 'shape-image-threshold', | ||
140 | + 'shape-margin', | ||
141 | + 'shape-outside', | ||
142 | + | ||
143 | + // Tab size. | ||
144 | + 'tab-size', | ||
145 | + | ||
146 | + // Text align last. | ||
147 | + 'text-align-last', | ||
148 | + | ||
149 | + // Text decoration. | ||
150 | + 'text-decoration-color', | ||
151 | + 'text-decoration-line', | ||
152 | + 'text-decoration-skip', | ||
153 | + 'text-decoration-style', | ||
154 | + | ||
155 | + // Text emphasis. | ||
156 | + 'text-emphasis', | ||
157 | + 'text-emphasis-color', | ||
158 | + 'text-emphasis-position', | ||
159 | + 'text-emphasis-style', | ||
160 | + | ||
161 | + // Text size adjust. | ||
162 | + 'text-size-adjust', | ||
163 | + | ||
164 | + // Text spacing. | ||
165 | + 'text-spacing', | ||
166 | + | ||
167 | + // Transform. | ||
168 | + 'transform', | ||
169 | + 'transform-origin', | ||
170 | + | ||
171 | + // Transform 3D. | ||
172 | + 'backface-visibility', | ||
173 | + 'perspective', | ||
174 | + 'perspective-origin', | ||
175 | + 'transform-style', | ||
176 | + | ||
177 | + // Transition. | ||
178 | + 'transition', | ||
179 | + 'transition-delay', | ||
180 | + 'transition-duration', | ||
181 | + 'transition-property', | ||
182 | + 'transition-timing-function', | ||
183 | + | ||
184 | + // Unicode bidi. | ||
185 | + 'unicode-bidi', | ||
186 | + | ||
187 | + // User select. | ||
188 | + 'user-select', | ||
189 | + | ||
190 | + // Writing mode. | ||
191 | + 'writing-mode', | ||
192 | + | ||
193 | + ); | ||
194 | + | ||
195 | + /// Values that should be vendorized. | ||
196 | + /// Data via caniuse.com, github.com/postcss/autoprefixer, and developer.mozilla.org | ||
197 | + /// @var {list} | ||
198 | + $vendor-values: ( | ||
199 | + | ||
200 | + // Cross fade. | ||
201 | + 'cross-fade', | ||
202 | + | ||
203 | + // Element function. | ||
204 | + 'element', | ||
205 | + | ||
206 | + // Filter function. | ||
207 | + 'filter', | ||
208 | + | ||
209 | + // Flexbox. | ||
210 | + 'flex', | ||
211 | + 'inline-flex', | ||
212 | + | ||
213 | + // Grab cursors. | ||
214 | + 'grab', | ||
215 | + 'grabbing', | ||
216 | + | ||
217 | + // Gradients. | ||
218 | + 'linear-gradient', | ||
219 | + 'repeating-linear-gradient', | ||
220 | + 'radial-gradient', | ||
221 | + 'repeating-radial-gradient', | ||
222 | + | ||
223 | + // Grid layout. | ||
224 | + 'grid', | ||
225 | + 'inline-grid', | ||
226 | + | ||
227 | + // Image set. | ||
228 | + 'image-set', | ||
229 | + | ||
230 | + // Intrinsic width. | ||
231 | + 'max-content', | ||
232 | + 'min-content', | ||
233 | + 'fit-content', | ||
234 | + 'fill', | ||
235 | + 'fill-available', | ||
236 | + 'stretch', | ||
237 | + | ||
238 | + // Sticky position. | ||
239 | + 'sticky', | ||
240 | + | ||
241 | + // Transform. | ||
242 | + 'transform', | ||
243 | + | ||
244 | + // Zoom cursors. | ||
245 | + 'zoom-in', | ||
246 | + 'zoom-out', | ||
247 | + | ||
248 | + ); | ||
249 | + | ||
250 | +// Functions. | ||
251 | + | ||
252 | + /// Removes a specific item from a list. | ||
253 | + /// @author Hugo Giraudel | ||
254 | + /// @param {list} $list List. | ||
255 | + /// @param {integer} $index Index. | ||
256 | + /// @return {list} Updated list. | ||
257 | + @function remove-nth($list, $index) { | ||
258 | + | ||
259 | + $result: null; | ||
260 | + | ||
261 | + @if type-of($index) != number { | ||
262 | + @warn "$index: #{quote($index)} is not a number for `remove-nth`."; | ||
263 | + } | ||
264 | + @else if $index == 0 { | ||
265 | + @warn "List index 0 must be a non-zero integer for `remove-nth`."; | ||
266 | + } | ||
267 | + @else if abs($index) > length($list) { | ||
268 | + @warn "List index is #{$index} but list is only #{length($list)} item long for `remove-nth`."; | ||
269 | + } | ||
270 | + @else { | ||
271 | + | ||
272 | + $result: (); | ||
273 | + $index: if($index < 0, length($list) + $index + 1, $index); | ||
274 | + | ||
275 | + @for $i from 1 through length($list) { | ||
276 | + | ||
277 | + @if $i != $index { | ||
278 | + $result: append($result, nth($list, $i)); | ||
279 | + } | ||
280 | + | ||
281 | + } | ||
282 | + | ||
283 | + } | ||
284 | + | ||
285 | + @return $result; | ||
286 | + | ||
287 | + } | ||
288 | + | ||
289 | + /// Replaces a substring within another string. | ||
290 | + /// @author Hugo Giraudel | ||
291 | + /// @param {string} $string String. | ||
292 | + /// @param {string} $search Substring. | ||
293 | + /// @param {string} $replace Replacement. | ||
294 | + /// @return {string} Updated string. | ||
295 | + @function str-replace($string, $search, $replace: '') { | ||
296 | + | ||
297 | + $index: str-index($string, $search); | ||
298 | + | ||
299 | + @if $index { | ||
300 | + @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace); | ||
301 | + } | ||
302 | + | ||
303 | + @return $string; | ||
304 | + | ||
305 | + } | ||
306 | + | ||
307 | + /// Replaces a substring within each string in a list. | ||
308 | + /// @param {list} $strings List of strings. | ||
309 | + /// @param {string} $search Substring. | ||
310 | + /// @param {string} $replace Replacement. | ||
311 | + /// @return {list} Updated list of strings. | ||
312 | + @function str-replace-all($strings, $search, $replace: '') { | ||
313 | + | ||
314 | + @each $string in $strings { | ||
315 | + $strings: set-nth($strings, index($strings, $string), str-replace($string, $search, $replace)); | ||
316 | + } | ||
317 | + | ||
318 | + @return $strings; | ||
319 | + | ||
320 | + } | ||
321 | + | ||
322 | +// Mixins. | ||
323 | + | ||
324 | + /// Wraps @content in vendorized keyframe blocks. | ||
325 | + /// @param {string} $name Name. | ||
326 | + @mixin keyframes($name) { | ||
327 | + | ||
328 | + @-moz-keyframes #{$name} { @content; } | ||
329 | + @-webkit-keyframes #{$name} { @content; } | ||
330 | + @-ms-keyframes #{$name} { @content; } | ||
331 | + @keyframes #{$name} { @content; } | ||
332 | + | ||
333 | + } | ||
334 | + | ||
335 | + /// Vendorizes a declaration's property and/or value(s). | ||
336 | + /// @param {string} $property Property. | ||
337 | + /// @param {mixed} $value String/list of value(s). | ||
338 | + @mixin vendor($property, $value) { | ||
339 | + | ||
340 | + // Determine if property should expand. | ||
341 | + $expandProperty: index($vendor-properties, $property); | ||
342 | + | ||
343 | + // Determine if value should expand (and if so, add '-prefix-' placeholder). | ||
344 | + $expandValue: false; | ||
345 | + | ||
346 | + @each $x in $value { | ||
347 | + @each $y in $vendor-values { | ||
348 | + @if $y == str-slice($x, 1, str-length($y)) { | ||
349 | + | ||
350 | + $value: set-nth($value, index($value, $x), '-prefix-' + $x); | ||
351 | + $expandValue: true; | ||
352 | + | ||
353 | + } | ||
354 | + } | ||
355 | + } | ||
356 | + | ||
357 | + // Expand property? | ||
358 | + @if $expandProperty { | ||
359 | + @each $vendor in $vendor-prefixes { | ||
360 | + #{$vendor}#{$property}: #{str-replace-all($value, '-prefix-', $vendor)}; | ||
361 | + } | ||
362 | + } | ||
363 | + | ||
364 | + // Expand just the value? | ||
365 | + @elseif $expandValue { | ||
366 | + @each $vendor in $vendor-prefixes { | ||
367 | + #{$property}: #{str-replace-all($value, '-prefix-', $vendor)}; | ||
368 | + } | ||
369 | + } | ||
370 | + | ||
371 | + // Neither? Treat them as a normal declaration. | ||
372 | + @else { | ||
373 | + #{$property}: #{$value}; | ||
374 | + } | ||
375 | + | ||
376 | + } | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
This diff is collapsed. Click to expand it.
No preview for this file type
This diff could not be displayed because it is too large.
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
This diff could not be displayed because it is too large.
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
This diff could not be displayed because it is too large.
No preview for this file type
No preview for this file type
No preview for this file type

74.3 KB

10 KB

10.3 KB

10.3 KB

2.69 KB

2.71 KB

2.88 KB

2.87 KB

253 Bytes

5.09 KB

1.63 MB

48.9 KB
1 | +<nav id="nav"> | ||
2 | + <ul> | ||
3 | + <li class="current"><a href="{% url 'index' %}">Home</a></li> | ||
4 | + <li><a href="{% url 'fishes' %}">Fishes</a></li> | ||
5 | + <li><a href="{% url 'board:list' %}">조황문의</a></li> | ||
6 | + {% if request.session.authUser is None %} | ||
7 | + <li><a href="{% url 'users:loginform' %}">로그인</a></li> | ||
8 | + {% else %} | ||
9 | + <li><a href="{% url 'users:updateform' %}">{{ request.session.authUser.email }}</a></li> | ||
10 | + <li><a href="{% url 'users:logout' %}">로그아웃</a></li> | ||
11 | + {% endif %} | ||
12 | + </ul> | ||
13 | +</nav> |
FishBook/django/fishbook/fishbook/urls.py
0 → 100644
1 | +"""fishbook URL Configuration | ||
2 | + | ||
3 | +The `urlpatterns` list routes URLs to views. For more information please see: | ||
4 | + https://docs.djangoproject.com/en/3.0/topics/http/urls/ | ||
5 | +Examples: | ||
6 | +Function views | ||
7 | + 1. Add an import: from my_app import views | ||
8 | + 2. Add a URL to urlpatterns: path('', views.home, name='home') | ||
9 | +Class-based views | ||
10 | + 1. Add an import: from other_app.views import Home | ||
11 | + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') | ||
12 | +Including another URLconf | ||
13 | + 1. Import the include() function: from django.urls import include, path | ||
14 | + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) | ||
15 | +""" | ||
16 | +from django.contrib import admin | ||
17 | +from django.urls import path, include | ||
18 | +from posts.views import index, fishes | ||
19 | +from admins.views import adminIndex, adminLogin | ||
20 | + | ||
21 | +urlpatterns = [ | ||
22 | + path('admin/', admin.site.urls), | ||
23 | + path('', index, name="index"), | ||
24 | + path('fishes/',fishes, name="fishes"), | ||
25 | + path('adminIndex/', adminIndex, name="adminIndex"), | ||
26 | + path('adminLogin/', adminLogin, name="adminLogin"), | ||
27 | + path('posts/', include('posts.urls')), | ||
28 | + path('users/', include('users.urls')), | ||
29 | + path('board/', include('board.urls')), | ||
30 | +] |
FishBook/django/fishbook/fishbook/wsgi.py
0 → 100644
1 | +""" | ||
2 | +WSGI config for fishbook project. | ||
3 | + | ||
4 | +It exposes the WSGI callable as a module-level variable named ``application``. | ||
5 | + | ||
6 | +For more information on this file, see | ||
7 | +https://docs.djangoproject.com/en/3.0/howto/deployment/wsgi/ | ||
8 | +""" | ||
9 | + | ||
10 | +import os | ||
11 | + | ||
12 | +from django.core.wsgi import get_wsgi_application | ||
13 | + | ||
14 | +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'fishbook.settings') | ||
15 | + | ||
16 | +application = get_wsgi_application() |
FishBook/django/fishbook/manage.py
0 → 100644
1 | +#!/usr/bin/env python | ||
2 | +"""Django's command-line utility for administrative tasks.""" | ||
3 | +import os | ||
4 | +import sys | ||
5 | + | ||
6 | + | ||
7 | +def main(): | ||
8 | + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'fishbook.settings') | ||
9 | + try: | ||
10 | + from django.core.management import execute_from_command_line | ||
11 | + except ImportError as exc: | ||
12 | + raise ImportError( | ||
13 | + "Couldn't import Django. Are you sure it's installed and " | ||
14 | + "available on your PYTHONPATH environment variable? Did you " | ||
15 | + "forget to activate a virtual environment?" | ||
16 | + ) from exc | ||
17 | + execute_from_command_line(sys.argv) | ||
18 | + | ||
19 | + | ||
20 | +if __name__ == '__main__': | ||
21 | + main() |
FishBook/django/fishbook/posts/__init__.py
0 → 100644
File mode changed
FishBook/django/fishbook/posts/admin.py
0 → 100644
1 | +from django.contrib import admin | ||
2 | + | ||
3 | +from .models import Post | ||
4 | + | ||
5 | +@admin.register(Post) | ||
6 | +class PostAdmin(admin.ModelAdmin): | ||
7 | + list_display = ( | ||
8 | + 'id', | ||
9 | + 'species', | ||
10 | + 'description', | ||
11 | + 'image', | ||
12 | + 'view_count', | ||
13 | + 'created_at', | ||
14 | + 'updated_at' | ||
15 | + ) | ||
16 | + search_fields = ( | ||
17 | + 'species', | ||
18 | + ) | ||
19 | +# Register your models here. |
FishBook/django/fishbook/posts/apps.py
0 → 100644
FishBook/django/fishbook/posts/forms.py
0 → 100644
1 | +from django import forms | ||
2 | +from .models import Post | ||
3 | + | ||
4 | +class PostForm(forms.ModelForm): | ||
5 | + class Meta: | ||
6 | + model = Post | ||
7 | + fields = ['species', 'description'] | ||
8 | + labels = { | ||
9 | + 'species': '어종', | ||
10 | + 'description': '설명', | ||
11 | + } | ||
12 | + widget = { | ||
13 | + 'species': forms.TextInput(attrs={ | ||
14 | + 'class': 'form-control' | ||
15 | + }), | ||
16 | + 'description': forms.Textarea(attrs={ | ||
17 | + 'class': 'form-control' | ||
18 | + }), | ||
19 | + } |
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
FishBook/django/fishbook/posts/models.py
0 → 100644
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
FishBook/django/fishbook/posts/tests.py
0 → 100644
This diff is collapsed. Click to expand it.
FishBook/django/fishbook/posts/urls.py
0 → 100644
This diff is collapsed. Click to expand it.
FishBook/django/fishbook/posts/views.py
0 → 100644
This diff is collapsed. Click to expand it.
FishBook/django/fishbook/users/__init__.py
0 → 100644
This diff is collapsed. Click to expand it.
FishBook/django/fishbook/users/admin.py
0 → 100644
This diff is collapsed. Click to expand it.
FishBook/django/fishbook/users/apps.py
0 → 100644
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
FishBook/django/fishbook/users/models.py
0 → 100644
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
FishBook/django/fishbook/users/tests.py
0 → 100644
This diff is collapsed. Click to expand it.
FishBook/django/fishbook/users/urls.py
0 → 100644
This diff is collapsed. Click to expand it.
FishBook/django/fishbook/users/views.py
0 → 100644
This diff is collapsed. Click to expand it.
FishBook/django/git_hub_url.txt
0 → 100644
This diff is collapsed. Click to expand it.
FishBook/django/데모영상.mp4
0 → 100644
This file is too large to display.
FishBook/django/박정훈.zip
0 → 100644
This file is too large to display.
FishBook/django/발표자료.pptx
0 → 100644
No preview for this file type
FishBook/goFishing.html
0 → 100644
This diff is collapsed. Click to expand it.
FishBook/image/arrow.png
0 → 100644

81 KB
FishBook/image/fish-logo.png
0 → 100644

74.3 KB
FishBook/index.html
0 → 100644
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
FishBook/js/classie.js
0 → 100644
This diff is collapsed. Click to expand it.
FishBook/js/index.js
0 → 100644
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
FishBook/practice/SlidePushMenus.zip
0 → 100644
No preview for this file type
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
No preview for this file type
This diff is collapsed. Click to expand it.
No preview for this file type
No preview for this file type
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
FishBook/practice/css/slide_push_menus.css
0 → 100644
This diff is collapsed. Click to expand it.
FishBook/practice/js/slide_push_menus.js
0 → 100644
This diff is collapsed. Click to expand it.
FishBook/practice/slide_push_menus.html
0 → 100644
This diff is collapsed. Click to expand it.
FishBook/user.json
0 → 100644
This diff is collapsed. Click to expand it.
FishBook/기획/FishBook기획서_경희대_박정훈_v1.5.pptx
0 → 100644
No preview for this file type
No preview for this file type
report/최종보고서.hwp
0 → 100644
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
면담 확인서/04_14.eml
0 → 100644
This diff is collapsed. Click to expand it.
면담 확인서/04_14_캡스톤디자인_면담_확인서.hwp
0 → 100644
No preview for this file type
면담 확인서/04_16.eml
0 → 100644
This diff is collapsed. Click to expand it.
면담 확인서/04_16_캡스톤디자인_면담_확인서.hwp
0 → 100644
No preview for this file type
면담 확인서/04_17_캡스톤디자인_면담1.PNG
deleted
100644 → 0
112 KB
면담 확인서/04_17_캡스톤디자인_면담2.PNG
deleted
100644 → 0
29.9 KB
면담 확인서/04_24.eml
0 → 100644
This diff could not be displayed because it is too large.
면담 확인서/04_24_캡스톤디자인_면담_확인서.hwp
0 → 100644
No preview for this file type
면담 확인서/04_28.eml
0 → 100644
This diff is collapsed. Click to expand it.
면담 확인서/04_28_캡스톤디자인_면담_확인서.hwp
0 → 100644
No preview for this file type
면담 확인서/05_04.eml
0 → 100644
This diff is collapsed. Click to expand it.
면담 확인서/05_04_캡스톤디자인_면담_확인서.hwp
0 → 100644
No preview for this file type
면담 확인서/05_12.eml
0 → 100644
This diff is collapsed. Click to expand it.
면담 확인서/05_12_캡스톤디자인_면담_확인서.hwp
0 → 100644
No preview for this file type
면담 확인서/05_19.eml
0 → 100644
This diff is collapsed. Click to expand it.
면담 확인서/05_19_캡스톤디자인_면담_확인서.hwp
0 → 100644
No preview for this file type
면담 확인서/05_22.eml
0 → 100644
This diff is collapsed. Click to expand it.
면담 확인서/05_22_캡스톤디자인_면담_확인서.hwp
0 → 100644
No preview for this file type
면담 확인서/05_29.eml
0 → 100644
This diff is collapsed. Click to expand it.
면담 확인서/05_29_캡스톤디자인_면담_확인서.hwp
0 → 100644
No preview for this file type
면담 확인서/06_05.eml
0 → 100644
This diff is collapsed. Click to expand it.
면담 확인서/06_05_캡스톤디자인_면담_확인서.hwp
0 → 100644
No preview for this file type
면담 확인서/06_08.eml
0 → 100644
This diff is collapsed. Click to expand it.
면담 확인서/06_08_캡스톤디자인_면담_확인서.hwp
0 → 100644
No preview for this file type
면담 확인서/06_11_캡스톤디자인_면담_확인서.hwp
0 → 100644
This file is too large to display.
면담 확인서/06_12.eml
0 → 100644
This diff is collapsed. Click to expand it.
면담 확인서/06_12_캡스톤디자인_면담_확인서.hwp
0 → 100644
No preview for this file type
중간 보고서/pc난잡.PNG
deleted
100644 → 0
1.63 MB
중간 보고서/모바일.PNG
deleted
100644 → 0
273 KB
-
Please register or login to post a comment