hubez-admin partner-git master -> hubez-git transfer 202205241800

This commit is contained in:
hyunjin35
2022-05-24 18:12:19 +09:00
parent 013e992bc7
commit ad80b88089
309 changed files with 50355 additions and 91 deletions

View File

@@ -0,0 +1,11 @@
import ChannelList from '../views/ChannelList'
export default [
{
path: '/attractMgt/channelList',
component: ChannelList,
name: 'channelList',
meta: { public: true }
}
]

View File

@@ -0,0 +1,107 @@
<template>
<div class="contents">
<div class="contents_wrap">
<div class="top_wrap">
<h3 class="title">유치채널 목록조회</h3>
<p class="breadcrumb">시스템관리 &gt; 권한 관리</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>

View File

@@ -0,0 +1,12 @@
import CalcList from '../views/CalcList'
export default [
{
path: '/calculate/calcList',
component: CalcList,
name: 'calcList',
meta: { public: true }
},
]

View File

@@ -0,0 +1,165 @@
<template>
<div class="contents">
<div class="contents_wrap">
<div class="top_wrap">
<h3 class="title">정산이력목록조회</h3>
<p class="breadcrumb">시스템관리 &gt; 관리자/유치채널 관리</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>

View File

@@ -0,0 +1,12 @@
import TmpltList from '../views/TmpltList'
export default [
{
path: '/channelMgt/tmpltList',
component: TmpltList,
name: 'tmpltList',
meta: { public: true }
},
]

View File

@@ -0,0 +1,165 @@
<template>
<div class="contents">
<div class="contents_wrap">
<div class="top_wrap">
<h3 class="title">알림톡 템플릿 목록 조회</h3>
<p class="breadcrumb">시스템관리 &gt; 관리자/유치채널 관리</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>

View 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 }
},
]

View File

@@ -0,0 +1,211 @@
<template>
<div class="contents">
<div class="contents_wrap">
<div class="top_wrap">
<h3 class="title">청약고객정보목록조회</h3>
<p class="breadcrumb">시스템관리 &gt; 관리자/유치채널 관리</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>

View File

@@ -0,0 +1,165 @@
<template>
<div class="contents">
<div class="contents_wrap">
<div class="top_wrap">
<h3 class="title">회원 정보 상세 조회</h3>
<p class="breadcrumb">시스템관리 &gt; 관리자/유치채널 관리</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>

View File

@@ -0,0 +1,165 @@
<template>
<div class="contents">
<div class="contents_wrap">
<div class="top_wrap">
<h3 class="title">회원목록조회</h3>
<p class="breadcrumb">시스템관리 &gt; 관리자/유치채널 관리</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>

View File

@@ -0,0 +1,165 @@
<template>
<div class="contents">
<div class="contents_wrap">
<div class="top_wrap">
<h3 class="title">청약 정보 상세 조회</h3>
<p class="breadcrumb">시스템관리 &gt; 관리자/유치채널 관리</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>

View 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 }
},
]

View 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
};

View 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 };

View 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
};

View 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>

View 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>

View 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>

View 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 }
},
]

View File

@@ -0,0 +1,165 @@
<template>
<div class="contents">
<div class="contents_wrap">
<div class="top_wrap">
<h3 class="title">실시간 발송 현황 정보 조회</h3>
<p class="breadcrumb">시스템관리 &gt; 관리자/유치채널 관리</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>

View File

@@ -0,0 +1,165 @@
<template>
<div class="contents">
<div class="contents_wrap">
<div class="top_wrap">
<h3 class="title">발송내역 목록 조회</h3>
<p class="breadcrumb">시스템관리 &gt; 관리자/유치채널 관리</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>

View 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 }
},
]

View File

@@ -0,0 +1,165 @@
<template>
<div class="contents">
<div class="contents_wrap">
<div class="top_wrap">
<h3 class="title">차단 내역 목록 조회</h3>
<p class="breadcrumb">시스템관리 &gt; 관리자/유치채널 관리</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>

View File

@@ -0,0 +1,165 @@
<template>
<div class="contents">
<div class="contents_wrap">
<div class="top_wrap">
<h3 class="title">발신번호 차단 목록 조회</h3>
<p class="breadcrumb">시스템관리 &gt; 관리자/유치채널 관리</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>

View File

@@ -0,0 +1,165 @@
<template>
<div class="contents">
<div class="contents_wrap">
<div class="top_wrap">
<h3 class="title">메시지 차단 목록 조회</h3>
<p class="breadcrumb">시스템관리 &gt; 관리자/유치채널 관리</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>

View 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">시스템관리 &gt; 관리자/유치채널 관리</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>

View 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 }
},
]

View File

@@ -0,0 +1,165 @@
<template>
<div class="contents">
<div class="contents_wrap">
<div class="top_wrap">
<h3 class="title">발신번호 승인 목록 조회</h3>
<p class="breadcrumb">시스템관리 &gt; 관리자/유치채널 관리</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>

View File

@@ -0,0 +1,165 @@
<template>
<div class="contents">
<div class="contents_wrap">
<div class="top_wrap">
<h3 class="title">문자 발신 번호 목록 조회</h3>
<p class="breadcrumb">시스템관리 &gt; 관리자/유치채널 관리</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>

View File

@@ -0,0 +1,165 @@
<template>
<div class="contents">
<div class="contents_wrap">
<div class="top_wrap">
<h3 class="title">발신 프로필 목록 조회</h3>
<p class="breadcrumb">시스템관리 &gt; 관리자/유치채널 관리</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>

View File

@@ -0,0 +1,11 @@
import rejectRecvList from '../views/rejectRecvList'
export default [
{
path: '/servMgt/rejectRecvList',
component: rejectRecvList,
name: 'rejectRecvList',
meta: { public: true }
},
]

View File

@@ -0,0 +1,165 @@
<template>
<div class="contents">
<div class="contents_wrap">
<div class="top_wrap">
<h3 class="title">서비스관리</h3>
<p class="breadcrumb">시스템관리 &gt; 관리자/유치채널 관리</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>

View 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">&nbsp;</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>

View 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>

View 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">&nbsp;</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>

View 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">&nbsp;</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>

View 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,
},
]

View 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
};

View 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": "성공률(%)"
}
]
]
}

View 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": "성공률(%)"
}
]
]
}

View File

@@ -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": "성공률(%)"
}
]
]
}

View 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": "성공률(%)"
}
]
]
}

View 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 }
},
]

View File

@@ -0,0 +1,164 @@
<template>
<div class="contents">
<div class="contents_wrap">
<div class="top_wrap">
<h3 class="title">사업자 월별 통계 목록 조회</h3>
<p class="breadcrumb">시스템관리 &gt; 관리자/유치채널 관리</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>

View File

@@ -0,0 +1,165 @@
<template>
<div class="contents">
<div class="contents_wrap">
<div class="top_wrap">
<h3 class="title">월별 통계 목록 조회</h3>
<p class="breadcrumb">시스템관리 &gt; 관리자/유치채널 관리</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>

View 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 }
}
]

View File

@@ -0,0 +1,107 @@
<template>
<div class="contents">
<div class="contents_wrap">
<div class="top_wrap">
<h3 class="title">관리자 목록 조회</h3>
<p class="breadcrumb">시스템관리 &gt; 권한 관리</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>

View File

@@ -0,0 +1,107 @@
<template>
<div class="contents">
<div class="contents_wrap">
<div class="top_wrap">
<h3 class="title">권한 관리</h3>
<p class="breadcrumb">시스템관리 &gt; 권한 관리</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>