
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
<template>
<div class="notice-wrap">
<div class="content-box">
<div class="title-wrap">
<div class="flex-start">
<img src="../../../../resources/jpg/tech-logo.png" alt="기술문서 아이콘" class="title-icon">
<h2 class="main-title">기술문서</h2>
</div>
</div>
<div class="content-wrap">
<table class="insert-table">
<tbody>
<tr>
<td class="title-zone" colspan="2">
<p class="flex detail-title">
<span class="post-title">{{ post.post_title }}</span>
<span v-if="post.ctgry_nm === 'api'" class="category-zone">API</span>
<span v-else-if="post.ctgry_nm === 'tech'" class="category-zone">기술리포트</span>
<span v-else class="category-zone">기술규격문서</span>
</p>
<p class="flex-end write-info">
<span class="writer">작성자</span>
<span>{{ post.rgtr_id }}</span>
<span class="view">조회수</span>
<span>{{ post.view_cnt }}</span>
</p>
</td>
</tr>
<tr>
<td colspan="2">
<div class="tech-info">
<span class="tech-info-img">
<img :src=src alt="기술문서 이미지">
</span>
<div class="tech-txt-wrap" style="margin: 0px;">
<table class="tech-table">
<tr style="border-top: 2px solid #e5e5e5 ;">
<th style="width: 50px;">
<p> 기술문서명</p>
</th>
<td>{{ post.tech_doc_nm }}</td>
</tr>
<tr>
<th>
<p>버전</p>
</th>
<td>{{ post.tech_doc_version }}</td>
</tr>
<tr>
<th>
<p>배포날짜</p>
</th>
<td>{{ post.tech_doc_dt }}</td>
</tr>
<tr>
<th>
<p>주요내용</p>
</th>
<td>{{ post.tech_doc_main_content }}</td>
</tr>
<tr>
<th>
<p>키워드</p>
</th>
<td>{{ post.tech_doc_keyword }}</td>
</tr>
</table>
</div>
</div>
</td>
</tr>
<tr>
<td colspan="2" style="border-bottom: 1px solid #007aff;">
<div id="viewer" ref="viewer" class="viewer"></div>
</td>
</tr>
<tr>
<th style="width: 10%;">썸네일</th>
<td>
<div v-if="thumbnailFileList.length == 0">
<label>첨부된 파일이 없습니다.</label>
</div>
<ul v-else v-for="(item, idx) in thumbnailFileList" :key="idx">
<li @click="downloadFile(item)">{{ item.real_file_nm }}</li>
</ul>
</td>
</tr>
<tr class="file-zone">
<th style="width: 10%;">첨부파일명</th>
<td>
<div v-if="attachFileList.length == 0">
<label>첨부된 파일이 없습니다.</label>
</div>
<ul v-else v-for="(item, idx) in attachFileList" :key="idx">
<li @click="downloadFile(item)">{{ item.real_file_nm }}</li>
</ul>
</td>
</tr>
</tbody>
</table>
<div class="article-list">
<ul>
<li><span class="next">다음글</span>
<span>
<span v-if="nextPost" @click="movePost(nextPost)" class="sub-content-title">
{{ nextPost.post_title }}
</span>
<span v-else class="sub-content-title">다음글이 없습니다.</span>
</span>
</li>
<li><span class="prev">이전글</span>
<span>
<span v-if="prevPost" @click="movePost(prevPost)" class="sub-content-title">
{{ prevPost.post_title }}
</span>
<span v-else class="sub-content-title">이전글이 없습니다.</span>
</span>
</li>
</ul>
</div>
<div class="btn-wrap">
<button class="red-btn" @click="postDelete()">삭제</button>
<button class="dark-gray-btn" @click="postSelectListPage()">목록</button>
<button class="blue-btn" @click="postUpdatePage()">수정</button>
</div>
</div>
</div>
</div>
</template>
<script>
import axios from 'axios';
import COMMON_UTIL from '../../../../resources/js/commonUtil.js';
import { useRoute } from 'vue-router';
import Viewer from '@toast-ui/editor/dist/toastui-editor-viewer';
import '@toast-ui/editor/dist/toastui-editor.css';
import '@toast-ui/editor/dist/i18n/ko-kr';
import * as FileSaver from 'file-saver';
export default {
data() {
return {
post: {
post_id: null,
post_title: null,
post_content: null,
notice_yn: null,
notice_start_dt: null,
notice_end_dt: null,
reg_dt: null,
mdfcn_dt: null,
link_url: null,
view_cnt: null,
file_id: null,
bbs_id: '3',
rgtr_id: null,
mdfr_id: null,
ctgry_nm: null,
tech_doc_nm: null,
tech_doc_version: null,
tech_doc_date: null,
tech_doc_main_content: null,
tech_doc_keyword: null,
tech_doc_dt: null,
},
prevPost: {
post_id: null,
post_title: null,
file_id: null,
},
nextPost: {
post_id: null,
post_title: null,
file_id: null,
},
fileList: [],
oEditors: [], // oEditors는 스마트에디터용
route: useRoute(),
thumbnailFileList: [],
attachFileList: [],
src: null,
};
},
methods: {
postSelectOne: function () {
const vm = this;
axios({
url: '/post/postSelectOne.json',
method: 'post',
hearder: {
'Content-Type': "application/json; charset=UTF-8",
},
data: {
'post_id': vm.route.query.post_id,
'file_id': vm.route.query.file_id,
'bbs_id': vm.route.query.bbs_id
}
}).then(function (response) {
vm.prevPost = response.data.postSelectOne.prevPost;
vm.post = response.data.postSelectOne.post;
vm.nextPost = response.data.postSelectOne.nextPost;
if (response.data.selectFileList.length != 0) {
vm.fileList = response.data.selectFileList;
vm.thumbnailFileList = [];
vm.attachFileList = [];
for (let i = 0; i < vm.fileList.length; i++) {
if (vm.fileList[i].file_ty === 'thumbnail') {
vm.thumbnailFileList.push(vm.fileList[i]);
} else {
vm.attachFileList.push(vm.fileList[i]);
}
}
vm.src = 'http://localhost:8080' + vm.thumbnailFileList[0].file_path.replace('C:', '') + '/' + vm.thumbnailFileList[0].file_nm + '.' + vm.thumbnailFileList[0].file_extn_nm
}
vm.getViewer(vm.post.post_content)
}).catch(function (error) {
console.log("error - ", error)
alert("게시글 상세보기 조회 오류, 관리자에게 문의하세요.");
})
},
getViewer(data) {
this.viewer = new Viewer({
el: this.$refs.viewer,
initialEditType: 'wysiwyg',
previewStyle: 'vertical',
initialValue: data,
customHTMLRenderer: {
htmlBlock: {
iframe(node) {
return [
{ type: 'openTag', tagName: 'iframe', outerNewLine: true, attributes: node.attrs },
{ type: 'html', content: node.childrenHTML },
{ type: 'closeTag', tagName: 'iframe', outerNewLine: true },
];
},
}
},
});
},
downloadFile: function (item) {
const vm = this;
let path = item.file_path + '/' + item.file_nm + '.' + item.file_extn_nm;
console.log(path);
axios({
url: '/file/downloadFile.json',
method: 'post',
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
responseType: 'blob',
data: `file_path=${encodeURIComponent(path)}`
}).then((response) => {
const blob = new Blob([response.data]);
const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
if (isSafari) {
FileSaver.saveAs(blob, item.real_file_nm);
} else {
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.style.display = 'none';
a.href = url;
a.download = item.real_file_nm;
document.body.appendChild(a);
a.click();
window.URL.revokeObjectURL(url);
}
this.$router.go(0);
}).catch(function (error) {
console.log('error - ', error)
alert('에러발생');
});
},
postDelete: function () {
const vm = this;
axios({
url: "/post/postDelete.json",
method: "post",
headers: {
"Content-Type": "application/json; charset=UTF-8",
},
data: vm.post
}).then(function (response) {
console.log("postDelete - response : ", response.data);
let result = response.data;
if (result > 0) {
alert("삭제가 완료 되었습니다.");
vm.postSelectListPage();
} else {
alert("삭제실패, 다시 시도 해주세요.");
}
}).catch(function (error) {
console.log("postDelete - error : ", error);
alert("삭제 오류, 관리자에게 문의해주세요.");
});
},
movePost: function (post1) {
const vm = this;
console.log('------------이동-----------')
console.log(vm.route)
axios({
url: '/post/postSelectOne.json',
method: 'post',
hearder: {
'Content-Type': "application/json; charset=UTF-8",
},
data: {
'post_id': post1.post_id,
'file_id': post1.file_id,
'bbs_id': post1.bbs_id
}
}).then(function (response) {
vm.prevPost = response.data.postSelectOne.prevPost;
vm.post = response.data.postSelectOne.post;
vm.nextPost = response.data.postSelectOne.nextPost;
vm.fileList = response.data.selectFileList;
vm.getViewer(vm.post.post_content)
}).catch(function (error) {
console.log("error - ", error)
alert("게시글 상세보기 조회 오류, 관리자에게 문의하세요.");
})
},
postSelectListPage: function () {
this.$router.push({ path: '/adm/techSelectList.page' });
},
postUpdatePage: function () {
this.$router.push({ path: '/adm/techUpdate.page', query: { 'post_id': this.post.post_id, 'file_id': this.post.file_id, 'bbs_id': this.post.bbs_id } });
},
removeTag: function (data) {
return COMMON_UTIL.removeTag(data);
},
},
watch: {},
computed: {},
components: {},
mounted() {
this.postSelectOne();
}
};
</script>