留言板功能部分实现
This commit is contained in:
parent
c63f8097e7
commit
1de24c5d31
18
src/api/learn.js
Normal file
18
src/api/learn.js
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import request from '@/utils/request';
|
||||||
|
|
||||||
|
// 分页查询帖子回复
|
||||||
|
export function queryPostPaging(postId, params) {
|
||||||
|
return request({
|
||||||
|
url: `/api/learn/${postId}/message/query/paged`,
|
||||||
|
method: 'get',
|
||||||
|
params: params
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// 回复帖子
|
||||||
|
export function answerPost(data) {
|
||||||
|
return request({
|
||||||
|
url: `/api/learn/message/create`,
|
||||||
|
method: 'post',
|
||||||
|
data: data
|
||||||
|
});
|
||||||
|
}
|
BIN
src/assets/bg_board.jpg
Normal file
BIN
src/assets/bg_board.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.3 MiB |
@ -4,7 +4,8 @@
|
|||||||
ref="editor"
|
ref="editor"
|
||||||
v-model="content"
|
v-model="content"
|
||||||
:options="options"
|
:options="options"
|
||||||
:style="{height: height+'px', 'margin-bottom': '80px'}"
|
style="background-color: #fff"
|
||||||
|
:style="{height: height+'px', 'margin-bottom': marginBottom+'px'}"
|
||||||
@change="onChange"
|
@change="onChange"
|
||||||
@blur="onBlur"
|
@blur="onBlur"
|
||||||
@focus="onFocus"
|
@focus="onFocus"
|
||||||
@ -13,9 +14,10 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { quillEditor } from 'vue-quill-editor';
|
import { quillEditor, Quill } from 'vue-quill-editor';
|
||||||
import 'quill/dist/quill.snow.css';
|
import 'quill/dist/quill.snow.css';
|
||||||
|
import { ImageExtend, QuillWatch} from 'quill-image-extend-module';
|
||||||
|
Quill.register('modules/ImageExtend', ImageExtend);
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
quillEditor
|
quillEditor
|
||||||
@ -32,12 +34,66 @@ export default {
|
|||||||
placeholder: {
|
placeholder: {
|
||||||
type: String,
|
type: String,
|
||||||
default: ''
|
default: ''
|
||||||
|
},
|
||||||
|
marginBottom: {
|
||||||
|
type: Number,
|
||||||
|
default: 80
|
||||||
|
},
|
||||||
|
unloadImg: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
noHandleP: {
|
||||||
|
type: Boolean,
|
||||||
|
defalut: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
content: '',
|
content: ''
|
||||||
options: {
|
};
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
editor() {
|
||||||
|
return this.$refs.editor.quill;
|
||||||
|
},
|
||||||
|
options() {
|
||||||
|
return this.unloadImg ? {
|
||||||
|
modules: {
|
||||||
|
ImageExtend: {
|
||||||
|
loading: true,
|
||||||
|
name: 'file',
|
||||||
|
size: 3,
|
||||||
|
action: `https://test.joylink.club/jlfile/api/upload/PICTURE?appId=00001&appSecret=joylink00001`,
|
||||||
|
response: (res) => {
|
||||||
|
return `https://test.joylink.club/oss/joylink${res.data}`;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
toolbar: {
|
||||||
|
container: [
|
||||||
|
['bold', 'italic', 'underline', 'strike'],
|
||||||
|
[],
|
||||||
|
[],
|
||||||
|
[{'list': 'ordered'}, {'list': 'bullet'}],
|
||||||
|
[{'script': 'sub'}, {'script': 'super'}],
|
||||||
|
[{'indent': '-1'}, {'indent': '+1'}],
|
||||||
|
[{'direction': 'rtl'}],
|
||||||
|
[{'size': ['small', 'large', 'huge']}],
|
||||||
|
[{'color': [], 'background': []}],
|
||||||
|
[{'font': []}],
|
||||||
|
[{'align': []}],
|
||||||
|
['clean'],
|
||||||
|
['image']
|
||||||
|
],
|
||||||
|
handlers: {
|
||||||
|
'image': function () {
|
||||||
|
QuillWatch.emit(this.quill.id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
placeholder: '请输入'
|
||||||
|
} : {
|
||||||
modules: {
|
modules: {
|
||||||
toolbar: [
|
toolbar: [
|
||||||
['bold', 'italic', 'underline', 'strike'],
|
['bold', 'italic', 'underline', 'strike'],
|
||||||
@ -54,12 +110,7 @@ export default {
|
|||||||
['clean']
|
['clean']
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
};
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
editor() {
|
|
||||||
return this.$refs.editor.quill;
|
|
||||||
},
|
},
|
||||||
titleConfig () {
|
titleConfig () {
|
||||||
return {
|
return {
|
||||||
@ -91,11 +142,13 @@ export default {
|
|||||||
watch: {
|
watch: {
|
||||||
'value': function(val) {
|
'value': function(val) {
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
if (val != this.$escapeHTML(this.content)) {
|
if (val != this.$escapeHTML(this.content) && !this.noHandleP) {
|
||||||
this.editor.enable(false);
|
this.editor.enable(false);
|
||||||
this.content = val;
|
this.content = val;
|
||||||
this.editor.enable(true);
|
this.editor.enable(true);
|
||||||
this.editor.blur();
|
this.editor.blur();
|
||||||
|
} else if (this.noHandleP) {
|
||||||
|
this.content = val;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -105,11 +158,18 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
onChange(e) {
|
onChange(e) {
|
||||||
this.$emit('input', this.$escapeHTML(this.content));
|
if (!this.noHandleP) {
|
||||||
|
this.$emit('input', this.$escapeHTML(this.content));
|
||||||
|
} else {
|
||||||
|
this.$emit('input', this.content);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
onBlur(e) {
|
onBlur(e) {
|
||||||
},
|
},
|
||||||
onFocus(e) {
|
onFocus(e) {
|
||||||
|
},
|
||||||
|
getFocus() {
|
||||||
|
this.$refs.editor.quill.focus();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -2,10 +2,10 @@ export function getBaseUrl() {
|
|||||||
let BASE_API;
|
let BASE_API;
|
||||||
if (process.env.NODE_ENV === 'development') {
|
if (process.env.NODE_ENV === 'development') {
|
||||||
// BASE_API = 'https://joylink.club/jlcloud';
|
// BASE_API = 'https://joylink.club/jlcloud';
|
||||||
BASE_API = 'https://test.joylink.club/jlcloud';
|
// BASE_API = 'https://test.joylink.club/jlcloud';
|
||||||
// BASE_API = 'http://192.168.8.107:9000'; // 袁琪
|
// BASE_API = 'http://192.168.8.107:9000'; // 袁琪
|
||||||
// BASE_API = 'http://192.168.8.129:9000'; // 旭强
|
// BASE_API = 'http://192.168.8.129:9000'; // 旭强
|
||||||
// BASE_API = 'http://192.168.8.109:9000'; // 张赛
|
BASE_API = 'http://192.168.8.119:9000'; // 张赛
|
||||||
// BASE_API = 'http://192.168.8.110:9000'; // 杜康
|
// BASE_API = 'http://192.168.8.110:9000'; // 杜康
|
||||||
// BASE_API = 'http://b29z135112.zicp.vip';
|
// BASE_API = 'http://b29z135112.zicp.vip';
|
||||||
// BASE_API = 'http://2925963m2a.zicp.vip'; // 杜康
|
// BASE_API = 'http://2925963m2a.zicp.vip'; // 杜康
|
||||||
|
150
src/views/newMap/displayNew/demon/messageBoard.vue
Normal file
150
src/views/newMap/displayNew/demon/messageBoard.vue
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
<template>
|
||||||
|
<el-dialog
|
||||||
|
id="elDialog"
|
||||||
|
title="留言板"
|
||||||
|
:visible.sync="dialogVisible"
|
||||||
|
fullscreen
|
||||||
|
center
|
||||||
|
:before-close="handleClose"
|
||||||
|
>
|
||||||
|
<el-card class="box-card" style="width: 80%;margin-left: 10%;padding: 20px;margin-bottom: 20px;background-color: rgba(255,255,255,0)">
|
||||||
|
<div v-if="postCommentList.length">
|
||||||
|
<template v-for="(item,i) in postCommentList">
|
||||||
|
<div :key="i" style="border: 1px solid #C0C0C0;border-radius: 5px;margin-bottom: 20px;box-shadow: 2px 2px 3px #808080;padding: 10px;background-color: #fff">
|
||||||
|
<div style="margin-bottom: 10px;display: flex;align-items: center;">
|
||||||
|
<img :src="avatarUrl(item)" class="head_portrait">
|
||||||
|
<div style="display: inline-block;margin-right: 20px;margin-left:10px;font-size: 18px;color: #000;">{{ item.creatorNickName }}</div>
|
||||||
|
<div style="display: inline-block;">{{ item.createTime }}</div>
|
||||||
|
</div>
|
||||||
|
<div style="margin-left: 60px;" v-html="$escapeHTML(`${item.content}`)" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
<div v-else style="text-align: center;width: 100%;height: 50px;line-height: 50px;font-size: 18px;color: #ccc;">
|
||||||
|
<span>暂无评论</span>
|
||||||
|
</div>
|
||||||
|
<div style="width: 100%;text-align: center;">
|
||||||
|
<el-pagination
|
||||||
|
:current-page.sync="pageNum"
|
||||||
|
:page-size="pageSize"
|
||||||
|
layout="total, prev, pager, next,jumper"
|
||||||
|
:total="total"
|
||||||
|
@current-change="handleCurrentChange"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
<quill-editor ref="quillEditor" v-model="content" style="width: 80%;margin-left: 10%;" placeholder="请输入内容" :margin-bottom="20" :unload-img="true" :noHandleP="true" />
|
||||||
|
<span id="boardBottom" class="dialog-footer">
|
||||||
|
<el-button @click="handleClear">清空</el-button>
|
||||||
|
<el-button type="primary" @click="commitComment">留言</el-button>
|
||||||
|
<el-button type="danger" @click="dialogVisible = false">返回</el-button>
|
||||||
|
</span>
|
||||||
|
<el-button size="mini" type="danger" style="position: fixed; right: 100px;top: 80px;" @click="goSlide">我要留言</el-button>
|
||||||
|
<div v-show="imgShow" style="position: fixed;width: 100%;height: 100%;left: 0;top: 0;background: rgba(0,0,0,0.5);" @click="handelCloseImg">
|
||||||
|
<img id="targetImg" src="" style="position: fixed;top: 50%;left: 50%;transform: translate(-50%,-50%);min-width: 500px;max-height: 80%;height: auto;">
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { answerPost, queryPostPaging } from '@/api/learn';
|
||||||
|
export default {
|
||||||
|
name: 'MessageBoard',
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
dialogVisible: false,
|
||||||
|
content: '',
|
||||||
|
postCommentList: [],
|
||||||
|
pageSize: 10,
|
||||||
|
pageNum: 0,
|
||||||
|
total: 0,
|
||||||
|
imgShow: false
|
||||||
|
};
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
const that = this;
|
||||||
|
window.handleZoomImg = function () {
|
||||||
|
that.imgShow = true;
|
||||||
|
document.getElementById('targetImg').src = event.target.currentSrc;
|
||||||
|
};
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
handleClose() {
|
||||||
|
this.dialogVisible = false;
|
||||||
|
},
|
||||||
|
doShow() {
|
||||||
|
this.handleCurrentChange();
|
||||||
|
this.dialogVisible = true;
|
||||||
|
},
|
||||||
|
commitComment() {
|
||||||
|
const images = this.content.match(/<img/g);
|
||||||
|
if (images && images.length > 3) {
|
||||||
|
this.$message.error('留言内容使用图片应小于三张!');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
answerPost({postId: 1, content: this.content}).then(resp => {
|
||||||
|
this.handleCurrentChange();
|
||||||
|
this.$message.success('留言成功 !');
|
||||||
|
this.content = '';
|
||||||
|
}).catch(error => {
|
||||||
|
this.$message.error('留言失败 !');
|
||||||
|
});
|
||||||
|
},
|
||||||
|
handleCurrentChange() {
|
||||||
|
queryPostPaging(1, {pageSize: this.pageSize, pageNum: this.pageNum}).then(resp => {
|
||||||
|
this.postCommentList = [];
|
||||||
|
(resp.data.list || []).forEach(item => {
|
||||||
|
const value = item.content.replace(/<img/g, '<img style="width: 100px;height: auto;cursor: zoom-in;" onclick="handleZoomImg()"');
|
||||||
|
item.content = value;
|
||||||
|
this.postCommentList.push(item);
|
||||||
|
});
|
||||||
|
this.total = resp.data.total;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
goSlide() {
|
||||||
|
const bottom = document.getElementById('boardBottom');
|
||||||
|
const element = document.getElementById('elDialog').childNodes[0];
|
||||||
|
element.scrollTop = bottom.offsetTop;
|
||||||
|
this.$refs.quillEditor.getFocus();
|
||||||
|
},
|
||||||
|
avatarUrl(val) {
|
||||||
|
if (val && val.creatorAvatarPath) {
|
||||||
|
return 'https://joylink.club/oss/joylink' + val.creatorAvatarPath;
|
||||||
|
} else {
|
||||||
|
return 'https://joylink.club/oss/wxmicro_assistant/userhead/defaultuser.png';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
handleClear() {
|
||||||
|
this.content = '';
|
||||||
|
},
|
||||||
|
handelCloseImg() {
|
||||||
|
this.imgShow = false;
|
||||||
|
document.getElementById('targetImg').src = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.dialog-footer{
|
||||||
|
margin: 0 auto;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
.head_portrait{
|
||||||
|
width: 50px;
|
||||||
|
height: 50px;
|
||||||
|
border-radius: 25px;
|
||||||
|
}
|
||||||
|
.img-box{
|
||||||
|
width: 100px;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
/deep/.el-dialog.is-fullscreen{
|
||||||
|
background-image:url('../../../../assets/bg_board.jpg');
|
||||||
|
}
|
||||||
|
/deep/.ql-container{
|
||||||
|
height: 80%;
|
||||||
|
}
|
||||||
|
</style>
|
@ -24,6 +24,7 @@
|
|||||||
<!-- <el-button v-if="isContest" size="small" @click=" fieldExam">实操测验</el-button> -->
|
<!-- <el-button v-if="isContest" size="small" @click=" fieldExam">实操测验</el-button> -->
|
||||||
<el-button v-if="isContest" size="small" @click="goTheoryQuiz">理论考试</el-button>
|
<el-button v-if="isContest" size="small" @click="goTheoryQuiz">理论考试</el-button>
|
||||||
<el-button v-if="isContest" size="small" @click="viewChangeMap">切换地图</el-button>
|
<el-button v-if="isContest" size="small" @click="viewChangeMap">切换地图</el-button>
|
||||||
|
<el-button size="small" @click="messageBoardShow">留言板</el-button>
|
||||||
<template v-if="project === 'bjd'">
|
<template v-if="project === 'bjd'">
|
||||||
<el-button v-if="running" size="small" @click="viewRunPlan">{{ $t('joinTraining.runGraphPreview') }}</el-button>
|
<el-button v-if="running" size="small" @click="viewRunPlan">{{ $t('joinTraining.runGraphPreview') }}</el-button>
|
||||||
<el-button v-if="!running" size="small" type="warning" @click="loadRunPlan">{{ $t('joinTraining.runGraphLoading') }}</el-button><!-- 运行图加载 -->
|
<el-button v-if="!running" size="small" type="warning" @click="loadRunPlan">{{ $t('joinTraining.runGraphLoading') }}</el-button><!-- 运行图加载 -->
|
||||||
@ -43,6 +44,7 @@
|
|||||||
<scheduling-view v-if="schedulePreviewShow" ref="schedulingView" :group="group" />
|
<scheduling-view v-if="schedulePreviewShow" ref="schedulingView" :group="group" />
|
||||||
<change-map v-if="isContest" ref="changeMap" @changeMap="changeMap" />
|
<change-map v-if="isContest" ref="changeMap" @changeMap="changeMap" />
|
||||||
<qr-code ref="qrCode" />
|
<qr-code ref="qrCode" />
|
||||||
|
<message-board ref="messageBoard" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
@ -56,6 +58,7 @@ import SchedulingView from '@/views/newMap/displayNew/demon/schedulingView';
|
|||||||
import { EventBus } from '@/scripts/event-bus';
|
import { EventBus } from '@/scripts/event-bus';
|
||||||
import DistributeDraft from '@/views/components/limits/distribute';
|
import DistributeDraft from '@/views/components/limits/distribute';
|
||||||
import QrCode from '@/components/QrCode';
|
import QrCode from '@/components/QrCode';
|
||||||
|
import MessageBoard from './demon/messageBoard';
|
||||||
export default {
|
export default {
|
||||||
name:'DemonMenu',
|
name:'DemonMenu',
|
||||||
components:{
|
components:{
|
||||||
@ -65,7 +68,8 @@ export default {
|
|||||||
SchedulingView,
|
SchedulingView,
|
||||||
ChangeMap,
|
ChangeMap,
|
||||||
DistributeDraft,
|
DistributeDraft,
|
||||||
QrCode
|
QrCode,
|
||||||
|
MessageBoard
|
||||||
},
|
},
|
||||||
props:{
|
props:{
|
||||||
isAllShow:{
|
isAllShow:{
|
||||||
@ -286,6 +290,9 @@ export default {
|
|||||||
if (this.$refs) {
|
if (this.$refs) {
|
||||||
this.$refs.distribute.doShow({PermissionType:'03', mapId: this.$route.query.mapId, prdType: this.$route.query.prdType});
|
this.$refs.distribute.doShow({PermissionType:'03', mapId: this.$route.query.mapId, prdType: this.$route.query.prdType});
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
messageBoardShow() {
|
||||||
|
this.$refs.messageBoard.doShow();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user