

231026 류윤주 관리자단 사용자단 합침
@a35a32053f3ecb7569fbc8444614d3d222bd9cb9
--- client/resources/css/reset.css
+++ client/resources/css/reset.css
... | ... | @@ -40,7 +40,7 @@ |
40 | 40 |
overflow-y: scroll; |
41 | 41 |
} |
42 | 42 |
|
43 |
-body { |
|
43 |
+body,#root { |
|
44 | 44 |
width: 100%; |
45 | 45 |
height: 100%; |
46 | 46 |
} |
+++ client/views/layout/AdminHeader.vue
... | ... | @@ -0,0 +1,73 @@ |
1 | +<template> | |
2 | + <header> | |
3 | + <p class="navigate_bar"><router-link to="/">Home</router-link> > {{pathName()}}</p> | |
4 | + </header> | |
5 | +</template> | |
6 | + | |
7 | +<script> | |
8 | +import { useRoute } from 'vue-router'; | |
9 | + | |
10 | +export default { | |
11 | + data() { | |
12 | + return { | |
13 | + //현재 라우터의 정보 | |
14 | + route: useRoute(), | |
15 | + | |
16 | + // 페이지 경로 목록 | |
17 | + pageList: [ | |
18 | + {path: "/management.page", name: "수요반응자원 관리"} | |
19 | + , {path: "/contract.page", name: "참여고객 관리"} | |
20 | + , {path: "/rrmsePropose.page", name: "RRMSE 산출의뢰"} | |
21 | + , {path: "/rrmseCalculationLog.page", name: "RRMSE 산출이력"} | |
22 | + , {path: "/reduceState.page", name: "감축현황"} | |
23 | + , {path: "/reduceReport.page", name: "감축결과보고서"} | |
24 | + , {path: "/translateDay.page", name: "데이터송수신현황 일별"} | |
25 | + , {path: "/translateContract.page", name: "데이터송수신현황 참여고객별"} | |
26 | + , {path: "/dataStatus.page", name: "데이터송수신현황 데이터수집현황"} | |
27 | + , {path: "/analysis.page", name: "전력사용량/CBL 통계"} | |
28 | + , {path: "/cblAnalysis.page", name: "CBL 분석"} | |
29 | + , {path: "/device.page", name: "5분검침기 현황"} | |
30 | + , {path: "/smsAutoSend.page", name: "SMS발송관리 자동발송설정"} | |
31 | + , {path: "/smsManualSend.page", name: "SMS발송관리 수동발송"} | |
32 | + , {path: "/smsLog.page", name: "SMS발송관리 발송이력"} | |
33 | + , {path: "/emailAutoSend.page", name: "E-mail발송관리 자동발송설정"} | |
34 | + , {path: "/emailLog.page", name: "E-mail발송관리 발송이력"} | |
35 | + , {path: "/system.page", name: "회원관리"} | |
36 | + , {path: "/login.page", name: "로그인"} | |
37 | + ] | |
38 | + }; | |
39 | + }, | |
40 | + methods: { | |
41 | + pathName: function () { | |
42 | + for(let i=0; i<this.pageList.length; i++) { | |
43 | + if(this.route.path == this.pageList[i]['path']) { | |
44 | + return this.pageList[i]['name']; | |
45 | + } | |
46 | + } | |
47 | + return "대시보드" | |
48 | + } | |
49 | + }, | |
50 | + watch: {}, | |
51 | + computed: {}, | |
52 | + components: {}, | |
53 | + mounted() { | |
54 | + console.log("Header mounted"); | |
55 | + console.log("Header route: ", this.route); | |
56 | + }, | |
57 | +}; | |
58 | +</script> | |
59 | + | |
60 | +<style scoped> | |
61 | +header { | |
62 | + max-width: 100%; | |
63 | + border-bottom: 1px solid #eee; | |
64 | + grid-area: header; | |
65 | + background: #fff; | |
66 | +} | |
67 | + | |
68 | +header p { | |
69 | + padding: 15px 30px; | |
70 | + font-size: 1.5rem; | |
71 | + font-weight: 900; | |
72 | +} | |
73 | +</style> |
+++ client/views/layout/AdminMenu.vue
... | ... | @@ -0,0 +1,123 @@ |
1 | +<template> | |
2 | + <nav class="main-menu"> | |
3 | + <div class="logo-wrap"> | |
4 | + <h1 class="logo"><router-link to="/">AI 디지털교과서 통합지원센터</router-link></h1> | |
5 | + </div> | |
6 | + <ul> | |
7 | + <li v-for="(menu, index) in menuList" :key="index" @click="toggleMenu(menu)"> | |
8 | + <router-link :to="menu.path">{{ menu.pathName }}<span v-html="menu.icon"></span></router-link> | |
9 | + <ul v-if="menu.subMenu" class="sub-menu" :style="{ 'max-height': menu.isOpen ? '200px' : '0' }"> | |
10 | + <li v-for="(subMenu, subIndex) in menu.subMenu" :key="subIndex"> | |
11 | + <router-link :to="subMenu.path">{{ subMenu.pathName }}</router-link> | |
12 | + </li> | |
13 | + </ul> | |
14 | + </li> | |
15 | + </ul> | |
16 | + </nav> | |
17 | +</template> | |
18 | + | |
19 | +<script> | |
20 | +export default { | |
21 | + data() { | |
22 | + return { | |
23 | + menuList: [ | |
24 | + { path: "/main.page", pathName: "대시보드" }, | |
25 | + { path: "/notice.page", pathName: "커뮤니티", subMenu: [{ path: "/notice.page", pathName: "공지사항" }, { path: "/new.page", pathName: "홍보/뉴스" }], icon: "<i class='fa-solid fa-angle-right'></i>", isOpen: false }, | |
26 | + { path: "/document.page", pathName: "자료실", subMenu: [{ path: "/document.page", pathName: "기술문서" }, { path: "/reference.page", pathName: "자료집" }], icon: "<i class='fa-solid fa-angle-right'></i>", isOpen: false }, | |
27 | + { path: "/statistics.page", pathName: "통계서비스" }, | |
28 | + { path: "/corporatePR.page", pathName: "네트워킹", subMenu: [{ path: "/corporatePR.page", pathName: "기업홍보관" }], icon: "<i class='fa-solid fa-angle-right'></i>", isOpen: false }, | |
29 | + { path: "/modal.page", pathName: "팝업관리" }, | |
30 | + { path: "/email.page", pathName: "메일발송" }, | |
31 | + { path: "/userSelectList.page", pathName: "사용자관리" }, | |
32 | + { path: "/subscription .page", pathName: "구독서비스" }, | |
33 | + ] | |
34 | + }; | |
35 | + }, | |
36 | + methods: { | |
37 | + //토글 메뉴 | |
38 | + toggleMenu(menu) { | |
39 | + console.log(menu); | |
40 | + if (menu.hasOwnProperty('isOpen')) { | |
41 | + menu.isOpen = !menu.isOpen; | |
42 | + if (menu.isOpen) { | |
43 | + menu.icon = "<i class='fa-solid fa-angle-down'></i>"; | |
44 | + } else { | |
45 | + menu.icon = "<i class='fa-solid fa-angle-right'></i>"; | |
46 | + } | |
47 | + } | |
48 | + }, | |
49 | + // 하위메뉴 클릭 시 메뉴 닫힘 방지 | |
50 | + stopToggleSubMenuClick(event) { | |
51 | + event.stopPropagation(); | |
52 | + }, | |
53 | + }, | |
54 | + watch: {}, | |
55 | + computed: {}, | |
56 | + components: {}, | |
57 | + mounted() { | |
58 | + console.log("Header mounted"); | |
59 | + }, | |
60 | +}; | |
61 | +</script> | |
62 | + | |
63 | +<style scoped> | |
64 | +.main-menu { | |
65 | + height: 100%; | |
66 | + grid-area: nav; | |
67 | + background-color: #101924; | |
68 | + overflow-y: auto; | |
69 | +} | |
70 | + | |
71 | +.main-menu::-webkit-scrollbar { | |
72 | + width: 10px; | |
73 | +} | |
74 | + | |
75 | +.main-menu::-webkit-scrollbar-thumb { | |
76 | + background-color: #2f3542; | |
77 | + border-radius: 10px; | |
78 | + background-clip: padding-box; | |
79 | + border: 2px solid transparent; | |
80 | +} | |
81 | + | |
82 | +.main-menu::-webkit-scrollbar-track { | |
83 | + background-color: grey; | |
84 | + border-radius: 10px; | |
85 | + box-shadow: inset 0px 0px 5px white; | |
86 | +} | |
87 | + | |
88 | +.logo-wrap h1 a { | |
89 | + display: block; | |
90 | + font-size: 2rem; | |
91 | + font-weight: 900; | |
92 | + color: #fff; | |
93 | + padding: 30px 15px; | |
94 | +} | |
95 | + | |
96 | +.main-menu>ul { | |
97 | + padding: 30px 0; | |
98 | +} | |
99 | + | |
100 | +.main-menu>ul>li>a, | |
101 | +.sub-menu>li>a { | |
102 | + display: block; | |
103 | + color: #fff; | |
104 | + padding: 10px 15px; | |
105 | +} | |
106 | + | |
107 | +.main-menu>ul>li>a { | |
108 | + font-size: 1.6rem; | |
109 | + display: flex; | |
110 | + justify-content: space-between; | |
111 | +} | |
112 | + | |
113 | +.sub-menu { | |
114 | + background-color: #203248; | |
115 | + overflow: hidden; | |
116 | + transition: all 0.5s ease-in-out; | |
117 | +} | |
118 | + | |
119 | +.sub-menu>li>a { | |
120 | + font-size: 1.3rem; | |
121 | + padding: 10px 30px; | |
122 | +} | |
123 | +</style> |
--- client/views/pages/App.vue
+++ client/views/pages/App.vue
... | ... | @@ -1,5 +1,13 @@ |
1 | 1 |
<template> |
2 |
- <div v-cloak> |
|
2 |
+ <div v-if="isUserPage" :class="{ 'layout-wrap': true }"> |
|
3 |
+ <AdminHeader></AdminHeader> |
|
4 |
+ <AdminMenu></AdminMenu> |
|
5 |
+ <div class="main-warp"> |
|
6 |
+ <router-view /> |
|
7 |
+ </div> |
|
8 |
+ <AdminFooter></AdminFooter> |
|
9 |
+ </div> |
|
10 |
+ <div v-else> |
|
3 | 11 |
<Header></Header> |
4 | 12 |
<Menu></Menu> |
5 | 13 |
<div class="main-warp"> |
... | ... | @@ -15,6 +23,9 @@ |
15 | 23 |
import Header from '../layout/Header.vue'; |
16 | 24 |
import Menu from '../layout/Menu.vue'; |
17 | 25 |
import Footer from '../layout/Footer.vue'; |
26 |
+import AdminHeader from '../layout/AdminHeader.vue'; |
|
27 |
+import AdminMenu from '../layout/AdminMenu.vue'; |
|
28 |
+import AdminFooter from '../layout/AdminFooter.vue'; |
|
18 | 29 |
|
19 | 30 |
const App = { |
20 | 31 |
data: () => { |
... | ... | @@ -22,38 +33,38 @@ |
22 | 33 |
title: null, |
23 | 34 |
isLogin: false, |
24 | 35 |
userInfo: { |
25 |
- user_id: null, |
|
36 |
+ user_id: null, |
|
26 | 37 |
}, |
27 | 38 |
store: useStore(), |
28 | 39 |
}; |
29 | 40 |
}, |
30 | 41 |
methods: { |
31 |
-//로그인 사용자 조회 |
|
42 |
+ //로그인 사용자 조회 |
|
32 | 43 |
loginUserSelectOne: function (callback) { |
33 | 44 |
let vm = this; |
34 | 45 |
axios({ |
35 |
- url: "/user/loginUserSelectOne.json", |
|
36 |
- method: "post", |
|
37 |
- headers: { |
|
38 |
- "Content-Type": "application/json; charset=UTF-8", |
|
39 |
- }, |
|
46 |
+ url: "/user/loginUserSelectOne.json", |
|
47 |
+ method: "post", |
|
48 |
+ headers: { |
|
49 |
+ "Content-Type": "application/json; charset=UTF-8", |
|
50 |
+ }, |
|
40 | 51 |
}).then(function (response) { |
41 |
- // console.log("getIsLogin - response : ", response); |
|
42 |
- if (response.data.loginUser != null && response.data.loginUser['user_id'] != null) { |
|
43 |
- vm.store.commit("setLoginUser", response.data.loginUser); |
|
44 |
- vm.isLogin = true; |
|
45 |
- vm.userInfo.user_id = response.data.loginUser['user_id']; |
|
46 |
- } else { |
|
47 |
- vm.store.commit("setLoginUser", null); |
|
48 |
- } |
|
49 |
- if (response.data.key != null && response.data.key['salt'] != null) { |
|
50 |
- vm.store.commit("setKey", response.data.key); |
|
51 |
- } else { |
|
52 |
- vm.store.commit("setKey", null); |
|
53 |
- } |
|
54 |
- callback(response.data); |
|
52 |
+ // console.log("getIsLogin - response : ", response); |
|
53 |
+ if (response.data.loginUser != null && response.data.loginUser['user_id'] != null) { |
|
54 |
+ vm.store.commit("setLoginUser", response.data.loginUser); |
|
55 |
+ vm.isLogin = true; |
|
56 |
+ vm.userInfo.user_id = response.data.loginUser['user_id']; |
|
57 |
+ } else { |
|
58 |
+ vm.store.commit("setLoginUser", null); |
|
59 |
+ } |
|
60 |
+ if (response.data.key != null && response.data.key['salt'] != null) { |
|
61 |
+ vm.store.commit("setKey", response.data.key); |
|
62 |
+ } else { |
|
63 |
+ vm.store.commit("setKey", null); |
|
64 |
+ } |
|
65 |
+ callback(response.data); |
|
55 | 66 |
}).catch(function (error) { |
56 |
- console.log("getIsLogin - error : ", error); |
|
67 |
+ console.log("getIsLogin - error : ", error); |
|
57 | 68 |
}); |
58 | 69 |
} |
59 | 70 |
}, |
... | ... | @@ -61,12 +72,18 @@ |
61 | 72 |
|
62 | 73 |
}, |
63 | 74 |
computed: { |
64 |
- |
|
75 |
+ isUserPage() { |
|
76 |
+ // 현재 URL을 기반으로 사용자와 관리자 페이지 여부를 판단 |
|
77 |
+ return this.$route.path.startsWith('/adm'); |
|
78 |
+ } |
|
65 | 79 |
}, |
66 | 80 |
components: { |
67 | 81 |
'Header': Header, |
82 |
+ 'AdminHeader': AdminHeader, |
|
68 | 83 |
'Menu': Menu, |
84 |
+ 'AdminMenu': AdminMenu, |
|
69 | 85 |
'Footer': Footer, |
86 |
+ 'AdminFooter': AdminFooter, |
|
70 | 87 |
}, |
71 | 88 |
mounted: () => { |
72 | 89 |
console.log('Vue mounted'); |
... | ... | @@ -117,4 +134,21 @@ |
117 | 134 |
export default App; |
118 | 135 |
</script> |
119 | 136 |
|
120 |
-<style></style> |
|
137 |
+<style scoped> |
|
138 |
+.layout-wrap { |
|
139 |
+ width: 100%; |
|
140 |
+ height: 100%; |
|
141 |
+ display: grid; |
|
142 |
+ grid-template-columns: 200px minmax(1234px, 1fr); |
|
143 |
+ grid-template-rows: 50px 1fr 33px; |
|
144 |
+ grid-template-areas: |
|
145 |
+ "nav header " |
|
146 |
+ "nav main " |
|
147 |
+ "nav footer " |
|
148 |
+} |
|
149 |
+ |
|
150 |
+.main-wrap { |
|
151 |
+ padding: 30px; |
|
152 |
+ grid-area: main; |
|
153 |
+} |
|
154 |
+</style> |
--- client/views/pages/AppRouter.js
+++ client/views/pages/AppRouter.js
... | ... | @@ -1,12 +1,16 @@ |
1 | 1 |
import { createWebHistory, createRouter } from "vue-router"; |
2 | 2 |
|
3 |
-import Main from "../pages/main/Main.vue"; |
|
4 |
-import Matching from "../pages/matching/Matching.vue"; |
|
5 |
-import Data from "../pages/Data/Data.vue"; |
|
6 |
-import Login from "../pages/login/Login.vue"; |
|
7 |
-import Join from "../pages/Join/Join.vue"; |
|
8 |
-import Introduction from "../pages/introduction/Introduction.vue"; |
|
9 |
-import Technology from "../pages/Data/Technology.vue"; |
|
3 |
+import Main from "../pages/user/main/Main.vue"; |
|
4 |
+import Matching from "../pages/user/matching/Matching.vue"; |
|
5 |
+import Data from "../pages/user/Data/Data.vue"; |
|
6 |
+import Login from "../pages/user/login/Login.vue"; |
|
7 |
+import Join from "../pages/user/Join/Join.vue"; |
|
8 |
+import Introduction from "../pages/user/introduction/Introduction.vue"; |
|
9 |
+import Technology from "../pages/user/Data/Technology.vue"; |
|
10 |
+ |
|
11 |
+ /* 관리자 */ |
|
12 |
+ import AdminMain from "../pages/admin/main/Main.vue"; |
|
13 |
+ import AdminUser from "../pages/admin/user/UserSelectList.vue"; |
|
10 | 14 |
|
11 | 15 |
const routes = [ |
12 | 16 |
/* 메인화면 */ |
... | ... | @@ -17,6 +21,9 @@ |
17 | 21 |
{ path: "/Join.page", name: "Join", component: Join }, |
18 | 22 |
{ path: "/Introduction.page", name: "Introduction", component: Introduction }, |
19 | 23 |
{ path: "/Technology.page", name: "Technology", component: Technology }, |
24 |
+ /* 관리자 */ |
|
25 |
+ { path: "/adm.page", name: "AdminMain", component: AdminMain }, |
|
26 |
+ { path: "/adm/user.page", name: "AdminUser", component: AdminUser }, |
|
20 | 27 |
]; |
21 | 28 |
|
22 | 29 |
const AppRouter = createRouter({ |
+++ client/views/pages/admin/login/Login.vue
... | ... | @@ -0,0 +1,16 @@ |
1 | +<template> | |
2 | + | |
3 | +</template> | |
4 | + | |
5 | +<script> | |
6 | +export default { | |
7 | + data() { | |
8 | + return {}; | |
9 | + }, | |
10 | + methods: {}, | |
11 | + watch: {}, | |
12 | + computed: {}, | |
13 | + components: {}, | |
14 | + mounted() { }, | |
15 | +}; | |
16 | +</script> |
+++ client/views/pages/admin/main/Main.vue
... | ... | @@ -0,0 +1,19 @@ |
1 | +<template> | |
2 | + | |
3 | +</template> | |
4 | + | |
5 | +<script> | |
6 | +import axios from "axios"; | |
7 | + | |
8 | + | |
9 | +export default { | |
10 | + data() { | |
11 | + return {} | |
12 | + }, | |
13 | + methods: {}, | |
14 | + watch: {}, | |
15 | + computed: {}, | |
16 | + components: {}, | |
17 | + mounted() {} | |
18 | +} | |
19 | +</script> |
+++ client/views/pages/admin/user/UserInsert.vue
... | ... | @@ -0,0 +1,0 @@ |
+++ client/views/pages/admin/user/UserSelectList.vue
... | ... | @@ -0,0 +1,143 @@ |
1 | +<template> | |
2 | + <div class="user-wrap"> | |
3 | + <div class="content-box"> | |
4 | + <div class="title-wrap"> | |
5 | + <h2 class="main-title">회원관리</h2> | |
6 | + </div> | |
7 | + <div class="content-wrap"> | |
8 | + <ul class="tab-menu"> | |
9 | + <li v-for="(tab, index) in tabMenu" :key="index"> | |
10 | + <a @click="currentTab = index" :class="{ active: currentTab === index }">{{ tab }}</a> | |
11 | + </li> | |
12 | + </ul> | |
13 | + <div class="tab-content"> | |
14 | + <div v-show="currentTab == 0"> | |
15 | + <table> | |
16 | + <thead> | |
17 | + <tr> | |
18 | + <th>아이디</th> | |
19 | + <th>기업명</th> | |
20 | + <th>담당자명</th> | |
21 | + <th>이메일</th> | |
22 | + </tr> | |
23 | + </thead> | |
24 | + <tbody> | |
25 | + <tr v-for="(user,index) in user1" :key="index"> | |
26 | + <td>{{ user.id }}</td> | |
27 | + <td>{{ user.company }}</td> | |
28 | + <td>{{ user.name }}</td> | |
29 | + <td>{{ user.email }}</td> | |
30 | + </tr> | |
31 | + </tbody> | |
32 | + </table> | |
33 | + </div> | |
34 | + <div v-show="currentTab == 1"> | |
35 | + <table> | |
36 | + <thead> | |
37 | + <tr> | |
38 | + <th>아이디</th> | |
39 | + <th>기업명</th> | |
40 | + <th>담당자명</th> | |
41 | + <th>이메일</th> | |
42 | + </tr> | |
43 | + </thead> | |
44 | + <tbody> | |
45 | + <tr v-for="(user,index) in user2" :key="index"> | |
46 | + <td>{{ user.id }}</td> | |
47 | + <td>{{ user.company }}</td> | |
48 | + <td>{{ user.name }}</td> | |
49 | + <td>{{ user.email }}</td> | |
50 | + </tr> | |
51 | + </tbody> | |
52 | + </table> | |
53 | + </div> | |
54 | + <div v-show="currentTab == 2"> | |
55 | + <table> | |
56 | + <thead> | |
57 | + <tr> | |
58 | + <th>아이디</th> | |
59 | + <th>기업명</th> | |
60 | + <th>담당자명</th> | |
61 | + <th>이메일</th> | |
62 | + </tr> | |
63 | + </thead> | |
64 | + <tbody> | |
65 | + <tr v-for="(user,index) in user3" :key="index"> | |
66 | + <td>{{ user.id }}</td> | |
67 | + <td>{{ user.company }}</td> | |
68 | + <td>{{ user.name }}</td> | |
69 | + <td>{{ user.email }}</td> | |
70 | + </tr> | |
71 | + </tbody> | |
72 | + </table> | |
73 | + <div class="btn-wrap"> | |
74 | + <button class="blue-btn">등록</button> | |
75 | + </div> | |
76 | + </div> | |
77 | + </div> | |
78 | + </div> | |
79 | + </div> | |
80 | + | |
81 | + </div> | |
82 | +</template> | |
83 | +<script> | |
84 | +export default { | |
85 | + data() { | |
86 | + return { | |
87 | + currentTab: 0, | |
88 | + tabMenu: ['일반회원', '기관회원', '관리자'], | |
89 | + user1:[ | |
90 | + {id:"test1",company:"test1C",name:"user1",email:"test1@abc.com"}, | |
91 | + {id:"teste2",company:"test2C",name:"user2",email:"test2@abc.com"}, | |
92 | + {id:"test3",company:"test3C",name:"user3",email:"test3@abc.com"}, | |
93 | + ], | |
94 | + user2:[ | |
95 | + {id:"test1",company:"test1C",name:"user1",email:"test1@abc.com"}, | |
96 | + {id:"teste2",company:"test2C",name:"user2",email:"test2@abc.com"}, | |
97 | + {id:"test3",company:"test3C",name:"user3",email:"test3@abc.com"}, | |
98 | + ], | |
99 | + user3:[ | |
100 | + {id:"test1",company:"test1C",name:"user1",email:"test1@abc.com"}, | |
101 | + {id:"teste2",company:"test2C",name:"user2",email:"test2@abc.com"}, | |
102 | + {id:"test3",company:"test3C",name:"user3",email:"test3@abc.com"}, | |
103 | + ] | |
104 | + }; | |
105 | + }, | |
106 | + methods: {}, | |
107 | + watch: {}, | |
108 | + computed: {}, | |
109 | + components: {}, | |
110 | + mounted() { }, | |
111 | +}; | |
112 | +</script> | |
113 | +<style scoped> | |
114 | +.tab-menu{ | |
115 | + display: flex; | |
116 | + justify-content: flex-start; | |
117 | + align-items: center; | |
118 | +} | |
119 | +.tab-menu li a{ | |
120 | + padding: 10px 15px; | |
121 | + display: block; | |
122 | + font-size: 1.6rem; | |
123 | + border-radius: 5px 5px 0 0; | |
124 | + cursor: pointer; | |
125 | + border: 1px solid #ddd; | |
126 | + border-bottom: 0; | |
127 | +} | |
128 | + | |
129 | +.tab-menu li a.active{ | |
130 | + background-color: #f8f8f8; | |
131 | + color: #2b7cff; | |
132 | + font-weight: 800; | |
133 | + border: 0; | |
134 | +} | |
135 | + | |
136 | +.tab-content{ | |
137 | + width: 100%; | |
138 | + height: 100%; | |
139 | + background-color: #f8f8f8; | |
140 | + padding: 15px; | |
141 | + | |
142 | +} | |
143 | +</style> |
+++ client/views/pages/admin/user/UserSelectOne.vue
... | ... | @@ -0,0 +1,38 @@ |
1 | +<template> | |
2 | + <div class="user-wrap"> | |
3 | + <div class="content-box"> | |
4 | + <div class="title-wrap"> | |
5 | + <h2 class="main-title">회원관리</h2> | |
6 | + </div> | |
7 | + <div class="content-wrap"> | |
8 | + <ul class="tab-menu"> | |
9 | + <li v-for="(tab, index) in tabMenu" :key="index" :class="{ active: currentTab === index }"> | |
10 | + <a href="#" v-on:click="currentTab = index">{{ tab }}</a> | |
11 | + </li> | |
12 | + </ul> | |
13 | + <div class="tab-content"> | |
14 | + <div v-show="currentTab == 0">1</div> | |
15 | + <div v-show="currentTab == 1">2</div> | |
16 | + <div v-show="currentTab == 2">3</div> | |
17 | + </div> | |
18 | + </div> | |
19 | + </div> | |
20 | + | |
21 | + </div> | |
22 | +</template> | |
23 | +<script> | |
24 | +export default { | |
25 | + data() { | |
26 | + return { | |
27 | + currentTab: 0, | |
28 | + tabMenu: ['일반회원', '기관회원', '관리자'] | |
29 | + }; | |
30 | + }, | |
31 | + methods: {}, | |
32 | + watch: {}, | |
33 | + computed: {}, | |
34 | + components: {}, | |
35 | + mounted() { }, | |
36 | +}; | |
37 | +</script> | |
38 | +<style scoped></style>> |
--- client/views/pages/Data/Data.vue
+++ client/views/pages/user/Data/Data.vue
No changes |
--- client/views/pages/Data/Technology.vue
+++ client/views/pages/user/Data/Technology.vue
... | ... | @@ -2,7 +2,7 @@ |
2 | 2 |
<div class="w1400"> |
3 | 3 |
<div class="tech"> |
4 | 4 |
<section class="tech-logo"> |
5 |
- <img src="../../../resources/jpg/tech-logo.png" alt=""> |
|
5 |
+ <img src="../../../../resources/jpg/tech-logo.png" alt=""> |
|
6 | 6 |
|
7 | 7 |
<h1>기술문서</h1> |
8 | 8 |
</section> |
... | ... | @@ -16,7 +16,7 @@ |
16 | 16 |
|
17 | 17 |
</div> |
18 | 18 |
<div> |
19 |
- <img src="../../../resources/jpg/data-img3.png" alt=""> |
|
19 |
+ <img src="../../../../resources/jpg/data-img3.png" alt=""> |
|
20 | 20 |
</div> |
21 | 21 |
<div> |
22 | 22 |
<p>기술문서1의 설명</p> |
... | ... | @@ -31,7 +31,7 @@ |
31 | 31 |
<h3>기술문서</h3> |
32 | 32 |
</div> |
33 | 33 |
<div> |
34 |
- <img src="../../../resources/jpg/data-img3.png" alt=""> |
|
34 |
+ <img src="../../../../resources/jpg/data-img3.png" alt=""> |
|
35 | 35 |
</div> |
36 | 36 |
<div> |
37 | 37 |
<p>기술문서1의 설명</p> |
... | ... | @@ -46,7 +46,7 @@ |
46 | 46 |
<h3>기술문서</h3> |
47 | 47 |
</div> |
48 | 48 |
<div> |
49 |
- <img src="../../../resources/jpg/data-img3.png" alt=""> |
|
49 |
+ <img src="../../../../resources/jpg/data-img3.png" alt=""> |
|
50 | 50 |
</div> |
51 | 51 |
<div> |
52 | 52 |
<p>기술문서1의 설명</p> |
... | ... | @@ -61,7 +61,7 @@ |
61 | 61 |
<h3>기술문서</h3> |
62 | 62 |
</div> |
63 | 63 |
<div> |
64 |
- <img src="../../../resources/jpg/data-img3.png" alt=""> |
|
64 |
+ <img src="../../../../resources/jpg/data-img3.png" alt=""> |
|
65 | 65 |
</div> |
66 | 66 |
<div> |
67 | 67 |
<p>기술문서1의 설명</p> |
... | ... | @@ -76,7 +76,7 @@ |
76 | 76 |
<h3>기술문서</h3> |
77 | 77 |
</div> |
78 | 78 |
<div> |
79 |
- <img src="../../../resources/jpg/data-img3.png" alt=""> |
|
79 |
+ <img src="../../../../resources/jpg/data-img3.png" alt=""> |
|
80 | 80 |
</div> |
81 | 81 |
<div> |
82 | 82 |
<p>기술문서1의 설명</p> |
... | ... | @@ -91,7 +91,7 @@ |
91 | 91 |
<h3>기술문서</h3> |
92 | 92 |
</div> |
93 | 93 |
<div> |
94 |
- <img src="../../../resources/jpg/data-img3.png" alt=""> |
|
94 |
+ <img src="../../../../resources/jpg/data-img3.png" alt=""> |
|
95 | 95 |
</div> |
96 | 96 |
<div> |
97 | 97 |
<p>기술문서1의 설명</p> |
... | ... | @@ -106,7 +106,7 @@ |
106 | 106 |
<h3>기술문서</h3> |
107 | 107 |
</div> |
108 | 108 |
<div> |
109 |
- <img src="../../../resources/jpg/data-img3.png" alt=""> |
|
109 |
+ <img src="../../../../resources/jpg/data-img3.png" alt=""> |
|
110 | 110 |
</div> |
111 | 111 |
<div> |
112 | 112 |
<p>기술문서1의 설명</p> |
... | ... | @@ -121,7 +121,7 @@ |
121 | 121 |
<h3>기술문서</h3> |
122 | 122 |
</div> |
123 | 123 |
<div> |
124 |
- <img src="../../../resources/jpg/data-img3.png" alt=""> |
|
124 |
+ <img src="../../../../resources/jpg/data-img3.png" alt=""> |
|
125 | 125 |
</div> |
126 | 126 |
<div> |
127 | 127 |
<p>기술문서1의 설명</p> |
... | ... | @@ -136,7 +136,7 @@ |
136 | 136 |
<h3>기술문서</h3> |
137 | 137 |
</div> |
138 | 138 |
<div> |
139 |
- <img src="../../../resources/jpg/data-img3.png" alt=""> |
|
139 |
+ <img src="../../../../resources/jpg/data-img3.png" alt=""> |
|
140 | 140 |
</div> |
141 | 141 |
<div> |
142 | 142 |
<p>기술문서1의 설명</p> |
--- client/views/pages/introduction/Introduction.vue
+++ client/views/pages/user/introduction/Introduction.vue
... | ... | @@ -8,7 +8,7 @@ |
8 | 8 |
|
9 | 9 |
<section class="intro-img"> |
10 | 10 |
<div> |
11 |
- <img src="../../../resources/jpg/intro.png" alt=""> |
|
11 |
+ <img src="../../../../resources/jpg/intro.png" alt=""> |
|
12 | 12 |
</div> |
13 | 13 |
</section> |
14 | 14 |
</div> |
--- client/views/pages/join/Join.vue
+++ client/views/pages/user/join/Join.vue
... | ... | @@ -8,11 +8,11 @@ |
8 | 8 |
<input type="radio" id="one" v-model="selectedMembership" value="one"> |
9 | 9 |
<label for="one" class="radio-t t1" |
10 | 10 |
:style="{ backgroundColor: selectedMembership === 'one' ? '#86868644' : '#e2ecfc' }">기관회원 |
11 |
- <img src="../../../resources/jpg/join-bt2.png" alt=""></label> |
|
11 |
+ <img src="../../../../resources/jpg/join-bt2.png" alt=""></label> |
|
12 | 12 |
<input type="radio" id="two" v-model="selectedMembership" value="two"> |
13 | 13 |
<label for="two" class="radio-t t2" |
14 | 14 |
:style="{ backgroundColor: selectedMembership === 'two' ? '#86868644' : '#e6fff1' }">일반회원 |
15 |
- <img src="../../../resources/jpg/join-bt.png" alt=""></label> |
|
15 |
+ <img src="../../../../resources/jpg/join-bt.png" alt=""></label> |
|
16 | 16 |
|
17 | 17 |
</div> |
18 | 18 |
</section> |
--- client/views/pages/login/Login.vue
+++ client/views/pages/user/login/Login.vue
... | ... | @@ -3,7 +3,7 @@ |
3 | 3 |
<div class=" login-sec"> |
4 | 4 |
<section class="login-logo"> |
5 | 5 |
<div class="login-logo-d"> |
6 |
- <img src="../../../resources/jpg/logo/keris.gif" alt=""> |
|
6 |
+ <img src="../../../../resources/jpg/logo/keris.gif" alt=""> |
|
7 | 7 |
<h1>AI 디지털교과서 통합지원센터</h1> |
8 | 8 |
</div> |
9 | 9 |
</section> |
--- client/views/pages/main/Main.vue
+++ client/views/pages/user/main/Main.vue
... | ... | @@ -85,28 +85,28 @@ |
85 | 85 |
|
86 | 86 |
<div class="m-p-c-2"> |
87 | 87 |
<div> |
88 |
- <img src="../../../resources/jpg/fille.png" alt=""> |
|
88 |
+ <img src="../../../../resources/jpg/fille.png" alt=""> |
|
89 | 89 |
<input type="button" value="매칭서비스" class="m-p-ai"> |
90 | 90 |
|
91 | 91 |
</div> |
92 | 92 |
</div> |
93 | 93 |
<div class="m-p-c-3"> |
94 | 94 |
<div> |
95 |
- <img src="../../../resources/jpg/m-p-ai2.png" alt=""> |
|
95 |
+ <img src="../../../../resources/jpg/m-p-ai2.png" alt=""> |
|
96 | 96 |
<input type="button" value="자료집" class="m-p-ai"> |
97 | 97 |
|
98 | 98 |
</div> |
99 | 99 |
</div> |
100 | 100 |
<div class="m-p-c-4"> |
101 | 101 |
<div> |
102 |
- <img src="../../../resources/jpg/m-p-ai.png" alt=""> |
|
102 |
+ <img src="../../../../resources/jpg/m-p-ai.png" alt=""> |
|
103 | 103 |
<input type="button" value="AI 디지털교과서 정책소개 다운" class="m-p-ai"> |
104 | 104 |
|
105 | 105 |
</div> |
106 | 106 |
</div> |
107 | 107 |
<div class="m-p-c-5"> |
108 | 108 |
<div> |
109 |
- <img src="../../../resources/jpg/ki-i.png" alt=""> |
|
109 |
+ <img src="../../../../resources/jpg/ki-i.png" alt=""> |
|
110 | 110 |
<input type="button" value="기술문서" class="m-p-ai"> |
111 | 111 |
|
112 | 112 |
</div> |
... | ... | @@ -311,15 +311,15 @@ |
311 | 311 |
1023: { slidesPerView: 5 } |
312 | 312 |
}" :navigation="false" :modules="modules" class="mySwiper swiper-2"> |
313 | 313 |
|
314 |
- <swiper-slide><img src="../../../resources/jpg/logo/ko-go.jpg" alt=""></swiper-slide> |
|
315 |
- <swiper-slide><img src="../../../resources/jpg/logo/ko-go.jpg" alt=""></swiper-slide> |
|
316 |
- <swiper-slide><img src="../../../resources/jpg/logo/kefa.png" alt=""></swiper-slide> |
|
317 |
- <swiper-slide><img src="../../../resources/jpg/logo/ko-go.jpg" alt=""></swiper-slide> |
|
318 |
- <swiper-slide><img src="../../../resources/jpg/logo/ko-go.jpg" alt=""></swiper-slide> |
|
319 |
- <swiper-slide><img src="../../../resources/jpg/logo/keris.gif" alt=""></swiper-slide> |
|
320 |
- <swiper-slide><img src="../../../resources/jpg/logo/ko-go.jpg" alt=""></swiper-slide> |
|
321 |
- <swiper-slide><img src="../../../resources/jpg/logo/ko-go.jpg" alt=""></swiper-slide> |
|
322 |
- <swiper-slide><img src="../../../resources/jpg/logo/ko.png" alt=""></swiper-slide> |
|
314 |
+ <swiper-slide><img src="../../../../resources/jpg/logo/ko-go.jpg" alt=""></swiper-slide> |
|
315 |
+ <swiper-slide><img src="../../../../resources/jpg/logo/ko-go.jpg" alt=""></swiper-slide> |
|
316 |
+ <swiper-slide><img src="../../../../resources/jpg/logo/kefa.png" alt=""></swiper-slide> |
|
317 |
+ <swiper-slide><img src="../../../../resources/jpg/logo/ko-go.jpg" alt=""></swiper-slide> |
|
318 |
+ <swiper-slide><img src="../../../../resources/jpg/logo/ko-go.jpg" alt=""></swiper-slide> |
|
319 |
+ <swiper-slide><img src="../../../../resources/jpg/logo/keris.gif" alt=""></swiper-slide> |
|
320 |
+ <swiper-slide><img src="../../../../resources/jpg/logo/ko-go.jpg" alt=""></swiper-slide> |
|
321 |
+ <swiper-slide><img src="../../../../resources/jpg/logo/ko-go.jpg" alt=""></swiper-slide> |
|
322 |
+ <swiper-slide><img src="../../../../resources/jpg/logo/ko.png" alt=""></swiper-slide> |
|
323 | 323 |
|
324 | 324 |
</swiper> |
325 | 325 |
</div> |
--- client/views/pages/matching/Matching.vue
+++ client/views/pages/user/matching/Matching.vue
... | ... | @@ -8,7 +8,7 @@ |
8 | 8 |
<div class="w1400"> |
9 | 9 |
<div class="mat-b-b"> |
10 | 10 |
<div class="mat-img"> |
11 |
- <img src="../../../resources/jpg/mat-img.png" alt=""> |
|
11 |
+ <img src="../../../../resources/jpg/mat-img.png" alt=""> |
|
12 | 12 |
</div> |
13 | 13 |
<!-- 매칭 텍스트 --> |
14 | 14 |
<div class="mat-text"> |
... | ... | @@ -16,7 +16,7 @@ |
16 | 16 |
<p>추천 매칭서비스</p> |
17 | 17 |
</div> |
18 | 18 |
<div class="mat-img"> |
19 |
- <img src="../../../resources/jpg/mat-img1.png" alt=""> |
|
19 |
+ <img src="../../../../resources/jpg/mat-img1.png" alt=""> |
|
20 | 20 |
</div> |
21 | 21 |
|
22 | 22 |
</div> |
... | ... | @@ -40,7 +40,7 @@ |
40 | 40 |
<div> |
41 | 41 |
|
42 | 42 |
<h3>(주)지학사</h3> |
43 |
- <img src="../../../resources/jpg/zigaksa.jpg" width="20px" alt=""> |
|
43 |
+ <img src="../../../../resources/jpg/zigaksa.jpg" width="20px" alt=""> |
|
44 | 44 |
<p>기업은 고객,고객은 기업이라는 마인드로 항상 고객의 만족을 최우선의 가치로 실천한다.</p> |
45 | 45 |
<div class="g1-1"> |
46 | 46 |
<p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p> |
... | ... | @@ -59,7 +59,7 @@ |
59 | 59 |
<div class="mat-b-g-2 g1"> |
60 | 60 |
<div> |
61 | 61 |
<h3>(주)지학사</h3> |
62 |
- <img src="../../../resources/jpg/zigaksa.jpg" width="20px" alt=""> |
|
62 |
+ <img src="../../../../resources/jpg/zigaksa.jpg" width="20px" alt=""> |
|
63 | 63 |
<p>기업은 고객,고객은 기업이라는 마인드로 항상 고객의 만족을 최우선의 가치로 실천한다.</p> |
64 | 64 |
<div class="g1-1"> |
65 | 65 |
<p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p> |
... | ... | @@ -77,7 +77,7 @@ |
77 | 77 |
<div class="mat-b-g-3 g1"> |
78 | 78 |
<div> |
79 | 79 |
<h3>(주)지학사</h3> |
80 |
- <img src="../../../resources/jpg/zigaksa.jpg" width="20px" alt=""> |
|
80 |
+ <img src="../../../../resources/jpg/zigaksa.jpg" width="20px" alt=""> |
|
81 | 81 |
<p>기업은 고객,고객은 기업이라는 마인드로 항상 고객의 만족을 최우선의 가치로 실천한다.</p> |
82 | 82 |
<div class="g1-1"> |
83 | 83 |
<p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p> |
... | ... | @@ -95,7 +95,7 @@ |
95 | 95 |
<div class="mat-b-g-3 g1"> |
96 | 96 |
<div> |
97 | 97 |
<h3>(주)지학사</h3> |
98 |
- <img src="../../../resources/jpg/zigaksa.jpg" width="20px" alt=""> |
|
98 |
+ <img src="../../../../resources/jpg/zigaksa.jpg" width="20px" alt=""> |
|
99 | 99 |
<p>기업은 고객,고객은 기업이라는 마인드로 항상 고객의 만족을 최우선의 가치로 실천한다.</p> |
100 | 100 |
<div class="g1-1"> |
101 | 101 |
<p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p> |
... | ... | @@ -113,7 +113,7 @@ |
113 | 113 |
<div class="mat-b-g-3 g1"> |
114 | 114 |
<div> |
115 | 115 |
<h3>(주)지학사</h3> |
116 |
- <img src="../../../resources/jpg/zigaksa.jpg" width="20px" alt=""> |
|
116 |
+ <img src="../../../../resources/jpg/zigaksa.jpg" width="20px" alt=""> |
|
117 | 117 |
<p>기업은 고객,고객은 기업이라는 마인드로 항상 고객의 만족을 최우선의 가치로 실천한다.</p> |
118 | 118 |
<div class="g1-1"> |
119 | 119 |
<p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p> |
... | ... | @@ -131,7 +131,7 @@ |
131 | 131 |
<div class="mat-b-g-3 g1"> |
132 | 132 |
<div> |
133 | 133 |
<h3>(주)지학사</h3> |
134 |
- <img src="../../../resources/jpg/zigaksa.jpg" width="20px" alt=""> |
|
134 |
+ <img src="../../../../resources/jpg/zigaksa.jpg" width="20px" alt=""> |
|
135 | 135 |
<p>기업은 고객,고객은 기업이라는 마인드로 항상 고객의 만족을 최우선의 가치로 실천한다.</p> |
136 | 136 |
<div class="g1-1"> |
137 | 137 |
<p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p> |
--- package-lock.json
+++ package-lock.json
... | ... | @@ -1,5 +1,5 @@ |
1 | 1 |
{ |
2 |
- "name": "KERIS", |
|
2 |
+ "name": "KERIS-1", |
|
3 | 3 |
"lockfileVersion": 3, |
4 | 4 |
"requires": true, |
5 | 5 |
"packages": { |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?