Vue2_Frontend 수정1...
This commit is contained in:
parent
5ac1eb6722
commit
409ad85356
1566
package-lock.json
generated
1566
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -15,6 +15,7 @@
|
|||||||
"vee-validate": "^3.4.14",
|
"vee-validate": "^3.4.14",
|
||||||
"vue": "^2.6.14",
|
"vue": "^2.6.14",
|
||||||
"vue-router": "^3.5.1",
|
"vue-router": "^3.5.1",
|
||||||
|
"vue2-editor": "^2.10.3",
|
||||||
"vuex": "^3.6.2"
|
"vuex": "^3.6.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
@ -11,7 +11,7 @@
|
|||||||
<b-input-group>
|
<b-input-group>
|
||||||
<label class="input-group-text">{{ field.email.label }}</label>
|
<label class="input-group-text">{{ field.email.label }}</label>
|
||||||
<b-form-input
|
<b-form-input
|
||||||
:name="field.email.label"
|
:name="field.email.key"
|
||||||
:type="field.email.type"
|
:type="field.email.type"
|
||||||
v-model="form.email"
|
v-model="form.email"
|
||||||
:state="getValidationState(validationContext)"
|
:state="getValidationState(validationContext)"
|
||||||
@ -30,7 +30,7 @@
|
|||||||
<b-input-group>
|
<b-input-group>
|
||||||
<label class="input-group-text">{{ field.password.label }}</label>
|
<label class="input-group-text">{{ field.password.label }}</label>
|
||||||
<b-form-input
|
<b-form-input
|
||||||
:name="field.password.label"
|
:name="field.password.key"
|
||||||
:type="field.password.type"
|
:type="field.password.type"
|
||||||
v-model="form.password"
|
v-model="form.password"
|
||||||
:state="getValidationState(validationContext)"
|
:state="getValidationState(validationContext)"
|
||||||
@ -89,13 +89,12 @@ export default {
|
|||||||
password: this.form.password
|
password: this.form.password
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
if (result) {
|
if (result.access_token) {
|
||||||
// localStorage를 사용하면, 브라우저에 key-value 값을 Storage에 저장할 수 있습니다
|
// localStorage를 사용하면, 브라우저에 key-value 값을 Storage에 저장할 수 있습니다
|
||||||
localStorage.setItem(process.env.VUE_APP_LOCALSTORAGE_NAME, result)
|
localStorage.setItem(process.env.VUE_APP_LOCALSTORAGE_NAME, result)
|
||||||
alert('로그인 성공...')
|
alert('로그인 성공...')
|
||||||
console.log('로그인 성공...')
|
|
||||||
console.log(this.$router)
|
console.log(this.$router)
|
||||||
this.$router.push(this.$reouter.path)
|
//this.$router.push(this.$router.path)
|
||||||
} else {
|
} else {
|
||||||
console.log(result)
|
console.log(result)
|
||||||
localStorage.removeItem(process.env.VUE_APP_LOCALSTORAGE_NAME)
|
localStorage.removeItem(process.env.VUE_APP_LOCALSTORAGE_NAME)
|
||||||
@ -115,15 +114,16 @@ export default {
|
|||||||
async callAPI(url, params) {
|
async callAPI(url, params) {
|
||||||
console.log('CallAPI..', [url, params])
|
console.log('CallAPI..', [url, params])
|
||||||
axios.defaults.baseURL = process.env.VUE_APP_BACKEND_HOST
|
axios.defaults.baseURL = process.env.VUE_APP_BACKEND_HOST
|
||||||
axios.defaults.headers.post['Content-Type'] =
|
//전송 Header에 CORP정보 추가
|
||||||
process.env.VUE_APP_BACKEND_HEADERS_Content_Type
|
// axios.defaults.headers.post['Content-Type'] =
|
||||||
axios.defaults.headers.post['Access-Control-Allow-Origin'] =
|
// process.env.VUE_APP_BACKEND_HEADERS_Content_Type
|
||||||
process.env.VUE_APP_BACKEND_HEADERS_Access_Control_Allow_Origin
|
// axios.defaults.headers.post['Access-Control-Allow-Origin'] =
|
||||||
|
// process.env.VUE_APP_BACKEND_HEADERS_Access_Control_Allow_Origin
|
||||||
return await axios
|
return await axios
|
||||||
.post(url, params)
|
.post(url, params)
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
// console.log(response)
|
// console.log(response)
|
||||||
return response.status === 201 ? response.data.access_token : null
|
return response.status === 201 ? response.data : null
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
console.log(err)
|
console.log(err)
|
||||||
|
|||||||
180
src/components/todo/InputComponent.vue
Normal file
180
src/components/todo/InputComponent.vue
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<b-modal
|
||||||
|
id="inputForm"
|
||||||
|
centered
|
||||||
|
title="입력폼"
|
||||||
|
size="lg"
|
||||||
|
:header-bg-variant="headerBgVariant"
|
||||||
|
:header-text-variant="headerTextVariant"
|
||||||
|
:body-bg-variant="bodyBgVariant"
|
||||||
|
:body-text-variant="bodyTextVariant"
|
||||||
|
:footer-bg-variant="footerBgVariant"
|
||||||
|
:footer-text-variant="footerTextVariant"
|
||||||
|
>
|
||||||
|
<validation-observer ref="observer" v-slot="{ handleSubmit }">
|
||||||
|
<b-form @submit.stop.prevent="handleSubmit(onSubmit)">
|
||||||
|
<validation-provider
|
||||||
|
:name="field.title.label"
|
||||||
|
:rules="field.title.rules"
|
||||||
|
v-slot="validationContext"
|
||||||
|
>
|
||||||
|
<b-input-group>
|
||||||
|
<label class="input-group-text">{{ field.title.label }}</label>
|
||||||
|
<b-form-input
|
||||||
|
:name="field.title.key"
|
||||||
|
:type="field.title.type"
|
||||||
|
v-model="form.title"
|
||||||
|
:state="getValidationState(validationContext)"
|
||||||
|
:style="field.title.style"
|
||||||
|
></b-form-input>
|
||||||
|
<b-form-invalid-feedback>{{
|
||||||
|
validationContext.errors[0]
|
||||||
|
}}</b-form-invalid-feedback>
|
||||||
|
</b-input-group>
|
||||||
|
</validation-provider>
|
||||||
|
<validation-provider
|
||||||
|
:name="field.content.label"
|
||||||
|
:rules="field.content.rules"
|
||||||
|
v-slot="validationContext"
|
||||||
|
>
|
||||||
|
<label class="input-group-text">{{ field.content.label }}</label>
|
||||||
|
<b-input-group>
|
||||||
|
<b-form-textarea
|
||||||
|
:config="field.content.config"
|
||||||
|
:name="field.content.key"
|
||||||
|
v-model="form.content"
|
||||||
|
:state="getValidationState(validationContext)"
|
||||||
|
:style="field.content.style"
|
||||||
|
rows="8"
|
||||||
|
></b-form-textarea>
|
||||||
|
<b-form-invalid-feedback>{{
|
||||||
|
validationContext.errors[0]
|
||||||
|
}}</b-form-invalid-feedback>
|
||||||
|
</b-input-group>
|
||||||
|
</validation-provider>
|
||||||
|
<div class="mt-300 border">
|
||||||
|
<b-button type="submit" variant="primary">입력</b-button>
|
||||||
|
<b-button type="reset" variant="danger" @click="onReset()"
|
||||||
|
>Reset</b-button
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</b-form>
|
||||||
|
</validation-observer>
|
||||||
|
</b-modal>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import axios from 'axios'
|
||||||
|
//import { VueEditor } from 'vue2-editor/dist/vue2-editor.core.js'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
components: {},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
form: {
|
||||||
|
title: null,
|
||||||
|
content: null
|
||||||
|
},
|
||||||
|
field: {
|
||||||
|
title: {
|
||||||
|
key: 'title',
|
||||||
|
label: '제목',
|
||||||
|
type: 'text',
|
||||||
|
placeholder: 'Enter your name',
|
||||||
|
rules: { required: true, min: 10 },
|
||||||
|
style: 'sm-2'
|
||||||
|
},
|
||||||
|
content: {
|
||||||
|
key: 'content',
|
||||||
|
label: '내용',
|
||||||
|
type: 'textarea',
|
||||||
|
rules: { required: true, min: 10 },
|
||||||
|
style: 'height: 200px'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
variants: [
|
||||||
|
'primary',
|
||||||
|
'secondary',
|
||||||
|
'success',
|
||||||
|
'warning',
|
||||||
|
'danger',
|
||||||
|
'info',
|
||||||
|
'light',
|
||||||
|
'dark'
|
||||||
|
],
|
||||||
|
headerBgVariant: 'dark',
|
||||||
|
headerTextVariant: 'light',
|
||||||
|
bodyBgVariant: 'light',
|
||||||
|
bodyTextVariant: 'dark',
|
||||||
|
footerBgVariant: 'warning',
|
||||||
|
footerTextVariant: 'dark'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
getValidationState({ dirty, validated, valid = null }) {
|
||||||
|
return dirty || validated ? valid : null
|
||||||
|
},
|
||||||
|
async onSubmit() {
|
||||||
|
const result = await this.callAPI(
|
||||||
|
'/todo',
|
||||||
|
JSON.stringify({
|
||||||
|
title: this.form.title,
|
||||||
|
content: this.form.content
|
||||||
|
})
|
||||||
|
)
|
||||||
|
if (result !== null) {
|
||||||
|
alert('todo 추가 완료...')
|
||||||
|
} else {
|
||||||
|
console.log(result)
|
||||||
|
alert('todo 추가 오류발생...')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onReset() {
|
||||||
|
// Reset our form values
|
||||||
|
this.form.email = ''
|
||||||
|
this.form.pasword = ''
|
||||||
|
// Trick to reset/clear native browser form validation state
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.$refs.observer.reset()
|
||||||
|
})
|
||||||
|
},
|
||||||
|
async callAPI(url, params) {
|
||||||
|
console.log('CallAPI..', [url, params])
|
||||||
|
axios.defaults.baseURL = process.env.VUE_APP_BACKEND_HOST
|
||||||
|
//전송 Header에 CORP정보 추가
|
||||||
|
// axios.defaults.headers.post['Content-Type'] =
|
||||||
|
// process.env.VUE_APP_BACKEND_HEADERS_Content_Type
|
||||||
|
// axios.defaults.headers.post['Access-Control-Allow-Origin'] =
|
||||||
|
// process.env.VUE_APP_BACKEND_HEADERS_Access_Control_Allow_Origin
|
||||||
|
//전송 Header에 인증키 추가
|
||||||
|
axios.defaults.headers.common = {
|
||||||
|
Authorization: `Bearer ${localStorage.getItem(
|
||||||
|
process.env.VUE_APP_LOCALSTORAGE_NAME
|
||||||
|
)}`
|
||||||
|
}
|
||||||
|
const headers = {
|
||||||
|
Authorization: 'Bearer ' + process.env.VUE_APP_LOCALSTORAGE_NAME
|
||||||
|
}
|
||||||
|
return await axios
|
||||||
|
.post(url, params, headers)
|
||||||
|
.then((response) => {
|
||||||
|
console.log(response)
|
||||||
|
return response.status === 201 ? response.data : null
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
console.log(err)
|
||||||
|
return null
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style scoped>
|
||||||
|
/* @import '~vue2-editor/dist/vue2-editor.css';
|
||||||
|
/* Import the Quill styles you want */
|
||||||
|
/* @import '~quill/dist/quill.core.css';
|
||||||
|
@import '~quill/dist/quill.bubble.css';
|
||||||
|
@import '~quill/dist/quill.snow.css'; */
|
||||||
|
</style>
|
||||||
@ -21,16 +21,16 @@
|
|||||||
<label class="input-group-text">
|
<label class="input-group-text">
|
||||||
<b-form-checkbox-group
|
<b-form-checkbox-group
|
||||||
class="d-flex flex-nowrap"
|
class="d-flex flex-nowrap"
|
||||||
v-model="filterOn"
|
v-model="searchFields"
|
||||||
:options="filterOptions"
|
:options="searchOptions"
|
||||||
></b-form-checkbox-group>
|
></b-form-checkbox-group>
|
||||||
</label>
|
</label>
|
||||||
<b-form-input
|
<b-form-input
|
||||||
v-model="filter"
|
v-model="search"
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="Type to Filter"
|
placeholder="검색어"
|
||||||
></b-form-input>
|
></b-form-input>
|
||||||
<b-button :disabled="!filter" @click="filter = ''">Clear</b-button>
|
<b-button @click="searchClick">검색</b-button>
|
||||||
</b-input-group>
|
</b-input-group>
|
||||||
</b-col>
|
</b-col>
|
||||||
<b-col class="border">
|
<b-col class="border">
|
||||||
@ -39,20 +39,19 @@
|
|||||||
<b-form-select
|
<b-form-select
|
||||||
v-model="perPage"
|
v-model="perPage"
|
||||||
:options="perPageOptions"
|
:options="perPageOptions"
|
||||||
|
@change="perPageClick"
|
||||||
></b-form-select>
|
></b-form-select>
|
||||||
</b-input-group>
|
</b-input-group>
|
||||||
</b-col>
|
</b-col>
|
||||||
</b-row>
|
</b-row>
|
||||||
<b-row class="overflow-auto">
|
<b-row class="overflow-auto">
|
||||||
<b-table
|
<b-table
|
||||||
ref="selectableTable"
|
id="todoTable"
|
||||||
:items="items"
|
ref="todoTable"
|
||||||
|
:items="rows"
|
||||||
:fields="fields"
|
:fields="fields"
|
||||||
:per-page="perPage"
|
:per-page="perPage"
|
||||||
:current-page="currentPage"
|
:current-page="currentPage"
|
||||||
:filter="filter"
|
|
||||||
:filter-included-fields="filterOn"
|
|
||||||
@filtered="onFiltered"
|
|
||||||
:sort-by.sync="sortBy"
|
:sort-by.sync="sortBy"
|
||||||
:sort-desc.sync="sortDesc"
|
:sort-desc.sync="sortDesc"
|
||||||
:sort-direction="sortDirection"
|
:sort-direction="sortDirection"
|
||||||
@ -71,14 +70,6 @@
|
|||||||
:dark="commonTableAttributes.dark"
|
:dark="commonTableAttributes.dark"
|
||||||
:head-variant="commonTableAttributes.headVariant"
|
:head-variant="commonTableAttributes.headVariant"
|
||||||
>
|
>
|
||||||
<!-- 각 Cell/Field별 속성 추가용 -->
|
|
||||||
<template>
|
|
||||||
<col
|
|
||||||
v-for="field in fields"
|
|
||||||
:key="field.key"
|
|
||||||
:style="field.style"
|
|
||||||
/>
|
|
||||||
</template>
|
|
||||||
<!-- 비/선택 Row를 토글용 -->
|
<!-- 비/선택 Row를 토글용 -->
|
||||||
<template #cell(rowSelect)="{ rowSelected }">
|
<template #cell(rowSelect)="{ rowSelected }">
|
||||||
<template v-if="rowSelected">
|
<template v-if="rowSelected">
|
||||||
@ -89,25 +80,27 @@
|
|||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
<!-- Row의 Index를 이용한 번호 출력 -->
|
<!-- Row의 Index를 이용한 번호 출력 -->
|
||||||
<template #cell(index)="row">
|
<template #cell(id)="row">
|
||||||
{{ total - (currentPage * perPage + row.index) + perPage }}
|
<b-link ref="edit/{{row.item.id}}">
|
||||||
|
{{ total - (currentPage * perPage + row.index) + perPage }}
|
||||||
|
</b-link>
|
||||||
</template>
|
</template>
|
||||||
<!-- 제목부분 출력용 -->
|
<!-- 제목부분 출력용 -->
|
||||||
<template #cell(title)="row">
|
<template #cell(title)="row">
|
||||||
{{ row.item.title }}
|
{{ row.item.title }}
|
||||||
<b-button size="sm" @click="row.toggleDetails" class="mr-2">
|
|
||||||
{{ row.detailsShowing ? 'Hide' : 'Show' }} Details
|
|
||||||
</b-button>
|
|
||||||
</template>
|
</template>
|
||||||
<!-- 상세 내용 출력용 -->
|
<!-- 상세 내용 출력용 -->
|
||||||
|
<template #cell(content)="row">
|
||||||
|
<b-button size="sm" @click="row.toggleDetails" class="mr-2">
|
||||||
|
{{ row.detailsShowing ? '숨기기' : '보기' }}
|
||||||
|
</b-button>
|
||||||
|
</template>
|
||||||
<template #row-details="row">
|
<template #row-details="row">
|
||||||
<b-card>
|
<b-card>
|
||||||
<b-row class="mb-2">
|
<b-row>
|
||||||
<b-col v-html="row.item.content"></b-col>
|
<b-col v-html="row.item.content"></b-col>
|
||||||
</b-row>
|
</b-row>
|
||||||
<b-button size="sm" @click="row.toggleDetails"
|
<b-button size="sm" @click="row.toggleDetails">숨기기</b-button>
|
||||||
>Hide Details</b-button
|
|
||||||
>
|
|
||||||
</b-card>
|
</b-card>
|
||||||
</template>
|
</template>
|
||||||
<!-- 데이터 로딩중 출력용 -->
|
<!-- 데이터 로딩중 출력용 -->
|
||||||
@ -121,18 +114,20 @@
|
|||||||
</b-row>
|
</b-row>
|
||||||
<b-row>
|
<b-row>
|
||||||
<b-col>
|
<b-col>
|
||||||
<b-pagination
|
<p>{{ selectedRows }}</p>
|
||||||
v-model="currentPage"
|
|
||||||
:total-rows="total"
|
|
||||||
:per-page="perPage"
|
|
||||||
></b-pagination>
|
|
||||||
</b-col>
|
</b-col>
|
||||||
<b-col>
|
<b-col>
|
||||||
<b-input-group>
|
<template>
|
||||||
<label class="input-group-text">DB</label>
|
<b-pagination
|
||||||
<input type="text" class="form-control" v-model="search" />
|
v-model="currentPage"
|
||||||
<span class="input-group-text" @click="searchForDB">검색</span>
|
:total-rows="total"
|
||||||
</b-input-group>
|
:per-page="perPage"
|
||||||
|
@page-click="pageClick"
|
||||||
|
aria-controls="todoTable"
|
||||||
|
size="lg"
|
||||||
|
class="justify-content-center"
|
||||||
|
></b-pagination>
|
||||||
|
</template>
|
||||||
</b-col>
|
</b-col>
|
||||||
<b-col>
|
<b-col>
|
||||||
<b-input-group class="justify-content-end">
|
<b-input-group class="justify-content-end">
|
||||||
@ -141,10 +136,6 @@
|
|||||||
</b-col>
|
</b-col>
|
||||||
</b-row>
|
</b-row>
|
||||||
</b-container>
|
</b-container>
|
||||||
<p>
|
|
||||||
Selected Rows:<br />
|
|
||||||
{{ selectedRows }}
|
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
@ -154,45 +145,41 @@ export default {
|
|||||||
components: {},
|
components: {},
|
||||||
data: function () {
|
data: function () {
|
||||||
return {
|
return {
|
||||||
items: [],
|
rows: [],
|
||||||
fields: [
|
fields: [
|
||||||
{ key: 'rowSelect', label: '✓', width: '55px' },
|
{ key: 'rowSelect', label: '✓', thStyle: { width: '55px' } },
|
||||||
{
|
{
|
||||||
key: 'index',
|
key: 'id',
|
||||||
label: '번호',
|
label: '번호',
|
||||||
style: { width: '55px' },
|
thStyle: { width: '65px' },
|
||||||
variant: 'primary'
|
variant: 'primary',
|
||||||
|
sortable: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'title',
|
key: 'title',
|
||||||
label: '제목',
|
label: '제목',
|
||||||
sortable: true,
|
sortable: true
|
||||||
sortByFormatted: true,
|
},
|
||||||
filterByFormatted: true
|
{
|
||||||
|
key: 'content',
|
||||||
|
label: '내용',
|
||||||
|
sortable: true
|
||||||
},
|
},
|
||||||
// {
|
|
||||||
// key: 'content',
|
|
||||||
// label: '내용',
|
|
||||||
// sortable: true,
|
|
||||||
// sortByFormatted: true,
|
|
||||||
// filterByFormatted: true
|
|
||||||
// },
|
|
||||||
{
|
{
|
||||||
key: 'is_done',
|
key: 'is_done',
|
||||||
label: '사용여부',
|
label: '사용여부',
|
||||||
style: { width: '105px' },
|
thStyle: { width: '105px' },
|
||||||
// formatter: (value, key, item) => {
|
|
||||||
formatter: (value) => {
|
formatter: (value) => {
|
||||||
return value ? 'Yes' : 'No'
|
return value ? 'Yes' : 'No'
|
||||||
},
|
},
|
||||||
sortable: true,
|
sortable: true,
|
||||||
filterByFormatted: true
|
sortByFormatted: true //fomatter결과에따른 Sort가 필요시 true
|
||||||
},
|
},
|
||||||
// { key: 'updateAt', label: '수정일' },
|
// { key: 'updateAt', label: '수정일' },
|
||||||
{
|
{
|
||||||
key: 'createdAt',
|
key: 'createdAt',
|
||||||
label: '등록일',
|
label: '등록일',
|
||||||
style: { width: '105px' },
|
thStyle: { width: '105px' },
|
||||||
formatter: (value) => {
|
formatter: (value) => {
|
||||||
return value.replace(
|
return value.replace(
|
||||||
/([0-9]{4})-([0-9]{2})-([0-9]{2}).*/gi,
|
/([0-9]{4})-([0-9]{2})-([0-9]{2}).*/gi,
|
||||||
@ -200,25 +187,23 @@ export default {
|
|||||||
)
|
)
|
||||||
},
|
},
|
||||||
sortable: true,
|
sortable: true,
|
||||||
sortByFormatted: true
|
sortByFormatted: true //fomatter결과에따른 Sort가 필요시 true
|
||||||
// filterByFormatted: true
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
total: 0,
|
total: 0,
|
||||||
|
currentPage: 1, // 현재 페이지
|
||||||
perPage: 5, // 페이지당 보여줄 갯수
|
perPage: 5, // 페이지당 보여줄 갯수
|
||||||
perPageOptions: [
|
perPageOptions: [
|
||||||
{ value: 5, text: '5줄' },
|
{ text: '5줄', value: 5 },
|
||||||
{ value: 10, text: '10줄' },
|
{ text: '10줄', value: 10 },
|
||||||
{ value: 30, text: '30줄' },
|
{ text: '30줄', value: 30 },
|
||||||
{ value: 60, text: '60줄' },
|
{ text: '60줄', value: 60 },
|
||||||
{ value: 100, text: '100줄' }
|
{ text: '100줄', value: 100 }
|
||||||
],
|
],
|
||||||
currentPage: 1, // 현재 페이지
|
|
||||||
search: null, //DB검색
|
|
||||||
// 속성옵션
|
// 속성옵션
|
||||||
commonTableAttributes: {
|
commonTableAttributes: {
|
||||||
stickyHeader: '400px',
|
stickyHeader: '50%',
|
||||||
noBorderCollapse: false,
|
//noBorderCollapse: false,
|
||||||
striped: true,
|
striped: true,
|
||||||
hover: true,
|
hover: true,
|
||||||
bordered: true,
|
bordered: true,
|
||||||
@ -227,15 +212,15 @@ export default {
|
|||||||
},
|
},
|
||||||
isBusy: false,
|
isBusy: false,
|
||||||
sortBy: 'id',
|
sortBy: 'id',
|
||||||
sortDesc: false,
|
sortDesc: true,
|
||||||
sortDirection: 'asc',
|
sortDirection: 'desc',
|
||||||
filter: null,
|
search: null, //DB검색
|
||||||
filterOn: ['title', 'content'],
|
searchFields: ['title', 'content'],
|
||||||
filterOptions: [
|
searchOptions: [
|
||||||
{ text: '제목', value: 'title' },
|
{ text: '제목', value: 'title' },
|
||||||
{ text: '내용', value: 'content' },
|
{ text: '내용', value: 'content' },
|
||||||
{ text: '수정일', value: 'updateAt', disabled: true },
|
{ text: '수정일', value: 'updateAt' },
|
||||||
{ text: '등록일', value: 'createdAt' }
|
{ text: '등록일', value: 'createAt' }
|
||||||
],
|
],
|
||||||
selectModes: ['multi', 'single', 'range'],
|
selectModes: ['multi', 'single', 'range'],
|
||||||
selectMode: 'multi',
|
selectMode: 'multi',
|
||||||
@ -252,51 +237,70 @@ export default {
|
|||||||
methods: {
|
methods: {
|
||||||
async getDatas() {
|
async getDatas() {
|
||||||
this.isBusy = true
|
this.isBusy = true
|
||||||
this.items = await this.callAPI('/todo', {
|
const results = await this.callAPI('/todo', {
|
||||||
search: this.search
|
params: {
|
||||||
|
sortBy: this.sortBy,
|
||||||
|
sortDirection: this.sortDirection,
|
||||||
|
searchFields: this.searchFields,
|
||||||
|
search: this.search,
|
||||||
|
page: this.currentPage,
|
||||||
|
perPage: this.perPage
|
||||||
|
}
|
||||||
})
|
})
|
||||||
//console.log(JSON.stringify(this.items))
|
//console.log(JSON.stringify(results))
|
||||||
this.total = this.items.length
|
console.log(results)
|
||||||
|
this.total = results.total
|
||||||
|
this.perPage = results.perPage
|
||||||
|
this.page = results.page
|
||||||
|
this.rows = results.rows
|
||||||
this.isBusy = false
|
this.isBusy = false
|
||||||
},
|
},
|
||||||
searchForDB() {
|
searchClick() {
|
||||||
this.currentPage = 1
|
this.currentPage = 1
|
||||||
this.getDatas()
|
this.getDatas()
|
||||||
},
|
},
|
||||||
|
pageClick(bvEvent, page) {
|
||||||
|
console.log(bvEvent)
|
||||||
|
this.currentPage = page
|
||||||
|
this.getDatas()
|
||||||
|
bvEvent.preventDefault()
|
||||||
|
},
|
||||||
|
perPageClick(perPage) {
|
||||||
|
this.currentPage = 1
|
||||||
|
this.perPage = perPage
|
||||||
|
console.log(this.perPage)
|
||||||
|
this.getDatas()
|
||||||
|
},
|
||||||
busyToggle() {
|
busyToggle() {
|
||||||
this.isBusy = !this.isBusy
|
this.isBusy = !this.isBusy
|
||||||
},
|
},
|
||||||
onFiltered(filteredItems) {
|
|
||||||
this.total = filteredItems.length
|
|
||||||
this.currentPage = 1
|
|
||||||
},
|
|
||||||
rowSelectedToggle(selectedRow) {
|
rowSelectedToggle(selectedRow) {
|
||||||
this.selectedRows = selectedRow
|
this.selectedRows = selectedRow
|
||||||
},
|
},
|
||||||
rowSelectAllToggle() {
|
rowSelectAllToggle() {
|
||||||
if (this.selectedAllToggle) {
|
if (this.selectedAllToggle) {
|
||||||
this.$refs.selectableTable.clearSelected()
|
this.$refs.todoTable.clearSelected()
|
||||||
this.selectedAllToggle = false
|
this.selectedAllToggle = false
|
||||||
} else {
|
} else {
|
||||||
this.$refs.selectableTable.selectAllRows()
|
this.$refs.todoTable.selectAllRows()
|
||||||
this.selectedAllToggle = true
|
this.selectedAllToggle = true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// rowSelectSet(id) {
|
// rowSelectSet(id) {
|
||||||
// // Rows are indexed from 0, so the third row is index 2
|
// // Rows are indexed from 0, so the third row is index 2
|
||||||
// this.$refs.selectableTable.selectRow(id)
|
// this.$refs.todoTable.selectRow(id)
|
||||||
// },
|
// },
|
||||||
// rowSelectUnSet(id) {
|
// rowSelectUnSet(id) {
|
||||||
// // Rows are indexed from 0, so the third row is index 2
|
// // Rows are indexed from 0, so the third row is index 2
|
||||||
// this.$refs.selectableTable.unselectRow(id)
|
// this.$refs.todoTable.unselectRow(id)
|
||||||
// }
|
// }
|
||||||
async callAPI(url, params) {
|
async callAPI(url, params) {
|
||||||
console.log('CallAPI..', [url, params])
|
console.log('CallAPI..', [url, params])
|
||||||
axios.defaults.baseURL = process.env.VUE_APP_BACKEND_HOST
|
axios.defaults.baseURL = process.env.VUE_APP_BACKEND_HOST
|
||||||
axios.defaults.headers.post['Content-Type'] =
|
// axios.defaults.headers.post['Content-Type'] =
|
||||||
process.env.VUE_APP_BACKEND_HEADERS_Content_Type
|
// process.env.VUE_APP_BACKEND_HEADERS_Content_Type
|
||||||
axios.defaults.headers.post['Access-Control-Allow-Origin'] =
|
// axios.defaults.headers.post['Access-Control-Allow-Origin'] =
|
||||||
process.env.VUE_APP_BACKEND_HEADERS_Access_Control_Allow_Origin
|
// process.env.VUE_APP_BACKEND_HEADERS_Access_Control_Allow_Origin
|
||||||
return await axios
|
return await axios
|
||||||
.get(url, params)
|
.get(url, params)
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
@ -308,16 +312,7 @@ export default {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {}
|
||||||
sortOptions() {
|
|
||||||
// Create an options list from our fields
|
|
||||||
return this.fields
|
|
||||||
.filter((f) => f.sortable)
|
|
||||||
.map((f) => {
|
|
||||||
return { text: f.label, value: f.key }
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style scoped></style>
|
<style scoped></style>
|
||||||
@ -26,7 +26,6 @@ localize('ko', ko)
|
|||||||
// Install VeeValidate components globally
|
// Install VeeValidate components globally
|
||||||
Vue.component('ValidationObserver', ValidationObserver)
|
Vue.component('ValidationObserver', ValidationObserver)
|
||||||
Vue.component('ValidationProvider', ValidationProvider)
|
Vue.component('ValidationProvider', ValidationProvider)
|
||||||
|
|
||||||
Vue.config.productionTip = false
|
Vue.config.productionTip = false
|
||||||
Vue.use(BootstrapVue)
|
Vue.use(BootstrapVue)
|
||||||
new Vue({
|
new Vue({
|
||||||
|
|||||||
@ -32,9 +32,9 @@ const routes = [
|
|||||||
name: 'todo',
|
name: 'todo',
|
||||||
component: () =>
|
component: () =>
|
||||||
import(
|
import(
|
||||||
/* webpackChunkName: "api", webpackPrefetch:true */ '@/views/todo/listView.vue'
|
/* webpackChunkName: "api", webpackPrefetch:true */ '@/views/todoView.vue'
|
||||||
),
|
),
|
||||||
meta: { requiresAuth: true }
|
meta: { requiredAuth: true }
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -53,16 +53,17 @@ const router = new VueRouter({
|
|||||||
// next : to에서 지정한 url로 이동하기 위해 꼭 호출해야 하는 함수
|
// next : to에서 지정한 url로 이동하기 위해 꼭 호출해야 하는 함수
|
||||||
//여기에서 login은 path가 아니라 name에서 찾는다
|
//여기에서 login은 path가 아니라 name에서 찾는다
|
||||||
router.beforeEach((to, from, next) => {
|
router.beforeEach((to, from, next) => {
|
||||||
//routes 설정에서 meta: { requiresAuth: true } 가 선언된 경우
|
//routes 설정에서 meta: { requiredAuth: true } 가 선언된 경우
|
||||||
if (to.matched.some((record) => record.meta.requiresAuth)) {
|
if (to.matched.some((record) => record.meta.requiredAuth)) {
|
||||||
|
//localStorage에 Access-Token이 없으면 Login페이지로 전송
|
||||||
if (!localStorage.getItem(process.env.VUE_APP_LOCALSTORAGE_NAME)) {
|
if (!localStorage.getItem(process.env.VUE_APP_LOCALSTORAGE_NAME)) {
|
||||||
|
console.log(from.path + ' => 인증않됨 => Login 페이지 이동')
|
||||||
next({ name: 'login' })
|
next({ name: 'login' })
|
||||||
} else {
|
|
||||||
console.log(from.path + " => 인증됨 => '" + to.path + "'")
|
|
||||||
next()
|
|
||||||
}
|
}
|
||||||
|
console.log(from.path + ' => 인증 통과 => ' + to.path)
|
||||||
|
next()
|
||||||
} else {
|
} else {
|
||||||
console.log(from.path + " => 인증않됨 => '" + to.path + "'")
|
console.log(from.path + ' => 인증요구없으므로 통과 => ' + to.path)
|
||||||
next()
|
next()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<!-- 참조: https://codesandbox.io/s/3v0m1?file=/src/components/board/BoardList.vue -->
|
|
||||||
<div>
|
<div>
|
||||||
|
<!-- 참조: https://codesandbox.io/s/3v0m1?file=/src/components/board/BoardList.vue -->
|
||||||
<LoginComponent />
|
<LoginComponent />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
21
src/views/todoView.vue
Normal file
21
src/views/todoView.vue
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<!-- 참조: https://codesandbox.io/s/3v0m1?file=/src/components/board/BoardList.vue -->
|
||||||
|
<ListComponent />
|
||||||
|
<div class="justify-content-end border">
|
||||||
|
<b-button v-b-modal.inputForm variant="outline-primary">입력</b-button>
|
||||||
|
<InputComponent />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script>
|
||||||
|
import ListComponent from '@/components/todo/ListComponent.vue'
|
||||||
|
import InputComponent from '@/components/todo/InputComponent.vue'
|
||||||
|
export default {
|
||||||
|
components: {
|
||||||
|
InputComponent,
|
||||||
|
ListComponent
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style scoped></style>
|
||||||
Loading…
Reference in New Issue
Block a user