mirror of
http://git.mhez-qa.uplus.co.kr/hubez/hubez-admin.git
synced 2026-01-28 05:54:55 +09:00
hubez-admin partner-git master -> hubez-git transfer 202205241800
This commit is contained in:
11
frontend/src/modules/attractMgt/router/index.js
Normal file
11
frontend/src/modules/attractMgt/router/index.js
Normal file
@@ -0,0 +1,11 @@
|
||||
import ChannelList from '../views/ChannelList'
|
||||
|
||||
export default [
|
||||
{
|
||||
path: '/attractMgt/channelList',
|
||||
component: ChannelList,
|
||||
name: 'channelList',
|
||||
meta: { public: true }
|
||||
}
|
||||
]
|
||||
|
||||
107
frontend/src/modules/attractMgt/views/ChannelList.vue
Normal file
107
frontend/src/modules/attractMgt/views/ChannelList.vue
Normal file
@@ -0,0 +1,107 @@
|
||||
<template>
|
||||
<div class="contents">
|
||||
<div class="contents_wrap">
|
||||
<div class="top_wrap">
|
||||
<h3 class="title">유치채널 목록조회</h3>
|
||||
<p class="breadcrumb">시스템관리 > 권한 관리</p>
|
||||
</div>
|
||||
<div class="info">
|
||||
<div class="count">총 <span>4</span>건</div>
|
||||
<div class="button_group">
|
||||
<button type="button" class="button blue add" onclick="location.href='system_right_add.html';">권한 추가</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="table">
|
||||
<table>
|
||||
<colgroup>
|
||||
<col width="10%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="15%"/>
|
||||
<col width="20%"/>
|
||||
<col width="15%"/>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>NO</th>
|
||||
<th>코드</th>
|
||||
<th>권한명</th>
|
||||
<th>상태</th>
|
||||
<th>등록일</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>4</td>
|
||||
<td>Admin_01</td>
|
||||
<td>슈퍼관리자</td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
<td class="two_btn_group">
|
||||
<button type="button" class="button grey" onclick="location.href='system_right_modify.html';">수정</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>3</td>
|
||||
<td>Admin_01</td>
|
||||
<td>슈퍼관리자</td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
<td class="two_btn_group">
|
||||
<button type="button" class="button grey">수정</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2</td>
|
||||
<td>Admin_01</td>
|
||||
<td>슈퍼관리자</td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
<td class="two_btn_group">
|
||||
<button type="button" class="button grey">수정</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>1</td>
|
||||
<td>Admin_01</td>
|
||||
<td>슈퍼관리자</td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
<td class="two_btn_group">
|
||||
<button type="button" class="button grey">수정</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'channelList',
|
||||
data() {
|
||||
return {
|
||||
|
||||
};
|
||||
},
|
||||
components: {
|
||||
|
||||
},
|
||||
destroyed() {
|
||||
|
||||
},
|
||||
mounted() {
|
||||
|
||||
},
|
||||
methods: {
|
||||
|
||||
}
|
||||
};
|
||||
</script>
|
||||
12
frontend/src/modules/calculate/router/index.js
Normal file
12
frontend/src/modules/calculate/router/index.js
Normal file
@@ -0,0 +1,12 @@
|
||||
import CalcList from '../views/CalcList'
|
||||
|
||||
export default [
|
||||
{
|
||||
path: '/calculate/calcList',
|
||||
component: CalcList,
|
||||
name: 'calcList',
|
||||
meta: { public: true }
|
||||
},
|
||||
|
||||
]
|
||||
|
||||
165
frontend/src/modules/calculate/views/CalcList.vue
Normal file
165
frontend/src/modules/calculate/views/CalcList.vue
Normal file
@@ -0,0 +1,165 @@
|
||||
<template>
|
||||
|
||||
<div class="contents">
|
||||
<div class="contents_wrap">
|
||||
<div class="top_wrap">
|
||||
<h3 class="title">정산이력목록조회</h3>
|
||||
<p class="breadcrumb">시스템관리 > 관리자/유치채널 관리</p>
|
||||
</div>
|
||||
<form autocomplete="off" class="search_form">
|
||||
<div class="search_wrap">
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">권한</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="대리점">대리점</option>
|
||||
<option value="운영자">운영자</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">상태</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="사용">사용</option>
|
||||
<option value="중지">중지</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="input_box id">
|
||||
<label for="id1" class="label">ID</label>
|
||||
<input type="text" id="id1" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<div class="input_box">
|
||||
<label for="name" class="label">이름(대리점명)</label>
|
||||
<input type="text" id="name" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<button type="button" class="button grey">조회</button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="info">
|
||||
<div class="count">총 <span>100</span>건</div>
|
||||
<div class="button_group">
|
||||
<button type="button" class="button blue admin">관리자 등록</button>
|
||||
<button type="button" class="button blue channel">유지채널 등록</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="table">
|
||||
<table>
|
||||
<colgroup>
|
||||
<col width="5%"/>
|
||||
<col width="15%"/>
|
||||
<col width="15%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="5%"/>
|
||||
<col width="20%"/>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><input type="checkbox" id="admin_check1"><label for="admin_check1"></label></th>
|
||||
<th>NO</th>
|
||||
<th>권한</th>
|
||||
<th>이름(대리점명)</th>
|
||||
<th>ID</th>
|
||||
<th>상태</th>
|
||||
<th>등록일</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><input type="checkbox" checked id="admin_check2"><label for="admin_check2"></label></td>
|
||||
<td>10</td>
|
||||
<td>대리점</td>
|
||||
<td>유플러스</td>
|
||||
<td><a href="javascript:void(0)">uplus1</a></td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div> -->
|
||||
<div class="table">
|
||||
<custom-grid
|
||||
ref="table"
|
||||
:totalItems="'totalItems'"
|
||||
:url="testList.url"
|
||||
:perPage="testList.perPage"
|
||||
:initialRequest="testList.initialRequest"
|
||||
:pagination="testList.pagination"
|
||||
:isCheckbox="testList.isCheckbox"
|
||||
:columns="testList.columns"
|
||||
:noDataStr="testList.noDataStr"
|
||||
:addCls="testList.addCls"
|
||||
:header="testList.header"
|
||||
></custom-grid>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import customGrid from '@/components/CustomGrid';
|
||||
//import api from '../service/api';
|
||||
export default {
|
||||
name: 'calcList',
|
||||
data() {
|
||||
return {
|
||||
testList: {
|
||||
url: '/api/v1/bo/sysMgt/adminList',
|
||||
perPage: 20,
|
||||
pagination: true,
|
||||
isCheckbox: true,
|
||||
initialRequest: false,
|
||||
addCls: 'box_OFvis',
|
||||
|
||||
|
||||
header: [
|
||||
[
|
||||
{ header: 'NO', childNames: [] },
|
||||
{ header: '권한', childNames: [] },
|
||||
{ header: '이름(대리점명)', childNames: [] },
|
||||
{ header: 'ID', childNames: [] },
|
||||
{ header: '상태', childNames: [] },
|
||||
{ header: '등록일', childNames: [] }
|
||||
]
|
||||
],
|
||||
|
||||
columns: [
|
||||
{ name: 'no', header: 'NO', align: 'center', width: 60 },
|
||||
{ name: 'auth', header: '권한', align: 'left', width: 160 },
|
||||
{ name: 'name', header: '이름(대리점명)', align: 'center', width: 130},
|
||||
{ name: 'adminId', header: 'ID', align: 'center', width: 130},
|
||||
{ name: 'adminStat', header: '상태', align: 'center', width: 130},
|
||||
{ name: 'regDt', header: '등록일', width: 90, cls: 'td_line' }
|
||||
],
|
||||
noDataStr: '검색 결과가 없습니다.',
|
||||
// params: {
|
||||
// apprResult: '',
|
||||
// searchType: '',
|
||||
// searchText: '',
|
||||
// startDate: '',
|
||||
// endDate: ''
|
||||
// },
|
||||
excelHeader: []
|
||||
}
|
||||
};
|
||||
},
|
||||
components: {
|
||||
customGrid: customGrid
|
||||
},
|
||||
destroyed() {
|
||||
|
||||
},
|
||||
mounted() {
|
||||
let isKeep = false;
|
||||
isKeep = true;
|
||||
this.search(isKeep);
|
||||
},
|
||||
methods: {
|
||||
search: function(isKeep) {
|
||||
console.log(this.testList.params);
|
||||
this.$refs.table.search(this.testList.params, isKeep);
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
||||
12
frontend/src/modules/channelMgt/router/index.js
Normal file
12
frontend/src/modules/channelMgt/router/index.js
Normal file
@@ -0,0 +1,12 @@
|
||||
import TmpltList from '../views/TmpltList'
|
||||
|
||||
export default [
|
||||
{
|
||||
path: '/channelMgt/tmpltList',
|
||||
component: TmpltList,
|
||||
name: 'tmpltList',
|
||||
meta: { public: true }
|
||||
},
|
||||
|
||||
]
|
||||
|
||||
165
frontend/src/modules/channelMgt/views/TmpltList.vue
Normal file
165
frontend/src/modules/channelMgt/views/TmpltList.vue
Normal file
@@ -0,0 +1,165 @@
|
||||
<template>
|
||||
|
||||
<div class="contents">
|
||||
<div class="contents_wrap">
|
||||
<div class="top_wrap">
|
||||
<h3 class="title">알림톡 템플릿 목록 조회</h3>
|
||||
<p class="breadcrumb">시스템관리 > 관리자/유치채널 관리</p>
|
||||
</div>
|
||||
<form autocomplete="off" class="search_form">
|
||||
<div class="search_wrap">
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">권한</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="대리점">대리점</option>
|
||||
<option value="운영자">운영자</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">상태</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="사용">사용</option>
|
||||
<option value="중지">중지</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="input_box id">
|
||||
<label for="id1" class="label">ID</label>
|
||||
<input type="text" id="id1" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<div class="input_box">
|
||||
<label for="name" class="label">이름(대리점명)</label>
|
||||
<input type="text" id="name" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<button type="button" class="button grey">조회</button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="info">
|
||||
<div class="count">총 <span>100</span>건</div>
|
||||
<div class="button_group">
|
||||
<button type="button" class="button blue admin">관리자 등록</button>
|
||||
<button type="button" class="button blue channel">유지채널 등록</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="table">
|
||||
<table>
|
||||
<colgroup>
|
||||
<col width="5%"/>
|
||||
<col width="15%"/>
|
||||
<col width="15%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="5%"/>
|
||||
<col width="20%"/>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><input type="checkbox" id="admin_check1"><label for="admin_check1"></label></th>
|
||||
<th>NO</th>
|
||||
<th>권한</th>
|
||||
<th>이름(대리점명)</th>
|
||||
<th>ID</th>
|
||||
<th>상태</th>
|
||||
<th>등록일</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><input type="checkbox" checked id="admin_check2"><label for="admin_check2"></label></td>
|
||||
<td>10</td>
|
||||
<td>대리점</td>
|
||||
<td>유플러스</td>
|
||||
<td><a href="javascript:void(0)">uplus1</a></td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div> -->
|
||||
<div class="table">
|
||||
<custom-grid
|
||||
ref="table"
|
||||
:totalItems="'totalItems'"
|
||||
:url="testList.url"
|
||||
:perPage="testList.perPage"
|
||||
:initialRequest="testList.initialRequest"
|
||||
:pagination="testList.pagination"
|
||||
:isCheckbox="testList.isCheckbox"
|
||||
:columns="testList.columns"
|
||||
:noDataStr="testList.noDataStr"
|
||||
:addCls="testList.addCls"
|
||||
:header="testList.header"
|
||||
></custom-grid>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import customGrid from '@/components/CustomGrid';
|
||||
//import api from '../service/api';
|
||||
export default {
|
||||
name: 'temltList',
|
||||
data() {
|
||||
return {
|
||||
testList: {
|
||||
url: '/api/v1/bo/sysMgt/adminList',
|
||||
perPage: 20,
|
||||
pagination: true,
|
||||
isCheckbox: true,
|
||||
initialRequest: false,
|
||||
addCls: 'box_OFvis',
|
||||
|
||||
|
||||
header: [
|
||||
[
|
||||
{ header: 'NO', childNames: [] },
|
||||
{ header: '권한', childNames: [] },
|
||||
{ header: '이름(대리점명)', childNames: [] },
|
||||
{ header: 'ID', childNames: [] },
|
||||
{ header: '상태', childNames: [] },
|
||||
{ header: '등록일', childNames: [] }
|
||||
]
|
||||
],
|
||||
|
||||
columns: [
|
||||
{ name: 'no', header: 'NO', align: 'center', width: 60 },
|
||||
{ name: 'auth', header: '권한', align: 'left', width: 160 },
|
||||
{ name: 'name', header: '이름(대리점명)', align: 'center', width: 130},
|
||||
{ name: 'adminId', header: 'ID', align: 'center', width: 130},
|
||||
{ name: 'adminStat', header: '상태', align: 'center', width: 130},
|
||||
{ name: 'regDt', header: '등록일', width: 90, cls: 'td_line' }
|
||||
],
|
||||
noDataStr: '검색 결과가 없습니다.',
|
||||
// params: {
|
||||
// apprResult: '',
|
||||
// searchType: '',
|
||||
// searchText: '',
|
||||
// startDate: '',
|
||||
// endDate: ''
|
||||
// },
|
||||
excelHeader: []
|
||||
}
|
||||
};
|
||||
},
|
||||
components: {
|
||||
customGrid: customGrid
|
||||
},
|
||||
destroyed() {
|
||||
|
||||
},
|
||||
mounted() {
|
||||
let isKeep = false;
|
||||
isKeep = true;
|
||||
this.search(isKeep);
|
||||
},
|
||||
methods: {
|
||||
search: function(isKeep) {
|
||||
console.log(this.testList.params);
|
||||
this.$refs.table.search(this.testList.params, isKeep);
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
||||
33
frontend/src/modules/custMgt/router/index.js
Normal file
33
frontend/src/modules/custMgt/router/index.js
Normal file
@@ -0,0 +1,33 @@
|
||||
import CustList from '../views/CustList'
|
||||
import MemberList from '../views/MemberList'
|
||||
import SubsDetail from '../views/SubsDetail'
|
||||
import MemberDetail from '../views/MemberDetail'
|
||||
|
||||
export default [
|
||||
{
|
||||
path: '/custMgt/subsList',
|
||||
component: CustList,
|
||||
name: 'subsList',
|
||||
meta: { public: true }
|
||||
},
|
||||
{
|
||||
path: '/custMgt/memberList',
|
||||
component: MemberList,
|
||||
name: 'memberList',
|
||||
meta: { public: true }
|
||||
},
|
||||
{
|
||||
path: '/custMgt/subsDetail',
|
||||
component: SubsDetail,
|
||||
name: 'subsDetail',
|
||||
meta: { public: true }
|
||||
},
|
||||
{
|
||||
path: '/custMgt/memberDetail',
|
||||
component: MemberDetail,
|
||||
name: 'memberDetail',
|
||||
meta: { public: true }
|
||||
},
|
||||
|
||||
]
|
||||
|
||||
211
frontend/src/modules/custMgt/views/CustList.vue
Normal file
211
frontend/src/modules/custMgt/views/CustList.vue
Normal file
@@ -0,0 +1,211 @@
|
||||
<template>
|
||||
|
||||
<div class="contents">
|
||||
<div class="contents_wrap">
|
||||
<div class="top_wrap">
|
||||
<h3 class="title">청약고객정보목록조회</h3>
|
||||
<p class="breadcrumb">시스템관리 > 관리자/유치채널 관리</p>
|
||||
</div>
|
||||
<!-- <form autocomplete="off" class="search_form"> -->
|
||||
<div class="search_form">
|
||||
<div class="search_wrap">
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">권한</label>
|
||||
<select name="" id="right" v-model="grid.params.searchType1">
|
||||
<option value="">전체</option>
|
||||
<option value="대리점">대리점</option>
|
||||
<option value="운영자">운영자</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">상태</label>
|
||||
<select name="" id="right" v-model="grid.params.searchType2">
|
||||
<option value="">전체</option>
|
||||
<option value="사용">사용</option>
|
||||
<option value="중지">중지</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="input_box id">
|
||||
<label for="id1" class="label">ID</label>
|
||||
<input type="text" id="id1" placeholder="검색어 입력" v-model="grid.params.searchText1"/>
|
||||
</div>
|
||||
<div class="input_box">
|
||||
<label for="name" class="label">이름(대리점명)</label>
|
||||
<input type="text" id="name" placeholder="검색어 입력" v-model="grid.params.searchText2"/>
|
||||
</div>
|
||||
<button type="button" class="button grey" v-on:click="search">조회</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- </form> -->
|
||||
<div class="info">
|
||||
<!-- <div class="count">총 <span>100</span>건</div> -->
|
||||
<div class="count">총 <span>{{ totalItems }}</span>건</div>
|
||||
<div class="button_group">
|
||||
<button type="button" class="button blue admin" @click="ModalOpen('modal20')">관리자 등록</button>
|
||||
<button type="button" class="button blue channel" @click="ModalOpen('modal23')">유지채널 등록</button>
|
||||
<button type="button" class="button white delete" @click="deleteRow()">삭제</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="table">
|
||||
<table>
|
||||
<colgroup>
|
||||
<col width="5%"/>
|
||||
<col width="15%"/>
|
||||
<col width="15%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="5%"/>
|
||||
<col width="20%"/>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><input type="checkbox" id="admin_check1"><label for="admin_check1"></label></th>
|
||||
<th>NO</th>
|
||||
<th>권한</th>
|
||||
<th>이름(대리점명)</th>
|
||||
<th>ID</th>
|
||||
<th>상태</th>
|
||||
<th>등록일</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><input type="checkbox" checked id="admin_check2"><label for="admin_check2"></label></td>
|
||||
<td>10</td>
|
||||
<td>대리점</td>
|
||||
<td>유플러스</td>
|
||||
<td><a href="javascript:void(0)">uplus1</a></td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div> -->
|
||||
|
||||
<div class="table">
|
||||
<custom-grid
|
||||
ref="table"
|
||||
:totalItems="'totalItems'"
|
||||
:url="grid.url"
|
||||
:perPage="grid.perPage"
|
||||
:initialRequest="grid.initialRequest"
|
||||
:pagination="grid.pagination"
|
||||
:isCheckbox="grid.isCheckbox"
|
||||
:columns="grid.columns"
|
||||
:noDataStr="grid.noDataStr"
|
||||
:addCls="grid.addCls"
|
||||
:header="grid.headder"
|
||||
></custom-grid>
|
||||
</div>
|
||||
<system-popup ref="systemModal"></system-popup>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import customGrid from '@/components/CustomGrid';
|
||||
import SystemPopup from '@/components/SystemPopup.vue';
|
||||
|
||||
//import api from '../service/api';
|
||||
export default {
|
||||
name: 'custList',
|
||||
data() {
|
||||
return {
|
||||
totalItems: 0,
|
||||
grid: {
|
||||
url: '/api/v1/bo/sysMgt/adminList',
|
||||
perPage: 20,
|
||||
pagination: true,
|
||||
isCheckbox: true,
|
||||
initialRequest: false,
|
||||
addCls: 'box_OFvis',
|
||||
|
||||
|
||||
header: [
|
||||
[
|
||||
{ header: 'NO', childNames: [] },
|
||||
{ header: '권한', childNames: [] },
|
||||
{ header: '이름(대리점명)', childNames: [] },
|
||||
{ header: 'ID', childNames: [] },
|
||||
{ header: '상태', childNames: [] },
|
||||
{ header: '등록일', childNames: [] }
|
||||
]
|
||||
],
|
||||
|
||||
columns: [
|
||||
{ name: 'no', header: 'NO', align: 'center', width: 60},
|
||||
{ name: 'auth', header: '권한', align: 'center', width: 160 },
|
||||
{ name: 'name', header: '이름(대리점명)', align: 'center', width: 130},
|
||||
{ name: 'adminId', header: 'ID', align: 'center', width: 130},
|
||||
{ name: 'adminStat', header: '상태', align: 'center', width: 130},
|
||||
{ name: 'regDt', header: '등록일', width: 90, cls: 'td_line' }
|
||||
],
|
||||
noDataStr: '검색 결과가 없습니다.',
|
||||
params: {
|
||||
searchType1: '',
|
||||
searchType2: '',
|
||||
searchText1: '',
|
||||
searchText2: ''
|
||||
},
|
||||
excelHeader: []
|
||||
}
|
||||
};
|
||||
},
|
||||
components: {
|
||||
customGrid: customGrid,
|
||||
SystemPopup
|
||||
},
|
||||
created(){
|
||||
this.$store.commit("login/isLogin", true);
|
||||
this.$store.commit("login/isAuthChk", true);
|
||||
//let cont = document.querySelector(".wrap");
|
||||
//cont.classList.add("main_wrap");
|
||||
},
|
||||
destroyed() {
|
||||
|
||||
},
|
||||
mounted() {
|
||||
let page = 1;
|
||||
// 페이지 정보 및 검색 조건
|
||||
const getCondition = this.$store.getters['searchcondition/getSearchCondition'];
|
||||
let isKeep = false;
|
||||
if (getCondition) {
|
||||
this.grid.perPage = getCondition.perPage;
|
||||
this.grid.params = getCondition.params;
|
||||
if (getCondition.sort != undefined && getCondition.sort != null) {
|
||||
this.grid.params.sort = getCondition.sort;
|
||||
}
|
||||
page = getCondition.page;
|
||||
isKeep = true;
|
||||
}
|
||||
this.search(isKeep);
|
||||
},
|
||||
methods: {
|
||||
search: function(isKeep) {
|
||||
console.log(this.grid.params);
|
||||
this.$refs.table.search(this.grid.params, isKeep);
|
||||
},
|
||||
ModalOpen: function(target){
|
||||
this.$refs.systemModal.ModalOpen(target);
|
||||
},
|
||||
deleteRow: function(){ //로우데이터 삭제하도록 수정
|
||||
var checkTest = this.$refs.table.checkedElementDatas();
|
||||
if(checkTest.length == 0){
|
||||
alert('체크박스에 체크를 해주세요.')
|
||||
}
|
||||
for(var i = 0; i < checkTest.length; i++){
|
||||
alert(checkTest[i].adminId);
|
||||
}
|
||||
},
|
||||
memberDetail: function(data) {
|
||||
if(data.adminId == 'free'){
|
||||
this.$router.push({
|
||||
path: `./views/MemberDetail`
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
}
|
||||
};
|
||||
</script>
|
||||
165
frontend/src/modules/custMgt/views/MemberDetail.vue
Normal file
165
frontend/src/modules/custMgt/views/MemberDetail.vue
Normal file
@@ -0,0 +1,165 @@
|
||||
<template>
|
||||
|
||||
<div class="contents">
|
||||
<div class="contents_wrap">
|
||||
<div class="top_wrap">
|
||||
<h3 class="title">회원 정보 상세 조회</h3>
|
||||
<p class="breadcrumb">시스템관리 > 관리자/유치채널 관리</p>
|
||||
</div>
|
||||
<form autocomplete="off" class="search_form">
|
||||
<div class="search_wrap">
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">권한</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="대리점">대리점</option>
|
||||
<option value="운영자">운영자</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">상태</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="사용">사용</option>
|
||||
<option value="중지">중지</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="input_box id">
|
||||
<label for="id1" class="label">ID</label>
|
||||
<input type="text" id="id1" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<div class="input_box">
|
||||
<label for="name" class="label">이름(대리점명)</label>
|
||||
<input type="text" id="name" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<button type="button" class="button grey">조회</button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="info">
|
||||
<div class="count">총 <span>100</span>건</div>
|
||||
<div class="button_group">
|
||||
<button type="button" class="button blue admin">관리자 등록</button>
|
||||
<button type="button" class="button blue channel">유지채널 등록</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="table">
|
||||
<table>
|
||||
<colgroup>
|
||||
<col width="5%"/>
|
||||
<col width="15%"/>
|
||||
<col width="15%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="5%"/>
|
||||
<col width="20%"/>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><input type="checkbox" id="admin_check1"><label for="admin_check1"></label></th>
|
||||
<th>NO</th>
|
||||
<th>권한</th>
|
||||
<th>이름(대리점명)</th>
|
||||
<th>ID</th>
|
||||
<th>상태</th>
|
||||
<th>등록일</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><input type="checkbox" checked id="admin_check2"><label for="admin_check2"></label></td>
|
||||
<td>10</td>
|
||||
<td>대리점</td>
|
||||
<td>유플러스</td>
|
||||
<td><a href="javascript:void(0)">uplus1</a></td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div> -->
|
||||
<div class="table">
|
||||
<custom-grid
|
||||
ref="table"
|
||||
:totalItems="'totalItems'"
|
||||
:url="testList.url"
|
||||
:perPage="testList.perPage"
|
||||
:initialRequest="testList.initialRequest"
|
||||
:pagination="testList.pagination"
|
||||
:isCheckbox="testList.isCheckbox"
|
||||
:columns="testList.columns"
|
||||
:noDataStr="testList.noDataStr"
|
||||
:addCls="testList.addCls"
|
||||
:header="testList.header"
|
||||
></custom-grid>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import customGrid from '@/components/CustomGrid';
|
||||
//import api from '../service/api';
|
||||
export default {
|
||||
name: 'custList',
|
||||
data() {
|
||||
return {
|
||||
testList: {
|
||||
url: '/api/v1/bo/sysMgt/adminList',
|
||||
perPage: 20,
|
||||
pagination: true,
|
||||
isCheckbox: true,
|
||||
initialRequest: false,
|
||||
addCls: 'box_OFvis',
|
||||
|
||||
|
||||
header: [
|
||||
[
|
||||
{ header: 'NO', childNames: [] },
|
||||
{ header: '권한', childNames: [] },
|
||||
{ header: '이름(대리점명)', childNames: [] },
|
||||
{ header: 'ID', childNames: [] },
|
||||
{ header: '상태', childNames: [] },
|
||||
{ header: '등록일', childNames: [] }
|
||||
]
|
||||
],
|
||||
|
||||
columns: [
|
||||
{ name: 'no', header: 'NO', align: 'center', width: 60 },
|
||||
{ name: 'auth', header: '권한', align: 'left', width: 160 },
|
||||
{ name: 'name', header: '이름(대리점명)', align: 'center', width: 130},
|
||||
{ name: 'adminId', header: 'ID', align: 'center', width: 130},
|
||||
{ name: 'adminStat', header: '상태', align: 'center', width: 130},
|
||||
{ name: 'regDt', header: '등록일', width: 90, cls: 'td_line' }
|
||||
],
|
||||
noDataStr: '검색 결과가 없습니다.',
|
||||
// params: {
|
||||
// apprResult: '',
|
||||
// searchType: '',
|
||||
// searchText: '',
|
||||
// startDate: '',
|
||||
// endDate: ''
|
||||
// },
|
||||
excelHeader: []
|
||||
}
|
||||
};
|
||||
},
|
||||
components: {
|
||||
customGrid: customGrid
|
||||
},
|
||||
destroyed() {
|
||||
|
||||
},
|
||||
mounted() {
|
||||
let isKeep = false;
|
||||
isKeep = true;
|
||||
this.search(isKeep);
|
||||
},
|
||||
methods: {
|
||||
search: function(isKeep) {
|
||||
console.log(this.testList.params);
|
||||
this.$refs.table.search(this.testList.params, isKeep);
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
||||
165
frontend/src/modules/custMgt/views/MemberList.vue
Normal file
165
frontend/src/modules/custMgt/views/MemberList.vue
Normal file
@@ -0,0 +1,165 @@
|
||||
<template>
|
||||
|
||||
<div class="contents">
|
||||
<div class="contents_wrap">
|
||||
<div class="top_wrap">
|
||||
<h3 class="title">회원목록조회</h3>
|
||||
<p class="breadcrumb">시스템관리 > 관리자/유치채널 관리</p>
|
||||
</div>
|
||||
<form autocomplete="off" class="search_form">
|
||||
<div class="search_wrap">
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">권한</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="대리점">대리점</option>
|
||||
<option value="운영자">운영자</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">상태</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="사용">사용</option>
|
||||
<option value="중지">중지</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="input_box id">
|
||||
<label for="id1" class="label">ID</label>
|
||||
<input type="text" id="id1" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<div class="input_box">
|
||||
<label for="name" class="label">이름(대리점명)</label>
|
||||
<input type="text" id="name" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<button type="button" class="button grey">조회</button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="info">
|
||||
<div class="count">총 <span>100</span>건</div>
|
||||
<div class="button_group">
|
||||
<button type="button" class="button blue admin">관리자 등록</button>
|
||||
<button type="button" class="button blue channel">유지채널 등록</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="table">
|
||||
<table>
|
||||
<colgroup>
|
||||
<col width="5%"/>
|
||||
<col width="15%"/>
|
||||
<col width="15%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="5%"/>
|
||||
<col width="20%"/>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><input type="checkbox" id="admin_check1"><label for="admin_check1"></label></th>
|
||||
<th>NO</th>
|
||||
<th>권한</th>
|
||||
<th>이름(대리점명)</th>
|
||||
<th>ID</th>
|
||||
<th>상태</th>
|
||||
<th>등록일</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><input type="checkbox" checked id="admin_check2"><label for="admin_check2"></label></td>
|
||||
<td>10</td>
|
||||
<td>대리점</td>
|
||||
<td>유플러스</td>
|
||||
<td><a href="javascript:void(0)">uplus1</a></td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div> -->
|
||||
<div class="table">
|
||||
<custom-grid
|
||||
ref="table"
|
||||
:totalItems="'totalItems'"
|
||||
:url="testList.url"
|
||||
:perPage="testList.perPage"
|
||||
:initialRequest="testList.initialRequest"
|
||||
:pagination="testList.pagination"
|
||||
:isCheckbox="testList.isCheckbox"
|
||||
:columns="testList.columns"
|
||||
:noDataStr="testList.noDataStr"
|
||||
:addCls="testList.addCls"
|
||||
:header="testList.header"
|
||||
></custom-grid>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import customGrid from '@/components/CustomGrid';
|
||||
//import api from '../service/api';
|
||||
export default {
|
||||
name: 'custList',
|
||||
data() {
|
||||
return {
|
||||
testList: {
|
||||
url: '/api/v1/bo/sysMgt/adminList',
|
||||
perPage: 20,
|
||||
pagination: true,
|
||||
isCheckbox: true,
|
||||
initialRequest: false,
|
||||
addCls: 'box_OFvis',
|
||||
|
||||
|
||||
header: [
|
||||
[
|
||||
{ header: 'NO', childNames: [] },
|
||||
{ header: '권한', childNames: [] },
|
||||
{ header: '이름(대리점명)', childNames: [] },
|
||||
{ header: 'ID', childNames: [] },
|
||||
{ header: '상태', childNames: [] },
|
||||
{ header: '등록일', childNames: [] }
|
||||
]
|
||||
],
|
||||
|
||||
columns: [
|
||||
{ name: 'no', header: 'NO', align: 'center', width: 60 },
|
||||
{ name: 'auth', header: '권한', align: 'left', width: 160 },
|
||||
{ name: 'name', header: '이름(대리점명)', align: 'center', width: 130},
|
||||
{ name: 'adminId', header: 'ID', align: 'center', width: 130},
|
||||
{ name: 'adminStat', header: '상태', align: 'center', width: 130},
|
||||
{ name: 'regDt', header: '등록일', width: 90, cls: 'td_line' }
|
||||
],
|
||||
noDataStr: '검색 결과가 없습니다.',
|
||||
// params: {
|
||||
// apprResult: '',
|
||||
// searchType: '',
|
||||
// searchText: '',
|
||||
// startDate: '',
|
||||
// endDate: ''
|
||||
// },
|
||||
excelHeader: []
|
||||
}
|
||||
};
|
||||
},
|
||||
components: {
|
||||
customGrid: customGrid
|
||||
},
|
||||
destroyed() {
|
||||
|
||||
},
|
||||
mounted() {
|
||||
let isKeep = false;
|
||||
isKeep = true;
|
||||
this.search(isKeep);
|
||||
},
|
||||
methods: {
|
||||
search: function(isKeep) {
|
||||
console.log(this.testList.params);
|
||||
this.$refs.table.search(this.testList.params, isKeep);
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
||||
165
frontend/src/modules/custMgt/views/SubsDetail.vue
Normal file
165
frontend/src/modules/custMgt/views/SubsDetail.vue
Normal file
@@ -0,0 +1,165 @@
|
||||
<template>
|
||||
|
||||
<div class="contents">
|
||||
<div class="contents_wrap">
|
||||
<div class="top_wrap">
|
||||
<h3 class="title">청약 정보 상세 조회</h3>
|
||||
<p class="breadcrumb">시스템관리 > 관리자/유치채널 관리</p>
|
||||
</div>
|
||||
<form autocomplete="off" class="search_form">
|
||||
<div class="search_wrap">
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">권한</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="대리점">대리점</option>
|
||||
<option value="운영자">운영자</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">상태</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="사용">사용</option>
|
||||
<option value="중지">중지</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="input_box id">
|
||||
<label for="id1" class="label">ID</label>
|
||||
<input type="text" id="id1" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<div class="input_box">
|
||||
<label for="name" class="label">이름(대리점명)</label>
|
||||
<input type="text" id="name" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<button type="button" class="button grey">조회</button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="info">
|
||||
<div class="count">총 <span>100</span>건</div>
|
||||
<div class="button_group">
|
||||
<button type="button" class="button blue admin">관리자 등록</button>
|
||||
<button type="button" class="button blue channel">유지채널 등록</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="table">
|
||||
<table>
|
||||
<colgroup>
|
||||
<col width="5%"/>
|
||||
<col width="15%"/>
|
||||
<col width="15%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="5%"/>
|
||||
<col width="20%"/>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><input type="checkbox" id="admin_check1"><label for="admin_check1"></label></th>
|
||||
<th>NO</th>
|
||||
<th>권한</th>
|
||||
<th>이름(대리점명)</th>
|
||||
<th>ID</th>
|
||||
<th>상태</th>
|
||||
<th>등록일</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><input type="checkbox" checked id="admin_check2"><label for="admin_check2"></label></td>
|
||||
<td>10</td>
|
||||
<td>대리점</td>
|
||||
<td>유플러스</td>
|
||||
<td><a href="javascript:void(0)">uplus1</a></td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div> -->
|
||||
<div class="table">
|
||||
<custom-grid
|
||||
ref="table"
|
||||
:totalItems="'totalItems'"
|
||||
:url="testList.url"
|
||||
:perPage="testList.perPage"
|
||||
:initialRequest="testList.initialRequest"
|
||||
:pagination="testList.pagination"
|
||||
:isCheckbox="testList.isCheckbox"
|
||||
:columns="testList.columns"
|
||||
:noDataStr="testList.noDataStr"
|
||||
:addCls="testList.addCls"
|
||||
:header="testList.header"
|
||||
></custom-grid>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import customGrid from '@/components/CustomGrid';
|
||||
//import api from '../service/api';
|
||||
export default {
|
||||
name: 'custList',
|
||||
data() {
|
||||
return {
|
||||
testList: {
|
||||
url: '/api/v1/bo/sysMgt/adminList',
|
||||
perPage: 20,
|
||||
pagination: true,
|
||||
isCheckbox: true,
|
||||
initialRequest: false,
|
||||
addCls: 'box_OFvis',
|
||||
|
||||
|
||||
header: [
|
||||
[
|
||||
{ header: 'NO', childNames: [] },
|
||||
{ header: '권한', childNames: [] },
|
||||
{ header: '이름(대리점명)', childNames: [] },
|
||||
{ header: 'ID', childNames: [] },
|
||||
{ header: '상태', childNames: [] },
|
||||
{ header: '등록일', childNames: [] }
|
||||
]
|
||||
],
|
||||
|
||||
columns: [
|
||||
{ name: 'no', header: 'NO', align: 'center', width: 60 },
|
||||
{ name: 'auth', header: '권한', align: 'left', width: 160 },
|
||||
{ name: 'name', header: '이름(대리점명)', align: 'center', width: 130},
|
||||
{ name: 'adminId', header: 'ID', align: 'center', width: 130},
|
||||
{ name: 'adminStat', header: '상태', align: 'center', width: 130},
|
||||
{ name: 'regDt', header: '등록일', width: 90, cls: 'td_line' }
|
||||
],
|
||||
noDataStr: '검색 결과가 없습니다.',
|
||||
// params: {
|
||||
// apprResult: '',
|
||||
// searchType: '',
|
||||
// searchText: '',
|
||||
// startDate: '',
|
||||
// endDate: ''
|
||||
// },
|
||||
excelHeader: []
|
||||
}
|
||||
};
|
||||
},
|
||||
components: {
|
||||
customGrid: customGrid
|
||||
},
|
||||
destroyed() {
|
||||
|
||||
},
|
||||
mounted() {
|
||||
let isKeep = false;
|
||||
isKeep = true;
|
||||
this.search(isKeep);
|
||||
},
|
||||
methods: {
|
||||
search: function(isKeep) {
|
||||
console.log(this.testList.params);
|
||||
this.$refs.table.search(this.testList.params, isKeep);
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
||||
24
frontend/src/modules/login/router/index.js
Normal file
24
frontend/src/modules/login/router/index.js
Normal file
@@ -0,0 +1,24 @@
|
||||
import LoginMain from '../views/LoginMain'
|
||||
import LoginAuth from '../views/LoginAuth'
|
||||
import ResetPassword from '../views/ResetPassword'
|
||||
|
||||
export default [
|
||||
{
|
||||
path: '/login',
|
||||
name: 'login',
|
||||
component: LoginMain,
|
||||
meta: { public: true }
|
||||
},
|
||||
{
|
||||
path: '/view/login/auth',
|
||||
name: 'loginAuth',
|
||||
component: LoginAuth,
|
||||
meta: { public: true }
|
||||
},
|
||||
{
|
||||
path: '/view/login/resetPassword',
|
||||
name: 'resetPassword',
|
||||
component: ResetPassword,
|
||||
meta: { public: true }
|
||||
},
|
||||
]
|
||||
53
frontend/src/modules/login/service/api.js
Normal file
53
frontend/src/modules/login/service/api.js
Normal file
@@ -0,0 +1,53 @@
|
||||
import httpClient from '@/common/http-client';
|
||||
|
||||
const login = (params) => {
|
||||
return httpClient.post('api/v1/bo/login/login', params, { headers: {"show-layer": "Yes"} },{ withCredentials: false });
|
||||
};
|
||||
|
||||
const chgpwd = (params) => {
|
||||
return httpClient.post('/api/oper/user/chgpwd', params);
|
||||
};
|
||||
|
||||
const myphone = () => {
|
||||
return httpClient.get('/api/oper/user/phone/self');
|
||||
};
|
||||
|
||||
const phone = (params) => {
|
||||
return httpClient.get('/api/public/auth/phone', { params: params });
|
||||
};
|
||||
|
||||
// 삭제 예정
|
||||
const reqnum = (params) => {
|
||||
return httpClient.get('/api/public/auth/reqnum', { params: params });
|
||||
};
|
||||
|
||||
const authNum = (params) => {
|
||||
return httpClient.post('/api/v1/bo/login/authNum', params);
|
||||
};
|
||||
|
||||
const confirmNum = (params) => {
|
||||
//return httpClient.get('/api/public/auth/chknum', { params: params });
|
||||
return httpClient.post('/api/v1/bo/login/confirmNum', params);
|
||||
};
|
||||
|
||||
|
||||
const newpwd = (params) => {
|
||||
return httpClient.post('/api/public/auth/newpwd', params);
|
||||
};
|
||||
|
||||
const logout = () => {
|
||||
//return httpClient.get('/api/auth/logout', {headers: {"show-layer": "Yes"}});
|
||||
return httpClient.post('/api/v1/bo/login/logout', {headers: {"show-layer": "Yes"}});
|
||||
};
|
||||
|
||||
export default {
|
||||
login,
|
||||
logout,
|
||||
chgpwd,
|
||||
myphone,
|
||||
phone,
|
||||
reqnum,
|
||||
confirmNum,
|
||||
newpwd,
|
||||
authNum
|
||||
};
|
||||
257
frontend/src/modules/login/service/mixins.js
Normal file
257
frontend/src/modules/login/service/mixins.js
Normal file
@@ -0,0 +1,257 @@
|
||||
var commonPwdView = {
|
||||
data: function() {
|
||||
return {
|
||||
err_msg: null,
|
||||
message: {
|
||||
curPwd: '', newPwd: '', cfmPwd: ''
|
||||
},
|
||||
param: {
|
||||
userId: null, phone: null
|
||||
},
|
||||
curPwd: '', newPwd: '', cfmPwd: ''
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
verifyNewPwd: function (evt) {
|
||||
var valid = this.checkPassword(evt.target.value);
|
||||
if (valid) {
|
||||
this.err_msg = '';
|
||||
}
|
||||
this.message.newPwd = this.err_msg;
|
||||
},
|
||||
verifyCfmPwd: function() {
|
||||
this.message.cfmPwd = '';
|
||||
if (this.newPwd != this.cfmPwd) {
|
||||
this.message.cfmPwd = this.cfmPwdFailMsg();
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var validation = {
|
||||
methods: {
|
||||
checkId: function (id) {
|
||||
if (id == null || id.trim() == "") {
|
||||
this.err_msg = "아이디를 입력해 주세요.";
|
||||
return false;
|
||||
}
|
||||
if (id.length < 4 || id.length > 15) {
|
||||
this.err_msg = "아이디는 영문, 숫자를 이용하여 4자리 이상 15자리 이하이어야 합니다.";
|
||||
return false;
|
||||
}
|
||||
if (!id.match(/^[0-9a-zA-Z]+$/)) {
|
||||
this.err_msg = "아이디는 영문, 숫자를 이용하여야 합니다.";
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
checkPassword: function (pw) {
|
||||
if (pw == null || pw.trim() == "") {
|
||||
this.err_msg = "비밀번호를 입력해 주세요.";
|
||||
return false;
|
||||
}
|
||||
|
||||
if (typeof this.param.userId != "undefined") {
|
||||
if (pw.indexOf(this.param.userId) >= 0) {
|
||||
this.err_msg = "아이디가 포함된 문자열은 사용할 수 없습니다.";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
for (var i = 0; i < pw.length; i++) {
|
||||
var ch1 = pw.charAt(i);
|
||||
var ch2 = pw.charAt(i + 1);
|
||||
var ch3 = pw.charAt(i + 2);
|
||||
var ch4 = pw.charAt(i + 3);
|
||||
if (ch1 == ch2 && ch2 == ch3 && ch3 == ch4) {
|
||||
//console.log(ch1 + "" + ch2 + "" + ch3 + ch4 + " is equality");
|
||||
this.err_msg = "연속적인 숫자 또는 문자열은 사용할 수 없습니다.";
|
||||
return false;
|
||||
}
|
||||
if (ch1.charCodeAt(0) - ch2.charCodeAt(0) == 1 && ch2.charCodeAt(0) - ch3.charCodeAt(0) == 1 && ch3.charCodeAt(0) - ch4.charCodeAt(0) == 1) {
|
||||
//console.log(ch1 + "" + ch2 + "" + ch3 + ch4 + " is continuity");
|
||||
this.err_msg = "연속적인 숫자 또는 문자열은 사용할 수 없습니다.";
|
||||
return false;
|
||||
}
|
||||
if (ch1.charCodeAt(0) - ch2.charCodeAt(0) == -1 && ch2.charCodeAt(0) - ch3.charCodeAt(0) == -1 && ch3.charCodeAt(0) - ch4.charCodeAt(0) == -1) {
|
||||
//console.log(ch1 + "" + ch2 + "" + ch3 + ch4 + " is continuity");
|
||||
this.err_msg = "연속적인 숫자 또는 문자열은 사용할 수 없습니다.";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof this.param.phone != "undefined" && this.param.phone != null) {
|
||||
var phone = this.param.phone;
|
||||
phone = phone.substring(3, phone.length); // 앞 3자리 제거
|
||||
|
||||
var last = phone.substring(phone.length - 4, phone.length); // 뒤 4자리 추출
|
||||
var middle = phone.substring(0, phone.length - 4); // 뒤 4자리 제거 == 국번
|
||||
|
||||
if (pw.indexOf(middle) >= 0 || pw.indexOf(last) >= 0) {
|
||||
this.err_msg = "휴대폰번호가 포함된 문자열은 사용할 수 없습니다.";
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
if (pw.length >= 10) {
|
||||
if (pw.match(/^(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[!@#$%^&*])([a-zA-Z0-9!@#$%^&*]+)$/)) {
|
||||
return true;
|
||||
} else if (!pw.match(/^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)$/)
|
||||
&& !pw.match(/^(?=.*[0-9])(?=.*[!@#$%^&*])([0-9!@#$%^&*]+)$/)
|
||||
&& !pw.match(/^(?=.*[a-zA-Z])(?=.*[!@#$%^&*])([a-zA-Z!@#$%^&*]+)$/)) {
|
||||
this.err_msg = "영문, 숫자, 특수문자 중 2가지 이상 조합하여 10자리 이상 또는 3가지 이상 조합하여 8자리 이상이어야 합니다.";
|
||||
return false;
|
||||
}
|
||||
} else if (pw.length >= 8) {
|
||||
if (!pw.match(/^(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[!@#$%^&*])([a-zA-Z0-9!@#$%^&*]+)$/)) {
|
||||
this.err_msg = "영문, 숫자, 특수문자 중 2가지 이상 조합하여 10자리 이상 또는 3가지 이상 조합하여 8자리 이상이어야 합니다.";
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
this.err_msg = "영문, 숫자, 특수문자 중 2가지 이상 조합하여 10자리 이상 또는 3가지 이상 조합하여 8자리 이상이어야 합니다.";
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
checkName: function (name) {
|
||||
if (name == null || name.trim() == "") {
|
||||
this.err_msg = "이름을 입력해 주세요.";
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
checkDeptNm: function (dept) {
|
||||
if (dept == null || dept.trim() == "") {
|
||||
this.err_msg = "부서명을 입력해 주세요.";
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
checkPhone: function (phone) {
|
||||
if (phone == null || phone.trim() == "") {
|
||||
this.err_msg = "휴대폰번호를 입력해 주세요.";
|
||||
return false;
|
||||
}
|
||||
if (phone.length < 10) {
|
||||
this.err_msg = "휴대폰번호를 정확히 입력해 주세요.";
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
checkEmail: function (email) {
|
||||
if (email == null || email.trim() == "") {
|
||||
this.err_msg = "이메일을 입력해 주세요.";
|
||||
return false;
|
||||
}
|
||||
// eslint-disable-next-line
|
||||
if (!email.match(/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/)) {
|
||||
this.err_msg = "이메일을 정확히 입력해 주세요.";
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
checkIp: function (param) {
|
||||
if ((param.ip1 == null || param.ip1 == "") && (param.ip2 == null || param.ip2 == "") && (param.ip3 == null || param.ip3 == "") && (param.ip4 == null || param.ip4 == "")) {
|
||||
this.err_msg = "접근허용 IP를 입력해 주세요.";
|
||||
return false;
|
||||
}
|
||||
if ((param.ip1 == null || param.ip1 == "")
|
||||
|| (param.ip2 == null || param.ip2 == "")
|
||||
|| (param.ip3 == null || param.ip3 == "")
|
||||
|| (param.ip4 == null || param.ip4 == "")) {
|
||||
this.err_msg = "IP 주소를 정확히 입력해 주세요.";
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
checkIpEach: function (ip, msg) {
|
||||
if (ip == null || ip == "") {
|
||||
this.err_msg = typeof msg != "undefined" ? msg : "접근허용 IP를 입력해 주세요.";
|
||||
return false;
|
||||
}
|
||||
if (!ip.match(/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/)) {
|
||||
this.err_msg = "IP 주소를 정확히 입력해 주세요.";
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
checkIpWithAsterisk: function (ip, msg) {
|
||||
if (ip == null || ip == "") {
|
||||
this.err_msg = typeof msg != "undefined" ? msg : "접근허용 IP를 입력해 주세요.";
|
||||
return false;
|
||||
}
|
||||
// 3레벨 이후 * 허용... 2레벨 이후 시 {2,3} 1레벨 이후시 {1,3} 필요 시 구문 추가
|
||||
if (!ip.match(/^((((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}\*))$/)) {
|
||||
this.err_msg = "IP 주소를 정확히 입력해 주세요.";
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
checkRole: function (role) {
|
||||
if (role == null || role == "") {
|
||||
this.err_msg = "권한을 선택해 주세요.";
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
//리스크관리
|
||||
checkSpamCliId: function (comnId, spamCliId) {
|
||||
if (comnId == "N") {
|
||||
if (spamCliId == null || spamCliId.trim() == "") {
|
||||
this.err_msg = "SMID를 입력해 주세요.";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
},
|
||||
checkReqType: function (reqType) {
|
||||
if (reqType == null || reqType.trim() == "") {
|
||||
this.err_msg = "요청자를 선택해 주세요.";
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
checkSpamType: function (spamType) {
|
||||
if (spamType == null || spamType.trim() == "") {
|
||||
this.err_msg = "차단사유를 선택해 주세요.";
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
checkSpamContents: function (blockType) {
|
||||
var str = "";
|
||||
for (var k in this.callBacks) {
|
||||
str = this.callBacks[k].spamContent;
|
||||
|
||||
|
||||
if (blockType == "CLB") {
|
||||
if (str == null || str.trim() == "") {
|
||||
this.err_msg = "발신번호를 입력해 주세요.";
|
||||
return false;
|
||||
} else {
|
||||
if (this.bytes(str) < 8) {
|
||||
this.err_msg = "발신번호가 8자리 미만입니다.";
|
||||
return false;
|
||||
}
|
||||
|
||||
if (this.bytes(str) > 11) {
|
||||
this.err_msg = "발신번호가 11자리 초과입니다.";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (str == null || str.trim() == "") {
|
||||
this.err_msg = "차단메시지를 입력해 주세요.";
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export { commonPwdView, validation };
|
||||
52
frontend/src/modules/login/store/index.js
Normal file
52
frontend/src/modules/login/store/index.js
Normal file
@@ -0,0 +1,52 @@
|
||||
const state = {
|
||||
token: null,
|
||||
isLogin: false,
|
||||
isErrorPage: false,
|
||||
isAuthChk: false,
|
||||
pwd: null
|
||||
};
|
||||
|
||||
const getters = {
|
||||
getToken: state => state.token,
|
||||
isLogin: state => state.isLogin,
|
||||
isErrorPage: state => state.isErrorPage,
|
||||
isAuthChk: state => state.isAuthChk,
|
||||
getPwd: state => state.pwd,
|
||||
};
|
||||
|
||||
const mutations = {
|
||||
saveToken: (state, token) => {
|
||||
console.log('saveToken:', token);
|
||||
state.token = token;
|
||||
},
|
||||
removeToken: (state) => {
|
||||
console.log('removeToken:');
|
||||
state.token = null;
|
||||
},
|
||||
isLogin: (state, value) => {
|
||||
console.log("isLogin mutation : " + value);
|
||||
state.isLogin = value;
|
||||
},
|
||||
isErrorPage: (state, value) => {
|
||||
console.log("isErrorPage mutation : " + value);
|
||||
state.isErrorPage = value;
|
||||
},
|
||||
isAuthChk: (state, value) => {
|
||||
console.log("isAuthChk mutation : "+ value);
|
||||
state.isAuthChk = value;
|
||||
},
|
||||
savePwd: (state, value) => {
|
||||
state.pwd = value;
|
||||
},
|
||||
};
|
||||
|
||||
const actions = {
|
||||
};
|
||||
|
||||
export default {
|
||||
namespaced: true,
|
||||
state,
|
||||
getters,
|
||||
mutations,
|
||||
actions
|
||||
};
|
||||
263
frontend/src/modules/login/views/LoginAuth.vue
Normal file
263
frontend/src/modules/login/views/LoginAuth.vue
Normal file
@@ -0,0 +1,263 @@
|
||||
<template>
|
||||
<!-- s: 문자인증 -->
|
||||
<div class="wrap bg-wrap">
|
||||
<div class="login-box text-auth">
|
||||
<div class="logo"></div>
|
||||
<div class="wbox">
|
||||
<h3 class="title">2차 휴대폰 문자 인증</h3>
|
||||
<p class="desc">아이디에 등록된 휴대폰번호를 입력해 주세요.</p>
|
||||
<!-- <form action=""> -->
|
||||
<ul class="pw-form">
|
||||
<div>
|
||||
<li><input type="text"
|
||||
placeholder="휴대폰번호를 입력하세요 (숫자만 입력하세요.)"
|
||||
v-model="mdn"
|
||||
:maxlength="11"
|
||||
oninput="javascript: this.value = this.value.replace(/[^0-9]/g, '');"
|
||||
>
|
||||
<button class="btn-p2color" v-on:click="authNum">인증번호 받기</button></li>
|
||||
</div>
|
||||
<div>
|
||||
<li class="bg-g">
|
||||
<input type="text"
|
||||
placeholder="인증번호를 입력하세요"
|
||||
v-model="confirmNum"
|
||||
:maxlength="6"
|
||||
oninput="javascript: this.value = this.value.replace(/[^0-9]/g, '');"
|
||||
>
|
||||
<span class="time"> {{ TimerStr }}</span></li>
|
||||
</div>
|
||||
<li>
|
||||
<button class="btn-default" @click="clickMenu('/login')">취소</button>
|
||||
<button class="btn-pcolor" v-on:click="ajaxAuth">확인</button>
|
||||
</li>
|
||||
</ul>
|
||||
<!-- </form> -->
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<login-popup ref="LoginPopup"> </login-popup>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { mapGetters } from 'vuex';
|
||||
import api from '../service/api';
|
||||
import tokenSvc from '@/common/token-service';
|
||||
import LoginPopup from '@/components/LoginPopup.vue'
|
||||
//import * as utils from '@/common/utils';
|
||||
|
||||
export default {
|
||||
data: function() {
|
||||
return {
|
||||
errors: [],
|
||||
mdn: '',
|
||||
confirmNum: '',
|
||||
userId: '',
|
||||
isAuthNum: false,
|
||||
isLogin: true,
|
||||
pwd: '',
|
||||
text: '',
|
||||
number: '',
|
||||
Timer: null,
|
||||
TimeCounter: 180,
|
||||
TimerStr: "03:00"
|
||||
};
|
||||
},
|
||||
components: {
|
||||
LoginPopup : LoginPopup
|
||||
},
|
||||
created() {
|
||||
if(!!tokenSvc.getToken()){
|
||||
this.$store.commit("login/isLogin", true);
|
||||
this.$store.commit("login/isAuthChk", true);
|
||||
this.$router.push({ path: '/' });
|
||||
}else{
|
||||
if(!this.getLogin){
|
||||
this.$router.push({ path: '/login' });
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
if (localStorage.hubwebUserId) {
|
||||
this.userId = localStorage.hubwebUserId;
|
||||
}
|
||||
this.isLogin = this.getLogin;
|
||||
this.pwd = this.getPwd;
|
||||
},
|
||||
computed: {
|
||||
...mapGetters({
|
||||
getLogin: 'login/isLogin',
|
||||
getErrorPage: 'login/isErrorPage',
|
||||
getAuthChk: 'login/isAuthChk',
|
||||
getPwd: 'login/getPwd'
|
||||
}),
|
||||
},
|
||||
watch: {
|
||||
getLogin(data) {
|
||||
if (data != null && data != '' && data == true) {
|
||||
this.isLogin = true;
|
||||
} else {
|
||||
this.isLogin = false;
|
||||
}
|
||||
},
|
||||
getPwd(data) {
|
||||
if(data != null && data != ''){
|
||||
this.pwd = data;
|
||||
}
|
||||
}
|
||||
},
|
||||
destroyed() {
|
||||
let cont = document.querySelector(".wrap");
|
||||
cont.classList.remove("bg-wrap");
|
||||
},
|
||||
methods: {
|
||||
// 2차 인증번호 요청
|
||||
authNum(){
|
||||
var vm = this;
|
||||
if(!this.isLogin){
|
||||
var vm = this;
|
||||
vm.$store.commit("login/isLogin", false);
|
||||
vm.$store.commit("login/isAuthChk", false);
|
||||
vm.$router.push({ path: '/'});
|
||||
return;
|
||||
}
|
||||
if (vm.mdn == null || vm.mdn.trim() == ""){
|
||||
vm.ModalOpen('modal08');
|
||||
return false;
|
||||
} else if (vm.mdn.length < 11 || !vm.mdn) {
|
||||
vm.ModalOpen('modal06');
|
||||
}
|
||||
var params = {
|
||||
"oprtrId": this.userId,
|
||||
"hpNo": this.mdn,
|
||||
"isLogin" : this.isLogin
|
||||
}
|
||||
api.authNum(params).then(response => {
|
||||
console.log(response);
|
||||
var rsp = response.data;
|
||||
if(rsp.retCode == '0000'){
|
||||
this.Timer = this.timerStart();
|
||||
vm.ModalOpen('modal07');
|
||||
// console.log('시간 3:00 카운트 하기');
|
||||
this.isAuthNum = true;
|
||||
}else if (!this.Timer) {
|
||||
this.timerStop(this.Timer);
|
||||
this.Timer = null;
|
||||
// 실패 -> 실패 코드에 따라 실패 팝업 보여주기
|
||||
//인증시간 초과 후 “시간초과!” 문구로 변경
|
||||
}
|
||||
}).catch(response =>{
|
||||
|
||||
console.log(response);
|
||||
});
|
||||
},
|
||||
|
||||
// 2차 인증 확인
|
||||
ajaxAuth: function(){
|
||||
var vm = this;
|
||||
|
||||
if (!vm.formCheck()){
|
||||
alert(vm.errors[0]);
|
||||
return false;
|
||||
}
|
||||
if(vm.TimeCounter==0){
|
||||
alert("시간초과");
|
||||
return false;
|
||||
}
|
||||
|
||||
var params = {
|
||||
"oprtrId": this.userId,
|
||||
"hpNo": this.mdn,
|
||||
"chrVal": this.confirmNum,
|
||||
"isLogin": this.isLogin,
|
||||
"oprtrPw": this.pwd
|
||||
}
|
||||
|
||||
//인증번호 확인
|
||||
api.confirmNum(params).then(function(response){
|
||||
var rsp = response.data;
|
||||
console.log("RESULT_CODE : "+rsp.retCode);
|
||||
if(rsp.retCode == '0000'){
|
||||
vm.$store.commit("login/isLogin", true);
|
||||
//var nextUrl = rsp.data.nextUrl;
|
||||
//vm.$router.push({ path: nextUrl});
|
||||
vm.$router.push({ path: '/'});
|
||||
}else if(rsp.retCode == '4008') { //휴대폰번호 확인
|
||||
vm.ModalOpen('modal06');
|
||||
} else if(rsp.retCode == '404') { //인증번호: 입력
|
||||
vm.ModalOpen('modal08');
|
||||
} else if(rsp.retCode == '4009') { //인증실패: 시간초과
|
||||
vm.ModalOpen('modal10');
|
||||
} else if(rsp.retCode == '4010') { //인증실패: 인증번호
|
||||
vm.ModalOpen('modal09');
|
||||
} else if(rsp.retCode == '4011') { //인증실패: 5회
|
||||
vm.ModalOpen('modal11');
|
||||
} else{
|
||||
return;
|
||||
}
|
||||
});
|
||||
},
|
||||
formCheck: function() {
|
||||
this.errors = [];
|
||||
if(!this.isAuthNum){
|
||||
this.errors.push('인증요청을 먼저 해주세요.');
|
||||
}
|
||||
if(!this.mdn){
|
||||
this.errors.push('휴대폰 번호를 확인해주세요.');
|
||||
}
|
||||
if(!this.confirmNum){
|
||||
this.errors.push('인증번호를 입력하세요.');
|
||||
}
|
||||
return this.errors.length == 0;
|
||||
},
|
||||
|
||||
clickMenu(link){
|
||||
this.$router.push({
|
||||
path: link
|
||||
});
|
||||
},
|
||||
|
||||
ModalOpen: function(target){
|
||||
this.$refs.LoginPopup.ModalOpen(target);
|
||||
},
|
||||
timerStart: function() {
|
||||
// 1초에 한번씩 start 호출
|
||||
this.TimeCounter = 180;
|
||||
var interval = setInterval(() => {
|
||||
this.TimeCounter--;
|
||||
//1초씩 감소
|
||||
this.TimerStr = this.prettyTime();
|
||||
if (this.TimeCounter <= 0)
|
||||
{
|
||||
this.timerStop(interval);
|
||||
// this.ModalOpen('modal10');
|
||||
}
|
||||
}, 100);
|
||||
|
||||
return interval;
|
||||
},
|
||||
|
||||
timerStop: function(Timer)
|
||||
{
|
||||
clearInterval(Timer);
|
||||
this.TimeCounter = 0;
|
||||
},
|
||||
|
||||
prettyTime: function() {
|
||||
// 시간 형식으로 변환 리턴
|
||||
let time = this.TimeCounter / 60;
|
||||
let minutes = parseInt(time);
|
||||
let secondes = Math.round((time - minutes) * 60);
|
||||
|
||||
return (
|
||||
minutes.toString().padStart(2, "0") +
|
||||
":"
|
||||
+ secondes.toString().padStart(2, "0")
|
||||
);
|
||||
},
|
||||
|
||||
}
|
||||
};
|
||||
</script>
|
||||
153
frontend/src/modules/login/views/LoginMain.vue
Normal file
153
frontend/src/modules/login/views/LoginMain.vue
Normal file
@@ -0,0 +1,153 @@
|
||||
<template>
|
||||
<div class="wrap bg-wrap">
|
||||
<div class="login-box adm-login">
|
||||
<div class="wbox">
|
||||
<div class="logo"></div>
|
||||
<h3 class="title">관리자 로그인</h3>
|
||||
<!-- <form action=""> -->
|
||||
<div class="login-form">
|
||||
<li><input type="text" placeholder="아이디" v-model="userId"></li>
|
||||
<li><input type="password" placeholder="비밀번호" v-model="userPwd"></li>
|
||||
<li>
|
||||
<span class="lcont"><input type="checkbox" id="id-remember" ref="chkSaveId" checked><label for="id-remember">아이디 저장</label></span>
|
||||
<span class="rcont"><button class="btn-pwreset" @click="clickMenu('/view/login/resetPassword')">비밀번호 초기화</button></span>
|
||||
</li>
|
||||
<li><button class="btn-pcolor" v-on:click="ajaxlogin">로그인</button></li>
|
||||
</div>
|
||||
<!-- </form> -->
|
||||
<div class="login-notice">
|
||||
<div>
|
||||
<li>비밀번호 분실 시 비밀번호 초기화를 이용해주세요.</li>
|
||||
<li>비밀번호는 90일이내 변경하여 안전히 관리해주세요.</li>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<login-popup ref="LoginPopup"> </login-popup>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import api from '../service/api';
|
||||
import LoginPopup from '@/components/LoginPopup.vue';
|
||||
import tokenSvc from '@/common/token-service';
|
||||
//import * as utils from '@/common/utils';
|
||||
|
||||
export default {
|
||||
data: function() {
|
||||
return {
|
||||
errors: [],
|
||||
corpId: '',
|
||||
userId: '',
|
||||
userPwd: ''
|
||||
};
|
||||
},
|
||||
created() {
|
||||
// 로그인 페이지 진입시
|
||||
if(!!tokenSvc.getToken()){
|
||||
this.$store.commit("login/isLogin", true);
|
||||
this.$store.commit("login/isAuthChk", true);
|
||||
this.$router.push({ path: '/' });
|
||||
}else{
|
||||
this.$store.commit("login/isLogin", false);
|
||||
this.$store.commit("login/isAuthChk", false);
|
||||
this.$store.commit("login/isErrorPage", false);
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.$refs.chkSaveId.checked = true;
|
||||
|
||||
if (localStorage.hubwebUserId) {
|
||||
this.userId = localStorage.hubwebUserId;
|
||||
}
|
||||
},
|
||||
destroyed() {
|
||||
let cont = document.querySelector(".wrap");
|
||||
cont.classList.remove("login-wrap");
|
||||
},
|
||||
components: {
|
||||
LoginPopup : LoginPopup
|
||||
},
|
||||
methods: {
|
||||
chgChkUserId() {
|
||||
if (this.$refs.chkSaveId.checked == true) {
|
||||
localStorage.hubwebUserId = this.userId;
|
||||
} else {
|
||||
delete localStorage.hubwebUserId;
|
||||
}
|
||||
},
|
||||
toRegister(){
|
||||
this.$router.push({ name: 'register'});
|
||||
},
|
||||
formCheck: function() {
|
||||
this.errors = [];
|
||||
|
||||
|
||||
if (!this.userId) this.errors.push('아이디를 입력해 주세요.');
|
||||
if (!this.userPwd) this.errors.push('비밀번호를 입력해 주세요.');
|
||||
|
||||
return this.errors.length == 0;
|
||||
},
|
||||
ajaxlogin: function() {
|
||||
|
||||
var vm = this;
|
||||
vm.errmsg = null;
|
||||
|
||||
if (!vm.formCheck()) return false;
|
||||
|
||||
let oprtrPw = this.userPwd;
|
||||
|
||||
// FormData 객체를 파라미터로 넘기면 Content-Type: multipart/form-data; 요청을 한다.
|
||||
// 일반 Object를 파라미터로 넘기면 Content-Type: application/json;charset=UTF-8 요청을 한다.
|
||||
var params = {
|
||||
"oprtrId": this.userId,
|
||||
"oprtrPw": this.userPwd,
|
||||
}
|
||||
//로그인버튼을 누를시 상황
|
||||
api.login(params).then(function(response) {
|
||||
|
||||
var rsp = response.data;
|
||||
|
||||
if(rsp.retCode == '0000'){
|
||||
var path = rsp.data.nextUrl;
|
||||
console.log(path);
|
||||
vm.chgChkUserId();
|
||||
vm.$store.commit("login/isLogin", true);
|
||||
vm.$store.commit("login/savePwd", oprtrPw);
|
||||
vm.$router.push({ path: '/view/login/auth'});
|
||||
} else if(rsp.retCode == '4004') { // ID/PWD 불일치
|
||||
vm.errors.push('로그인 실패하였습니다. (5회 실패 시 계정 잠김)');
|
||||
vm.ModalOpen('modal01');
|
||||
} else if(rsp.retCode == '4005') { // ID/PWD 불일치 횟수초과로 계정 잠김
|
||||
// msg = '5회 이상 로그인 실패하여 해당 아이디에 대한 계정이 잠금처리되었습니다.\n관리자에게 문의하세요.';
|
||||
vm.ModalOpen('modal02');
|
||||
} else if(rsp.retCode == '4006') {
|
||||
// msg = '비밀번호를 변경하신지 90일이 지났습니다.\n비밀번호 변경 화면으로 이동합니다.';
|
||||
vm.ModalOpen('modal04');
|
||||
} else if(rsp.retCode == '4007') {
|
||||
// msg = '관리자 승인 후 이용할 수 있습니다.';
|
||||
vm.ModalOpen('modal03');
|
||||
} else {
|
||||
vm.$store.commit("login/isLogin", false);
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
|
||||
clickMenu(link){
|
||||
|
||||
this.$router.push({
|
||||
path: link
|
||||
});
|
||||
},
|
||||
ModalOpen: function(target){
|
||||
this.$refs.LoginPopup.ModalOpen(target);
|
||||
},
|
||||
|
||||
} //method 끝
|
||||
};
|
||||
|
||||
</script>
|
||||
97
frontend/src/modules/login/views/ResetPassword.vue
Normal file
97
frontend/src/modules/login/views/ResetPassword.vue
Normal file
@@ -0,0 +1,97 @@
|
||||
<template>
|
||||
|
||||
<div class="wrap bg-wrap">
|
||||
|
||||
<!-- s: 패스워드초기화 -->
|
||||
<div class="login-box pw-reset">
|
||||
<div class="logo"></div>
|
||||
<div class="wbox">
|
||||
<h3 class="title">비밀번호 초기화</h3>
|
||||
<!-- <form action=""> -->
|
||||
<div class="login-form">
|
||||
<div>
|
||||
|
||||
<input type="text" placeholder="아이디를 입력하세요"></div>
|
||||
<div class="button_group">
|
||||
<button class="btn-default" @click="clickMenu('/login')">취소</button>
|
||||
<button class="btn-pcolor">비밀번호 초기화 문자 발송하기</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- </form> -->
|
||||
<div class="login-notice">
|
||||
<div>
|
||||
<li>초기화된 비밀번호는 등록된 휴대폰 문자메시지로 발송됩니다.</li>
|
||||
<li>휴대폰 번호 변경 시 관리자로 문의해주세요.</li>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<login-popup ref="LoginPopup"> </login-popup>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
// import api from '../service/api';
|
||||
import LoginPopup from '@/components/LoginPopup.vue';
|
||||
|
||||
export default {
|
||||
name: 'resetPassword',
|
||||
data() {
|
||||
return {}
|
||||
},
|
||||
created() {
|
||||
this.$store.commit("login/isLogin", false);
|
||||
this.$store.commit("login/isAuthChk", false);
|
||||
},
|
||||
components: {
|
||||
LoginPopup
|
||||
},
|
||||
methods: {
|
||||
// ajaxReset: function(){
|
||||
// var vm = this;
|
||||
// vm.errmsg = null;
|
||||
// // if (!vm.formCheck()) return false;
|
||||
|
||||
// var params = {
|
||||
// //"corpId": this.corpId,
|
||||
// // "userPwd": this.userPwd,
|
||||
|
||||
// } // 주석으로 인한
|
||||
// api.newpwd(params).then(function(response){
|
||||
// var rsp = response.data;
|
||||
// console.log("RESULT_CODE : "+rsp.retCode);
|
||||
// if(rsp.retCode == '000'){
|
||||
// // vm.$store.commit("login/isLogin", true);
|
||||
// //vm.$store.commit("login/isAuthChk", true);
|
||||
|
||||
// vm.ModalOpen('modal12');
|
||||
// // vm.$router.push({ path : 'view/login'});
|
||||
// } else {
|
||||
// return;
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
// ,
|
||||
clickMenu(link) {
|
||||
|
||||
this
|
||||
.$router
|
||||
.push({path: link});
|
||||
},
|
||||
|
||||
ModalOpen: function(target){
|
||||
this.$refs.LoginPopup.ModalOpen(target);
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style></style>
|
||||
19
frontend/src/modules/mntrng/router/index.js
Normal file
19
frontend/src/modules/mntrng/router/index.js
Normal file
@@ -0,0 +1,19 @@
|
||||
import SendList from '../views/SendList'
|
||||
import LiveSendSttus from '../views/LiveSendSttus'
|
||||
|
||||
export default [
|
||||
{
|
||||
path: '/mntrng/sendList',
|
||||
component: SendList,
|
||||
name: 'sendList',
|
||||
meta: { public: true }
|
||||
},
|
||||
{
|
||||
path: '/mntrng/liveSendSttus',
|
||||
component: LiveSendSttus,
|
||||
name: 'liveSendSttus',
|
||||
meta: { public: true }
|
||||
},
|
||||
|
||||
]
|
||||
|
||||
165
frontend/src/modules/mntrng/views/LiveSendSttus.vue
Normal file
165
frontend/src/modules/mntrng/views/LiveSendSttus.vue
Normal file
@@ -0,0 +1,165 @@
|
||||
<template>
|
||||
|
||||
<div class="contents">
|
||||
<div class="contents_wrap">
|
||||
<div class="top_wrap">
|
||||
<h3 class="title">실시간 발송 현황 정보 조회</h3>
|
||||
<p class="breadcrumb">시스템관리 > 관리자/유치채널 관리</p>
|
||||
</div>
|
||||
<form autocomplete="off" class="search_form">
|
||||
<div class="search_wrap">
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">권한</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="대리점">대리점</option>
|
||||
<option value="운영자">운영자</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">상태</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="사용">사용</option>
|
||||
<option value="중지">중지</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="input_box id">
|
||||
<label for="id1" class="label">ID</label>
|
||||
<input type="text" id="id1" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<div class="input_box">
|
||||
<label for="name" class="label">이름(대리점명)</label>
|
||||
<input type="text" id="name" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<button type="button" class="button grey">조회</button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="info">
|
||||
<div class="count">총 <span>100</span>건</div>
|
||||
<div class="button_group">
|
||||
<button type="button" class="button blue admin">관리자 등록</button>
|
||||
<button type="button" class="button blue channel">유지채널 등록</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="table">
|
||||
<table>
|
||||
<colgroup>
|
||||
<col width="5%"/>
|
||||
<col width="15%"/>
|
||||
<col width="15%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="5%"/>
|
||||
<col width="20%"/>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><input type="checkbox" id="admin_check1"><label for="admin_check1"></label></th>
|
||||
<th>NO</th>
|
||||
<th>권한</th>
|
||||
<th>이름(대리점명)</th>
|
||||
<th>ID</th>
|
||||
<th>상태</th>
|
||||
<th>등록일</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><input type="checkbox" checked id="admin_check2"><label for="admin_check2"></label></td>
|
||||
<td>10</td>
|
||||
<td>대리점</td>
|
||||
<td>유플러스</td>
|
||||
<td><a href="javascript:void(0)">uplus1</a></td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div> -->
|
||||
<div class="table">
|
||||
<custom-grid
|
||||
ref="table"
|
||||
:totalItems="'totalItems'"
|
||||
:url="testList.url"
|
||||
:perPage="testList.perPage"
|
||||
:initialRequest="testList.initialRequest"
|
||||
:pagination="testList.pagination"
|
||||
:isCheckbox="testList.isCheckbox"
|
||||
:columns="testList.columns"
|
||||
:noDataStr="testList.noDataStr"
|
||||
:addCls="testList.addCls"
|
||||
:header="testList.header"
|
||||
></custom-grid>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import customGrid from '@/components/CustomGrid';
|
||||
//import api from '../service/api';
|
||||
export default {
|
||||
name: 'sendList',
|
||||
data() {
|
||||
return {
|
||||
testList: {
|
||||
url: '/api/v1/bo/sysMgt/adminList',
|
||||
perPage: 20,
|
||||
pagination: true,
|
||||
isCheckbox: true,
|
||||
initialRequest: false,
|
||||
addCls: 'box_OFvis',
|
||||
|
||||
|
||||
header: [
|
||||
[
|
||||
{ header: 'NO', childNames: [] },
|
||||
{ header: '권한', childNames: [] },
|
||||
{ header: '이름(대리점명)', childNames: [] },
|
||||
{ header: 'ID', childNames: [] },
|
||||
{ header: '상태', childNames: [] },
|
||||
{ header: '등록일', childNames: [] }
|
||||
]
|
||||
],
|
||||
|
||||
columns: [
|
||||
{ name: 'no', header: 'NO', align: 'center', width: 60 },
|
||||
{ name: 'auth', header: '권한', align: 'left', width: 160 },
|
||||
{ name: 'name', header: '이름(대리점명)', align: 'center', width: 130},
|
||||
{ name: 'adminId', header: 'ID', align: 'center', width: 130},
|
||||
{ name: 'adminStat', header: '상태', align: 'center', width: 130},
|
||||
{ name: 'regDt', header: '등록일', width: 90, cls: 'td_line' }
|
||||
],
|
||||
noDataStr: '검색 결과가 없습니다.',
|
||||
// params: {
|
||||
// apprResult: '',
|
||||
// searchType: '',
|
||||
// searchText: '',
|
||||
// startDate: '',
|
||||
// endDate: ''
|
||||
// },
|
||||
excelHeader: []
|
||||
}
|
||||
};
|
||||
},
|
||||
components: {
|
||||
customGrid: customGrid
|
||||
},
|
||||
destroyed() {
|
||||
|
||||
},
|
||||
mounted() {
|
||||
let isKeep = false;
|
||||
isKeep = true;
|
||||
this.search(isKeep);
|
||||
},
|
||||
methods: {
|
||||
search: function(isKeep) {
|
||||
console.log(this.testList.params);
|
||||
this.$refs.table.search(this.testList.params, isKeep);
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
||||
165
frontend/src/modules/mntrng/views/SendList.vue
Normal file
165
frontend/src/modules/mntrng/views/SendList.vue
Normal file
@@ -0,0 +1,165 @@
|
||||
<template>
|
||||
|
||||
<div class="contents">
|
||||
<div class="contents_wrap">
|
||||
<div class="top_wrap">
|
||||
<h3 class="title">발송내역 목록 조회</h3>
|
||||
<p class="breadcrumb">시스템관리 > 관리자/유치채널 관리</p>
|
||||
</div>
|
||||
<form autocomplete="off" class="search_form">
|
||||
<div class="search_wrap">
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">권한</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="대리점">대리점</option>
|
||||
<option value="운영자">운영자</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">상태</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="사용">사용</option>
|
||||
<option value="중지">중지</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="input_box id">
|
||||
<label for="id1" class="label">ID</label>
|
||||
<input type="text" id="id1" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<div class="input_box">
|
||||
<label for="name" class="label">이름(대리점명)</label>
|
||||
<input type="text" id="name" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<button type="button" class="button grey">조회</button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="info">
|
||||
<div class="count">총 <span>100</span>건</div>
|
||||
<div class="button_group">
|
||||
<button type="button" class="button blue admin">관리자 등록</button>
|
||||
<button type="button" class="button blue channel">유지채널 등록</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="table">
|
||||
<table>
|
||||
<colgroup>
|
||||
<col width="5%"/>
|
||||
<col width="15%"/>
|
||||
<col width="15%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="5%"/>
|
||||
<col width="20%"/>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><input type="checkbox" id="admin_check1"><label for="admin_check1"></label></th>
|
||||
<th>NO</th>
|
||||
<th>권한</th>
|
||||
<th>이름(대리점명)</th>
|
||||
<th>ID</th>
|
||||
<th>상태</th>
|
||||
<th>등록일</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><input type="checkbox" checked id="admin_check2"><label for="admin_check2"></label></td>
|
||||
<td>10</td>
|
||||
<td>대리점</td>
|
||||
<td>유플러스</td>
|
||||
<td><a href="javascript:void(0)">uplus1</a></td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div> -->
|
||||
<div class="table">
|
||||
<custom-grid
|
||||
ref="table"
|
||||
:totalItems="'totalItems'"
|
||||
:url="testList.url"
|
||||
:perPage="testList.perPage"
|
||||
:initialRequest="testList.initialRequest"
|
||||
:pagination="testList.pagination"
|
||||
:isCheckbox="testList.isCheckbox"
|
||||
:columns="testList.columns"
|
||||
:noDataStr="testList.noDataStr"
|
||||
:addCls="testList.addCls"
|
||||
:header="testList.header"
|
||||
></custom-grid>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import customGrid from '@/components/CustomGrid';
|
||||
//import api from '../service/api';
|
||||
export default {
|
||||
name: 'sendList',
|
||||
data() {
|
||||
return {
|
||||
testList: {
|
||||
url: '/api/v1/bo/sysMgt/adminList',
|
||||
perPage: 20,
|
||||
pagination: true,
|
||||
isCheckbox: true,
|
||||
initialRequest: false,
|
||||
addCls: 'box_OFvis',
|
||||
|
||||
|
||||
header: [
|
||||
[
|
||||
{ header: 'NO', childNames: [] },
|
||||
{ header: '권한', childNames: [] },
|
||||
{ header: '이름(대리점명)', childNames: [] },
|
||||
{ header: 'ID', childNames: [] },
|
||||
{ header: '상태', childNames: [] },
|
||||
{ header: '등록일', childNames: [] }
|
||||
]
|
||||
],
|
||||
|
||||
columns: [
|
||||
{ name: 'no', header: 'NO', align: 'center', width: 60 },
|
||||
{ name: 'auth', header: '권한', align: 'left', width: 160 },
|
||||
{ name: 'name', header: '이름(대리점명)', align: 'center', width: 130},
|
||||
{ name: 'adminId', header: 'ID', align: 'center', width: 130},
|
||||
{ name: 'adminStat', header: '상태', align: 'center', width: 130},
|
||||
{ name: 'regDt', header: '등록일', width: 90, cls: 'td_line' }
|
||||
],
|
||||
noDataStr: '검색 결과가 없습니다.',
|
||||
// params: {
|
||||
// apprResult: '',
|
||||
// searchType: '',
|
||||
// searchText: '',
|
||||
// startDate: '',
|
||||
// endDate: ''
|
||||
// },
|
||||
excelHeader: []
|
||||
}
|
||||
};
|
||||
},
|
||||
components: {
|
||||
customGrid: customGrid
|
||||
},
|
||||
destroyed() {
|
||||
|
||||
},
|
||||
mounted() {
|
||||
let isKeep = false;
|
||||
isKeep = true;
|
||||
this.search(isKeep);
|
||||
},
|
||||
methods: {
|
||||
search: function(isKeep) {
|
||||
console.log(this.testList.params);
|
||||
this.$refs.table.search(this.testList.params, isKeep);
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
||||
33
frontend/src/modules/riskMgt/router/index.js
Normal file
33
frontend/src/modules/riskMgt/router/index.js
Normal file
@@ -0,0 +1,33 @@
|
||||
import IntrcpList from '../views/IntrcpList'
|
||||
import ZezNum from '../views/ZezNum'
|
||||
import Msg from '../views/Msg'
|
||||
import All from '../views/All'
|
||||
|
||||
export default [
|
||||
{
|
||||
path: '/riskMgt/sendNum/intrcpList',
|
||||
component: IntrcpList,
|
||||
name: 'intrcpList',
|
||||
meta: { public: true }
|
||||
},
|
||||
{
|
||||
path: '/riskMgt/sendNum/zezNum',
|
||||
component: ZezNum,
|
||||
name: 'zezNum',
|
||||
meta: { public: true }
|
||||
},
|
||||
{
|
||||
path: '/riskMgt/sendNum/msg',
|
||||
component: Msg,
|
||||
name: 'msg',
|
||||
meta: { public: true }
|
||||
},
|
||||
{
|
||||
path: '/riskMgt/sendNum/all',
|
||||
component: All,
|
||||
name: 'all',
|
||||
meta: { public: true }
|
||||
},
|
||||
|
||||
]
|
||||
|
||||
165
frontend/src/modules/riskMgt/views/All.vue
Normal file
165
frontend/src/modules/riskMgt/views/All.vue
Normal file
@@ -0,0 +1,165 @@
|
||||
<template>
|
||||
|
||||
<div class="contents">
|
||||
<div class="contents_wrap">
|
||||
<div class="top_wrap">
|
||||
<h3 class="title">차단 내역 목록 조회</h3>
|
||||
<p class="breadcrumb">시스템관리 > 관리자/유치채널 관리</p>
|
||||
</div>
|
||||
<form autocomplete="off" class="search_form">
|
||||
<div class="search_wrap">
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">권한</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="대리점">대리점</option>
|
||||
<option value="운영자">운영자</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">상태</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="사용">사용</option>
|
||||
<option value="중지">중지</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="input_box id">
|
||||
<label for="id1" class="label">ID</label>
|
||||
<input type="text" id="id1" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<div class="input_box">
|
||||
<label for="name" class="label">이름(대리점명)</label>
|
||||
<input type="text" id="name" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<button type="button" class="button grey">조회</button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="info">
|
||||
<div class="count">총 <span>100</span>건</div>
|
||||
<div class="button_group">
|
||||
<button type="button" class="button blue admin">관리자 등록</button>
|
||||
<button type="button" class="button blue channel">유지채널 등록</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="table">
|
||||
<table>
|
||||
<colgroup>
|
||||
<col width="5%"/>
|
||||
<col width="15%"/>
|
||||
<col width="15%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="5%"/>
|
||||
<col width="20%"/>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><input type="checkbox" id="admin_check1"><label for="admin_check1"></label></th>
|
||||
<th>NO</th>
|
||||
<th>권한</th>
|
||||
<th>이름(대리점명)</th>
|
||||
<th>ID</th>
|
||||
<th>상태</th>
|
||||
<th>등록일</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><input type="checkbox" checked id="admin_check2"><label for="admin_check2"></label></td>
|
||||
<td>10</td>
|
||||
<td>대리점</td>
|
||||
<td>유플러스</td>
|
||||
<td><a href="javascript:void(0)">uplus1</a></td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div> -->
|
||||
<div class="table">
|
||||
<custom-grid
|
||||
ref="table"
|
||||
:totalItems="'totalItems'"
|
||||
:url="testList.url"
|
||||
:perPage="testList.perPage"
|
||||
:initialRequest="testList.initialRequest"
|
||||
:pagination="testList.pagination"
|
||||
:isCheckbox="testList.isCheckbox"
|
||||
:columns="testList.columns"
|
||||
:noDataStr="testList.noDataStr"
|
||||
:addCls="testList.addCls"
|
||||
:header="testList.header"
|
||||
></custom-grid>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import customGrid from '@/components/CustomGrid';
|
||||
//import api from '../service/api';
|
||||
export default {
|
||||
name: 'intrcpList',
|
||||
data() {
|
||||
return {
|
||||
testList: {
|
||||
url: '/api/v1/bo/sysMgt/adminList',
|
||||
perPage: 20,
|
||||
pagination: true,
|
||||
isCheckbox: true,
|
||||
initialRequest: false,
|
||||
addCls: 'box_OFvis',
|
||||
|
||||
|
||||
header: [
|
||||
[
|
||||
{ header: 'NO', childNames: [] },
|
||||
{ header: '권한', childNames: [] },
|
||||
{ header: '이름(대리점명)', childNames: [] },
|
||||
{ header: 'ID', childNames: [] },
|
||||
{ header: '상태', childNames: [] },
|
||||
{ header: '등록일', childNames: [] }
|
||||
]
|
||||
],
|
||||
|
||||
columns: [
|
||||
{ name: 'no', header: 'NO', align: 'center', width: 60 },
|
||||
{ name: 'auth', header: '권한', align: 'left', width: 160 },
|
||||
{ name: 'name', header: '이름(대리점명)', align: 'center', width: 130},
|
||||
{ name: 'adminId', header: 'ID', align: 'center', width: 130},
|
||||
{ name: 'adminStat', header: '상태', align: 'center', width: 130},
|
||||
{ name: 'regDt', header: '등록일', width: 90, cls: 'td_line' }
|
||||
],
|
||||
noDataStr: '검색 결과가 없습니다.',
|
||||
// params: {
|
||||
// apprResult: '',
|
||||
// searchType: '',
|
||||
// searchText: '',
|
||||
// startDate: '',
|
||||
// endDate: ''
|
||||
// },
|
||||
excelHeader: []
|
||||
}
|
||||
};
|
||||
},
|
||||
components: {
|
||||
customGrid: customGrid
|
||||
},
|
||||
destroyed() {
|
||||
|
||||
},
|
||||
mounted() {
|
||||
let isKeep = false;
|
||||
isKeep = true;
|
||||
this.search(isKeep);
|
||||
},
|
||||
methods: {
|
||||
search: function(isKeep) {
|
||||
console.log(this.testList.params);
|
||||
this.$refs.table.search(this.testList.params, isKeep);
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
||||
165
frontend/src/modules/riskMgt/views/IntrcpList.vue
Normal file
165
frontend/src/modules/riskMgt/views/IntrcpList.vue
Normal file
@@ -0,0 +1,165 @@
|
||||
<template>
|
||||
|
||||
<div class="contents">
|
||||
<div class="contents_wrap">
|
||||
<div class="top_wrap">
|
||||
<h3 class="title">발신번호 차단 목록 조회</h3>
|
||||
<p class="breadcrumb">시스템관리 > 관리자/유치채널 관리</p>
|
||||
</div>
|
||||
<form autocomplete="off" class="search_form">
|
||||
<div class="search_wrap">
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">권한</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="대리점">대리점</option>
|
||||
<option value="운영자">운영자</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">상태</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="사용">사용</option>
|
||||
<option value="중지">중지</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="input_box id">
|
||||
<label for="id1" class="label">ID</label>
|
||||
<input type="text" id="id1" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<div class="input_box">
|
||||
<label for="name" class="label">이름(대리점명)</label>
|
||||
<input type="text" id="name" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<button type="button" class="button grey">조회</button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="info">
|
||||
<div class="count">총 <span>100</span>건</div>
|
||||
<div class="button_group">
|
||||
<button type="button" class="button blue admin">관리자 등록</button>
|
||||
<button type="button" class="button blue channel">유지채널 등록</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="table">
|
||||
<table>
|
||||
<colgroup>
|
||||
<col width="5%"/>
|
||||
<col width="15%"/>
|
||||
<col width="15%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="5%"/>
|
||||
<col width="20%"/>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><input type="checkbox" id="admin_check1"><label for="admin_check1"></label></th>
|
||||
<th>NO</th>
|
||||
<th>권한</th>
|
||||
<th>이름(대리점명)</th>
|
||||
<th>ID</th>
|
||||
<th>상태</th>
|
||||
<th>등록일</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><input type="checkbox" checked id="admin_check2"><label for="admin_check2"></label></td>
|
||||
<td>10</td>
|
||||
<td>대리점</td>
|
||||
<td>유플러스</td>
|
||||
<td><a href="javascript:void(0)">uplus1</a></td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div> -->
|
||||
<div class="table">
|
||||
<custom-grid
|
||||
ref="table"
|
||||
:totalItems="'totalItems'"
|
||||
:url="testList.url"
|
||||
:perPage="testList.perPage"
|
||||
:initialRequest="testList.initialRequest"
|
||||
:pagination="testList.pagination"
|
||||
:isCheckbox="testList.isCheckbox"
|
||||
:columns="testList.columns"
|
||||
:noDataStr="testList.noDataStr"
|
||||
:addCls="testList.addCls"
|
||||
:header="testList.header"
|
||||
></custom-grid>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import customGrid from '@/components/CustomGrid';
|
||||
//import api from '../service/api';
|
||||
export default {
|
||||
name: 'intrcpList',
|
||||
data() {
|
||||
return {
|
||||
testList: {
|
||||
url: '/api/v1/bo/sysMgt/adminList',
|
||||
perPage: 20,
|
||||
pagination: true,
|
||||
isCheckbox: true,
|
||||
initialRequest: false,
|
||||
addCls: 'box_OFvis',
|
||||
|
||||
|
||||
header: [
|
||||
[
|
||||
{ header: 'NO', childNames: [] },
|
||||
{ header: '권한', childNames: [] },
|
||||
{ header: '이름(대리점명)', childNames: [] },
|
||||
{ header: 'ID', childNames: [] },
|
||||
{ header: '상태', childNames: [] },
|
||||
{ header: '등록일', childNames: [] }
|
||||
]
|
||||
],
|
||||
|
||||
columns: [
|
||||
{ name: 'no', header: 'NO', align: 'center', width: 60 },
|
||||
{ name: 'auth', header: '권한', align: 'left', width: 160 },
|
||||
{ name: 'name', header: '이름(대리점명)', align: 'center', width: 130},
|
||||
{ name: 'adminId', header: 'ID', align: 'center', width: 130},
|
||||
{ name: 'adminStat', header: '상태', align: 'center', width: 130},
|
||||
{ name: 'regDt', header: '등록일', width: 90, cls: 'td_line' }
|
||||
],
|
||||
noDataStr: '검색 결과가 없습니다.',
|
||||
// params: {
|
||||
// apprResult: '',
|
||||
// searchType: '',
|
||||
// searchText: '',
|
||||
// startDate: '',
|
||||
// endDate: ''
|
||||
// },
|
||||
excelHeader: []
|
||||
}
|
||||
};
|
||||
},
|
||||
components: {
|
||||
customGrid: customGrid
|
||||
},
|
||||
destroyed() {
|
||||
|
||||
},
|
||||
mounted() {
|
||||
let isKeep = false;
|
||||
isKeep = true;
|
||||
this.search(isKeep);
|
||||
},
|
||||
methods: {
|
||||
search: function(isKeep) {
|
||||
console.log(this.testList.params);
|
||||
this.$refs.table.search(this.testList.params, isKeep);
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
||||
165
frontend/src/modules/riskMgt/views/Msg.vue
Normal file
165
frontend/src/modules/riskMgt/views/Msg.vue
Normal file
@@ -0,0 +1,165 @@
|
||||
<template>
|
||||
|
||||
<div class="contents">
|
||||
<div class="contents_wrap">
|
||||
<div class="top_wrap">
|
||||
<h3 class="title">메시지 차단 목록 조회</h3>
|
||||
<p class="breadcrumb">시스템관리 > 관리자/유치채널 관리</p>
|
||||
</div>
|
||||
<form autocomplete="off" class="search_form">
|
||||
<div class="search_wrap">
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">권한</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="대리점">대리점</option>
|
||||
<option value="운영자">운영자</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">상태</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="사용">사용</option>
|
||||
<option value="중지">중지</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="input_box id">
|
||||
<label for="id1" class="label">ID</label>
|
||||
<input type="text" id="id1" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<div class="input_box">
|
||||
<label for="name" class="label">이름(대리점명)</label>
|
||||
<input type="text" id="name" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<button type="button" class="button grey">조회</button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="info">
|
||||
<div class="count">총 <span>100</span>건</div>
|
||||
<div class="button_group">
|
||||
<button type="button" class="button blue admin">관리자 등록</button>
|
||||
<button type="button" class="button blue channel">유지채널 등록</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="table">
|
||||
<table>
|
||||
<colgroup>
|
||||
<col width="5%"/>
|
||||
<col width="15%"/>
|
||||
<col width="15%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="5%"/>
|
||||
<col width="20%"/>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><input type="checkbox" id="admin_check1"><label for="admin_check1"></label></th>
|
||||
<th>NO</th>
|
||||
<th>권한</th>
|
||||
<th>이름(대리점명)</th>
|
||||
<th>ID</th>
|
||||
<th>상태</th>
|
||||
<th>등록일</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><input type="checkbox" checked id="admin_check2"><label for="admin_check2"></label></td>
|
||||
<td>10</td>
|
||||
<td>대리점</td>
|
||||
<td>유플러스</td>
|
||||
<td><a href="javascript:void(0)">uplus1</a></td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div> -->
|
||||
<div class="table">
|
||||
<custom-grid
|
||||
ref="table"
|
||||
:totalItems="'totalItems'"
|
||||
:url="testList.url"
|
||||
:perPage="testList.perPage"
|
||||
:initialRequest="testList.initialRequest"
|
||||
:pagination="testList.pagination"
|
||||
:isCheckbox="testList.isCheckbox"
|
||||
:columns="testList.columns"
|
||||
:noDataStr="testList.noDataStr"
|
||||
:addCls="testList.addCls"
|
||||
:header="testList.header"
|
||||
></custom-grid>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import customGrid from '@/components/CustomGrid';
|
||||
//import api from '../service/api';
|
||||
export default {
|
||||
name: 'intrcpList',
|
||||
data() {
|
||||
return {
|
||||
testList: {
|
||||
url: '/api/v1/bo/sysMgt/adminList',
|
||||
perPage: 20,
|
||||
pagination: true,
|
||||
isCheckbox: true,
|
||||
initialRequest: false,
|
||||
addCls: 'box_OFvis',
|
||||
|
||||
|
||||
header: [
|
||||
[
|
||||
{ header: 'NO', childNames: [] },
|
||||
{ header: '권한', childNames: [] },
|
||||
{ header: '이름(대리점명)', childNames: [] },
|
||||
{ header: 'ID', childNames: [] },
|
||||
{ header: '상태', childNames: [] },
|
||||
{ header: '등록일', childNames: [] }
|
||||
]
|
||||
],
|
||||
|
||||
columns: [
|
||||
{ name: 'no', header: 'NO', align: 'center', width: 60 },
|
||||
{ name: 'auth', header: '권한', align: 'left', width: 160 },
|
||||
{ name: 'name', header: '이름(대리점명)', align: 'center', width: 130},
|
||||
{ name: 'adminId', header: 'ID', align: 'center', width: 130},
|
||||
{ name: 'adminStat', header: '상태', align: 'center', width: 130},
|
||||
{ name: 'regDt', header: '등록일', width: 90, cls: 'td_line' }
|
||||
],
|
||||
noDataStr: '검색 결과가 없습니다.',
|
||||
// params: {
|
||||
// apprResult: '',
|
||||
// searchType: '',
|
||||
// searchText: '',
|
||||
// startDate: '',
|
||||
// endDate: ''
|
||||
// },
|
||||
excelHeader: []
|
||||
}
|
||||
};
|
||||
},
|
||||
components: {
|
||||
customGrid: customGrid
|
||||
},
|
||||
destroyed() {
|
||||
|
||||
},
|
||||
mounted() {
|
||||
let isKeep = false;
|
||||
isKeep = true;
|
||||
this.search(isKeep);
|
||||
},
|
||||
methods: {
|
||||
search: function(isKeep) {
|
||||
console.log(this.testList.params);
|
||||
this.$refs.table.search(this.testList.params, isKeep);
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
||||
165
frontend/src/modules/riskMgt/views/ZezNum.vue
Normal file
165
frontend/src/modules/riskMgt/views/ZezNum.vue
Normal file
@@ -0,0 +1,165 @@
|
||||
<template>
|
||||
|
||||
<div class="contents">
|
||||
<div class="contents_wrap">
|
||||
<div class="top_wrap">
|
||||
<h3 class="title">080수신번호 차단 목록 조회</h3>
|
||||
<p class="breadcrumb">시스템관리 > 관리자/유치채널 관리</p>
|
||||
</div>
|
||||
<form autocomplete="off" class="search_form">
|
||||
<div class="search_wrap">
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">권한</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="대리점">대리점</option>
|
||||
<option value="운영자">운영자</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">상태</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="사용">사용</option>
|
||||
<option value="중지">중지</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="input_box id">
|
||||
<label for="id1" class="label">ID</label>
|
||||
<input type="text" id="id1" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<div class="input_box">
|
||||
<label for="name" class="label">이름(대리점명)</label>
|
||||
<input type="text" id="name" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<button type="button" class="button grey">조회</button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="info">
|
||||
<div class="count">총 <span>100</span>건</div>
|
||||
<div class="button_group">
|
||||
<button type="button" class="button blue admin">관리자 등록</button>
|
||||
<button type="button" class="button blue channel">유지채널 등록</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="table">
|
||||
<table>
|
||||
<colgroup>
|
||||
<col width="5%"/>
|
||||
<col width="15%"/>
|
||||
<col width="15%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="5%"/>
|
||||
<col width="20%"/>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><input type="checkbox" id="admin_check1"><label for="admin_check1"></label></th>
|
||||
<th>NO</th>
|
||||
<th>권한</th>
|
||||
<th>이름(대리점명)</th>
|
||||
<th>ID</th>
|
||||
<th>상태</th>
|
||||
<th>등록일</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><input type="checkbox" checked id="admin_check2"><label for="admin_check2"></label></td>
|
||||
<td>10</td>
|
||||
<td>대리점</td>
|
||||
<td>유플러스</td>
|
||||
<td><a href="javascript:void(0)">uplus1</a></td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div> -->
|
||||
<div class="table">
|
||||
<custom-grid
|
||||
ref="table"
|
||||
:totalItems="'totalItems'"
|
||||
:url="testList.url"
|
||||
:perPage="testList.perPage"
|
||||
:initialRequest="testList.initialRequest"
|
||||
:pagination="testList.pagination"
|
||||
:isCheckbox="testList.isCheckbox"
|
||||
:columns="testList.columns"
|
||||
:noDataStr="testList.noDataStr"
|
||||
:addCls="testList.addCls"
|
||||
:header="testList.header"
|
||||
></custom-grid>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import customGrid from '@/components/CustomGrid';
|
||||
//import api from '../service/api';
|
||||
export default {
|
||||
name: 'intrcpList',
|
||||
data() {
|
||||
return {
|
||||
testList: {
|
||||
url: '/api/v1/bo/sysMgt/adminList',
|
||||
perPage: 20,
|
||||
pagination: true,
|
||||
isCheckbox: true,
|
||||
initialRequest: false,
|
||||
addCls: 'box_OFvis',
|
||||
|
||||
|
||||
header: [
|
||||
[
|
||||
{ header: 'NO', childNames: [] },
|
||||
{ header: '권한', childNames: [] },
|
||||
{ header: '이름(대리점명)', childNames: [] },
|
||||
{ header: 'ID', childNames: [] },
|
||||
{ header: '상태', childNames: [] },
|
||||
{ header: '등록일', childNames: [] }
|
||||
]
|
||||
],
|
||||
|
||||
columns: [
|
||||
{ name: 'no', header: 'NO', align: 'center', width: 60 },
|
||||
{ name: 'auth', header: '권한', align: 'left', width: 160 },
|
||||
{ name: 'name', header: '이름(대리점명)', align: 'center', width: 130},
|
||||
{ name: 'adminId', header: 'ID', align: 'center', width: 130},
|
||||
{ name: 'adminStat', header: '상태', align: 'center', width: 130},
|
||||
{ name: 'regDt', header: '등록일', width: 90, cls: 'td_line' }
|
||||
],
|
||||
noDataStr: '검색 결과가 없습니다.',
|
||||
// params: {
|
||||
// apprResult: '',
|
||||
// searchType: '',
|
||||
// searchText: '',
|
||||
// startDate: '',
|
||||
// endDate: ''
|
||||
// },
|
||||
excelHeader: []
|
||||
}
|
||||
};
|
||||
},
|
||||
components: {
|
||||
customGrid: customGrid
|
||||
},
|
||||
destroyed() {
|
||||
|
||||
},
|
||||
mounted() {
|
||||
let isKeep = false;
|
||||
isKeep = true;
|
||||
this.search(isKeep);
|
||||
},
|
||||
methods: {
|
||||
search: function(isKeep) {
|
||||
console.log(this.testList.params);
|
||||
this.$refs.table.search(this.testList.params, isKeep);
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
||||
26
frontend/src/modules/sendNumMgt/router/index.js
Normal file
26
frontend/src/modules/sendNumMgt/router/index.js
Normal file
@@ -0,0 +1,26 @@
|
||||
import ProfileList from '../views/ProfileList'
|
||||
import NumberList from '../views/NumberList'
|
||||
import ApprList from '../views/ApprList'
|
||||
|
||||
export default [
|
||||
{
|
||||
path: '/sendNumMgt/profileList',
|
||||
component: ProfileList,
|
||||
name: 'profileList',
|
||||
meta: { public: true }
|
||||
},
|
||||
{
|
||||
path: '/sendNumMgt/numberList',
|
||||
component: NumberList,
|
||||
name: 'numberList',
|
||||
meta: { public: true }
|
||||
},
|
||||
{
|
||||
path: '/sendNumMgt/apprList',
|
||||
component: ApprList,
|
||||
name: 'apprList',
|
||||
meta: { public: true }
|
||||
},
|
||||
|
||||
]
|
||||
|
||||
165
frontend/src/modules/sendNumMgt/views/ApprList.vue
Normal file
165
frontend/src/modules/sendNumMgt/views/ApprList.vue
Normal file
@@ -0,0 +1,165 @@
|
||||
<template>
|
||||
|
||||
<div class="contents">
|
||||
<div class="contents_wrap">
|
||||
<div class="top_wrap">
|
||||
<h3 class="title">발신번호 승인 목록 조회</h3>
|
||||
<p class="breadcrumb">시스템관리 > 관리자/유치채널 관리</p>
|
||||
</div>
|
||||
<form autocomplete="off" class="search_form">
|
||||
<div class="search_wrap">
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">권한</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="대리점">대리점</option>
|
||||
<option value="운영자">운영자</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">상태</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="사용">사용</option>
|
||||
<option value="중지">중지</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="input_box id">
|
||||
<label for="id1" class="label">ID</label>
|
||||
<input type="text" id="id1" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<div class="input_box">
|
||||
<label for="name" class="label">이름(대리점명)</label>
|
||||
<input type="text" id="name" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<button type="button" class="button grey">조회</button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="info">
|
||||
<div class="count">총 <span>100</span>건</div>
|
||||
<div class="button_group">
|
||||
<button type="button" class="button blue admin">관리자 등록</button>
|
||||
<button type="button" class="button blue channel">유지채널 등록</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="table">
|
||||
<table>
|
||||
<colgroup>
|
||||
<col width="5%"/>
|
||||
<col width="15%"/>
|
||||
<col width="15%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="5%"/>
|
||||
<col width="20%"/>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><input type="checkbox" id="admin_check1"><label for="admin_check1"></label></th>
|
||||
<th>NO</th>
|
||||
<th>권한</th>
|
||||
<th>이름(대리점명)</th>
|
||||
<th>ID</th>
|
||||
<th>상태</th>
|
||||
<th>등록일</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><input type="checkbox" checked id="admin_check2"><label for="admin_check2"></label></td>
|
||||
<td>10</td>
|
||||
<td>대리점</td>
|
||||
<td>유플러스</td>
|
||||
<td><a href="javascript:void(0)">uplus1</a></td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div> -->
|
||||
<div class="table">
|
||||
<custom-grid
|
||||
ref="table"
|
||||
:totalItems="'totalItems'"
|
||||
:url="testList.url"
|
||||
:perPage="testList.perPage"
|
||||
:initialRequest="testList.initialRequest"
|
||||
:pagination="testList.pagination"
|
||||
:isCheckbox="testList.isCheckbox"
|
||||
:columns="testList.columns"
|
||||
:noDataStr="testList.noDataStr"
|
||||
:addCls="testList.addCls"
|
||||
:header="testList.header"
|
||||
></custom-grid>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import customGrid from '@/components/CustomGrid';
|
||||
//import api from '../service/api';
|
||||
export default {
|
||||
name: 'profileList',
|
||||
data() {
|
||||
return {
|
||||
testList: {
|
||||
url: '/api/v1/bo/sysMgt/adminList',
|
||||
perPage: 20,
|
||||
pagination: true,
|
||||
isCheckbox: true,
|
||||
initialRequest: false,
|
||||
addCls: 'box_OFvis',
|
||||
|
||||
|
||||
header: [
|
||||
[
|
||||
{ header: 'NO', childNames: [] },
|
||||
{ header: '권한', childNames: [] },
|
||||
{ header: '이름(대리점명)', childNames: [] },
|
||||
{ header: 'ID', childNames: [] },
|
||||
{ header: '상태', childNames: [] },
|
||||
{ header: '등록일', childNames: [] }
|
||||
]
|
||||
],
|
||||
|
||||
columns: [
|
||||
{ name: 'no', header: 'NO', align: 'center', width: 60 },
|
||||
{ name: 'auth', header: '권한', align: 'left', width: 160 },
|
||||
{ name: 'name', header: '이름(대리점명)', align: 'center', width: 130},
|
||||
{ name: 'adminId', header: 'ID', align: 'center', width: 130},
|
||||
{ name: 'adminStat', header: '상태', align: 'center', width: 130},
|
||||
{ name: 'regDt', header: '등록일', width: 90, cls: 'td_line' }
|
||||
],
|
||||
noDataStr: '검색 결과가 없습니다.',
|
||||
// params: {
|
||||
// apprResult: '',
|
||||
// searchType: '',
|
||||
// searchText: '',
|
||||
// startDate: '',
|
||||
// endDate: ''
|
||||
// },
|
||||
excelHeader: []
|
||||
}
|
||||
};
|
||||
},
|
||||
components: {
|
||||
customGrid: customGrid
|
||||
},
|
||||
destroyed() {
|
||||
|
||||
},
|
||||
mounted() {
|
||||
let isKeep = false;
|
||||
isKeep = true;
|
||||
this.search(isKeep);
|
||||
},
|
||||
methods: {
|
||||
search: function(isKeep) {
|
||||
console.log(this.testList.params);
|
||||
this.$refs.table.search(this.testList.params, isKeep);
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
||||
165
frontend/src/modules/sendNumMgt/views/NumberList.vue
Normal file
165
frontend/src/modules/sendNumMgt/views/NumberList.vue
Normal file
@@ -0,0 +1,165 @@
|
||||
<template>
|
||||
|
||||
<div class="contents">
|
||||
<div class="contents_wrap">
|
||||
<div class="top_wrap">
|
||||
<h3 class="title">문자 발신 번호 목록 조회</h3>
|
||||
<p class="breadcrumb">시스템관리 > 관리자/유치채널 관리</p>
|
||||
</div>
|
||||
<form autocomplete="off" class="search_form">
|
||||
<div class="search_wrap">
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">권한</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="대리점">대리점</option>
|
||||
<option value="운영자">운영자</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">상태</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="사용">사용</option>
|
||||
<option value="중지">중지</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="input_box id">
|
||||
<label for="id1" class="label">ID</label>
|
||||
<input type="text" id="id1" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<div class="input_box">
|
||||
<label for="name" class="label">이름(대리점명)</label>
|
||||
<input type="text" id="name" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<button type="button" class="button grey">조회</button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="info">
|
||||
<div class="count">총 <span>100</span>건</div>
|
||||
<div class="button_group">
|
||||
<button type="button" class="button blue admin">관리자 등록</button>
|
||||
<button type="button" class="button blue channel">유지채널 등록</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="table">
|
||||
<table>
|
||||
<colgroup>
|
||||
<col width="5%"/>
|
||||
<col width="15%"/>
|
||||
<col width="15%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="5%"/>
|
||||
<col width="20%"/>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><input type="checkbox" id="admin_check1"><label for="admin_check1"></label></th>
|
||||
<th>NO</th>
|
||||
<th>권한</th>
|
||||
<th>이름(대리점명)</th>
|
||||
<th>ID</th>
|
||||
<th>상태</th>
|
||||
<th>등록일</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><input type="checkbox" checked id="admin_check2"><label for="admin_check2"></label></td>
|
||||
<td>10</td>
|
||||
<td>대리점</td>
|
||||
<td>유플러스</td>
|
||||
<td><a href="javascript:void(0)">uplus1</a></td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div> -->
|
||||
<div class="table">
|
||||
<custom-grid
|
||||
ref="table"
|
||||
:totalItems="'totalItems'"
|
||||
:url="testList.url"
|
||||
:perPage="testList.perPage"
|
||||
:initialRequest="testList.initialRequest"
|
||||
:pagination="testList.pagination"
|
||||
:isCheckbox="testList.isCheckbox"
|
||||
:columns="testList.columns"
|
||||
:noDataStr="testList.noDataStr"
|
||||
:addCls="testList.addCls"
|
||||
:header="testList.header"
|
||||
></custom-grid>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import customGrid from '@/components/CustomGrid';
|
||||
//import api from '../service/api';
|
||||
export default {
|
||||
name: 'profileList',
|
||||
data() {
|
||||
return {
|
||||
testList: {
|
||||
url: '/api/v1/bo/sysMgt/adminList',
|
||||
perPage: 20,
|
||||
pagination: true,
|
||||
isCheckbox: true,
|
||||
initialRequest: false,
|
||||
addCls: 'box_OFvis',
|
||||
|
||||
|
||||
header: [
|
||||
[
|
||||
{ header: 'NO', childNames: [] },
|
||||
{ header: '권한', childNames: [] },
|
||||
{ header: '이름(대리점명)', childNames: [] },
|
||||
{ header: 'ID', childNames: [] },
|
||||
{ header: '상태', childNames: [] },
|
||||
{ header: '등록일', childNames: [] }
|
||||
]
|
||||
],
|
||||
|
||||
columns: [
|
||||
{ name: 'no', header: 'NO', align: 'center', width: 60 },
|
||||
{ name: 'auth', header: '권한', align: 'left', width: 160 },
|
||||
{ name: 'name', header: '이름(대리점명)', align: 'center', width: 130},
|
||||
{ name: 'adminId', header: 'ID', align: 'center', width: 130},
|
||||
{ name: 'adminStat', header: '상태', align: 'center', width: 130},
|
||||
{ name: 'regDt', header: '등록일', width: 90, cls: 'td_line' }
|
||||
],
|
||||
noDataStr: '검색 결과가 없습니다.',
|
||||
// params: {
|
||||
// apprResult: '',
|
||||
// searchType: '',
|
||||
// searchText: '',
|
||||
// startDate: '',
|
||||
// endDate: ''
|
||||
// },
|
||||
excelHeader: []
|
||||
}
|
||||
};
|
||||
},
|
||||
components: {
|
||||
customGrid: customGrid
|
||||
},
|
||||
destroyed() {
|
||||
|
||||
},
|
||||
mounted() {
|
||||
let isKeep = false;
|
||||
isKeep = true;
|
||||
this.search(isKeep);
|
||||
},
|
||||
methods: {
|
||||
search: function(isKeep) {
|
||||
console.log(this.testList.params);
|
||||
this.$refs.table.search(this.testList.params, isKeep);
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
||||
165
frontend/src/modules/sendNumMgt/views/ProfileList.vue
Normal file
165
frontend/src/modules/sendNumMgt/views/ProfileList.vue
Normal file
@@ -0,0 +1,165 @@
|
||||
<template>
|
||||
|
||||
<div class="contents">
|
||||
<div class="contents_wrap">
|
||||
<div class="top_wrap">
|
||||
<h3 class="title">발신 프로필 목록 조회</h3>
|
||||
<p class="breadcrumb">시스템관리 > 관리자/유치채널 관리</p>
|
||||
</div>
|
||||
<form autocomplete="off" class="search_form">
|
||||
<div class="search_wrap">
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">권한</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="대리점">대리점</option>
|
||||
<option value="운영자">운영자</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">상태</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="사용">사용</option>
|
||||
<option value="중지">중지</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="input_box id">
|
||||
<label for="id1" class="label">ID</label>
|
||||
<input type="text" id="id1" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<div class="input_box">
|
||||
<label for="name" class="label">이름(대리점명)</label>
|
||||
<input type="text" id="name" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<button type="button" class="button grey">조회</button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="info">
|
||||
<div class="count">총 <span>100</span>건</div>
|
||||
<div class="button_group">
|
||||
<button type="button" class="button blue admin">관리자 등록</button>
|
||||
<button type="button" class="button blue channel">유지채널 등록</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="table">
|
||||
<table>
|
||||
<colgroup>
|
||||
<col width="5%"/>
|
||||
<col width="15%"/>
|
||||
<col width="15%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="5%"/>
|
||||
<col width="20%"/>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><input type="checkbox" id="admin_check1"><label for="admin_check1"></label></th>
|
||||
<th>NO</th>
|
||||
<th>권한</th>
|
||||
<th>이름(대리점명)</th>
|
||||
<th>ID</th>
|
||||
<th>상태</th>
|
||||
<th>등록일</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><input type="checkbox" checked id="admin_check2"><label for="admin_check2"></label></td>
|
||||
<td>10</td>
|
||||
<td>대리점</td>
|
||||
<td>유플러스</td>
|
||||
<td><a href="javascript:void(0)">uplus1</a></td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div> -->
|
||||
<div class="table">
|
||||
<custom-grid
|
||||
ref="table"
|
||||
:totalItems="'totalItems'"
|
||||
:url="testList.url"
|
||||
:perPage="testList.perPage"
|
||||
:initialRequest="testList.initialRequest"
|
||||
:pagination="testList.pagination"
|
||||
:isCheckbox="testList.isCheckbox"
|
||||
:columns="testList.columns"
|
||||
:noDataStr="testList.noDataStr"
|
||||
:addCls="testList.addCls"
|
||||
:header="testList.header"
|
||||
></custom-grid>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import customGrid from '@/components/CustomGrid';
|
||||
//import api from '../service/api';
|
||||
export default {
|
||||
name: 'profileList',
|
||||
data() {
|
||||
return {
|
||||
testList: {
|
||||
url: '/api/v1/bo/sysMgt/adminList',
|
||||
perPage: 20,
|
||||
pagination: true,
|
||||
isCheckbox: true,
|
||||
initialRequest: false,
|
||||
addCls: 'box_OFvis',
|
||||
|
||||
|
||||
header: [
|
||||
[
|
||||
{ header: 'NO', childNames: [] },
|
||||
{ header: '권한', childNames: [] },
|
||||
{ header: '이름(대리점명)', childNames: [] },
|
||||
{ header: 'ID', childNames: [] },
|
||||
{ header: '상태', childNames: [] },
|
||||
{ header: '등록일', childNames: [] }
|
||||
]
|
||||
],
|
||||
|
||||
columns: [
|
||||
{ name: 'no', header: 'NO', align: 'center', width: 60 },
|
||||
{ name: 'auth', header: '권한', align: 'left', width: 160 },
|
||||
{ name: 'name', header: '이름(대리점명)', align: 'center', width: 130},
|
||||
{ name: 'adminId', header: 'ID', align: 'center', width: 130},
|
||||
{ name: 'adminStat', header: '상태', align: 'center', width: 130},
|
||||
{ name: 'regDt', header: '등록일', width: 90, cls: 'td_line' }
|
||||
],
|
||||
noDataStr: '검색 결과가 없습니다.',
|
||||
// params: {
|
||||
// apprResult: '',
|
||||
// searchType: '',
|
||||
// searchText: '',
|
||||
// startDate: '',
|
||||
// endDate: ''
|
||||
// },
|
||||
excelHeader: []
|
||||
}
|
||||
};
|
||||
},
|
||||
components: {
|
||||
customGrid: customGrid
|
||||
},
|
||||
destroyed() {
|
||||
|
||||
},
|
||||
mounted() {
|
||||
let isKeep = false;
|
||||
isKeep = true;
|
||||
this.search(isKeep);
|
||||
},
|
||||
methods: {
|
||||
search: function(isKeep) {
|
||||
console.log(this.testList.params);
|
||||
this.$refs.table.search(this.testList.params, isKeep);
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
||||
11
frontend/src/modules/servMgt/router/index.js
Normal file
11
frontend/src/modules/servMgt/router/index.js
Normal file
@@ -0,0 +1,11 @@
|
||||
import rejectRecvList from '../views/rejectRecvList'
|
||||
|
||||
export default [
|
||||
{
|
||||
path: '/servMgt/rejectRecvList',
|
||||
component: rejectRecvList,
|
||||
name: 'rejectRecvList',
|
||||
meta: { public: true }
|
||||
},
|
||||
|
||||
]
|
||||
165
frontend/src/modules/servMgt/views/rejectRecvList.vue
Normal file
165
frontend/src/modules/servMgt/views/rejectRecvList.vue
Normal file
@@ -0,0 +1,165 @@
|
||||
<template>
|
||||
|
||||
<div class="contents">
|
||||
<div class="contents_wrap">
|
||||
<div class="top_wrap">
|
||||
<h3 class="title">서비스관리</h3>
|
||||
<p class="breadcrumb">시스템관리 > 관리자/유치채널 관리</p>
|
||||
</div>
|
||||
<form autocomplete="off" class="search_form">
|
||||
<div class="search_wrap">
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">권한</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="대리점">대리점</option>
|
||||
<option value="운영자">운영자</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">상태</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="사용">사용</option>
|
||||
<option value="중지">중지</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="input_box id">
|
||||
<label for="id1" class="label">ID</label>
|
||||
<input type="text" id="id1" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<div class="input_box">
|
||||
<label for="name" class="label">이름(대리점명)</label>
|
||||
<input type="text" id="name" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<button type="button" class="button grey">조회</button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="info">
|
||||
<div class="count">총 <span>100</span>건</div>
|
||||
<div class="button_group">
|
||||
<button type="button" class="button blue admin">관리자 등록</button>
|
||||
<button type="button" class="button blue channel">유지채널 등록</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="table">
|
||||
<table>
|
||||
<colgroup>
|
||||
<col width="5%"/>
|
||||
<col width="15%"/>
|
||||
<col width="15%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="5%"/>
|
||||
<col width="20%"/>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><input type="checkbox" id="admin_check1"><label for="admin_check1"></label></th>
|
||||
<th>NO</th>
|
||||
<th>권한</th>
|
||||
<th>이름(대리점명)</th>
|
||||
<th>ID</th>
|
||||
<th>상태</th>
|
||||
<th>등록일</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><input type="checkbox" checked id="admin_check2"><label for="admin_check2"></label></td>
|
||||
<td>10</td>
|
||||
<td>대리점</td>
|
||||
<td>유플러스</td>
|
||||
<td><a href="javascript:void(0)">uplus1</a></td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div> -->
|
||||
<div class="table">
|
||||
<custom-grid
|
||||
ref="table"
|
||||
:totalItems="'totalItems'"
|
||||
:url="testList.url"
|
||||
:perPage="testList.perPage"
|
||||
:initialRequest="testList.initialRequest"
|
||||
:pagination="testList.pagination"
|
||||
:isCheckbox="testList.isCheckbox"
|
||||
:columns="testList.columns"
|
||||
:noDataStr="testList.noDataStr"
|
||||
:addCls="testList.addCls"
|
||||
:header="testList.header"
|
||||
></custom-grid>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import customGrid from '@/components/CustomGrid';
|
||||
//import api from '../service/api';
|
||||
export default {
|
||||
name: 'rejectRecvList',
|
||||
data() {
|
||||
return {
|
||||
testList: {
|
||||
url: '/api/v1/bo/sysMgt/adminList',
|
||||
perPage: 20,
|
||||
pagination: true,
|
||||
isCheckbox: true,
|
||||
initialRequest: false,
|
||||
addCls: 'box_OFvis',
|
||||
|
||||
|
||||
header: [
|
||||
[
|
||||
{ header: 'NO', childNames: [] },
|
||||
{ header: '권한', childNames: [] },
|
||||
{ header: '이름(대리점명)', childNames: [] },
|
||||
{ header: 'ID', childNames: [] },
|
||||
{ header: '상태', childNames: [] },
|
||||
{ header: '등록일', childNames: [] }
|
||||
]
|
||||
],
|
||||
|
||||
columns: [
|
||||
{ name: 'no', header: 'NO', align: 'center', width: 60 },
|
||||
{ name: 'auth', header: '권한', align: 'left', width: 160 },
|
||||
{ name: 'name', header: '이름(대리점명)', align: 'center', width: 130},
|
||||
{ name: 'adminId', header: 'ID', align: 'center', width: 130},
|
||||
{ name: 'adminStat', header: '상태', align: 'center', width: 130},
|
||||
{ name: 'regDt', header: '등록일', width: 90, cls: 'td_line' }
|
||||
],
|
||||
noDataStr: '검색 결과가 없습니다.',
|
||||
// params: {
|
||||
// apprResult: '',
|
||||
// searchType: '',
|
||||
// searchText: '',
|
||||
// startDate: '',
|
||||
// endDate: ''
|
||||
// },
|
||||
excelHeader: []
|
||||
}
|
||||
};
|
||||
},
|
||||
components: {
|
||||
customGrid: customGrid
|
||||
},
|
||||
destroyed() {
|
||||
|
||||
},
|
||||
mounted() {
|
||||
let isKeep = false;
|
||||
isKeep = true;
|
||||
this.search(isKeep);
|
||||
},
|
||||
methods: {
|
||||
search: function(isKeep) {
|
||||
console.log(this.testList.params);
|
||||
this.$refs.table.search(this.testList.params, isKeep);
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
||||
563
frontend/src/modules/statics/components/CampaignStaticsList.vue
Normal file
563
frontend/src/modules/statics/components/CampaignStaticsList.vue
Normal file
@@ -0,0 +1,563 @@
|
||||
<template>
|
||||
<article id="content" class="content">
|
||||
<ul class="breadcrumb">
|
||||
<li class="home">
|
||||
<a href="javascript:void(0);">홈</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="javascript:void(0);">발송통계</a>
|
||||
</li>
|
||||
<li>
|
||||
<span>캠페인ID별통계</span>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="title_area">
|
||||
<h2>캠페인ID별통계</h2>
|
||||
</div>
|
||||
<div class="tab_wrap">
|
||||
<ul class="tab_nav">
|
||||
<li>
|
||||
<a
|
||||
href="javascript:void(0);"
|
||||
@click="isAdmin ? toMove('staticsList') : ''"
|
||||
:style="isAdmin ? '' : 'cursor:default'"
|
||||
>상품별통계</a>
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
href="javascript:void(0);"
|
||||
@click="isAdmin ? toMove('tmpltStatics') : ''"
|
||||
:style="isAdmin ? '' : 'cursor:default'"
|
||||
>포맷ID별통계</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="javascript:void(0);" @click="toMove('userStatics')">사용자별통계</a>
|
||||
</li>
|
||||
<li class="active">
|
||||
<a href="javascript:void(0);">캠페인ID별통계</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="box_search_area">
|
||||
<div class="filter_bundle_wrap">
|
||||
<div class="filter_bundle">
|
||||
<strong class="tit_bundle">발송일</strong>
|
||||
<div class="cont_bundle center">
|
||||
<div class="box_select_period">
|
||||
<div class="period_wrap">
|
||||
<span class="custom_input icon_date">
|
||||
<vuejs-datepicker
|
||||
:language="ko"
|
||||
:format="customFormatter"
|
||||
:disabled-dates="disabledSDate"
|
||||
:minimumView="sDateDiv"
|
||||
:maximumView="sDateDiv"
|
||||
v-model="startDate"
|
||||
@selected="selectedStartDate(0)"
|
||||
@closed="closeDate('start')"
|
||||
></vuejs-datepicker>
|
||||
</span>
|
||||
<span class="hypen">~</span>
|
||||
<span class="custom_input icon_date">
|
||||
<vuejs-datepicker
|
||||
:language="ko"
|
||||
:format="customFormatter"
|
||||
:disabled-dates="disabledEDate"
|
||||
:minimumView="sDateDiv"
|
||||
:maximumView="sDateDiv"
|
||||
v-model="endDate"
|
||||
@selected="selectedEndDate(0)"
|
||||
@closed="closeDate('end')"
|
||||
></vuejs-datepicker>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="radio_wrap">
|
||||
<span class="custom_radio">
|
||||
<input
|
||||
type="radio"
|
||||
name="radioDate"
|
||||
id="day"
|
||||
v-model="sDateDiv"
|
||||
value="day"
|
||||
checked
|
||||
>
|
||||
<label for="day">일별</label>
|
||||
</span>
|
||||
<span class="custom_radio">
|
||||
<input type="radio" name="radioDate" id="month" v-model="sDateDiv" value="month">
|
||||
<label for="month">월별</label>
|
||||
</span>
|
||||
<span class="custom_radio">
|
||||
<input type="radio" name="radioDate" id="year" v-model="sDateDiv" value="year">
|
||||
<label for="year">년별</label>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- end of filter_bundle_wrap -->
|
||||
|
||||
<div class="filter_bundle">
|
||||
<strong class="tit_bundle"> </strong>
|
||||
<div class="cont_flex_bundle full_width">
|
||||
<span style="width:336px;" class="custom_input">
|
||||
<input
|
||||
type="text"
|
||||
placeholder="캠페인ID를 입력해주세요."
|
||||
v-model="grid.params.searchCampId"
|
||||
@keyup.enter="search"
|
||||
maxlength="20"
|
||||
>
|
||||
<!-- <select>
|
||||
<option value="">부서</option>
|
||||
</select>-->
|
||||
<!-- <select
|
||||
v-model="grid.params.searchDeptNm"
|
||||
@change="selectUserIdList"
|
||||
v-bind:disabled="isSelIdDisabled"
|
||||
>
|
||||
<option value>부서</option>
|
||||
<option
|
||||
v-for="dept in deptNmList"
|
||||
:key="dept.deptNm"
|
||||
:value="dept.deptNm"
|
||||
>{{dept.deptNm}}</option>
|
||||
</select> -->
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<!-- end of filter_bundle 2 -->
|
||||
</div>
|
||||
<div class="btn_wrap center">
|
||||
<a href="javascript:void(0);" class="btn mid point" @click="searchSummary">
|
||||
<span>조회</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- end of box_search_area -->
|
||||
|
||||
<div class="cont_flex_bundle bottom mar_b20">
|
||||
<div class="result_date left col_6">
|
||||
<span>
|
||||
<em class="date">{{ customFormatter(startDate) }}</em> 부터
|
||||
<em class="date">{{ customFormatter(endDate) }}</em>까지의 전송/성공/성공률 입니다.
|
||||
</span>
|
||||
</div>
|
||||
<div class="btn_wrap right col_6">
|
||||
<a href="javascript:void(0)" class="btn sml bd_gray icon_down_doc" @click="excelDown()">
|
||||
<span>엑셀 다운로드</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<custom-grid
|
||||
ref="table"
|
||||
:url="grid.url"
|
||||
:perPage="grid.perPage"
|
||||
:pagination="grid.pagination"
|
||||
:header="grid.header"
|
||||
:columns="grid.columns"
|
||||
:noDataStr="grid.noDataStr"
|
||||
:initialRequest="grid.initialRequest"
|
||||
:addBodyAlign="grid.addAlign"
|
||||
:addBodyTmplt="grid.summary"
|
||||
></custom-grid>
|
||||
</article>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import moment from 'moment';
|
||||
|
||||
import customGrid from '@/components/CustomGrid';
|
||||
import api from '../service/api';
|
||||
import xlsx from '@/common/excel';
|
||||
|
||||
let summaryList = {};
|
||||
|
||||
export default {
|
||||
name: 'campaignStatisticList',
|
||||
|
||||
data() {
|
||||
return {
|
||||
userRoleInfoList: [],
|
||||
|
||||
bbsCategoryType: 'CAMPAIGN',
|
||||
ko: vdp_translation_ko.js,
|
||||
periodDay: 7,
|
||||
sDateDiv: 'day',
|
||||
startDate: new Date(),
|
||||
endDate: new Date(),
|
||||
|
||||
isSelIdDisabled: false,
|
||||
|
||||
isAdmin: true,
|
||||
excelHeader: [],
|
||||
|
||||
grid: {
|
||||
url: '/api/statics/campList',
|
||||
|
||||
initialRequest: false,
|
||||
pagination: true,
|
||||
perPage: 10,
|
||||
|
||||
header: [
|
||||
[
|
||||
{ header: 'NO', childNames: [] },
|
||||
{ header: '캠페인ID', childNames: [] },
|
||||
{ header: '템플릿명', childNames: [] },
|
||||
{ header: '템플릿아이디', childNames: [] },
|
||||
{ header: '날짜', childNames: [] },
|
||||
{ header: '스타일 템플릿', childNames: ['cellTmpltTot', 'cellTmpltRateStr'] },
|
||||
{ header: '서술 템플릿', childNames: ['descTmpltTot', 'descTmpltRateStr'] },
|
||||
{ header: '기본 템플릿', childNames: ['freeTmpltTot', 'freeTmpltRateStr'] },
|
||||
{ header: '템플릿 소계', childNames: ['subSumTmpltTot', 'subSumTmpltRateStr'] },
|
||||
{ header: 'RCS SMS', childNames: ['smsTot', 'smsRateStr'] },
|
||||
{ header: 'RCS LMS', childNames: ['lmsTot', 'lmsRateStr'] },
|
||||
{ header: 'RCS MMS', childNames: ['mmsTot', 'mmsRateStr'] },
|
||||
{ header: 'RCS 소계', childNames: ['formatTot', 'formatRateStr'] },
|
||||
{ header: 'Fallback SMS', childNames: ['fbSmsTot', 'fbSmsRateStr'] },
|
||||
{ header: 'Fallback LMS', childNames: ['fbLmsTot', 'fbLmsRateStr'] }
|
||||
]
|
||||
],
|
||||
|
||||
columns: [
|
||||
{ name: 'seq', header: 'NO', width: 100 },
|
||||
{
|
||||
name: 'campaignId',
|
||||
header: '캠페인ID',
|
||||
width: 150,
|
||||
formatter: props => {
|
||||
return '<div class="ellipsis">' + props.campaignId + '</div>';
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'msgbaseName',
|
||||
header: '템플릿명',
|
||||
width: 180,
|
||||
formatter: props => {
|
||||
return '<div class="ellipsis">' + props.msgbaseName + '</div>';
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'msgbaseId',
|
||||
header: '템플릿아이디',
|
||||
width: 200,
|
||||
formatter: props => {
|
||||
return '<div class="ellipsis">' + props.msgbaseId + '</div>';
|
||||
}
|
||||
},
|
||||
{ name: 'ymd', header: '날짜', width: 100 },
|
||||
{ name: 'cellTmpltTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'cellTmpltRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
{ name: 'descTmpltTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'descTmpltRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
{ name: 'freeTmpltTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'freeTmpltRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
{ name: 'subSumTmpltTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'subSumTmpltRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
|
||||
{ name: 'smsTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'smsRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
{ name: 'lmsTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'lmsRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
{ name: 'mmsTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'mmsRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
{ name: 'formatTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'formatRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
|
||||
{ name: 'fbSmsTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'fbSmsRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
{ name: 'fbLmsTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'fbLmsRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' }
|
||||
],
|
||||
|
||||
summary: '',
|
||||
addAlign: '',
|
||||
|
||||
noDataStr: '검색 결과가 없습니다.',
|
||||
params: {
|
||||
searchCampId: ''
|
||||
}
|
||||
}
|
||||
};
|
||||
},
|
||||
beforeCreate() {},
|
||||
created() {
|
||||
api.selectUserRoleInfo().then(response => {
|
||||
const respList = response.data.data;
|
||||
if (response.data.success && respList != null && respList.length > 0) {
|
||||
let adminStr = respList[0].selIsAdmin;
|
||||
if (typeof adminStr != undefined && adminStr != null && adminStr == 'false') {
|
||||
this.isAdmin = false;
|
||||
}
|
||||
} else {
|
||||
this.isAdmin = true;
|
||||
}
|
||||
});
|
||||
|
||||
this.setPeriodDay(0);
|
||||
this.getExcelHeader();
|
||||
},
|
||||
|
||||
mounted() {
|
||||
// 합계 조회
|
||||
this.searchSummary();
|
||||
},
|
||||
|
||||
components: {
|
||||
'vuejs-datepicker': vuejsDatepicker,
|
||||
customGrid: customGrid
|
||||
},
|
||||
methods: {
|
||||
getExcelHeader() {
|
||||
// 헤더를 mockup으로 관리한다.
|
||||
api.getExcelHeader(this.bbsCategoryType).then(res => {
|
||||
this.excelHeader = res;
|
||||
});
|
||||
},
|
||||
|
||||
selectUserRoleInfo() {
|
||||
api
|
||||
.selectUserRoleInfo()
|
||||
.then(response => {
|
||||
const respList = response.data.data;
|
||||
console.log('selectUserRoleInfo : ' , respList)
|
||||
if (response.data.success && respList != null && respList.length > 0) {
|
||||
this.userRoleInfoList = respList;
|
||||
} else {
|
||||
this.userRoleInfoList = '';
|
||||
}
|
||||
})
|
||||
.finally(() => {
|
||||
this.setUserIdListByRole();
|
||||
});
|
||||
},
|
||||
|
||||
setUserIdListByRole: function() {
|
||||
var selUserId = this.userRoleInfoList[0].selUserId;
|
||||
if (this.userRoleInfoList[0].selIsAdmin != null && this.userRoleInfoList[0].selIsAdmin == 'false') {
|
||||
if (this.userRoleInfoList != null && this.userRoleInfoList.length > 0) {
|
||||
this.userIdList = this.userIdListOrigin.filter(function(rowData) {
|
||||
if (rowData.userId == selUserId) {
|
||||
return rowData.userId;
|
||||
}
|
||||
});
|
||||
|
||||
this.grid.params.searchCampId = this.userRoleInfoList[0].selCampId;
|
||||
this.isSelIdDisabled = true; // 두개 같이 사용.
|
||||
}
|
||||
} else {
|
||||
let isContain = false;
|
||||
let currSelId = this.grid.params.searchCampId;
|
||||
this.userIdList.some(function(id) {
|
||||
if (currSelId == id) {
|
||||
isContain = true;
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
if (!isContain) this.grid.params.searchCampId = '';
|
||||
}
|
||||
},
|
||||
|
||||
customFormatter: function(date) {
|
||||
if (this.sDateDiv == 'month') {
|
||||
return moment(date).format('YYYY-MM');
|
||||
} else if (this.sDateDiv == 'year') {
|
||||
return moment(date).format('YYYY');
|
||||
} else {
|
||||
return moment(date).format('YYYY-MM-DD');
|
||||
}
|
||||
},
|
||||
toPage(lifeCycle) {
|
||||
const page = this.isNull(this.$route.params.page) ? 1 : this.$route.params.page;
|
||||
try {
|
||||
console.log('page-->', page);
|
||||
this.$refs.table.readData(page, this.grid.params);
|
||||
} catch (error) {
|
||||
console.log(lifeCycle, error);
|
||||
}
|
||||
},
|
||||
|
||||
toMove(routeName) {
|
||||
this.$router.push({ name: routeName, params: { page: 1, searchText: '' } });
|
||||
},
|
||||
|
||||
search: function(data) {
|
||||
this.grid.params = {
|
||||
sDate: moment(this.startDate).format('YYYYMMDD'),
|
||||
eDate: moment(this.endDate).format('YYYYMMDD'),
|
||||
dateDiv: this.sDateDiv,
|
||||
searchCampId: this.grid.params.searchCampId
|
||||
};
|
||||
this.$refs.table.search(this.grid.params);
|
||||
},
|
||||
|
||||
searchSummary: function(data) {
|
||||
let summaryList = {};
|
||||
|
||||
this.grid.params.sDate = moment(this.startDate).format('YYYYMMDD');
|
||||
this.grid.params.eDate = moment(this.endDate).format('YYYYMMDD');
|
||||
this.grid.params.dateDiv = this.sDateDiv;
|
||||
this.grid.params.searchCampId = this.grid.params.searchCampId;
|
||||
|
||||
api
|
||||
.selectCampSummary(this.grid.params)
|
||||
.then(response => {
|
||||
console.log('selectCampSummary : ' , response);
|
||||
const respList = response.data.data;
|
||||
if (response.data.success && respList != null && respList.length > 0) {
|
||||
summaryList = respList[0];
|
||||
|
||||
this.grid.addAlign = 'TOP';
|
||||
let addBody = '';
|
||||
addBody += '<tr>';
|
||||
addBody += '<td colspan="5">합계</td>';
|
||||
addBody += '<td>' + summaryList.cellTmpltTot + '</td>';
|
||||
addBody += '<td>' + summaryList.cellTmpltSucc + '<br>(' + summaryList.cellTmpltRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.descTmpltTot + '</td>';
|
||||
addBody += '<td>' + summaryList.descTmpltSucc + '<br>(' + summaryList.descTmpltRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.freeTmpltTot + '</td>';
|
||||
addBody += '<td>' + summaryList.freeTmpltSucc + '<br>(' + summaryList.freeTmpltRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.subSumTmpltTot + '</td>';
|
||||
addBody += '<td>' + summaryList.subSumTmpltSucc + '<br>(' + summaryList.subSumTmpltRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.smsTot + '</td>';
|
||||
addBody += '<td>' + summaryList.smsSucc + '<br>(' + summaryList.smsRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.lmsTot + '</td>';
|
||||
addBody += '<td>' + summaryList.lmsSucc + '<br>(' + summaryList.lmsRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.mmsTot + '</td>';
|
||||
addBody += '<td>' + summaryList.mmsSucc + '<br>(' + summaryList.mmsRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.formatTot + '</td>';
|
||||
addBody += '<td>' + summaryList.formatSucc + '<br>(' + summaryList.formatRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.fbSmsTot + '</td>';
|
||||
addBody += '<td>' + summaryList.fbSmsSucc + '<br>(' + summaryList.fbSmsRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.fbLmsTot + '</td>';
|
||||
addBody += '<td>' + summaryList.fbLmsSucc + '<br>(' + summaryList.fbLmsRate + '%)</td>';
|
||||
addBody += '</tr>';
|
||||
|
||||
this.grid.summary = addBody;
|
||||
} else {
|
||||
this.grid.addAlign = '';
|
||||
this.grid.summary = '';
|
||||
}
|
||||
})
|
||||
.finally(() => {
|
||||
this.search(data);
|
||||
});
|
||||
},
|
||||
|
||||
setPeriodDay(day) {
|
||||
this.periodDay = day;
|
||||
this.endDate = new Date();
|
||||
this.startDate = moment(this.endDate)
|
||||
.subtract(day, 'day')
|
||||
.toDate();
|
||||
|
||||
this.closeDate('start');
|
||||
this.closeDate('end');
|
||||
},
|
||||
|
||||
selectedStartDate(day) {
|
||||
if (day != undefined && day != null) {
|
||||
this.periodDay = day;
|
||||
}
|
||||
if (this.startDate > this.endDate) {
|
||||
this.startDate = this.endDate;
|
||||
}
|
||||
},
|
||||
selectedEndDate(day) {
|
||||
if (day != undefined && day != null) {
|
||||
this.periodDay = day;
|
||||
}
|
||||
},
|
||||
closeDate(type) {
|
||||
if (type != undefined && type != null) {
|
||||
if (type == 'start') {
|
||||
this.disabledSDate = { from: this.endDate };
|
||||
this.disabledEDate = { to: this.startDate, from: this.endDate };
|
||||
} else if (type == 'end') {
|
||||
this.disabledSDate = { from: this.endDate };
|
||||
this.disabledEDate = { to: this.startDate, from: new Date() };
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
async getExcelDataDown() {
|
||||
try {
|
||||
let response;
|
||||
const params = {
|
||||
startDtXls: moment(this.startDate).format('YYYYMMDD'),
|
||||
endDtXls: moment(this.endDate).format('YYYYMMDD'),
|
||||
sDate: this.startDate,
|
||||
eDate: this.endDate,
|
||||
dateDiv: this.sDateDiv,
|
||||
searchCampId: this.grid.params.searchCampId
|
||||
};
|
||||
|
||||
response = await api.selectCampXlslist(params);
|
||||
|
||||
const result = response.data;
|
||||
if (result != null && result.success) {
|
||||
if (!this.isNull(result.data)) {
|
||||
return result.data;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
} catch (err) {
|
||||
return false;
|
||||
}
|
||||
}, // end of getExcelDataDown
|
||||
|
||||
async getExcelSumData() {
|
||||
try {
|
||||
let response = await api.selectCampSummary(this.grid.params);
|
||||
const result = response.data;
|
||||
|
||||
if (result != null && result.success) {
|
||||
if (!this.isNull(result.data)) {
|
||||
return result.data;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
} catch (err) {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
async excelDown() {
|
||||
if (this.$refs.table.getData().length <= 0) {
|
||||
alert('조회된 데이터가 없습니다.');
|
||||
return false;
|
||||
}
|
||||
|
||||
let today = moment().format('YYYYMMDDHHmmss');
|
||||
const saveFileName = `캠페인ID별통계_${today}.xlsx`;
|
||||
|
||||
const data = await this.getExcelDataDown();
|
||||
const sumData = await this.getExcelSumData();
|
||||
let options = {
|
||||
header: this.excelHeader,
|
||||
summary: {
|
||||
isUse: true,
|
||||
position: 'first',
|
||||
data: sumData,
|
||||
title: { replaceKeys: ['seq', 'campaignId', 'msgbaseName', 'msgbaseId', 'ymd'], name: '합계' }
|
||||
},
|
||||
dataOrder: 'header' // header, data, ['no', 'sendnum', 'errorDesc']
|
||||
};
|
||||
|
||||
xlsx.export(data, saveFileName, options).then(() => {});
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
433
frontend/src/modules/statics/components/StaticsList.vue
Normal file
433
frontend/src/modules/statics/components/StaticsList.vue
Normal file
@@ -0,0 +1,433 @@
|
||||
<template>
|
||||
<article id="content" class="content">
|
||||
<ul class="breadcrumb">
|
||||
<li class="home">
|
||||
<a href="javascript:void(0);">홈</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="javascript:void(0);">발송통계</a>
|
||||
</li>
|
||||
<li>
|
||||
<span>상품별통계</span>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="title_area">
|
||||
<h2>상품별통계</h2>
|
||||
</div>
|
||||
<div class="tab_wrap">
|
||||
<ul class="tab_nav">
|
||||
<li class="active">
|
||||
<a href="javascript:void(0);" :style="isAdmin ? '' : 'cursor:default'">상품별통계</a>
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
href="javascript:void(0);"
|
||||
@click="isAdmin ? toMove('tmpltStatics') : ''"
|
||||
:style="isAdmin ? '' : 'cursor:default'"
|
||||
>포맷ID별통계</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="javascript:void(0);" @click="toMove('userStatics')">사용자별통계</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="javascript:void(0);" @click="toMove('campaignStatics')">캠페인ID별통계</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="box_search_area">
|
||||
<div class="filter_bundle_wrap">
|
||||
<div class="filter_bundle">
|
||||
<strong class="tit_bundle">발송일</strong>
|
||||
<div class="cont_bundle center">
|
||||
<div class="box_select_period">
|
||||
<div class="period_wrap">
|
||||
<span class="custom_input icon_date">
|
||||
<vuejs-datepicker
|
||||
:language="ko"
|
||||
:format="customFormatter"
|
||||
:disabled-dates="disabledSDate"
|
||||
:minimumView="sDateDiv"
|
||||
:maximumView="sDateDiv"
|
||||
v-model="startDate"
|
||||
@selected="selectedStartDate(0)"
|
||||
@closed="closeDate('start')"
|
||||
></vuejs-datepicker>
|
||||
</span>
|
||||
<span class="hypen">~</span>
|
||||
<span class="custom_input icon_date">
|
||||
<vuejs-datepicker
|
||||
:language="ko"
|
||||
:format="customFormatter"
|
||||
:disabled-dates="disabledEDate"
|
||||
:minimumView="sDateDiv"
|
||||
:maximumView="sDateDiv"
|
||||
v-model="endDate"
|
||||
@selected="selectedEndDate(0)"
|
||||
@closed="closeDate('end')"
|
||||
></vuejs-datepicker>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="radio_wrap">
|
||||
<span class="custom_radio">
|
||||
<input
|
||||
type="radio"
|
||||
name="radioDate"
|
||||
id="day"
|
||||
v-model="sDateDiv"
|
||||
value="day"
|
||||
checked
|
||||
>
|
||||
<label for="day">일별</label>
|
||||
</span>
|
||||
<span class="custom_radio">
|
||||
<input type="radio" name="radioDate" id="month" v-model="sDateDiv" value="month">
|
||||
<label for="month">월별</label>
|
||||
</span>
|
||||
<span class="custom_radio">
|
||||
<input type="radio" name="radioDate" id="year" v-model="sDateDiv" value="year">
|
||||
<label for="year">년별</label>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- end of filter_bundle_wrap -->
|
||||
<div class="btn_wrap center">
|
||||
<a href="javascript:void(0);" class="btn mid point" @click="searchSummary">
|
||||
<span>조회</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- end of box_search_area -->
|
||||
|
||||
<div class="cont_flex_bundle bottom mar_b20">
|
||||
<div class="result_date left col_6">
|
||||
<span>
|
||||
<em class="date">{{ customFormatter(startDate) }}</em> 부터
|
||||
<em class="date">{{ customFormatter(endDate) }}</em>까지의 전송/성공/성공률 입니다.
|
||||
</span>
|
||||
</div>
|
||||
<div class="btn_wrap right col_6">
|
||||
<a href="javascript:void(0)" class="btn sml bd_gray icon_down_doc" @click="excelDown()">
|
||||
<span>엑셀 다운로드</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<custom-grid
|
||||
ref="table"
|
||||
:url="grid.url"
|
||||
:perPage="grid.perPage"
|
||||
:pagination="grid.pagination"
|
||||
:header="grid.header"
|
||||
:columns="grid.columns"
|
||||
:noDataStr="grid.noDataStr"
|
||||
:initialRequest="grid.initialRequest"
|
||||
:addBodyAlign="grid.addAlign"
|
||||
:addBodyTmplt="grid.summary"
|
||||
></custom-grid>
|
||||
</article>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import moment from 'moment';
|
||||
import customGrid from '@/components/CustomGrid';
|
||||
import api from '../service/api';
|
||||
import xlsx from '@/common/excel';
|
||||
|
||||
export default {
|
||||
name: 'staticsList',
|
||||
data() {
|
||||
return {
|
||||
ko: vdp_translation_ko.js,
|
||||
bbsCategoryType: 'PROD',
|
||||
|
||||
sDateDiv: 'day',
|
||||
startDate: new Date(),
|
||||
endDate: new Date(),
|
||||
|
||||
disabledSDate: { from: new Date() },
|
||||
disabledEDate: { from: new Date() },
|
||||
|
||||
isAdmin: true,
|
||||
|
||||
grid: {
|
||||
url: '/api/statics/list',
|
||||
|
||||
initialRequest: false,
|
||||
pagination: true,
|
||||
perPage: 10,
|
||||
|
||||
header: [
|
||||
[
|
||||
{ header: 'NO', childNames: [] },
|
||||
{ header: '날짜', childNames: [] },
|
||||
{ header: '스타일 템플릿', childNames: ['cellTmpltTot', 'cellTmpltRateStr'] },
|
||||
{ header: '서술 템플릿', childNames: ['descTmpltTot', 'descTmpltRateStr'] },
|
||||
{ header: '기본 템플릿', childNames: ['freeTmpltTot', 'freeTmpltRateStr'] },
|
||||
{ header: '템플릿 소계', childNames: ['subSumTmpltTot', 'subSumTmpltRateStr'] },
|
||||
{ header: 'RCS SMS', childNames: ['smsTot', 'smsRateStr'] },
|
||||
{ header: 'RCS LMS', childNames: ['lmsTot', 'lmsRateStr'] },
|
||||
{ header: 'RCS MMS', childNames: ['mmsTot', 'mmsRateStr'] },
|
||||
{ header: '포맷 소계', childNames: ['formatTot', 'formatRateStr'] },
|
||||
{ header: 'Fallback SMS', childNames: ['fbSmsTot', 'fbSmsRateStr'] },
|
||||
{ header: 'Fallback LMS', childNames: ['fbLmsTot', 'fbLmsRateStr'] }
|
||||
]
|
||||
],
|
||||
|
||||
columns: [
|
||||
{ name: 'seq', header: 'NO', width: 100 },
|
||||
{ name: 'ymd', header: '날짜', width: 100 },
|
||||
{ name: 'cellTmpltTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'cellTmpltRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
{ name: 'descTmpltTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'descTmpltRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
{ name: 'freeTmpltTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'freeTmpltRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
{ name: 'subSumTmpltTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'subSumTmpltRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
|
||||
{ name: 'smsTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'smsRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
{ name: 'lmsTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'lmsRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
{ name: 'mmsTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'mmsRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
{ name: 'formatTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'formatRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
|
||||
{ name: 'fbSmsTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'fbSmsRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
{ name: 'fbLmsTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'fbLmsRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' }
|
||||
],
|
||||
|
||||
summary: '',
|
||||
addAlign: '',
|
||||
|
||||
noDataStr: '검색 결과가 없습니다.',
|
||||
params: {},
|
||||
excelHeader: []
|
||||
}
|
||||
};
|
||||
},
|
||||
created() {
|
||||
api.selectUserRoleInfo().then(response => {
|
||||
const respList = response.data.data;
|
||||
if (response.data.success && respList != null && respList.length > 0) {
|
||||
let adminStr = respList[0].selIsAdmin;
|
||||
if (typeof adminStr != undefined && adminStr != null && adminStr == 'false') {
|
||||
this.isAdmin = false;
|
||||
}
|
||||
} else {
|
||||
this.isAdmin = true;
|
||||
}
|
||||
});
|
||||
|
||||
this.getExcelHeader();
|
||||
},
|
||||
mounted() {
|
||||
// 합계 조회
|
||||
this.searchSummary();
|
||||
},
|
||||
|
||||
components: {
|
||||
'vuejs-datepicker': vuejsDatepicker,
|
||||
customGrid: customGrid
|
||||
},
|
||||
methods: {
|
||||
getExcelHeader() {
|
||||
// 헤더를 mockup으로 관리한다.
|
||||
api.getExcelHeader(this.bbsCategoryType).then(res => {
|
||||
this.excelHeader = res;
|
||||
});
|
||||
},
|
||||
customFormatter: function(date) {
|
||||
if (this.sDateDiv == 'month') {
|
||||
return moment(date).format('YYYY-MM');
|
||||
} else if (this.sDateDiv == 'year') {
|
||||
return moment(date).format('YYYY');
|
||||
} else {
|
||||
return moment(date).format('YYYY-MM-DD');
|
||||
}
|
||||
},
|
||||
toPage(lifeCycle) {
|
||||
const page = this.isNull(this.$route.params.page) ? 1 : this.$route.params.page;
|
||||
try {
|
||||
this.$refs.table.readData(page, this.grid.params);
|
||||
} catch (error) {
|
||||
console.log(lifeCycle, error);
|
||||
}
|
||||
},
|
||||
|
||||
toMove(routeName) {
|
||||
this.$router.push({ name: routeName, params: { page: 1, searchText: '' } });
|
||||
},
|
||||
|
||||
search: function(data) {
|
||||
this.grid.params = {
|
||||
sDate: moment(this.startDate).format('YYYYMMDD'),
|
||||
eDate: moment(this.endDate).format('YYYYMMDD'),
|
||||
dateDiv: this.sDateDiv
|
||||
};
|
||||
|
||||
this.$refs.table.search(this.grid.params);
|
||||
},
|
||||
|
||||
searchSummary: function(data) {
|
||||
let summaryList = {};
|
||||
|
||||
this.grid.params = {
|
||||
sDate: moment(this.startDate).format('YYYYMMDD'),
|
||||
eDate: moment(this.endDate).format('YYYYMMDD'),
|
||||
dateDiv: this.sDateDiv
|
||||
};
|
||||
|
||||
api
|
||||
.selectStaticsSummary(this.grid.params)
|
||||
.then(response => {
|
||||
const respList = response.data.data;
|
||||
if (response.data.success && respList != null && respList.length > 0) {
|
||||
summaryList = respList[0];
|
||||
|
||||
this.grid.addAlign = 'TOP';
|
||||
let addBody = '';
|
||||
addBody += '<tr>';
|
||||
addBody += '<td colspan="2">합계</td>';
|
||||
addBody += '<td>' + summaryList.cellTmpltTot + '</td>';
|
||||
addBody += '<td>' + summaryList.cellTmpltSucc + '<br>(' + summaryList.cellTmpltRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.descTmpltTot + '</td>';
|
||||
addBody += '<td>' + summaryList.descTmpltSucc + '<br>(' + summaryList.descTmpltRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.freeTmpltTot + '</td>';
|
||||
addBody += '<td>' + summaryList.freeTmpltSucc + '<br>(' + summaryList.freeTmpltRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.subSumTmpltTot + '</td>';
|
||||
addBody += '<td>' + summaryList.subSumTmpltSucc + '<br>(' + summaryList.subSumTmpltRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.smsTot + '</td>';
|
||||
addBody += '<td>' + summaryList.smsSucc + '<br>(' + summaryList.smsRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.lmsTot + '</td>';
|
||||
addBody += '<td>' + summaryList.lmsSucc + '<br>(' + summaryList.lmsRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.mmsTot + '</td>';
|
||||
addBody += '<td>' + summaryList.mmsSucc + '<br>(' + summaryList.mmsRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.formatTot + '</td>';
|
||||
addBody += '<td>' + summaryList.formatSucc + '<br>(' + summaryList.formatRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.fbSmsTot + '</td>';
|
||||
addBody += '<td>' + summaryList.fbSmsSucc + '<br>(' + summaryList.fbSmsRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.fbLmsTot + '</td>';
|
||||
addBody += '<td>' + summaryList.fbLmsSucc + '<br>(' + summaryList.fbLmsRate + '%)</td>';
|
||||
addBody += '</tr>';
|
||||
|
||||
this.grid.summary = addBody;
|
||||
} else {
|
||||
this.grid.addAlign = '';
|
||||
this.grid.summary = '';
|
||||
}
|
||||
})
|
||||
.finally(() => {
|
||||
this.search();
|
||||
});
|
||||
},
|
||||
|
||||
selectedStartDate(day) {
|
||||
if (this.startDate > this.endDate) {
|
||||
this.startDate = this.endDate;
|
||||
}
|
||||
},
|
||||
selectedEndDate(day) {
|
||||
if (day != undefined && day != null) {
|
||||
this.periodDay = day;
|
||||
}
|
||||
},
|
||||
closeDate(type) {
|
||||
if (type != undefined && type != null) {
|
||||
if (type == 'start') {
|
||||
this.disabledSDate = { from: this.endDate };
|
||||
this.disabledEDate = { to: this.startDate, from: this.endDate };
|
||||
} else if (type == 'end') {
|
||||
this.disabledSDate = { from: this.endDate };
|
||||
this.disabledEDate = { to: this.startDate, from: new Date() };
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
async getExcelDataDown() {
|
||||
try {
|
||||
let response;
|
||||
const params = {
|
||||
startDtXls: moment(this.startDate).format('YYYYMMDD'),
|
||||
endDtXls: moment(this.endDate).format('YYYYMMDD'),
|
||||
sDate: this.startDate,
|
||||
eDate: this.endDate,
|
||||
dateDiv: this.sDateDiv
|
||||
};
|
||||
|
||||
response = await api.selectStaticsXls(params);
|
||||
|
||||
const result = response.data;
|
||||
if (result != null && result.success) {
|
||||
if (!this.isNull(result.data)) {
|
||||
return result.data;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
} catch (err) {
|
||||
return false;
|
||||
}
|
||||
}, // end of getExcelDataDown
|
||||
|
||||
async getExcelSumData() {
|
||||
// let sumBody = '';
|
||||
try {
|
||||
let response = await api.selectStaticsSummary(this.grid.params);
|
||||
const result = response.data;
|
||||
|
||||
if (result != null && result.success) {
|
||||
if (!this.isNull(result.data)) {
|
||||
return result.data;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
} catch (err) {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
async excelDown() {
|
||||
if (this.$refs.table.getData().length <= 0) {
|
||||
alert('조회된 데이터가 없습니다.');
|
||||
return false;
|
||||
}
|
||||
|
||||
let today = moment().format('YYYYMMDDHHmmss');
|
||||
const saveFileName = `상품별통계_${today}.xlsx`;
|
||||
|
||||
const data = await this.getExcelDataDown();
|
||||
const sumData = await this.getExcelSumData();
|
||||
|
||||
let options = {
|
||||
header: this.excelHeader,
|
||||
summary: {
|
||||
isUse: true,
|
||||
position: 'first',
|
||||
data: sumData,
|
||||
title: { replaceKeys: ['seq', 'ymd'], name: '합계' }
|
||||
},
|
||||
dataOrder: 'header' // header, data, ['no', 'sendnum', 'errorDesc']
|
||||
};
|
||||
|
||||
xlsx.export(data, saveFileName, options).then(() => {});
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
551
frontend/src/modules/statics/components/TmpltStaticsList.vue
Normal file
551
frontend/src/modules/statics/components/TmpltStaticsList.vue
Normal file
@@ -0,0 +1,551 @@
|
||||
<template>
|
||||
<article id="content" class="content">
|
||||
<ul class="breadcrumb">
|
||||
<li class="home">
|
||||
<a href="javascript:void(0);">홈</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="javascript:void(0);">발송통계</a>
|
||||
</li>
|
||||
<li>
|
||||
<span>포맷ID별통계</span>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="title_area">
|
||||
<h2>포맷ID별통계</h2>
|
||||
</div>
|
||||
<div class="tab_wrap">
|
||||
<ul class="tab_nav">
|
||||
<li>
|
||||
<a
|
||||
href="javascript:void(0);"
|
||||
@click="isAdmin ? toMove('staticsList') : ''"
|
||||
:style="isAdmin ? '' : 'cursor:default'"
|
||||
>상품별통계</a>
|
||||
</li>
|
||||
<li class="active">
|
||||
<a href="javascript:void(0);" :style="isAdmin ? '' : 'cursor:default'">포맷ID별통계</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="javascript:void(0);" @click="toMove('userStatics')">사용자별통계</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="javascript:void(0);" @click="toMove('campaignStatics')">캠페인ID별통계</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="box_search_area">
|
||||
<div class="filter_bundle_wrap">
|
||||
<div class="filter_bundle">
|
||||
<strong class="tit_bundle">발송일</strong>
|
||||
<div class="cont_bundle center">
|
||||
<div class="box_select_period">
|
||||
<div class="period_wrap">
|
||||
<span class="custom_input icon_date">
|
||||
<vuejs-datepicker
|
||||
:language="ko"
|
||||
:format="customFormatter"
|
||||
:disabled-dates="disabledSDate"
|
||||
:minimumView="sDateDiv"
|
||||
:maximumView="sDateDiv"
|
||||
v-model="startDate"
|
||||
@selected="selectedStartDate(0)"
|
||||
@closed="closeDate('start')"
|
||||
></vuejs-datepicker>
|
||||
</span>
|
||||
<span class="hypen">~</span>
|
||||
<span class="custom_input icon_date">
|
||||
<vuejs-datepicker
|
||||
:language="ko"
|
||||
:format="customFormatter"
|
||||
:disabled-dates="disabledEDate"
|
||||
:minimumView="sDateDiv"
|
||||
:maximumView="sDateDiv"
|
||||
v-model="endDate"
|
||||
@selected="selectedEndDate(0)"
|
||||
@closed="closeDate('end')"
|
||||
></vuejs-datepicker>
|
||||
</span>
|
||||
</div>
|
||||
<div class="radio_wrap">
|
||||
<span class="custom_radio">
|
||||
<input
|
||||
type="radio"
|
||||
name="radioDate"
|
||||
id="day"
|
||||
v-model="sDateDiv"
|
||||
value="day"
|
||||
checked
|
||||
>
|
||||
<label for="day">일별</label>
|
||||
</span>
|
||||
<span class="custom_radio">
|
||||
<input type="radio" name="radioDate" id="month" v-model="sDateDiv" value="month">
|
||||
<label for="month">월별</label>
|
||||
</span>
|
||||
<!-- 템플릿별에는 년별구분 없음 -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- end of filter_bundle 1 -->
|
||||
|
||||
<div class="filter_bundle">
|
||||
<strong class="tit_bundle"> </strong>
|
||||
<div class="cont_flex_bundle full_width">
|
||||
<span style="width:336px;" class="custom_select">
|
||||
<select v-model="grid.params.searchProdCd" @change="selectMsgbaseIdList">
|
||||
<option value>상품</option>
|
||||
<option v-for="grp in grpList" :key="grp.code" :value="grp.code">{{grp.codeDesc}}</option>
|
||||
</select>
|
||||
</span>
|
||||
<span style="width:336px;" class="box_select mar_l12">
|
||||
<a
|
||||
href="javascript:void(0);"
|
||||
class="btn_arrow"
|
||||
@click.stop="showSearchMsgbaseId()"
|
||||
>{{searchMsgbaseId}}</a>
|
||||
|
||||
<div class="select_search_area active" v-show="setShowMsgbId">
|
||||
<span class="custom_input search">
|
||||
<input type="text" v-model.trim="searchStr" @input="searchMsgbase" @click.stop>
|
||||
<a
|
||||
href="javascript:void(0);"
|
||||
class="btn_search"
|
||||
@click.stop="setwSearchMsgbaseId()"
|
||||
>검색</a>
|
||||
</span>
|
||||
<ul class="select box_scrollY">
|
||||
<li
|
||||
class="option"
|
||||
v-for="msgbase in msgbaseIdList"
|
||||
:key="msgbase.msgbaseId"
|
||||
:value="msgbase.msgbaseId"
|
||||
@click="setwSearchMsgbaseId(msgbase.msgbaseId)"
|
||||
>{{msgbase.msgbaseId}}</li>
|
||||
</ul>
|
||||
</div>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<!-- end of filter_bundle 2 -->
|
||||
</div>
|
||||
<!-- end of filter_bundle_wrap -->
|
||||
|
||||
<div class="btn_wrap center">
|
||||
<a href="javascript:void(0);" class="btn mid point" @click="searchSummary">
|
||||
<span>조회</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- end of box_search_area -->
|
||||
|
||||
<div class="cont_flex_bundle bottom mar_b20">
|
||||
<div class="result_date left col_6">
|
||||
<span>
|
||||
<em class="date">{{ customFormatter(startDate) }}</em> 부터
|
||||
<em class="date">{{ customFormatter(endDate) }}</em>까지의 전송/성공/성공률 입니다.
|
||||
</span>
|
||||
</div>
|
||||
<div class="btn_wrap right col_6">
|
||||
<a href="javascript:void(0)" class="btn sml bd_gray icon_down_doc" @click="excelDown()">
|
||||
<span>엑셀 다운로드</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<custom-grid
|
||||
ref="table"
|
||||
:url="grid.url"
|
||||
:perPage="grid.perPage"
|
||||
:pagination="grid.pagination"
|
||||
:header="grid.header"
|
||||
:columns="grid.columns"
|
||||
:noDataStr="grid.noDataStr"
|
||||
:initialRequest="grid.initialRequest"
|
||||
:summary="grid.summary"
|
||||
:addBodyAlign="grid.addAlign"
|
||||
:addBodyTmplt="grid.summary"
|
||||
></custom-grid>
|
||||
</article>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import moment from 'moment';
|
||||
import lodash from 'lodash';
|
||||
import customGrid from '@/components/CustomGrid';
|
||||
import api from '../service/api';
|
||||
import xlsx from '@/common/excel';
|
||||
|
||||
export default {
|
||||
name: 'tmpltStaticsList',
|
||||
data() {
|
||||
return {
|
||||
grpList: [],
|
||||
|
||||
bbsCategoryType: 'TMPL',
|
||||
msgbaseIdList: [],
|
||||
msgbaseIdListOrigin: [],
|
||||
setShowMsgbId: false,
|
||||
searchStr: '',
|
||||
searchProdCd: '',
|
||||
searchMsgbaseId: '포맷 아이디',
|
||||
|
||||
ko: vdp_translation_ko.js,
|
||||
|
||||
sDateDiv: 'day',
|
||||
startDate: new Date(),
|
||||
endDate: new Date(),
|
||||
disabledSDate: new Date(),
|
||||
disabledEDate: new Date(),
|
||||
|
||||
isAdmin: true,
|
||||
excelHeader: [],
|
||||
|
||||
grid: {
|
||||
url: '/api/statics/tmpltList',
|
||||
|
||||
initialRequest: false,
|
||||
pagination: true,
|
||||
perPage: 10,
|
||||
|
||||
header: [
|
||||
[
|
||||
{ header: 'NO', childNames: [] },
|
||||
{ header: '템플릿명(상품명)', childNames: [] },
|
||||
{ header: '포맷아이디', childNames: [] },
|
||||
{ header: '날짜', childNames: [] },
|
||||
{ header: '상품', childNames: [] },
|
||||
{ header: 'RCS', childNames: ['rcsCnt', 'rcsRateStr'] },
|
||||
{ header: 'Fallback SMS', childNames: ['fbSmsTot', 'fbSmsRateStr'] },
|
||||
{ header: 'Fallback LMS', childNames: ['fbLmsTot', 'fbLmsRateStr'] }
|
||||
]
|
||||
],
|
||||
columns: [
|
||||
{ name: 'seq', header: 'NO', width: 120 },
|
||||
{
|
||||
name: 'msgbaseName',
|
||||
header: '템플릿명(상품명)',
|
||||
width: 180,
|
||||
formatter: props => {
|
||||
return '<div class="ellipsis">' + props.msgbaseName + '</div>';
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'msgbaseId',
|
||||
header: '포맷아이디',
|
||||
width: 250,
|
||||
formatter: props => {
|
||||
return '<div class="ellipsis">' + props.msgbaseId + '</div>';
|
||||
}
|
||||
},
|
||||
{ name: 'ymd', header: '날짜', width: 120 },
|
||||
{ name: 'productName', header: '상품', width: 120 },
|
||||
|
||||
{ name: 'rcsCnt', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'rcsRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
|
||||
{ name: 'fbSmsTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'fbSmsRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
|
||||
{ name: 'fbLmsTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'fbLmsRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' }
|
||||
],
|
||||
|
||||
summary: '',
|
||||
addAlign: '',
|
||||
|
||||
noDataStr: '검색 결과가 없습니다.',
|
||||
params: {
|
||||
// mounted() 에서 reset 한다.
|
||||
searchProdCd: ''
|
||||
}
|
||||
}
|
||||
};
|
||||
},
|
||||
created() {
|
||||
api.selectUserRoleInfo().then(response => {
|
||||
const respList = response.data.data;
|
||||
if (response.data.success && respList != null && respList.length > 0) {
|
||||
let adminStr = respList[0].selIsAdmin;
|
||||
if (typeof adminStr != undefined && adminStr != null && adminStr == 'false') {
|
||||
this.isAdmin = false;
|
||||
}
|
||||
} else {
|
||||
this.isAdmin = true;
|
||||
}
|
||||
});
|
||||
|
||||
this.setPeriodDay(0);
|
||||
this.selectCodeProdList();
|
||||
this.selectMsgbaseIdList();
|
||||
this.getExcelHeader();
|
||||
},
|
||||
mounted() {
|
||||
// 합계 조회
|
||||
this.searchSummary();
|
||||
|
||||
document.addEventListener('click', () => {
|
||||
if (this.setShowMsgbId) {
|
||||
this.searchStr = '';
|
||||
this.setShowMsgbId = false;
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
components: {
|
||||
'vuejs-datepicker': vuejsDatepicker,
|
||||
customGrid: customGrid
|
||||
},
|
||||
methods: {
|
||||
getExcelHeader() {
|
||||
// 헤더를 mockup으로 관리한다.
|
||||
api.getExcelHeader(this.bbsCategoryType).then(res => {
|
||||
this.excelHeader = res;
|
||||
});
|
||||
},
|
||||
selectCodeProdList() {
|
||||
api.selectCodeProdList('PROD_DIV').then(response => {
|
||||
const respList = response.data.data;
|
||||
if (response.data.success && respList != null) {
|
||||
this.grpList = lodash.clone(respList);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
showSearchMsgbaseId() {
|
||||
if (this.setShowMsgbId) {
|
||||
this.searchStr = '';
|
||||
this.setShowMsgbId = false;
|
||||
} else {
|
||||
this.setShowMsgbId = true;
|
||||
}
|
||||
},
|
||||
|
||||
setwSearchMsgbaseId(searchMsgbaseId) {
|
||||
let exe = true;
|
||||
if (typeof searchMsgbaseId == undefined || searchMsgbaseId == null || searchMsgbaseId == '') {
|
||||
if (this.searchStr.length == 0) {
|
||||
//전체리스트
|
||||
this.searchMsgbaseId = '포맷 아이디';
|
||||
} else {
|
||||
exe = false;
|
||||
alert('선택된 포맷 아이디가 없습니다.');
|
||||
}
|
||||
} else {
|
||||
this.searchMsgbaseId = searchMsgbaseId;
|
||||
}
|
||||
|
||||
if (exe) {
|
||||
this.setShowMsgbId = false;
|
||||
this.searchStr = '';
|
||||
this.msgbaseIdList = this.msgbaseIdListOrigin;
|
||||
}
|
||||
},
|
||||
|
||||
selectMsgbaseIdList() {
|
||||
api.selectMsgbaseIdList(this.grid.params.searchProdCd).then(response => {
|
||||
const respList = response.data.data;
|
||||
if (response.data.success && respList != null && respList.length > 0) {
|
||||
this.msgbaseIdList = respList;
|
||||
this.msgbaseIdListOrigin = respList;
|
||||
} else {
|
||||
this.msgbaseIdList = '';
|
||||
this.msgbaseIdListOrigin = '';
|
||||
}
|
||||
this.searchStr = '';
|
||||
this.searchMsgbaseId = '포맷 아이디';
|
||||
|
||||
this.setShowMsgbId = false;
|
||||
});
|
||||
},
|
||||
searchMsgbase() {
|
||||
if (this.msgbaseIdListOrigin.length > 0) {
|
||||
this.msgbaseIdList = this.msgbaseIdListOrigin.filter(props => {
|
||||
return props.msgbaseId.toLowerCase().indexOf(this.searchStr.toLowerCase()) >= 0;
|
||||
});
|
||||
}
|
||||
},
|
||||
customFormatter: function(date) {
|
||||
if (this.sDateDiv == 'month') {
|
||||
return moment(date).format('YYYY-MM');
|
||||
} else if (this.sDateDiv == 'year') {
|
||||
return moment(date).format('YYYY');
|
||||
} else {
|
||||
return moment(date).format('YYYY-MM-DD');
|
||||
}
|
||||
},
|
||||
toPage(lifeCycle) {
|
||||
const page = this.isNull(this.$route.params.page) ? 1 : this.$route.params.page;
|
||||
try {
|
||||
console.log('page-->', page);
|
||||
this.$refs.table.readData(page, this.grid.params);
|
||||
} catch (error) {
|
||||
console.log(lifeCycle, error);
|
||||
}
|
||||
},
|
||||
|
||||
toMove(routeName) {
|
||||
this.$router.push({ name: routeName, params: { page: 1, searchText: '' } });
|
||||
},
|
||||
|
||||
search: function(data) {
|
||||
this.grid.params = {
|
||||
sDate: moment(this.startDate).format('YYYYMMDD'),
|
||||
eDate: moment(this.endDate).format('YYYYMMDD'),
|
||||
dateDiv: this.sDateDiv,
|
||||
searchProdCd: this.grid.params.searchProdCd,
|
||||
searchMsgbaseId: this.searchMsgbaseId
|
||||
};
|
||||
this.$refs.table.search(this.grid.params);
|
||||
},
|
||||
|
||||
searchSummary: function(data) {
|
||||
let summaryList = {};
|
||||
|
||||
this.grid.params.sDate = moment(this.startDate).format('YYYYMMDD');
|
||||
this.grid.params.eDate = moment(this.endDate).format('YYYYMMDD');
|
||||
this.grid.params.dateDiv = this.sDateDiv;
|
||||
this.grid.params.searchProdCd = this.grid.params.searchProdCd;
|
||||
this.grid.params.searchMsgbaseId = this.searchMsgbaseId;
|
||||
|
||||
api
|
||||
.selectTmpltSummary(this.grid.params)
|
||||
.then(response => {
|
||||
|
||||
console.log('조회 결과 : ' , response);
|
||||
|
||||
const respList = response.data.data;
|
||||
if (response.data.success && respList != null && respList.length > 0) {
|
||||
summaryList = respList[0];
|
||||
|
||||
this.grid.addAlign = 'TOP';
|
||||
let addBody = '';
|
||||
addBody += '<tr>';
|
||||
addBody += '<td colspan="5">합계</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.rcsCnt + '</td>';
|
||||
addBody += '<td>' + summaryList.rcsSucc + '<br>(' + summaryList.rcsRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.fbSmsTot + '</td>';
|
||||
addBody += '<td>' + summaryList.fbSmsSucc + '<br>(' + summaryList.fbSmsRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.fbLmsTot + '</td>';
|
||||
addBody += '<td>' + summaryList.fbLmsRate + '<br>(' + summaryList.fbLmsRate + '%)</td>';
|
||||
addBody += '</tr>';
|
||||
|
||||
this.grid.summary = addBody;
|
||||
} else {
|
||||
this.grid.addAlign = '';
|
||||
this.grid.summary = '';
|
||||
}
|
||||
})
|
||||
.finally(() => {
|
||||
this.search(data);
|
||||
});
|
||||
},
|
||||
|
||||
setPeriodDay(day) {
|
||||
this.endDate = new Date();
|
||||
this.startDate = moment(this.endDate)
|
||||
.subtract(day, 'day')
|
||||
.toDate();
|
||||
|
||||
this.closeDate('start');
|
||||
this.closeDate('end');
|
||||
},
|
||||
|
||||
selectedStartDate(day) {
|
||||
if (this.startDate > this.endDate) {
|
||||
this.startDate = this.endDate;
|
||||
}
|
||||
},
|
||||
selectedEndDate(day) {
|
||||
if (day != undefined && day != null) {
|
||||
this.periodDay = day;
|
||||
}
|
||||
},
|
||||
closeDate(type) {
|
||||
if (type != undefined && type != null) {
|
||||
if (type == 'start') {
|
||||
this.disabledSDate = { from: this.endDate };
|
||||
this.disabledEDate = { to: this.startDate, from: this.endDate };
|
||||
} else if (type == 'end') {
|
||||
this.disabledSDate = { from: this.endDate };
|
||||
this.disabledEDate = { to: this.startDate, from: new Date() };
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
async getExcelDataDown() {
|
||||
try {
|
||||
let response;
|
||||
const params = {
|
||||
startDtXls: moment(this.startDate).format('YYYYMMDD'),
|
||||
endDtXls: moment(this.endDate).format('YYYYMMDD'),
|
||||
sDate: this.startDate,
|
||||
eDate: this.endDate,
|
||||
dateDiv: this.sDateDiv,
|
||||
searchProdCd: this.grid.params.searchProdCd,
|
||||
searchMsgbaseId: this.searchMsgbaseId
|
||||
};
|
||||
|
||||
response = await api.selectTmpltXlslist(params);
|
||||
|
||||
const result = response.data;
|
||||
if (result != null && result.success) {
|
||||
if (!this.isNull(result.data)) {
|
||||
return result.data;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
} catch (err) {
|
||||
return false;
|
||||
}
|
||||
}, // end of getExcelDataDown
|
||||
|
||||
async getExcelSumData() {
|
||||
try {
|
||||
let response = await api.selectTmpltSummary(this.grid.params);
|
||||
const result = response.data;
|
||||
|
||||
if (result != null && result.success) {
|
||||
if (!this.isNull(result.data)) {
|
||||
return result.data;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
} catch (err) {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
|
||||
async excelDown() {
|
||||
if (this.$refs.table.getData().length <= 0) {
|
||||
alert('조회된 데이터가 없습니다.');
|
||||
return false;
|
||||
}
|
||||
|
||||
let today = moment().format('YYYYMMDDHHmmss');
|
||||
const saveFileName = `포맷ID별통계_${today}.xlsx`;
|
||||
|
||||
const data = await this.getExcelDataDown();
|
||||
const sumData = await this.getExcelSumData();
|
||||
|
||||
let options = {
|
||||
header: this.excelHeader,
|
||||
summary: {
|
||||
isUse: true,
|
||||
position: 'first',
|
||||
data: sumData,
|
||||
title: { replaceKeys: ['seq', 'msgbaseName', 'msgbaseId', 'ymd', 'productName'], name: '합계' }
|
||||
},
|
||||
dataOrder: 'header' // header, data, ['no', 'sendnum', 'errorDesc']
|
||||
};
|
||||
|
||||
xlsx.export(data, saveFileName, options).then(() => {});
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
609
frontend/src/modules/statics/components/UserStaticsList.vue
Normal file
609
frontend/src/modules/statics/components/UserStaticsList.vue
Normal file
@@ -0,0 +1,609 @@
|
||||
<template>
|
||||
<article id="content" class="content">
|
||||
<ul class="breadcrumb">
|
||||
<li class="home">
|
||||
<a href="javascript:void(0);">홈</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="javascript:void(0);">발송통계</a>
|
||||
</li>
|
||||
<li>
|
||||
<span>사용자별통계</span>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="title_area">
|
||||
<h2>사용자별통계</h2>
|
||||
</div>
|
||||
<div class="tab_wrap">
|
||||
<ul class="tab_nav">
|
||||
<li>
|
||||
<a
|
||||
href="javascript:void(0);"
|
||||
@click="isAdmin ? toMove('staticsList') : ''"
|
||||
:style="isAdmin ? '' : 'cursor:default'"
|
||||
>상품별통계</a>
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
href="javascript:void(0);"
|
||||
@click="isAdmin ? toMove('tmpltStatics') : ''"
|
||||
:style="isAdmin ? '' : 'cursor:default'"
|
||||
>포맷ID별통계</a>
|
||||
</li>
|
||||
<li class="active">
|
||||
<a href="javascript:void(0);">사용자별통계</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="javascript:void(0);" @click="toMove('campaignStatics')">캠페인ID별통계</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="box_search_area">
|
||||
<div class="filter_bundle_wrap">
|
||||
<div class="filter_bundle">
|
||||
<strong class="tit_bundle">발송일</strong>
|
||||
<div class="cont_bundle center">
|
||||
<div class="box_select_period">
|
||||
<div class="period_wrap">
|
||||
<span class="custom_input icon_date">
|
||||
<vuejs-datepicker
|
||||
:language="ko"
|
||||
:format="customFormatter"
|
||||
:disabled-dates="disabledSDate"
|
||||
:minimumView="sDateDiv"
|
||||
:maximumView="sDateDiv"
|
||||
v-model="startDate"
|
||||
@selected="selectedStartDate(0)"
|
||||
@closed="closeDate('start')"
|
||||
></vuejs-datepicker>
|
||||
</span>
|
||||
<span class="hypen">~</span>
|
||||
<span class="custom_input icon_date">
|
||||
<vuejs-datepicker
|
||||
:language="ko"
|
||||
:format="customFormatter"
|
||||
:disabled-dates="disabledEDate"
|
||||
:minimumView="sDateDiv"
|
||||
:maximumView="sDateDiv"
|
||||
v-model="endDate"
|
||||
@selected="selectedEndDate(0)"
|
||||
@closed="closeDate('end')"
|
||||
></vuejs-datepicker>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="radio_wrap">
|
||||
<span class="custom_radio">
|
||||
<input
|
||||
type="radio"
|
||||
name="radioDate"
|
||||
id="day"
|
||||
v-model="sDateDiv"
|
||||
value="day"
|
||||
checked
|
||||
>
|
||||
<label for="day">일별</label>
|
||||
</span>
|
||||
<span class="custom_radio">
|
||||
<input type="radio" name="radioDate" id="month" v-model="sDateDiv" value="month">
|
||||
<label for="month">월별</label>
|
||||
</span>
|
||||
<span class="custom_radio">
|
||||
<input type="radio" name="radioDate" id="year" v-model="sDateDiv" value="year">
|
||||
<label for="year">년별</label>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- end of filter_bundle_wrap -->
|
||||
|
||||
<div class="filter_bundle">
|
||||
<strong class="tit_bundle"> </strong>
|
||||
<div class="cont_flex_bundle full_width">
|
||||
<span style="width:336px;" class="custom_select">
|
||||
<!-- <select>
|
||||
<option value="">부서</option>
|
||||
</select>-->
|
||||
<select
|
||||
v-model="grid.params.searchDeptNm"
|
||||
@change="selectUserIdList"
|
||||
v-bind:disabled="isSelIdDisabled"
|
||||
>
|
||||
<option value>부서</option>
|
||||
<option
|
||||
v-for="dept in deptNmList"
|
||||
:key="dept.deptNm"
|
||||
:value="dept.deptNm"
|
||||
>{{dept.deptNm}}</option>
|
||||
</select>
|
||||
</span>
|
||||
<span style="width:336px;" class="custom_select">
|
||||
<!-- <select>
|
||||
<option value="">아이디</option>
|
||||
</select>-->
|
||||
<select v-model="grid.params.searchUserId" v-bind:disabled="isSelIdDisabled">
|
||||
<option value>아이디</option>
|
||||
<option value="system">system</option>
|
||||
<option
|
||||
v-for="user in userIdList"
|
||||
:key="user.userId"
|
||||
:value="user.userId"
|
||||
>{{user.userId}}</option>
|
||||
</select>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<!-- end of filter_bundle 2 -->
|
||||
</div>
|
||||
<div class="btn_wrap center">
|
||||
<a href="javascript:void(0);" class="btn mid point" @click="searchSummary">
|
||||
<span>조회</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<!-- end of box_search_area -->
|
||||
|
||||
<div class="cont_flex_bundle bottom mar_b20">
|
||||
<div class="result_date left col_6">
|
||||
<span>
|
||||
<em class="date">{{ customFormatter(startDate) }}</em> 부터
|
||||
<em class="date">{{ customFormatter(endDate) }}</em>까지의 전송/성공/성공률 입니다.
|
||||
</span>
|
||||
</div>
|
||||
<div class="btn_wrap right col_6">
|
||||
<a href="javascript:void(0)" class="btn sml bd_gray icon_down_doc" @click="excelDown()">
|
||||
<span>엑셀 다운로드</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<custom-grid
|
||||
ref="table"
|
||||
:url="grid.url"
|
||||
:perPage="grid.perPage"
|
||||
:pagination="grid.pagination"
|
||||
:header="grid.header"
|
||||
:columns="grid.columns"
|
||||
:noDataStr="grid.noDataStr"
|
||||
:initialRequest="grid.initialRequest"
|
||||
:addBodyAlign="grid.addAlign"
|
||||
:addBodyTmplt="grid.summary"
|
||||
></custom-grid>
|
||||
</article>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import moment from 'moment';
|
||||
|
||||
import customGrid from '@/components/CustomGrid';
|
||||
|
||||
import api from '../service/api';
|
||||
import xlsx from '@/common/excel';
|
||||
|
||||
let summaryList = {};
|
||||
|
||||
export default {
|
||||
name: 'userStatisticList',
|
||||
|
||||
data() {
|
||||
return {
|
||||
deptNmList: [],
|
||||
userIdList: [],
|
||||
userRoleInfoList: [],
|
||||
|
||||
bbsCategoryType: 'USER',
|
||||
ko: vdp_translation_ko.js,
|
||||
periodDay: 7,
|
||||
sDateDiv: 'day',
|
||||
startDate: new Date(),
|
||||
endDate: new Date(),
|
||||
|
||||
isSelIdDisabled: false,
|
||||
|
||||
isAdmin: true,
|
||||
excelHeader: [],
|
||||
|
||||
grid: {
|
||||
url: '/api/statics/userList',
|
||||
|
||||
initialRequest: false,
|
||||
pagination: true,
|
||||
perPage: 10,
|
||||
|
||||
header: [
|
||||
[
|
||||
{ header: 'NO', childNames: [] },
|
||||
{ header: '아이디', childNames: [] },
|
||||
{ header: '부서명', childNames: [] },
|
||||
{ header: '날짜', childNames: [] },
|
||||
{ header: '스타일 템플릿', childNames: ['cellTmpltTot', 'cellTmpltRateStr'] },
|
||||
{ header: '서술 템플릿', childNames: ['descTmpltTot', 'descTmpltRateStr'] },
|
||||
{ header: '기본 템플릿', childNames: ['freeTmpltTot', 'freeTmpltRateStr'] },
|
||||
{ header: '템플릿 소계', childNames: ['subSumTmpltTot', 'subSumTmpltRateStr'] },
|
||||
{ header: 'RCS SMS', childNames: ['smsTot', 'smsRateStr'] },
|
||||
{ header: 'RCS LMS', childNames: ['lmsTot', 'lmsRateStr'] },
|
||||
{ header: 'RCS MMS', childNames: ['mmsTot', 'mmsRateStr'] },
|
||||
{ header: 'RCS 소계', childNames: ['formatTot', 'formatRateStr'] },
|
||||
{ header: 'Fallback SMS', childNames: ['fbSmsTot', 'fbSmsRateStr'] },
|
||||
{ header: 'Fallback LMS', childNames: ['fbLmsTot', 'fbLmsRateStr'] }
|
||||
]
|
||||
],
|
||||
|
||||
columns: [
|
||||
{ name: 'seq', header: 'NO', width: 100 },
|
||||
{
|
||||
name: 'userId',
|
||||
header: '아이디',
|
||||
width: 150,
|
||||
formatter: props => {
|
||||
return '<div class="ellipsis">' + props.userId + '</div>';
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'deptNm',
|
||||
header: '부서명',
|
||||
width: 180,
|
||||
formatter: props => {
|
||||
return '<div class="ellipsis">' + props.deptNm + '</div>';
|
||||
}
|
||||
},
|
||||
{ name: 'ymd', header: '날짜', width: 100 },
|
||||
{ name: 'cellTmpltTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'cellTmpltRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
{ name: 'descTmpltTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'descTmpltRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
{ name: 'freeTmpltTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'freeTmpltRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
{ name: 'subSumTmpltTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'subSumTmpltRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
|
||||
{ name: 'smsTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'smsRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
{ name: 'lmsTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'lmsRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
{ name: 'mmsTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'mmsRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
{ name: 'formatTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'formatRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
|
||||
{ name: 'fbSmsTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'fbSmsRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' },
|
||||
{ name: 'fbLmsTot', header: '발송', width: 90, cls: 'td_line' },
|
||||
{ name: 'fbLmsRateStr', header: '성공<br>(성공률)', width: 90, cls: 'td_line' }
|
||||
],
|
||||
|
||||
summary: '',
|
||||
addAlign: '',
|
||||
|
||||
noDataStr: '검색 결과가 없습니다.',
|
||||
params: {
|
||||
searchDeptNm: '',
|
||||
searchUserId: ''
|
||||
}
|
||||
}
|
||||
};
|
||||
},
|
||||
beforeCreate() {},
|
||||
created() {
|
||||
api.selectUserRoleInfo().then(response => {
|
||||
const respList = response.data.data;
|
||||
if (response.data.success && respList != null && respList.length > 0) {
|
||||
let adminStr = respList[0].selIsAdmin;
|
||||
if (typeof adminStr != undefined && adminStr != null && adminStr == 'false') {
|
||||
this.isAdmin = false;
|
||||
}
|
||||
} else {
|
||||
this.isAdmin = true;
|
||||
}
|
||||
});
|
||||
|
||||
this.setPeriodDay(0);
|
||||
this.selectDeptNmList();
|
||||
this.selectUserIdList();
|
||||
this.getExcelHeader();
|
||||
},
|
||||
|
||||
mounted() {
|
||||
// 합계 조회
|
||||
this.searchSummary();
|
||||
},
|
||||
|
||||
components: {
|
||||
'vuejs-datepicker': vuejsDatepicker,
|
||||
customGrid: customGrid
|
||||
},
|
||||
methods: {
|
||||
getExcelHeader() {
|
||||
// 헤더를 mockup으로 관리한다.
|
||||
api.getExcelHeader(this.bbsCategoryType).then(res => {
|
||||
this.excelHeader = res;
|
||||
});
|
||||
},
|
||||
|
||||
selectDeptNmList() {
|
||||
api.selectDeptNmList().then(response => {
|
||||
const respList = response.data.data;
|
||||
if (response.data.success && respList != null && respList.length > 0) {
|
||||
this.deptNmList = respList;
|
||||
} else {
|
||||
this.deptNmList = '';
|
||||
}
|
||||
});
|
||||
|
||||
this.grid.params.searchDeptNm = '';
|
||||
},
|
||||
|
||||
selectUserIdList() {
|
||||
api
|
||||
.selectUserIdList(this.grid.params.searchDeptNm)
|
||||
.then(response => {
|
||||
const respList = response.data.data;
|
||||
if (response.data.success && respList != null && respList.length > 0) {
|
||||
this.userIdList = respList;
|
||||
this.userIdListOrigin = respList;
|
||||
} else {
|
||||
this.userIdList = '';
|
||||
this.userIdListOrigin = '';
|
||||
}
|
||||
this.searchUserId = '';
|
||||
})
|
||||
.finally(() => {
|
||||
this.selectUserRoleInfo();
|
||||
});
|
||||
},
|
||||
|
||||
selectUserRoleInfo() {
|
||||
api
|
||||
.selectUserRoleInfo()
|
||||
.then(response => {
|
||||
const respList = response.data.data;
|
||||
if (response.data.success && respList != null && respList.length > 0) {
|
||||
this.userRoleInfoList = respList;
|
||||
} else {
|
||||
this.userRoleInfoList = '';
|
||||
}
|
||||
})
|
||||
.finally(() => {
|
||||
this.setUserIdListByRole();
|
||||
});
|
||||
},
|
||||
|
||||
setUserIdListByRole: function() {
|
||||
var selUserId = this.userRoleInfoList[0].selUserId;
|
||||
if (this.userRoleInfoList[0].selIsAdmin != null && this.userRoleInfoList[0].selIsAdmin == 'false') {
|
||||
if (this.userRoleInfoList != null && this.userRoleInfoList.length > 0) {
|
||||
this.userIdList = this.userIdListOrigin.filter(function(rowData) {
|
||||
if (rowData.userId == selUserId) {
|
||||
return rowData.userId;
|
||||
}
|
||||
});
|
||||
|
||||
this.grid.params.searchDeptNm = this.userRoleInfoList[0].deptNm;
|
||||
this.grid.params.searchUserId = this.userRoleInfoList[0].selUserId;
|
||||
this.isSelIdDisabled = true; // 두개 같이 사용.
|
||||
}
|
||||
} else {
|
||||
let isContain = false;
|
||||
let currSelId = this.grid.params.searchUserId;
|
||||
this.userIdList.some(function(id) {
|
||||
if (currSelId == id) {
|
||||
isContain = true;
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
if (!isContain) this.grid.params.searchUserId = '';
|
||||
}
|
||||
},
|
||||
|
||||
customFormatter: function(date) {
|
||||
if (this.sDateDiv == 'month') {
|
||||
return moment(date).format('YYYY-MM');
|
||||
} else if (this.sDateDiv == 'year') {
|
||||
return moment(date).format('YYYY');
|
||||
} else {
|
||||
return moment(date).format('YYYY-MM-DD');
|
||||
}
|
||||
},
|
||||
toPage(lifeCycle) {
|
||||
const page = this.isNull(this.$route.params.page) ? 1 : this.$route.params.page;
|
||||
try {
|
||||
console.log('page-->', page);
|
||||
this.$refs.table.readData(page, this.grid.params);
|
||||
} catch (error) {
|
||||
console.log(lifeCycle, error);
|
||||
}
|
||||
},
|
||||
|
||||
toMove(routeName) {
|
||||
this.$router.push({ name: routeName, params: { page: 1, searchText: '' } });
|
||||
},
|
||||
|
||||
search: function(data) {
|
||||
this.grid.params = {
|
||||
sDate: moment(this.startDate).format('YYYYMMDD'),
|
||||
eDate: moment(this.endDate).format('YYYYMMDD'),
|
||||
dateDiv: this.sDateDiv,
|
||||
searchDeptNm: this.grid.params.searchDeptNm,
|
||||
searchUserId: this.grid.params.searchUserId
|
||||
};
|
||||
this.$refs.table.search(this.grid.params);
|
||||
},
|
||||
|
||||
searchSummary: function(data) {
|
||||
let summaryList = {};
|
||||
|
||||
this.grid.params.sDate = moment(this.startDate).format('YYYYMMDD');
|
||||
this.grid.params.eDate = moment(this.endDate).format('YYYYMMDD');
|
||||
this.grid.params.dateDiv = this.sDateDiv;
|
||||
this.grid.params.searchDeptNm = this.grid.params.searchDeptNm;
|
||||
this.grid.params.searchUserId = this.grid.params.searchUserId;
|
||||
/*
|
||||
if (this.grid.params.searchUserId == null) {
|
||||
this.grid.params.searchUserId = '';
|
||||
}
|
||||
*/
|
||||
|
||||
api
|
||||
.selectUserSummary(this.grid.params)
|
||||
.then(response => {
|
||||
|
||||
const respList = response.data.data;
|
||||
if (response.data.success && respList != null && respList.length > 0) {
|
||||
summaryList = respList[0];
|
||||
|
||||
this.grid.addAlign = 'TOP';
|
||||
let addBody = '';
|
||||
addBody += '<tr>';
|
||||
addBody += '<td colspan="4">합계</td>';
|
||||
addBody += '<td>' + summaryList.cellTmpltTot + '</td>';
|
||||
addBody += '<td>' + summaryList.cellTmpltSucc + '<br>(' + summaryList.cellTmpltRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.descTmpltTot + '</td>';
|
||||
addBody += '<td>' + summaryList.descTmpltSucc + '<br>(' + summaryList.descTmpltRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.freeTmpltTot + '</td>';
|
||||
addBody += '<td>' + summaryList.freeTmpltSucc + '<br>(' + summaryList.freeTmpltRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.subSumTmpltTot + '</td>';
|
||||
addBody += '<td>' + summaryList.subSumTmpltSucc + '<br>(' + summaryList.subSumTmpltRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.smsTot + '</td>';
|
||||
addBody += '<td>' + summaryList.smsSucc + '<br>(' + summaryList.smsRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.lmsTot + '</td>';
|
||||
addBody += '<td>' + summaryList.lmsSucc + '<br>(' + summaryList.lmsRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.mmsTot + '</td>';
|
||||
addBody += '<td>' + summaryList.mmsSucc + '<br>(' + summaryList.mmsRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.formatTot + '</td>';
|
||||
addBody += '<td>' + summaryList.formatSucc + '<br>(' + summaryList.formatRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.fbSmsTot + '</td>';
|
||||
addBody += '<td>' + summaryList.fbSmsSucc + '<br>(' + summaryList.fbSmsRate + '%)</td>';
|
||||
|
||||
addBody += '<td>' + summaryList.fbLmsTot + '</td>';
|
||||
addBody += '<td>' + summaryList.fbLmsSucc + '<br>(' + summaryList.fbLmsRate + '%)</td>';
|
||||
addBody += '</tr>';
|
||||
|
||||
this.grid.summary = addBody;
|
||||
} else {
|
||||
this.grid.addAlign = '';
|
||||
this.grid.summary = '';
|
||||
}
|
||||
})
|
||||
.finally(() => {
|
||||
this.search(data);
|
||||
});
|
||||
},
|
||||
|
||||
setPeriodDay(day) {
|
||||
this.periodDay = day;
|
||||
this.endDate = new Date();
|
||||
this.startDate = moment(this.endDate)
|
||||
.subtract(day, 'day')
|
||||
.toDate();
|
||||
|
||||
this.closeDate('start');
|
||||
this.closeDate('end');
|
||||
},
|
||||
|
||||
selectedStartDate(day) {
|
||||
if (day != undefined && day != null) {
|
||||
this.periodDay = day;
|
||||
}
|
||||
if (this.startDate > this.endDate) {
|
||||
this.startDate = this.endDate;
|
||||
}
|
||||
},
|
||||
selectedEndDate(day) {
|
||||
if (day != undefined && day != null) {
|
||||
this.periodDay = day;
|
||||
}
|
||||
},
|
||||
closeDate(type) {
|
||||
if (type != undefined && type != null) {
|
||||
if (type == 'start') {
|
||||
this.disabledSDate = { from: this.endDate };
|
||||
this.disabledEDate = { to: this.startDate, from: this.endDate };
|
||||
} else if (type == 'end') {
|
||||
this.disabledSDate = { from: this.endDate };
|
||||
this.disabledEDate = { to: this.startDate, from: new Date() };
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
async getExcelDataDown() {
|
||||
try {
|
||||
let response;
|
||||
const params = {
|
||||
startDtXls: moment(this.startDate).format('YYYYMMDD'),
|
||||
endDtXls: moment(this.endDate).format('YYYYMMDD'),
|
||||
sDate: this.startDate,
|
||||
eDate: this.endDate,
|
||||
dateDiv: this.sDateDiv,
|
||||
searchDeptNm: this.grid.params.searchDeptNm,
|
||||
searchUserId: this.grid.params.searchUserId
|
||||
};
|
||||
|
||||
// this.params.searchText = this.params.searchText2;
|
||||
response = await api.selectUserXlslist(params);
|
||||
|
||||
const result = response.data;
|
||||
if (result != null && result.success) {
|
||||
if (!this.isNull(result.data)) {
|
||||
return result.data;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
} catch (err) {
|
||||
return false;
|
||||
}
|
||||
}, // end of getExcelDataDown
|
||||
|
||||
async getExcelSumData() {
|
||||
try {
|
||||
let response = await api.selectUserSummary(this.grid.params);
|
||||
const result = response.data;
|
||||
|
||||
if (result != null && result.success) {
|
||||
if (!this.isNull(result.data)) {
|
||||
return result.data;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
} catch (err) {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
async excelDown() {
|
||||
if (this.$refs.table.getData().length <= 0) {
|
||||
alert('조회된 데이터가 없습니다.');
|
||||
return false;
|
||||
}
|
||||
|
||||
let today = moment().format('YYYYMMDDHHmmss');
|
||||
const saveFileName = `사용자별통계_${today}.xlsx`;
|
||||
|
||||
const data = await this.getExcelDataDown();
|
||||
const sumData = await this.getExcelSumData();
|
||||
|
||||
let options = {
|
||||
header: this.excelHeader,
|
||||
summary: {
|
||||
isUse: true,
|
||||
position: 'first',
|
||||
data: sumData,
|
||||
title: { replaceKeys: ['seq', 'userId', 'deptNm', 'ymd'], name: '합계' }
|
||||
},
|
||||
dataOrder: 'header' // header, data, ['no', 'sendnum', 'errorDesc']
|
||||
};
|
||||
|
||||
xlsx.export(data, saveFileName, options).then(() => {});
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
33
frontend/src/modules/statics/router/index.js
Normal file
33
frontend/src/modules/statics/router/index.js
Normal file
@@ -0,0 +1,33 @@
|
||||
import StaticsList from "../components/StaticsList";
|
||||
import TmpltStatics from "../components/TmpltStaticsList";
|
||||
import UserStatics from "../components/UserStaticsList";
|
||||
import CampaignStaticsList from "../components/CampaignStaticsList";
|
||||
|
||||
export default [
|
||||
{
|
||||
//
|
||||
path: '/view/stat/prod',
|
||||
name: 'staticsList',
|
||||
component: StaticsList,
|
||||
},
|
||||
{
|
||||
//
|
||||
path: '/view/stat/tmplt',
|
||||
name: 'tmpltStatics',
|
||||
component: TmpltStatics,
|
||||
},
|
||||
{
|
||||
//
|
||||
path: '/view/stat/usr',
|
||||
name: 'userStatics',
|
||||
component: UserStatics,
|
||||
},
|
||||
{
|
||||
//
|
||||
path: '/view/stat/camp',
|
||||
name: 'campaignStatics',
|
||||
component: CampaignStaticsList,
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
147
frontend/src/modules/statics/service/api.js
Normal file
147
frontend/src/modules/statics/service/api.js
Normal file
@@ -0,0 +1,147 @@
|
||||
import httpClient from '@/common/http-client';
|
||||
import prodExcelHeader from './mock/prodExcelHeader';
|
||||
import tmplExcelHeader from './mock/tmplExcelHeader';
|
||||
import userExcelHeader from './mock/userExcelHeader';
|
||||
import campExcelHeader from './mock/campExcelHeader';
|
||||
//import lodash from "lodash";
|
||||
|
||||
const selectStatics = params => {
|
||||
return httpClient.get('/api/statics/list');
|
||||
};
|
||||
|
||||
const selectStaticsSummary = params => {
|
||||
return httpClient.get('/api/statics/list/summary', {
|
||||
params: { dateDiv: params.dateDiv, sDate: params.sDate, eDate: params.eDate }
|
||||
});
|
||||
};
|
||||
|
||||
const selectStaticsXls = params => {
|
||||
return httpClient.post('/api/statics/xls/list', params);
|
||||
};
|
||||
|
||||
const selectTmpltlist = params => {
|
||||
return httpClient.get('/api/statics/tmpltList');
|
||||
};
|
||||
|
||||
const selectTmpltXlslist = params => {
|
||||
return httpClient.post('/api/statics/tmpltList/xls/list', params);
|
||||
};
|
||||
|
||||
const selectTmpltSummary = params => {
|
||||
return httpClient.get('/api/statics/tmpltList/summary', {
|
||||
params: {
|
||||
dateDiv: params.dateDiv,
|
||||
sDate: params.sDate,
|
||||
eDate: params.eDate,
|
||||
searchProdCd: params.searchProdCd,
|
||||
searchMsgbaseId: params.searchMsgbaseId
|
||||
// searchProdCd: params.searchProdCd != undefined ? params.searchProdCd : null,
|
||||
// searchMsgbaseId: params.searchMsgbaseId != undefined ? params.searchMsgbaseId : null
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
const selectUserlist = params => {
|
||||
return httpClient.get('/api/statics/userList');
|
||||
};
|
||||
|
||||
const selectUserXlslist = params => {
|
||||
return httpClient.post('/api/statics/userList/xls/list', params);
|
||||
};
|
||||
|
||||
const selectUserSummary = params => {
|
||||
return httpClient.get('/api/statics/userList/summary', {
|
||||
params: {
|
||||
dateDiv: params.dateDiv,
|
||||
sDate: params.sDate,
|
||||
eDate: params.eDate,
|
||||
searchDeptNm: params.searchDeptNm,
|
||||
searchUserId: params.searchUserId
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
const selectCampXlslist = params => {
|
||||
return httpClient.post('/api/statics/campList/xls/list', params);
|
||||
};
|
||||
|
||||
const selectCampSummary = params => {
|
||||
return httpClient.get('/api/statics/campList/summary', {
|
||||
params: {
|
||||
dateDiv: params.dateDiv,
|
||||
sDate: params.sDate,
|
||||
eDate: params.eDate,
|
||||
searchCampId: params.searchCampId
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
const selectCodeProdList = codeGrp => {
|
||||
// ES6에서는 key와 value가 같을경우. get은 아래와 같이 가능.
|
||||
return httpClient.get('/api/statics/code/list', { params: { codeGrp } });
|
||||
};
|
||||
|
||||
const selectMsgbaseIdList = searchProdCd => {
|
||||
//console.log("api selectMsgbaseIdList productcode : " + searchProdCd);
|
||||
return httpClient.get('/api/statics/msgbaseid/list', { params: { searchProdCd } });
|
||||
};
|
||||
|
||||
const selectDeptNmList = () => {
|
||||
return httpClient.get('/api/statics/deptNm/list');
|
||||
};
|
||||
|
||||
const selectUserRoleInfo = () => {
|
||||
return httpClient.get('/api/statics/userId/roleId');
|
||||
};
|
||||
|
||||
const selectUserIdList = searchDeptNm => {
|
||||
//console.log("api selectUserIdList searchDeptNm : " + searchDeptNm);
|
||||
return httpClient.get('/api/statics/userId/list', { params: { searchDeptNm } });
|
||||
};
|
||||
|
||||
const getExcelHeader = category => {
|
||||
// 엑셀에 출력할 Header 정보를 Mockup 데이터로 관리한다.
|
||||
return new Promise(function(resolve, reject) {
|
||||
let header = [];
|
||||
switch (category) {
|
||||
case 'TMPL':
|
||||
header = tmplExcelHeader.header;
|
||||
break;
|
||||
case 'USER':
|
||||
header = userExcelHeader.header;
|
||||
break;
|
||||
case 'CAMPAIGN':
|
||||
header = campExcelHeader.header;
|
||||
break;
|
||||
default:
|
||||
header = prodExcelHeader.header;
|
||||
break;
|
||||
}
|
||||
resolve(header);
|
||||
});
|
||||
};
|
||||
|
||||
export default {
|
||||
selectStatics,
|
||||
selectStaticsXls,
|
||||
selectStaticsSummary,
|
||||
|
||||
selectTmpltlist,
|
||||
selectTmpltXlslist,
|
||||
selectTmpltSummary,
|
||||
|
||||
selectUserlist,
|
||||
selectUserXlslist,
|
||||
selectUserSummary,
|
||||
|
||||
selectCampXlslist,
|
||||
selectCampSummary,
|
||||
|
||||
selectCodeProdList,
|
||||
selectMsgbaseIdList,
|
||||
selectDeptNmList,
|
||||
selectUserIdList,
|
||||
|
||||
selectUserRoleInfo,
|
||||
getExcelHeader
|
||||
};
|
||||
203
frontend/src/modules/statics/service/mock/campExcelHeader.json
Normal file
203
frontend/src/modules/statics/service/mock/campExcelHeader.json
Normal file
@@ -0,0 +1,203 @@
|
||||
{
|
||||
"header": [
|
||||
[
|
||||
{
|
||||
"key": "seq",
|
||||
"name": "NO",
|
||||
"rowspan": "2"
|
||||
},
|
||||
{
|
||||
"key": "campaignId",
|
||||
"name": "캠페인ID",
|
||||
"rowspan": "2"
|
||||
},
|
||||
{
|
||||
"key": "msgbaseName",
|
||||
"name": "템플릿명",
|
||||
"rowspan": "2"
|
||||
},
|
||||
{
|
||||
"key": "msgbaseId",
|
||||
"name": "템플릿아이디",
|
||||
"rowspan": "2"
|
||||
},
|
||||
{
|
||||
"key": "ymd",
|
||||
"name": "날짜",
|
||||
"rowspan": "2"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "스타일 템플릿",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "서술 템플릿",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "기본 템플릿",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "템플릿 소계",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "RCS SMS",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "RCS LMS",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "RCS MMS",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "RCS 소계",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "Fallback SMS",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "Fallback LMS",
|
||||
"colspan": "3"
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
"key": "cellTmpltTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "cellTmpltSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "cellTmpltRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "descTmpltTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "descTmpltSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "descTmpltRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "freeTmpltTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "freeTmpltSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "freeTmpltRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "subSumTmpltTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "subSumTmpltSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "subSumTmpltRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "smsTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "smsSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "smsRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "lmsTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "lmsSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "lmsRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "mmsTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "mmsSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "mmsRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "formatTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "formatSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "formatRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "fbSmsTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "fbSmsSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "fbSmsRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "fbLmsTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "fbLmsSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "fbLmsRate",
|
||||
"name": "성공률(%)"
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
188
frontend/src/modules/statics/service/mock/prodExcelHeader.json
Normal file
188
frontend/src/modules/statics/service/mock/prodExcelHeader.json
Normal file
@@ -0,0 +1,188 @@
|
||||
{
|
||||
"header": [
|
||||
[
|
||||
{
|
||||
"key": "seq",
|
||||
"name": "NO",
|
||||
"rowspan": "2"
|
||||
},
|
||||
{
|
||||
"key": "ymd",
|
||||
"name": "날짜",
|
||||
"rowspan": "2"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "스타일 템플릿",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "서술 템플릿",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "기본 템플릿",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "템플릿 소계",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "RCS SMS",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "RCS LMS",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "RCS MMS",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "포맷 소계",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "Fallback SMS",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "Fallback LMS",
|
||||
"colspan": "3"
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
"key": "cellTmpltTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "cellTmpltSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "cellTmpltRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "descTmpltTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "descTmpltSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "descTmpltRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "freeTmpltTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "freeTmpltSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "freeTmpltRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "subSumTmpltTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "subSumTmpltSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "subSumTmpltRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "smsTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "smsSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "smsRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "lmsTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "lmsSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "lmsRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "mmsTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "mmsSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "mmsRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "formatTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "formatSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "formatRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "fbSmsTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "fbSmsSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "fbSmsRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "fbLmsTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "fbLmsSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "fbLmsRate",
|
||||
"name": "성공률(%)"
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
{
|
||||
"header": [
|
||||
[
|
||||
{
|
||||
"key": "seq",
|
||||
"name": "NO",
|
||||
"rowspan": "2"
|
||||
},
|
||||
{
|
||||
"key": "msgbaseName",
|
||||
"name": "템플릿명",
|
||||
"rowspan": "2"
|
||||
},
|
||||
{
|
||||
"key": "msgbaseId",
|
||||
"name": "포맷ID",
|
||||
"rowspan": "2"
|
||||
},
|
||||
{
|
||||
"key": "ymd",
|
||||
"name": "날짜",
|
||||
"rowspan": "2"
|
||||
},
|
||||
{
|
||||
"key": "productName",
|
||||
"name": "상품명",
|
||||
"rowspan": "2"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "RCS",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "Fallback SMS",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "Fallback LMS",
|
||||
"colspan": "3"
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
"key": "rcsCnt",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "rcsSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "rcsRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "fbSmsTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "fbSmsSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "fbSmsRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "fbLmsTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "fbLmsSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "fbLmsRate",
|
||||
"name": "성공률(%)"
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
198
frontend/src/modules/statics/service/mock/userExcelHeader.json
Normal file
198
frontend/src/modules/statics/service/mock/userExcelHeader.json
Normal file
@@ -0,0 +1,198 @@
|
||||
{
|
||||
"header": [
|
||||
[
|
||||
{
|
||||
"key": "seq",
|
||||
"name": "NO",
|
||||
"rowspan": "2"
|
||||
},
|
||||
{
|
||||
"key": "userId",
|
||||
"name": "아이디",
|
||||
"rowspan": "2"
|
||||
},
|
||||
{
|
||||
"key": "deptNm",
|
||||
"name": "부서명",
|
||||
"rowspan": "2"
|
||||
},
|
||||
{
|
||||
"key": "ymd",
|
||||
"name": "날짜",
|
||||
"rowspan": "2"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "스타일 템플릿",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "서술 템플릿",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "기본 템플릿",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "템플릿 소계",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "RCS SMS",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "RCS LMS",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "RCS MMS",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "RCS 소계",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "Fallback SMS",
|
||||
"colspan": "3"
|
||||
},
|
||||
{
|
||||
"key": "",
|
||||
"name": "Fallback LMS",
|
||||
"colspan": "3"
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
"key": "cellTmpltTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "cellTmpltSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "cellTmpltRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "descTmpltTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "descTmpltSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "descTmpltRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "freeTmpltTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "freeTmpltSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "freeTmpltRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "subSumTmpltTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "subSumTmpltSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "subSumTmpltRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "smsTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "smsSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "smsRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "lmsTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "lmsSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "lmsRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "mmsTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "mmsSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "mmsRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "formatTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "formatSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "formatRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "fbSmsTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "fbSmsSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "fbSmsRate",
|
||||
"name": "성공률(%)"
|
||||
},
|
||||
{
|
||||
"key": "fbLmsTot",
|
||||
"name": "발송"
|
||||
},
|
||||
{
|
||||
"key": "fbLmsSucc",
|
||||
"name": "성공"
|
||||
},
|
||||
{
|
||||
"key": "fbLmsRate",
|
||||
"name": "성공률(%)"
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
19
frontend/src/modules/stats/router/index.js
Normal file
19
frontend/src/modules/stats/router/index.js
Normal file
@@ -0,0 +1,19 @@
|
||||
import MonthList from '../views/MonthList'
|
||||
import BsnmMonthList from '../views/BsnmMonthList'
|
||||
|
||||
export default [
|
||||
{
|
||||
path: '/stats/monthList',
|
||||
component: MonthList,
|
||||
name: 'monthList',
|
||||
meta: { public: true }
|
||||
},
|
||||
{
|
||||
path: '/stats/bsnmMonthList',
|
||||
component: BsnmMonthList,
|
||||
name: 'bsnmMonthList',
|
||||
meta: { public: true }
|
||||
},
|
||||
|
||||
]
|
||||
|
||||
164
frontend/src/modules/stats/views/BsnmMonthList.vue
Normal file
164
frontend/src/modules/stats/views/BsnmMonthList.vue
Normal file
@@ -0,0 +1,164 @@
|
||||
<template>
|
||||
|
||||
<div class="contents">
|
||||
<div class="contents_wrap">
|
||||
<div class="top_wrap">
|
||||
<h3 class="title">사업자 월별 통계 목록 조회</h3>
|
||||
<p class="breadcrumb">시스템관리 > 관리자/유치채널 관리</p>
|
||||
</div>
|
||||
<form autocomplete="off" class="search_form">
|
||||
<div class="search_wrap">
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">권한</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="대리점">대리점</option>
|
||||
<option value="운영자">운영자</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">상태</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="사용">사용</option>
|
||||
<option value="중지">중지</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="input_box id">
|
||||
<label for="id1" class="label">ID</label>
|
||||
<input type="text" id="id1" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<div class="input_box">
|
||||
<label for="name" class="label">이름(대리점명)</label>
|
||||
<input type="text" id="name" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<button type="button" class="button grey">조회</button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="info">
|
||||
<div class="count">총 <span>100</span>건</div>
|
||||
<div class="button_group">
|
||||
<button type="button" class="button blue admin">관리자 등록</button>
|
||||
<button type="button" class="button blue channel">유지채널 등록</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="table">
|
||||
<table>
|
||||
<colgroup>
|
||||
<col width="5%"/>
|
||||
<col width="15%"/>
|
||||
<col width="15%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="5%"/>
|
||||
<col width="20%"/>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><input type="checkbox" id="admin_check1"><label for="admin_check1"></label></th>
|
||||
<th>NO</th>
|
||||
<th>권한</th>
|
||||
<th>이름(대리점명)</th>
|
||||
<th>ID</th>
|
||||
<th>상태</th>
|
||||
<th>등록일</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><input type="checkbox" checked id="admin_check2"><label for="admin_check2"></label></td>
|
||||
<td>10</td>
|
||||
<td>대리점</td>
|
||||
<td>유플러스</td>
|
||||
<td><a href="javascript:void(0)">uplus1</a></td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div> -->
|
||||
<div class="table">
|
||||
<custom-grid
|
||||
ref="table"
|
||||
:totalItems="'totalItems'"
|
||||
:url="testList.url"
|
||||
:perPage="testList.perPage"
|
||||
:initialRequest="testList.initialRequest"
|
||||
:pagination="testList.pagination"
|
||||
:isCheckbox="testList.isCheckbox"
|
||||
:columns="testList.columns"
|
||||
:noDataStr="testList.noDataStr"
|
||||
:addCls="testList.addCls"
|
||||
:header="testList.header"
|
||||
></custom-grid>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import customGrid from '@/components/CustomGrid';
|
||||
//import api from '../service/api';
|
||||
export default {
|
||||
name: 'monthList',
|
||||
data() {
|
||||
return {
|
||||
testList: {
|
||||
url: '/api/v1/bo/sysMgt/adminList',
|
||||
perPage: 20,
|
||||
pagination: true,
|
||||
isCheckbox: true,
|
||||
initialRequest: false,
|
||||
addCls: 'box_OFvis',
|
||||
|
||||
|
||||
header: [
|
||||
[
|
||||
{ header: 'NO', childNames: [] },
|
||||
{ header: '권한', childNames: [] },
|
||||
{ header: '이름(대리점명)', childNames: [] },
|
||||
{ header: 'ID', childNames: [] },
|
||||
{ header: '상태', childNames: [] },
|
||||
{ header: '등록일', childNames: [] }
|
||||
]
|
||||
],
|
||||
|
||||
columns: [
|
||||
{ name: 'no', header: 'NO', align: 'center', width: 60 },
|
||||
{ name: 'auth', header: '권한', align: 'left', width: 160 },
|
||||
{ name: 'name', header: '이름(대리점명)', align: 'center', width: 130},
|
||||
{ name: 'adminId', header: 'ID', align: 'center', width: 130},
|
||||
{ name: 'adminStat', header: '상태', align: 'center', width: 130},
|
||||
{ name: 'regDt', header: '등록일', width: 90, cls: 'td_line' }
|
||||
],
|
||||
noDataStr: '검색 결과가 없습니다.',
|
||||
params: {
|
||||
searchType1: '',
|
||||
searchType2: '',
|
||||
searchText1: '',
|
||||
searchText2: ''
|
||||
},
|
||||
excelHeader: []
|
||||
}
|
||||
};
|
||||
},
|
||||
components: {
|
||||
customGrid: customGrid
|
||||
},
|
||||
destroyed() {
|
||||
|
||||
},
|
||||
mounted() {
|
||||
let isKeep = false;
|
||||
isKeep = true;
|
||||
this.search(isKeep);
|
||||
},
|
||||
methods: {
|
||||
search: function(isKeep) {
|
||||
console.log(this.testList.params);
|
||||
this.$refs.table.search(this.testList.params, isKeep);
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
||||
165
frontend/src/modules/stats/views/MonthList.vue
Normal file
165
frontend/src/modules/stats/views/MonthList.vue
Normal file
@@ -0,0 +1,165 @@
|
||||
<template>
|
||||
|
||||
<div class="contents">
|
||||
<div class="contents_wrap">
|
||||
<div class="top_wrap">
|
||||
<h3 class="title">월별 통계 목록 조회</h3>
|
||||
<p class="breadcrumb">시스템관리 > 관리자/유치채널 관리</p>
|
||||
</div>
|
||||
<form autocomplete="off" class="search_form">
|
||||
<div class="search_wrap">
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">권한</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="대리점">대리점</option>
|
||||
<option value="운영자">운영자</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="select_box">
|
||||
<label for="right" class="label">상태</label>
|
||||
<select name="" id="right">
|
||||
<option value="전체">전체</option>
|
||||
<option value="사용">사용</option>
|
||||
<option value="중지">중지</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="input_box id">
|
||||
<label for="id1" class="label">ID</label>
|
||||
<input type="text" id="id1" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<div class="input_box">
|
||||
<label for="name" class="label">이름(대리점명)</label>
|
||||
<input type="text" id="name" placeholder="검색어 입력"/>
|
||||
</div>
|
||||
<button type="button" class="button grey">조회</button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="info">
|
||||
<div class="count">총 <span>100</span>건</div>
|
||||
<div class="button_group">
|
||||
<button type="button" class="button blue admin">관리자 등록</button>
|
||||
<button type="button" class="button blue channel">유지채널 등록</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- <div class="table">
|
||||
<table>
|
||||
<colgroup>
|
||||
<col width="5%"/>
|
||||
<col width="15%"/>
|
||||
<col width="15%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="5%"/>
|
||||
<col width="20%"/>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><input type="checkbox" id="admin_check1"><label for="admin_check1"></label></th>
|
||||
<th>NO</th>
|
||||
<th>권한</th>
|
||||
<th>이름(대리점명)</th>
|
||||
<th>ID</th>
|
||||
<th>상태</th>
|
||||
<th>등록일</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><input type="checkbox" checked id="admin_check2"><label for="admin_check2"></label></td>
|
||||
<td>10</td>
|
||||
<td>대리점</td>
|
||||
<td>유플러스</td>
|
||||
<td><a href="javascript:void(0)">uplus1</a></td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div> -->
|
||||
<div class="table">
|
||||
<custom-grid
|
||||
ref="table"
|
||||
:totalItems="'totalItems'"
|
||||
:url="testList.url"
|
||||
:perPage="testList.perPage"
|
||||
:initialRequest="testList.initialRequest"
|
||||
:pagination="testList.pagination"
|
||||
:isCheckbox="testList.isCheckbox"
|
||||
:columns="testList.columns"
|
||||
:noDataStr="testList.noDataStr"
|
||||
:addCls="testList.addCls"
|
||||
:header="testList.header"
|
||||
></custom-grid>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import customGrid from '@/components/CustomGrid';
|
||||
//import api from '../service/api';
|
||||
export default {
|
||||
name: 'monthList',
|
||||
data() {
|
||||
return {
|
||||
testList: {
|
||||
url: '/api/v1/bo/sysMgt/adminList',
|
||||
perPage: 20,
|
||||
pagination: true,
|
||||
isCheckbox: true,
|
||||
initialRequest: false,
|
||||
addCls: 'box_OFvis',
|
||||
|
||||
|
||||
header: [
|
||||
[
|
||||
{ header: 'NO', childNames: [] },
|
||||
{ header: '권한', childNames: [] },
|
||||
{ header: '이름(대리점명)', childNames: [] },
|
||||
{ header: 'ID', childNames: [] },
|
||||
{ header: '상태', childNames: [] },
|
||||
{ header: '등록일', childNames: [] }
|
||||
]
|
||||
],
|
||||
|
||||
columns: [
|
||||
{ name: 'no', header: 'NO', align: 'center', width: 60 },
|
||||
{ name: 'auth', header: '권한', align: 'left', width: 160 },
|
||||
{ name: 'name', header: '이름(대리점명)', align: 'center', width: 130},
|
||||
{ name: 'adminId', header: 'ID', align: 'center', width: 130},
|
||||
{ name: 'adminStat', header: '상태', align: 'center', width: 130},
|
||||
{ name: 'regDt', header: '등록일', width: 90, cls: 'td_line' }
|
||||
],
|
||||
noDataStr: '검색 결과가 없습니다.',
|
||||
// params: {
|
||||
// apprResult: '',
|
||||
// searchType: '',
|
||||
// searchText: '',
|
||||
// startDate: '',
|
||||
// endDate: ''
|
||||
// },
|
||||
excelHeader: []
|
||||
}
|
||||
};
|
||||
},
|
||||
components: {
|
||||
customGrid: customGrid
|
||||
},
|
||||
destroyed() {
|
||||
|
||||
},
|
||||
mounted() {
|
||||
let isKeep = false;
|
||||
isKeep = true;
|
||||
this.search(isKeep);
|
||||
},
|
||||
methods: {
|
||||
search: function(isKeep) {
|
||||
console.log(this.testList.params);
|
||||
this.$refs.table.search(this.testList.params, isKeep);
|
||||
},
|
||||
}
|
||||
};
|
||||
</script>
|
||||
18
frontend/src/modules/sysMgt/router/index.js
Normal file
18
frontend/src/modules/sysMgt/router/index.js
Normal file
@@ -0,0 +1,18 @@
|
||||
import AustList from '../views/AuthList'
|
||||
import AdminList from '../views/AdminList'
|
||||
|
||||
export default [
|
||||
{
|
||||
path: '/sysMgt/authList',
|
||||
component: AustList,
|
||||
name: 'authList',
|
||||
meta: { public: true }
|
||||
},
|
||||
{
|
||||
path: '/sysMgt/adminList',
|
||||
component: AdminList,
|
||||
name: 'adminList',
|
||||
meta: { public: true }
|
||||
}
|
||||
]
|
||||
|
||||
107
frontend/src/modules/sysMgt/views/AdminList.vue
Normal file
107
frontend/src/modules/sysMgt/views/AdminList.vue
Normal file
@@ -0,0 +1,107 @@
|
||||
<template>
|
||||
<div class="contents">
|
||||
<div class="contents_wrap">
|
||||
<div class="top_wrap">
|
||||
<h3 class="title">관리자 목록 조회</h3>
|
||||
<p class="breadcrumb">시스템관리 > 권한 관리</p>
|
||||
</div>
|
||||
<div class="info">
|
||||
<div class="count">총 <span>4</span>건</div>
|
||||
<div class="button_group">
|
||||
<button type="button" class="button blue add" onclick="location.href='system_right_add.html';">권한 추가</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="table">
|
||||
<table>
|
||||
<colgroup>
|
||||
<col width="10%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="15%"/>
|
||||
<col width="20%"/>
|
||||
<col width="15%"/>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>NO</th>
|
||||
<th>코드</th>
|
||||
<th>권한명</th>
|
||||
<th>상태</th>
|
||||
<th>등록일</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>4</td>
|
||||
<td>Admin_01</td>
|
||||
<td>슈퍼관리자</td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
<td class="two_btn_group">
|
||||
<button type="button" class="button grey" onclick="location.href='system_right_modify.html';">수정</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>3</td>
|
||||
<td>Admin_01</td>
|
||||
<td>슈퍼관리자</td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
<td class="two_btn_group">
|
||||
<button type="button" class="button grey">수정</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2</td>
|
||||
<td>Admin_01</td>
|
||||
<td>슈퍼관리자</td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
<td class="two_btn_group">
|
||||
<button type="button" class="button grey">수정</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>1</td>
|
||||
<td>Admin_01</td>
|
||||
<td>슈퍼관리자</td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
<td class="two_btn_group">
|
||||
<button type="button" class="button grey">수정</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'authList',
|
||||
data() {
|
||||
return {
|
||||
|
||||
};
|
||||
},
|
||||
components: {
|
||||
|
||||
},
|
||||
destroyed() {
|
||||
|
||||
},
|
||||
mounted() {
|
||||
|
||||
},
|
||||
methods: {
|
||||
|
||||
}
|
||||
};
|
||||
</script>
|
||||
107
frontend/src/modules/sysMgt/views/AuthList.vue
Normal file
107
frontend/src/modules/sysMgt/views/AuthList.vue
Normal file
@@ -0,0 +1,107 @@
|
||||
<template>
|
||||
<div class="contents">
|
||||
<div class="contents_wrap">
|
||||
<div class="top_wrap">
|
||||
<h3 class="title">권한 관리</h3>
|
||||
<p class="breadcrumb">시스템관리 > 권한 관리</p>
|
||||
</div>
|
||||
<div class="info">
|
||||
<div class="count">총 <span>4</span>건</div>
|
||||
<div class="button_group">
|
||||
<button type="button" class="button blue add" onclick="location.href='system_right_add.html';">권한 추가</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="table">
|
||||
<table>
|
||||
<colgroup>
|
||||
<col width="10%"/>
|
||||
<col width="20%"/>
|
||||
<col width="20%"/>
|
||||
<col width="15%"/>
|
||||
<col width="20%"/>
|
||||
<col width="15%"/>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>NO</th>
|
||||
<th>코드</th>
|
||||
<th>권한명</th>
|
||||
<th>상태</th>
|
||||
<th>등록일</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>4</td>
|
||||
<td>Admin_01</td>
|
||||
<td>슈퍼관리자</td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
<td class="two_btn_group">
|
||||
<button type="button" class="button grey" onclick="location.href='system_right_modify.html';">수정</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>3</td>
|
||||
<td>Admin_01</td>
|
||||
<td>슈퍼관리자</td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
<td class="two_btn_group">
|
||||
<button type="button" class="button grey">수정</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>2</td>
|
||||
<td>Admin_01</td>
|
||||
<td>슈퍼관리자</td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
<td class="two_btn_group">
|
||||
<button type="button" class="button grey">수정</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>1</td>
|
||||
<td>Admin_01</td>
|
||||
<td>슈퍼관리자</td>
|
||||
<td>사용</td>
|
||||
<td>2022-03-10</td>
|
||||
<td class="two_btn_group">
|
||||
<button type="button" class="button grey">수정</button>
|
||||
<button type="button" class="button white delete">삭제</button>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'authList',
|
||||
data() {
|
||||
return {
|
||||
|
||||
};
|
||||
},
|
||||
components: {
|
||||
|
||||
},
|
||||
destroyed() {
|
||||
|
||||
},
|
||||
mounted() {
|
||||
|
||||
},
|
||||
methods: {
|
||||
|
||||
}
|
||||
};
|
||||
</script>
|
||||
Reference in New Issue
Block a user