Commit d9953e68 authored by 高飞's avatar 高飞
parents abbacd8b b1d888a9
......@@ -61,5 +61,8 @@
"vuex": "^3.6.2",
"webuploader": "^0.1.5",
"xlsx": "^0.17.0"
},
"volta": {
"node": "14.21.3"
}
}
......@@ -4,16 +4,16 @@ const PREFIX_RECORDS = 'api/rest/chat/chatRecords';
//分页查询群聊记录
//查询小群
export const getRecordsByPagingTeam = (chatRoomId, currPage, pageSize, startTime, endTime, fromUserId,teamId) => {
export const getRecordsByPagingTeam = (chatRoomId, currPage, pageSize, startTime, endTime, fromUserId, teamId) => {
let url = `${PREFIX_RECORDS}/chatroomTeam/page`;
url += addParam({ chatRoomId, currPage, pageSize, startTime, endTime, fromUserId,teamId });
url += addParam({ chatRoomId, currPage, pageSize, startTime, endTime, fromUserId, teamId });
return get(url);
}
//查询大群
export const getRecordsByPaging = (chatRoomId, currPage, pageSize, startTime, endTime, fromUserId,teamId) => {
export const getRecordsByPaging = (chatRoomId, currPage, pageSize, startTime, endTime, fromUserId, teamId) => {
let url = `${PREFIX_RECORDS}/chatroom/page`;
url += addParam({ chatRoomId, currPage, pageSize, startTime, endTime, fromUserId,teamId });
url += addParam({ chatRoomId, currPage, pageSize, startTime, endTime, fromUserId, teamId });
return get(url);
}
......@@ -28,3 +28,8 @@ export const getPrivateLetterByPaging = (currPage, pageSize, startTime, endTime,
export const getListUnread = (chatRoomId, userId) => {
return get(`${PREFIX_RECORDS}/listUnread?chatRoomId=${chatRoomId}&userId=${userId}`);
}
//获取图片库照片
export const getFileUrl = (bucket, name) => {
return get(`api/rest/file/viewPicture/${bucket}?objectName=${name}`);
}
\ No newline at end of file
......@@ -28,8 +28,8 @@ export const leaveChatRoom = (userId) => {
}
//查询某个用户所有聊天室(群组)
export const getChatRoomList = (userId) => {
return get(`${PREFIX_CHATROOM}/list?userId=${userId}`);
export const getChatRoomList = (data) => {
return post(`${PREFIX_CHATROOM}/list`,data);
}
//阅读(群组)信息
......
......@@ -42,7 +42,7 @@ export function queryUserPerformance(pageNum = 1, pageSize = 10, logType = LITER
* @param {*} body
* @returns
*/
export function countUserPerformance(pageNum = 1, pageSize = 10, logType = LITERATURE,body = {}) {
export function countUserPerformance(pageNum = 1, pageSize = 10, logType = LITERATURE, body = {}) {
return post(`api/rest/user/countUserPerformance?pageNum=${pageNum}&pageSize=${pageSize}&logType=${logType}`, body);
}
......@@ -67,7 +67,7 @@ export function queryNotification(pageNum, pageSize, account, text) {
* @param {*} account
* @returns
*/
export function removeNotification(ids,account) {
export function removeNotification(ids, account) {
return delete_util(`api/rest/user/removeNotification?account=${account}`, ids);
}
......@@ -82,3 +82,7 @@ export function readNotification(account, noteId) {
url += addParam({ account, noteId });
return post(url, {});
}
export function getUserList() {
return get("api/rest/system/user/queryUser")
}
\ No newline at end of file
export default{
bind(el, binding, vnode) {
const dialogHeaderEl = el.querySelector('.el-dialog__header')
const dragDom = el.querySelector('.el-dialog')
dialogHeaderEl.style.cssText += ';cursor:move;'
dragDom.style.cssText += ';top:0px;'
// 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
const getStyle = (function() {
if (window.document.currentStyle) {
return (dom, attr) => dom.currentStyle[attr]
} else {
return (dom, attr) => getComputedStyle(dom, false)[attr]
}
})()
dialogHeaderEl.onmousedown = (e) => {
// 鼠标按下,计算当前元素距离可视区的距离
const disX = e.clientX - dialogHeaderEl.offsetLeft
const disY = e.clientY - dialogHeaderEl.offsetTop
const dragDomWidth = dragDom.offsetWidth
const dragDomheight = dragDom.offsetHeight
const screenWidth = document.body.clientWidth
const screenHeight = document.body.clientHeight
const minDragDomLeft = dragDom.offsetLeft
const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth
const minDragDomTop = dragDom.offsetTop
const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomheight
// 获取到的值带px 正则匹配替换
let styL = getStyle(dragDom, 'left')
let styT = getStyle(dragDom, 'top')
if (styL.includes('%')) {
styL = +document.body.clientWidth * (+styL.replace(/%/g, '') / 100)
styT = +document.body.clientHeight * (+styT.replace(/%/g, '') / 100)
} else {
styL = +styL.replace(/\px/g, '')
styT = +styT.replace(/\px/g, '')
}
document.onmousemove = function(e) {
// 通过事件委托,计算移动的距离
let left = e.clientX - disX
let top = e.clientY - disY
// 边界处理
if (-(left) > minDragDomLeft) {
left = -minDragDomLeft
} else if (left > maxDragDomLeft) {
left = maxDragDomLeft
}
if (-(top) > minDragDomTop) {
top = -minDragDomTop
} else if (top > maxDragDomTop) {
top = maxDragDomTop
}
// 移动当前元素
dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`
// emit onDrag event
vnode.child.$emit('dragDialog')
}
document.onmouseup = function() {
document.onmousemove = null
document.onmouseup = null
}
}
}
}
\ No newline at end of file
import drag from '@/util/directive/el-dragDialog/drag'
const install = function(Vue) {
Vue.directive('el-drag-dialog', drag)
}
if (window.Vue) {
window['el-drag-dialog'] = drag
Vue.use(install);
}
drag.install = install
export default drag
......@@ -310,10 +310,12 @@ let getTime_extent = (n) => {
let pre_rq = pre_year + '-' + pre_newMonth + '-' + pre_newDate;
let pre_rq_start = pre_year + '-' + pre_newMonth + '-' + pre_newDate + ' ' + '00:00:00';
let pre_rq_end = pre_year + '-' + pre_newMonth + '-' + pre_newDate + ' ' + '23:59:59';
let currentDate = pre_year + '-' + pre_newMonth + '-' + pre_newDate + ' ' +now.toLocaleTimeString();
return {
pre_rq,
pre_rq_start,
pre_rq_end
pre_rq_end,
currentDate
}
}
......
<template>
<el-dialog title="聊天室" :visible.sync="dialogVisible" width="40%" :before-close="handleClose">
<el-dialog v-if="dialogVisible" v-el-drag-dialog title="聊天室" :visible.sync="dialogVisible" width="40%" :before-close="handleClose" :close-on-click-modal="false">
<div class="info-messageInfo">
<!-- <div class="title">
<img :src="arrow" alt="">
<span>内部通讯</span>
</div> -->
<div class="messageInfo-content">
<div class="chatPerson">
<span :style="{ backgroundColor: chatPerson.isLine ? '#30d64d' : '#686a6b' }"
v-show="chatPerson.isLine != undefined"></span>&nbsp;
<span v-text="chatPerson.name"></span>
</div>
<div id="chatContent" class="chatContent">
<div id="chatContent" class="chatContent" ref="chatContent">
<div v-for="item in chatMessageList" class="everyMessage">
<div :style="{ justifyContent: item.fromUserId == userInfo.account ? 'flex-end' : 'flex-start' }">
<template v-if="item.fromUserId != userInfo.account">
......@@ -23,7 +19,6 @@
<img :src="avatar" alt="">
</template>
</div>
</div>
</div>
<div class="chatSendMessage">
......@@ -44,6 +39,7 @@
<script>
import avatar from '../../../assets/img/ddkz/headPhoto.jpg';
import { getRecordsByPagingTeam } from '../../../api/chat/chatRecords';
import elDragDialog from "@/util/directive/el-dragDialog";
export default {
data() {
return {
......@@ -62,17 +58,23 @@ export default {
myStompClient: null
}
},
directives: {
elDragDialog
},
props: {
visible: Boolean,
analogData: Array,
stompClient: Object,
currentChatRoomInfo: Object
},
methods: {
handleClose() {
// this.dialogVisible = false;
this.$emit('handleCancel');
},
showDialog(){
this.dialogVisible = true;
},
sendMessageFn() {
if (this.sendMessage.trim().length > 0) {
this.myStompClient.send("/app/sendToChatRoomTeam/" + this.currentChatRoom.id + '/' + this.currentChatRoom.teamId, {}, JSON.stringify({
......@@ -88,8 +90,7 @@ export default {
}
},
keepBottom() {
const divscll = document.getElementById('chatContent');
divscll.scrollTop = divscll.scrollHeight;
this.$refs.chatContent.scrollTop = this.$refs.chatContent.scrollHeight;
},
listChatroom(data) {
//取消群聊的订阅
......@@ -105,18 +106,22 @@ export default {
content: JSON.parse(data.body).content,
fromUserId: data.headers.fromUserId
});
this.$nextTick(() => {
this.keepBottom();
});
}, { id: "multicast" + e.id + new Date().getTime() });
})
},
getCurrentMessageList(item) {
//查询我方聊天记录
getRecordsByPagingTeam(item.id, 1, 100, '2020-01-01 00:00:00', '2023-10-01 00:00:00', null, item.teamId).then(res1 => {
getRecordsByPagingTeam(item.id, 1, 100, '2020-01-01 00:00:00', '2024-10-01 00:00:00', null, item.teamId).then(res1 => {
this.chatMessageList = res1.records;
this.$nextTick(() => {
this.keepBottom();
});
})
}
},
computed: {
userInfo() {
......@@ -135,9 +140,6 @@ export default {
//订阅
this.listChatroom(this.analogDataList);
this.getCurrentMessageList(this.$props.currentChatRoomInfo);
setTimeout(() => {
this.keepBottom();
}, 2000);
}
}
</script>
......@@ -145,7 +147,7 @@ export default {
<style lang="scss">
.info-messageInfo {
width: 100%;
height: 70%;
height: 60%;
.title {
width: 100%;
......
<template>
<el-dialog title="人员情况" :visible.sync="dialogVisible" width="40%" :before-close="handleClose">
<el-dialog v-el-drag-dialog title="人员情况" :visible.sync="dialogVisible" width="40%"
:before-close="handleClose" @open="handleDialogOpen">
<div class="info-personInfo">
<!-- <div class="title">
<img :src="arrow" alt="">
<span>人员情况</span>
</div> -->
<div class="personInfo-content">
<div v-for="item in personList" class="everyPersonList">
<span v-text="item.userId" @click="selectPerson(item);"></span>
......@@ -16,6 +13,7 @@
<script>
import elDragDialog from "@/util/directive/el-dragDialog";
export default {
data() {
return {
......@@ -23,19 +21,30 @@ export default {
personList: []
}
},
directives: {
elDragDialog
},
props: {
visible: Boolean,
// visible: Boolean,
peopleList: Array
},
methods: {
handleClose() {
this.$emit('handleCancel');
}
this.dialogVisible = false;
// this.$emit('handleCancel');
},
mounted() {
this.dialogVisible = this.$props.visible;
showDialog() {
this.dialogVisible = true;
},
handleDialogOpen() {
// this.dialogVisible = this.$props.visible;
this.personList = this.$props.peopleList;
}
},
// mounted() {
// this.dialogVisible = this.$props.visible;
// this.personList = this.$props.peopleList;
// }
}
</script>
......@@ -44,6 +53,7 @@ export default {
.info-personInfo {
width: 100%;
height: 30%;
overflow-y: auto;
.title {
width: 100%;
......
<template>
<el-dialog title="发送公告" :visible.sync="dialogVisible" width="30%" :before-close="handleClose">
<el-dialog v-el-drag-dialog title="发送公告" :visible.sync="dialogVisible" width="30%" :before-close="handleClose">
<div class="notice">
<el-form ref="form" :model="form" label-width="80px">
<el-form-item label="标题">
......@@ -16,7 +16,7 @@
</el-upload>
</el-form-item>
<el-form-item style="text-align: center;">
<el-button type="default">取消</el-button>
<el-button type="default" @click="handleClose">取消</el-button>
<el-button type="success" @click="sendNotice">发送</el-button>
</el-form-item>
</el-form>
......@@ -28,6 +28,7 @@
<script>
import { upLoadFiles } from '../../../api/chat/chatRoom';
import { format_file } from '../../../util/http_util';
import elDragDialog from "@/util/directive/el-dragDialog";
export default {
data() {
return {
......@@ -35,7 +36,8 @@ export default {
form: {
title: '',
content: '',
attachment: ''
attachment: '',
messageForm:null
},
formatFile: format_file(),
myStompClient: null,
......@@ -43,6 +45,9 @@ export default {
analogDataList: [],
}
},
directives: {
elDragDialog
},
props: {
visible: Boolean,
stompClient: Object,
......@@ -51,13 +56,28 @@ export default {
},
methods: {
handleClose() {
this.$emit('handleCancel');
this.dialogVisible = false;
// this.$emit('handleCancel');
},
showDialog(){
this.dialogVisible = true;
},
handleChange(file, fileList) {
let fd = new FormData();
fd.append('file', file.raw);
upLoadFiles('CHAT', fd).then(res => {
this.form.attachment = res;
let type = file.name.split('.')[1];
if(type=='png'||type=='jpg'){
this.form.messageForm = 'PICTURE';
}else if(type=='mp4'){
this.form.messageForm = 'VIDEO';
}else if(type=='xlsx'||type=='xls'){
this.form.messageForm = 'EXCEL';
}else{
this.form.messageForm = 'TEXT';
}
});
},
handleRemove() { },
......
......@@ -6,12 +6,16 @@
<div class="ddkz-selection">
<el-form ref="form" :inline="true" :model="form" label-width="80px" class="demo-form-inline">
<el-form-item>
<el-date-picker v-model="form.date" type="daterange" range-separator="至"
start-placeholder="开始日期" end-placeholder="结束日期">
<el-date-picker value-format="yyyy-MM-dd HH:mm:ss" v-model="form.dateRange" type="daterange"
range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"
:default-time="['00:00:00', '23:59:59']">
</el-date-picker>
</el-form-item>
<el-form-item>
<el-input v-model="form.name" placeholder="请输入关键词" suffix-icon="el-icon-search"></el-input>
<el-input v-model="form.keyWord" placeholder="请输入关键词" suffix-icon="el-icon-search"></el-input>
</el-form-item>
<el-form-item>
<div class="searchButton" @click="searchChatList">搜索</div>
</el-form-item>
</el-form>
</div>
......@@ -40,16 +44,14 @@
<div class="ddkz-info-selection">
<el-form ref="form" :inline="true" :model="formInfo" class="demo-form-inline">
<el-form-item>
<el-select v-model="formInfo.topic" placeholder="请选择">
<el-option v-for="item in options" :key="item.value" :label="item.label"
:value="item.value">
<el-select v-model="formInfo.day" placeholder="请选择日期" clearable>
<el-option v-for="item in options" :key="item" :label="item" :value="item">
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-select v-model="formInfo.step" placeholder="请选择">
<el-option v-for="item in options" :key="item.value" :label="item.label"
:value="item.value">
<el-select v-model="formInfo.fromUser" placeholder="请选择公告来源" clearable>
<el-option v-for="item in optionsFrom" :key="item" :label="item" :value="item">
</el-option>
</el-select>
</el-form-item>
......@@ -64,76 +66,39 @@
<div class="everyDayTitle">
<div class="circle-light"></div>&emsp;
<span v-text="item.time"></span>&emsp;
<!-- <span v-text="item.week"></span> -->
</div>
<div class="everyDayNew">
<div class="everyTemplate">
<div v-for="item1 in item.news"
:class="['everyDayNewCard', 'cardType' + item1.teamInfo.teamType]">
<div class="everyDayNewCardTitle" v-text="item1.title"></div>
<div class="everyDayNewCardContent">
<div class="left-everyDayNew" :style="{ width: item1.attachment ? '50%' : '100%' }">
<div class="everyDayNewCardInfo">
<span v-text="item1.time"></span>&emsp;
<!-- <span v-text="item1.location"></span>&emsp; -->
来源:<span class="newsSource" v-text="item1.from"></span>
</div>
<div class="everyDayNewCardContent" v-text="item1.content"></div>
</div>
</div>
</div>
</div>
</div>
<div class="info-content-right">
<div class="info-personInfo">
<div class="title">
<img :src="arrow" alt="">
<span>人员情况</span>
<div class="everyDayNewCardText" v-text="item1.content"></div>
</div>
<div class="personInfo-content">
<div v-for="item in personList" class="everyPersonList">
<span v-for="item1 in item" @click="selectPerson(item1);">
<span v-text="item1.name"></span>
<span
:style="{ backgroundColor: item1.isLine ? '#30d64d' : '#686a6b' }"></span>&nbsp;
</span>
</div>
</div>
</div>
<div class="info-messageInfo">
<div class="title">
<img :src="arrow" alt="">
<span>内部通讯</span>
</div>
<div class="messageInfo-content">
<div class="chatPerson">
<span :style="{ backgroundColor: chatPerson.isLine ? '#30d64d' : '#686a6b' }"
v-show="chatPerson.isLine != undefined"></span>&nbsp;
<span v-text="chatPerson.name"></span>
</div>
<div id="chatContent" class="chatContent">
<div v-for="item in chatMessageList" class="everyMessage">
<div v-for="item1 in item.list"
:style="{ justifyContent: item.isMe ? 'flex-end' : 'flex-start' }">
<template v-if="!item.isMe">
<img :src="avatar" alt="">
<div v-text="item1" style="background-color:white"></div>
<div class="right-everyDayNew" v-if="item1.attachment">
<template v-if="item1.type == 'PICTURE'">
<el-image :src="item1.url" :preview-src-list="[item1.url]">
</el-image>
</template>
<template v-else-if="item.isMe">
<div v-text="item1" style="background-color: #85ce61;"></div>
<img :src="avatar" alt="">
<template v-else-if="item1.type == 'VIDEO'">
<video :src="item1.url" controls loop>
</video>
</template>
<template v-else-if="item1.type == 'EXCEL'">
<el-image :src="excelImg" @click="showLiterature(item1.attachment)">
</el-image>
</template>
<template v-else-if="item1.type == 'TEXT'">
<el-image :src="textImg" @click="showLiterature(item1.attachment)">
</el-image>
</template>
</div>
</div>
</div>
<div class="chatSendMessage">
<div class="messageContent">
<el-input type="textarea" autosize placeholder="请输入内容" v-model="sendMessage">
</el-input>
</div>
<div class="sendMessageButtonList">
<!-- <el-button size="mini" type="info" @click="sendNotice">发送公告</el-button>
<el-button size="mini" type="info" @click="test">邮箱</el-button> -->
<el-button size="mini" type="success" @click="sendMessageFn">发送</el-button>
</div>
</div>
</div>
......@@ -142,13 +107,14 @@
</div>
</div>
</transition>
<NoticeDialog v-if="visible" :visible="visible" @handleCancel="closeDialog" :stompClient="stompClient"
<NoticeDialog v-if="visible" ref="myNotice" @handleCancel="closeDialog" :stompClient="stompClient"
:currentChatRoomInfo="currentChatRoomInfo" :analogData="analogData" @showInfo="showInfo"></NoticeDialog>
<ChatRoomDialog v-if="chatRoomVisible" :visible="chatRoomVisible" @handleCancel="closeDialogChatRoom"
:analogData="analogData" :currentChatRoomInfo="currentChatRoomInfo" :stompClient="stompClient">
<ChatRoomDialog v-if="chatRoomVisible" :visible="chatRoomVisible" ref="myChatRoom"
@handleCancel="closeDialogChatRoom" :analogData="analogData" :currentChatRoomInfo="currentChatRoomInfo"
:stompClient="stompClient">
</ChatRoomDialog>
<ChatRoomPeople v-if="chatRoomPeopleVisible" :visible="chatRoomPeopleVisible"
@handleCancel="closeDialogChatRoomPeople" :peopleList="peopleList"></ChatRoomPeople>
<ChatRoomPeople ref="myChatRoomPeople" @handleCancel="closeDialogChatRoomPeople"
:peopleList="peopleList"></ChatRoomPeople>
<el-tooltip placement="left" class="myButtonList" v-if="isInfo">
<div class="myTools" slot="content">
<div>
......@@ -175,211 +141,34 @@ import arrow from '../../assets/img/ddkz/8.png';
import avatar from '../../assets/img/ddkz/headPhoto.jpg';
import NoticeDialog from '../../view/ddkz/components/noticeDialog.vue';
import ChatRoomDialog from "./components/chatRoomDialog.vue";
import ChatRoomPeople from "./components/chatRoomPeople.vue";
import ChatRoomPeople from "@/view/ddkz/components/chatRoomPeople.vue";
import { getChatRoomList, getChatRoomInfo } from "../../api/chat/chatRoom";
import { getRecordsByPaging } from '../../api/chat/chatRecords';
import { getRecordsByPaging, getFileUrl } from '../../api/chat/chatRecords';
import textImg from '@/assets/img/ddkz/tool1.png';
import excelImg from '@/assets/img/ddkz/tool5.png';
import '../../util/stomp.min.js'
import { getTime_extent, download } from '@/util/http_util.js';
export default {
data() {
return {
form: {
keyWord: '',
date: ''
keyWord: null,
dateRange: []
},
formInfo: {
topic: '',
step: ''
day: null,
fromUser: null
},
analogData: [
// {
// title: '马克龙:G20宣言不是俄方“外交胜利”',
// date: '2023-09-12 08:54:00',
// text: '据路透社报道,法国总统马克龙10日称,二十国集团(G20)领导人新德里峰会宣言不是俄罗斯的“外交胜利”。报道称,马克龙表示,为解决国际经济问题而成立的G20不是可以期待实现俄乌冲突外交进展的场合。另据法新社报道,俄罗斯外长拉夫罗夫10日表示,G20领导人新德里峰会是一个“成功”。报道称,拉夫罗夫说:“我们努力阻止西方将峰会议程‘乌克兰化’的企图。”他还表示,峰会宣言“根本没有提到俄罗斯”。',
// isRed: true,
// isBlue: false,
// isYellow: true
// },
// {
// title: '马克龙:G20宣言不是俄方“外交胜利”',
// date: '2023-09-12 08:54:00',
// text: '据路透社报道,法国总统马克龙10日称,二十国集团(G20)领导人新德里峰会宣言不是俄罗斯的“外交胜利”。报道称,马克龙表示,为解决国际经济问题而成立的G20不是可以期待实现俄乌冲突外交进展的场合。另据法新社报道,俄罗斯外长拉夫罗夫10日表示,G20领导人新德里峰会是一个“成功”。报道称,拉夫罗夫说:“我们努力阻止西方将峰会议程‘乌克兰化’的企图。”他还表示,峰会宣言“根本没有提到俄罗斯”。',
// isRed: true,
// isBlue: true,
// isYellow: true
// },
// {
// title: '马克龙:G20宣言不是俄方“外交胜利”',
// date: '2023-09-12 08:54:00',
// text: '据路透社报道,法国总统马克龙10日称,二十国集团(G20)领导人新德里峰会宣言不是俄罗斯的“外交胜利”。报道称,马克龙表示,为解决国际经济问题而成立的G20不是可以期待实现俄乌冲突外交进展的场合。另据法新社报道,俄罗斯外长拉夫罗夫10日表示,G20领导人新德里峰会是一个“成功”。报道称,拉夫罗夫说:“我们努力阻止西方将峰会议程‘乌克兰化’的企图。”他还表示,峰会宣言“根本没有提到俄罗斯”。',
// isRed: true,
// isBlue: true,
// isYellow: true
// },
// {
// title: '马克龙:G20宣言不是俄方“外交胜利”',
// date: '2023-09-12 08:54:00',
// text: '据路透社报道,法国总统马克龙10日称,二十国集团(G20)领导人新德里峰会宣言不是俄罗斯的“外交胜利”。报道称,马克龙表示,为解决国际经济问题而成立的G20不是可以期待实现俄乌冲突外交进展的场合。另据法新社报道,俄罗斯外长拉夫罗夫10日表示,G20领导人新德里峰会是一个“成功”。报道称,拉夫罗夫说:“我们努力阻止西方将峰会议程‘乌克兰化’的企图。”他还表示,峰会宣言“根本没有提到俄罗斯”。',
// isRed: false,
// isBlue: true,
// isYellow: true
// },
// {
// title: '马克龙:G20宣言不是俄方“外交胜利”',
// date: '2023-09-12 08:54:00',
// text: '据路透社报道,法国总统马克龙10日称,二十国集团(G20)领导人新德里峰会宣言不是俄罗斯的“外交胜利”。报道称,马克龙表示,为解决国际经济问题而成立的G20不是可以期待实现俄乌冲突外交进展的场合。另据法新社报道,俄罗斯外长拉夫罗夫10日表示,G20领导人新德里峰会是一个“成功”。报道称,拉夫罗夫说:“我们努力阻止西方将峰会议程‘乌克兰化’的企图。”他还表示,峰会宣言“根本没有提到俄罗斯”。',
// isRed: true,
// isBlue: false,
// isYellow: true
// },
// {
// title: '马克龙:G20宣言不是俄方“外交胜利”',
// date: '2023-09-12 08:54:00',
// text: '据路透社报道,法国总统马克龙10日称,二十国集团(G20)领导人新德里峰会宣言不是俄罗斯的“外交胜利”。报道称,马克龙表示,为解决国际经济问题而成立的G20不是可以期待实现俄乌冲突外交进展的场合。另据法新社报道,俄罗斯外长拉夫罗夫10日表示,G20领导人新德里峰会是一个“成功”。报道称,拉夫罗夫说:“我们努力阻止西方将峰会议程‘乌克兰化’的企图。”他还表示,峰会宣言“根本没有提到俄罗斯”。',
// isRed: false,
// isBlue: false,
// isYellow: true
// },
// {
// title: '马克龙:G20宣言不是俄方“外交胜利”',
// date: '2023-09-12 08:54:00',
// text: '据路透社报道,法国总统马克龙10日称,二十国集团(G20)领导人新德里峰会宣言不是俄罗斯的“外交胜利”。报道称,马克龙表示,为解决国际经济问题而成立的G20不是可以期待实现俄乌冲突外交进展的场合。另据法新社报道,俄罗斯外长拉夫罗夫10日表示,G20领导人新德里峰会是一个“成功”。报道称,拉夫罗夫说:“我们努力阻止西方将峰会议程‘乌克兰化’的企图。”他还表示,峰会宣言“根本没有提到俄罗斯”。',
// isRed: true,
// isBlue: true,
// isYellow: true
// },
// {
// title: '马克龙:G20宣言不是俄方“外交胜利”',
// date: '2023-09-12 08:54:00',
// text: '据路透社报道,法国总统马克龙10日称,二十国集团(G20)领导人新德里峰会宣言不是俄罗斯的“外交胜利”。报道称,马克龙表示,为解决国际经济问题而成立的G20不是可以期待实现俄乌冲突外交进展的场合。另据法新社报道,俄罗斯外长拉夫罗夫10日表示,G20领导人新德里峰会是一个“成功”。报道称,拉夫罗夫说:“我们努力阻止西方将峰会议程‘乌克兰化’的企图。”他还表示,峰会宣言“根本没有提到俄罗斯”。',
// isRed: false,
// isBlue: true,
// isYellow: true
// },
// {
// title: '马克龙:G20宣言不是俄方“外交胜利”',
// date: '2023-09-12 08:54:00',
// text: '据路透社报道,法国总统马克龙10日称,二十国集团(G20)领导人新德里峰会宣言不是俄罗斯的“外交胜利”。报道称,马克龙表示,为解决国际经济问题而成立的G20不是可以期待实现俄乌冲突外交进展的场合。另据法新社报道,俄罗斯外长拉夫罗夫10日表示,G20领导人新德里峰会是一个“成功”。报道称,拉夫罗夫说:“我们努力阻止西方将峰会议程‘乌克兰化’的企图。”他还表示,峰会宣言“根本没有提到俄罗斯”。',
// isRed: false,
// isBlue: false,
// isYellow: true
// },
// {
// title: '马克龙:G20宣言不是俄方“外交胜利”',
// date: '2023-09-12 08:54:00',
// text: '据路透社报道,法国总统马克龙10日称,二十国集团(G20)领导人新德里峰会宣言不是俄罗斯的“外交胜利”。报道称,马克龙表示,为解决国际经济问题而成立的G20不是可以期待实现俄乌冲突外交进展的场合。另据法新社报道,俄罗斯外长拉夫罗夫10日表示,G20领导人新德里峰会是一个“成功”。报道称,拉夫罗夫说:“我们努力阻止西方将峰会议程‘乌克兰化’的企图。”他还表示,峰会宣言“根本没有提到俄罗斯”。',
// isRed: false,
// isBlue: false,
// isYellow: true
// },
// {
// title: '马克龙:G20宣言不是俄方“外交胜利”',
// date: '2023-09-12 08:54:00',
// text: '据路透社报道,法国总统马克龙10日称,二十国集团(G20)领导人新德里峰会宣言不是俄罗斯的“外交胜利”。报道称,马克龙表示,为解决国际经济问题而成立的G20不是可以期待实现俄乌冲突外交进展的场合。另据法新社报道,俄罗斯外长拉夫罗夫10日表示,G20领导人新德里峰会是一个“成功”。报道称,拉夫罗夫说:“我们努力阻止西方将峰会议程‘乌克兰化’的企图。”他还表示,峰会宣言“根本没有提到俄罗斯”。',
// isRed: false,
// isBlue: false,
// isYellow: true
// },
// {
// title: '马克龙:G20宣言不是俄方“外交胜利”',
// date: '2023-09-12 08:54:00',
// text: '据路透社报道,法国总统马克龙10日称,二十国集团(G20)领导人新德里峰会宣言不是俄罗斯的“外交胜利”。报道称,马克龙表示,为解决国际经济问题而成立的G20不是可以期待实现俄乌冲突外交进展的场合。另据法新社报道,俄罗斯外长拉夫罗夫10日表示,G20领导人新德里峰会是一个“成功”。报道称,拉夫罗夫说:“我们努力阻止西方将峰会议程‘乌克兰化’的企图。”他还表示,峰会宣言“根本没有提到俄罗斯”。',
// isRed: false,
// isBlue: false,
// isYellow: true
// },
// {
// title: '马克龙:G20宣言不是俄方“外交胜利”',
// date: '2023-09-12 08:54:00',
// text: '据路透社报道,法国总统马克龙10日称,二十国集团(G20)领导人新德里峰会宣言不是俄罗斯的“外交胜利”。报道称,马克龙表示,为解决国际经济问题而成立的G20不是可以期待实现俄乌冲突外交进展的场合。另据法新社报道,俄罗斯外长拉夫罗夫10日表示,G20领导人新德里峰会是一个“成功”。报道称,拉夫罗夫说:“我们努力阻止西方将峰会议程‘乌克兰化’的企图。”他还表示,峰会宣言“根本没有提到俄罗斯”。',
// isRed: false,
// isBlue: false,
// isYellow: true
// },
// {
// title: '马克龙:G20宣言不是俄方“外交胜利”',
// date: '2023-09-12 08:54:00',
// text: '据路透社报道,法国总统马克龙10日称,二十国集团(G20)领导人新德里峰会宣言不是俄罗斯的“外交胜利”。报道称,马克龙表示,为解决国际经济问题而成立的G20不是可以期待实现俄乌冲突外交进展的场合。另据法新社报道,俄罗斯外长拉夫罗夫10日表示,G20领导人新德里峰会是一个“成功”。报道称,拉夫罗夫说:“我们努力阻止西方将峰会议程‘乌克兰化’的企图。”他还表示,峰会宣言“根本没有提到俄罗斯”。',
// isRed: false,
// isBlue: false,
// isYellow: true
// },
// {
// title: '马克龙:G20宣言不是俄方“外交胜利”',
// date: '2023-09-12 08:54:00',
// text: '据路透社报道,法国总统马克龙10日称,二十国集团(G20)领导人新德里峰会宣言不是俄罗斯的“外交胜利”。报道称,马克龙表示,为解决国际经济问题而成立的G20不是可以期待实现俄乌冲突外交进展的场合。另据法新社报道,俄罗斯外长拉夫罗夫10日表示,G20领导人新德里峰会是一个“成功”。报道称,拉夫罗夫说:“我们努力阻止西方将峰会议程‘乌克兰化’的企图。”他还表示,峰会宣言“根本没有提到俄罗斯”。',
// isRed: false,
// isBlue: false,
// isYellow: true
// },
// {
// title: '马克龙:G20宣言不是俄方“外交胜利”',
// date: '2023-09-12 08:54:00',
// text: '据路透社报道,法国总统马克龙10日称,二十国集团(G20)领导人新德里峰会宣言不是俄罗斯的“外交胜利”。报道称,马克龙表示,为解决国际经济问题而成立的G20不是可以期待实现俄乌冲突外交进展的场合。另据法新社报道,俄罗斯外长拉夫罗夫10日表示,G20领导人新德里峰会是一个“成功”。报道称,拉夫罗夫说:“我们努力阻止西方将峰会议程‘乌克兰化’的企图。”他还表示,峰会宣言“根本没有提到俄罗斯”。',
// isRed: false,
// isBlue: false,
// isYellow: true
// },
],
analogData: [],
isInfo: false,
options: [{
value: '2023081501',
label: '2023年08月15日******课题'
}, {
value: '2023081502',
label: '2023年08月15日******课题'
}, {
value: '2023081503',
label: '2023年08月15日******课题'
}, {
value: '2023081504',
label: '2023年08月15日******课题'
}, {
value: '2023081505',
label: '2023年08月15日******课题'
}],
options: [],
optionsFrom: [],
goBack: goBack,
newsList: [],
arrow: arrow,
personList: [[
{
name: '部长 李叔',
isLine: true
},
{
name: '副部长 李文',
isLine: false
},
{
name: '助理 李叔文',
isLine: true
}
], [
{
name: '部长 李叔',
isLine: false
},
{
name: '副部长 李文',
isLine: true
},
{
name: '助理 李叔文',
isLine: true
}
], [
{
name: '部长 李叔',
isLine: true
},
{
name: '副部长 李文',
isLine: false
},
{
name: '助理 李叔文',
isLine: false
}
]],
personList: [],
publicNoticeList: [],
chatPerson: {
name: '',
isLine: undefined
......@@ -400,8 +189,10 @@ export default {
peopleList: [],
// chatMessageList: [],
currentChatRoomInfo: {},
stompClient: '',
ws: null
stompClient: {},
ws: null,
excelImg: excelImg,
textImg: textImg
}
},
components: {
......@@ -421,11 +212,21 @@ export default {
getChatRoomInfo(item.id, this.userInfo.account).then(res => {
this.peopleList = res.chatRoomMemberRelationBOList;
});
this.getRecordsByPagingFn(item);
}
},
//分页查询群聊天记录
getRecordsByPaging(item.id, 1, 100, '2020-01-01 00:00:00', '2023-10-01 00:00:00').then(res1 => {
let newsArr = [];
res1.records.forEach(item => {
getRecordsByPagingFn(item) {
getRecordsByPaging(item.id, 1, 100, this.form.dateRange.length > 0 ? this.form.dateRange[0] : '2020-01-01 00:00:00', this.form.dateRange.length > 0 ? this.form.dateRange[1] : getTime_extent(0).pre_rq_end).then(res1 => {
this.publicNoticeList = res1.records;
this.dataOrderByParams(null, null);
let newsArr = [], dayArr = [];
this.optionsFrom = [];
this.publicNoticeList.forEach(item => {
let obj = { time: '', news: [] };
if (this.optionsFrom.indexOf(item.fromUserId) == -1) {
this.optionsFrom.push(item.fromUserId);
}
if (newsArr.some(newsArrChild => { return newsArrChild.time == item.createTime.slice(0, 10) })) {
newsArr.forEach(item1 => {
if (item1.time == item.createTime.slice(0, 10)) {
......@@ -434,14 +235,42 @@ export default {
})
} else {
obj.time = item.createTime.slice(0, 10);
dayArr.push(item.createTime.slice(0, 10));
this.options = dayArr;
obj.news.push({ time: item.createTime, title: item.title, content: item.content, from: item.fromUserId, teamInfo: item.teamInfo });
newsArr.push(obj);
}
});
this.newsList = newsArr;
});
},
dataOrderByParams(day, user) {
let newsArr = [];
let tmpArr = this.publicNoticeList;
if (day == null && user != null) {
tmpArr = this.publicNoticeList.filter(item => { return item.fromUserId == user });
} else if (day != null && user == null) {
tmpArr = this.publicNoticeList.filter(item => { return item.createTime.slice(0, 10) == day });
} else if (day != null && user != null) {
tmpArr = this.publicNoticeList.filter(item => { return item.fromUserId == user && item.createTime.slice(0, 10) == day });
}
tmpArr.forEach(item => {
console.log(item);
let obj = { time: '', news: [] };
let fileUrl = null;
fileUrl = item.attachment ? 'api/rest/file/viewPicture/CHAT?objectName=' + item.attachment : null;
if (newsArr.some(newsArrChild => { return newsArrChild.time == item.createTime.slice(0, 10) })) {
newsArr.forEach(item1 => {
if (item1.time == item.createTime.slice(0, 10)) {
item1.news.push({ time: item.createTime, title: item.title, content: item.content, from: item.fromUserId, teamInfo: item.teamInfo, url: fileUrl, type: item.messageForm, attachment: item.attachment });
}
})
} else {
obj.time = item.createTime.slice(0, 10);
obj.news.push({ time: item.createTime, title: item.title, content: item.content, from: item.fromUserId, teamInfo: item.teamInfo, url: fileUrl, type: item.messageForm, attachment: item.attachment });
newsArr.push(obj);
}
});
this.newsList = newsArr;
},
selectPerson(item) {
this.chatPerson = item;
......@@ -466,21 +295,39 @@ export default {
},
sendNotice() {
this.visible = true;
this.$nextTick(() => {
this.$refs.myNotice.showDialog();
})
// if (this.$refs.myNotice) {
// this.$refs.myNotice.showDialog();
// }
},
closeDialogChatRoom() {
this.chatRoomVisible = false;
},
showChatRoom() {
this.chatRoomVisible = true;
// this.$nextTick(() => {
// this.$refs.myChatRoom.showDialog();
// })
// if (this.$refs.myChatRoom) {
// this.$refs.myChatRoom.showDialog();
// }
},
closeDialogChatRoomPeople() {
this.chatRoomPeopleVisible = false;
},
showPeopleList() {
this.chatRoomPeopleVisible = true;
// this.chatRoomPeopleVisible = true;
this.$nextTick(() => {
this.$refs.myChatRoomPeople.showDialog();
})
// if (this.$refs.myChatRoomPeople) {
// this.$refs.myChatRoomPeople.showDialog();
// }
},
queryChatRoomListFn() {
getChatRoomList(this.userInfo.account).then(res => {
queryChatRoomListFn(params) {
getChatRoomList(params).then(res => {
this.analogData = res;
});
},
......@@ -503,6 +350,12 @@ export default {
});
})
},
searchChatList() {
this.queryChatRoomListFn({ startTime: this.form.dateRange.length > 0 ? this.form.dateRange[0] : null, endTime: this.form.dateRange.length > 0 ? this.form.dateRange[1] : null, userId: this.userInfo.account, keyword: this.form.keyWord == '' ? null : this.form.keyWord });
},
showLiterature(url) {
window.open("api/rest/file/download/CHAT/" + url);
}
},
computed: {
......@@ -514,9 +367,30 @@ export default {
}
}
},
watch: {
'formInfo.day'(newVal, oldVal) {
if (newVal == '') {
this.formInfo.day = null;
this.dataOrderByParams(null, this.formInfo.fromUser);
} else {
this.dataOrderByParams(newVal, this.formInfo.fromUser);
}
},
'formInfo.fromUser'(newVal, oldVal) {
if (newVal == '') {
this.formInfo.fromUser = null;
this.dataOrderByParams(this.formInfo.day, null);
} else {
this.dataOrderByParams(this.formInfo.day, newVal);
}
}
},
mounted() {
this.queryChatRoomListFn();
this.queryChatRoomListFn({ userId: this.userInfo.account });
this.connect();
},
destroyed() {
this.ws.onclose();
}
}
</script>
......@@ -541,7 +415,7 @@ export default {
.el-input {
float: left;
width: 200px;
margin-right: 30px;
// margin-right: 20px;
.el-input__inner {
background: none;
......@@ -566,6 +440,26 @@ export default {
.el-input__inner {
border: 1px solid #3a5f94c9 !important;
}
.searchButton {
width: 80px;
height: 30px;
line-height: 30px;
margin-top: 4px;
margin-right: 30px;
font-size: 14px;
text-align: center;
// background-image: url(../../../assets/img/fzjc/7.png);
background-size: 100% 100%;
background-repeat: no-repeat;
border: 1px solid #3a5f94c9 !important;
border-radius: 5px;
cursor: pointer;
&:hover {
background-color: #171a1cf7;
}
}
}
.ddkz-content {
......@@ -768,6 +662,8 @@ export default {
}
}
.everyDayNew {
width: 100%;
height: 220px;
......@@ -777,7 +673,7 @@ export default {
overflow-y: hidden;
.everyTemplate {
width: 100%;
width: 98%;
height: 100%;
padding-bottom: 10px;
box-sizing: border-box;
......@@ -805,6 +701,16 @@ export default {
border-bottom: 1px solid #7b7b7bdd;
}
.everyDayNewCardContent {
width: 100%;
height: 110px;
margin-top: 10px;
display: flex;
.left-everyDayNew {
width: 50%;
height: 100%;
.everyDayNewCardInfo {
width: 100%;
height: 20px;
......@@ -818,7 +724,7 @@ export default {
}
}
.everyDayNewCardContent {
.everyDayNewCardText {
width: 100%;
// height: calc(100% - 58px);
margin-top: 5px;
......@@ -830,237 +736,49 @@ export default {
-webkit-line-clamp: 5;
/* 控制显示的行数 */
overflow: hidden;
word-break: break-all
}
}
.cardTypeDIRECTOR {
background-image: url(../../assets/img/ddkz/new3.png);
background-size: 100% 100%;
}
.cardTypeBLUE {
background-image: url(../../assets/img/ddkz/new1.png);
background-size: 100% 100%;
}
.cardTypeRED {
background-image: url(../../assets/img/ddkz/new2.png);
background-size: 100% 100%;
}
}
}
}
.info-content-right {
width: 400px;
.right-everyDayNew {
width: 50%;
height: 100%;
float: left;
margin-left: 20px;
border: 1px solid #445771;
border-left: 4px solid #445771;
padding: 10px 20px;
box-sizing: border-box;
display: none;
.info-personInfo {
width: 100%;
height: 30%;
.title {
width: 100%;
height: 30px;
line-height: 30px;
text-align: center;
img {
width: 20px;
height: 20px;
}
span {
font-size: 16px;
font-weight: 500;
color: white;
vertical-align: text-bottom;
}
}
.personInfo-content {
width: 100%;
height: calc(100% - 30px);
.everyPersonList {
width: 100%;
height: 35px;
line-height: 35px;
margin-top: 10px;
padding: 0px 10px;
font-size: 13px;
color: #f1f1f7;
box-sizing: border-box;
&:nth-child(3n) {
background-image: url(../../assets/img/ddkz/12.png);
background-size: 100% 100%;
}
&:nth-child(3n+1) {
background-image: url(../../assets/img/ddkz/13.png);
background-size: 100% 100%;
}
&:nth-child(3n+2) {
background-image: url(../../assets/img/ddkz/14.png);
background-size: 100% 100%;
}
&>span {
float: left;
margin-left: 10px;
&:hover {
color: green;
cursor: pointer;
}
&>span:first-child {
float: left;
}
&>span:last-child {
width: 10px;
height: 10px;
border-radius: 50%;
display: block;
float: left;
margin-top: 12.5px;
margin-left: 5px;
}
}
}
}
height: 100%;
}
.info-messageInfo {
video {
width: 100%;
height: 70%;
.title {
width: 100%;
height: 30px;
line-height: 30px;
img {
width: 20px;
height: 20px;
height: 100%;
}
span {
font-size: 16px;
font-weight: 500;
color: white;
vertical-align: text-bottom;
}
}
.messageInfo-content {
width: 100%;
height: calc(100% - 40px);
margin-top: 10px;
padding: 0px 10px;
border: 1px solid #254751;
box-sizing: border-box;
.chatPerson {
width: 100%;
height: 40px;
line-height: 40px;
display: flex;
justify-content: center;
font-size: 13px;
border-bottom: 1px solid #37383f;
&>span:first-child {
width: 10px;
height: 10px;
border-radius: 50%;
display: block;
float: left;
margin-top: 15px;
margin-left: 5px;
}
&>span:last-child {
float: left;
margin-left: 10px;
}
.cardTypeDIRECTOR {
background-image: url(../../assets/img/ddkz/new3.png);
background-size: 100% 100%;
}
.chatContent {
width: 100%;
height: 60%;
border-bottom: 1px solid #37383f;
padding: 10px 0px;
box-sizing: border-box;
overflow-y: auto;
.everyMessage {
width: 100%;
margin-top: 10px;
&>div {
width: 100%;
display: flex;
align-items: center;
margin-top: 10px;
font-size: 13px;
img {
width: 20px;
height: 20px;
margin: 0px 10px;
.cardTypeBLUE {
background-image: url(../../assets/img/ddkz/new1.png);
background-size: 100% 100%;
}
&>div {
padding: 5px 10px;
border-radius: 5px;
color: black;
}
}
}
.cardTypeRED {
background-image: url(../../assets/img/ddkz/new2.png);
background-size: 100% 100%;
}
.chatSendMessage {
width: 100%;
height: calc(40% - 42px);
position: relative;
.messageContent {
width: 100%;
height: 100%;
padding: 5px;
box-sizing: border-box;
.el-textarea__inner {
height: 100% !important;
color: white !important;
background-color: transparent !important;
border: 1px solid #37383f !important;
}
}
.sendMessageButtonList {
position: absolute;
right: 10px;
bottom: 10px;
}
}
}
}
}
}
}
......
......@@ -9,7 +9,7 @@
</div>
<div class="button-list-right">
<div v-for="(item, index) in modules.rightModule"
:class="['module-info', isSelected-3 == index ? 'selectedModule' : '']" @click="choiceModule(index+3)"
:class="['module-info', isSelected - 3 == index ? 'selectedModule' : '']" @click="choiceModule(index + 3)"
v-text="item.name">
</div>
</div>
......@@ -340,6 +340,7 @@ export default {
background-size: 100% 105%;
background-repeat: no-repeat;
color: white;
.ant-layout-header {
background: none;
}
......@@ -354,6 +355,7 @@ export default {
font-size: 13px;
letter-spacing: 2px;
font-weight: 900;
h1 {
font-size: 34px;
letter-spacing: 7px;
......@@ -362,7 +364,8 @@ export default {
margin-bottom: 0px !important;
font-family: cursive;
text-align: center;
span{
span {
background-image: linear-gradient(to right, #498ce1, #75f8d2, #498ce1);
color: transparent;
-webkit-background-clip: text;
......@@ -848,5 +851,4 @@ export default {
transition: all 0.4s ease;
cursor: pointer;
}
}
</style>
\ No newline at end of file
}</style>
\ No newline at end of file
<template>
<div class="ddkzConfig">
<el-tabs type="border-card" @tab-click="handleTabClick" v-model="activeTabs">
<el-tab-pane>
<span slot="label"><i class="el-icon-date"></i> 新增会议</span>
<DdkzConfigAdd></DdkzConfigAdd>
</el-tab-pane>
<el-tab-pane>
<span slot="label"><i class="el-icon-date"></i> 会议列表</span>
<DdkzConfigList></DdkzConfigList>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import ddkzConfigAdd from '../sjgl/ddkzConfig/ddkzConfigAdd.vue';
import ddkzConfigList from '../sjgl/ddkzConfig/ddkzConfigList.vue';
export default {
data() {
return {
activeTabs: ''
}
},
components:{
DdkzConfigAdd:ddkzConfigAdd,
DdkzConfigList:ddkzConfigList
},
methods: {
handleTabClick() {
}
}
}
</script>
<style lang="scss">
.ddkzConfig {
width: 99%;
height: 98%;
padding: 30px;
box-sizing: border-box;
overflow-y: auto;
>.el-tabs--border-card {
width: calc(100% - 4px);
height: calc(100% - 4px);
border: 2px solid #125473;
border-radius: 5px;
box-sizing: border-box;
background: #ffffff00;
>.el-tabs__content {
width: 100%;
height: calc(100% - 40px);
box-sizing: border-box;
}
>.el-tabs__header {
background-color: unset;
border-bottom: 2px solid #125473;
.el-tabs__item {
color: #dedede;
}
.el-tabs__item.is-active {
color: #ffe000;
background-color: #116791;
border-right-color: #116791;
border-left-color: #116791;
}
.el-tabs__item:not(.is-disabled):hover {
color: #ffe000;
}
}
}
}
</style>
\ No newline at end of file
<template>
<div class="addDdkzConfig">
<el-form class="myForm" label-position="right" label-width="200px" :model="formData">
<el-form-item label="议题">
<el-input v-model="formData.nickname"></el-input>
</el-form-item>
<el-form-item label="聊天室主持人">
<!-- <el-input v-model="formData.chatroomOwner"></el-input> -->
<el-select v-model="formData.chatroomOwner" placeholder="请选择">
<el-option v-for="item in allData" :key="item.account" :label="item.account" :value="item.account">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="备注">
<el-input v-model="formData.conRemark"></el-input>
</el-form-item>
<el-form-item label="与会方">
<div>
<el-button type="primary" @click="addTeam">增加与会方</el-button>
</div>
<el-form class="yhf" v-for="(item, index) in formData.teams" :key="index">
<el-form-item label="队伍名称">
<el-input v-model="item.teamName"></el-input>
</el-form-item>
<el-form-item label="参会立场">
<el-select v-model="item.teamType" placeholder="请选择">
<el-option v-for="item in teamType" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="参会人员">
<div class="PackView_transfer">
<div class="ta-transfer">
<div class="ta-transfer_left">
<div class="transfer-view-head">
<div class="head_left">
<el-checkbox :indeterminate="item.invoking.isIndeterminate"
:disabled='allData.length == 0' v-model="item.invoking.checkAll"
@change="handleCheckAllChange($event, index, true)">人员列表</el-checkbox>
</div>
<div class="head_right">
<span>{{ item.invoking.selected_num }}</span>
<span>/</span>
<span>{{ allData.length }}</span>
</div>
</div>
<div class="transfer-view-main">
<el-checkbox-group v-model="item.invoking.checkedCities"
@change="handleCheckedCitiesChange($event, index, true)">
<div class="transfer-view-item" v-for="(item1, index1) in allData">
<el-checkbox :label="item1.id" :key="item1.account">{{ item1.account
}}</el-checkbox>
</div>
</el-checkbox-group>
</div>
</div>
<div class="ta-transfer_btn">
<el-button type="primary" :disabled='item.parameter.selected_num == 0'
@click="removeGoods(index)" icon="el-icon-arrow-left">离席</el-button>
<el-button type="primary" :disabled='item.invoking.selected_num == 0'
@click='addRemoveGoods(index)'>参会
<i class="el-icon-arrow-right el-icon--right"></i>
</el-button>
</div>
<div class="ta-transfer_right">
<div class="transfer-view-head">
<div class="head_left">
<el-checkbox :indeterminate="item.parameter.isIndeterminate"
:disabled='item.wpinfo.length == 0' v-model="item.parameter.checkAll"
@change="handleCheckAllChange($event, index)">
参会人员
</el-checkbox>
</div>
<div class="head_right">
<span>{{ item.parameter.selected_num }}</span>
<span>/</span>
<span>{{ item.wpinfo.length }}</span>
</div>
</div>
<div class="transfer-view-main">
<el-checkbox-group v-model="item.parameter.checkedCities"
@change="handleCheckedCitiesChange($event, index)">
<div class="transfer-view-item" v-for="(item1, index1) in item.wpinfo">
<el-checkbox :label="item1.id" :key="item1.account">{{ item1.account
}}</el-checkbox>
</div>
</el-checkbox-group>
</div>
</div>
</div>
</div>
</el-form-item>
</el-form>
</el-form-item>
<el-form-item>
<el-button type="success" @click="createMeeting">创建会议</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import { getUserList } from '@/api/user.js';
import { getTime_extent } from '@/util/http_util.js';
import { createChatRoom } from '@/api/chat/chatRoom.js';
export default {
data() {
return {
formData: {
chatroomOwner: '',
conRemark: '',
nickname: '',
chatroomHeadPic: '',
teams: [
{
createTime: '',
member: [],
teamName: '',
teamType: '',
invoking: {
checkedCities: [],
selected_num: 0,
isIndeterminate: false,
checkAll: false
},
parameter: {
isIndeterminate: false,
checkAll: false,
checkedCities: [],
selected_num: 0,
dataAll: []
},
wpinfo: []
}
]
},
value: [],
teamType: [
{ value: 'DIRECTOR', label: '中立方' },
{ value: 'RED', label: '红方' },
{ value: 'BLUE', label: '蓝方' },
{ value: 'OTHER', label: '其他方' }
],
// dataAll: [],
allData: [],
tmpArr:[],
bgData: [
{
invoking: {
checkedCities: [],
selected_num: 0,
isIndeterminate: false,
checkAll: false
},
parameter: {
isIndeterminate: false,
checkAll: false,
checkedCities: [],
selected_num: 0,
dataAll: []
},
wpinfo: []
}
],
userList: []
};
},
methods: {
addTeam() {
this.formData.teams.push(
{
createTime: '',
member: [],
teamName: '',
teamType: '',
invoking: {
checkedCities: [],
selected_num: 0,
isIndeterminate: false,
checkAll: false
},
parameter: {
isIndeterminate: false,
checkAll: false,
checkedCities: [],
selected_num: 0,
dataAll: []
},
wpinfo: []
}
);
},
addRemoveGoods(index) { //添加或者删除物品
let formData = this.formData.teams[index].invoking.checkedCities
for (const key in formData) {
for (const k in this.allData) {
if (this.allData[k].id == formData[key]) {
this.formData.teams[index].wpinfo.push.apply(this.formData.teams[index].wpinfo, this.allData.splice(k, 1))
}
}
}
for (const key in this.formData.teams[index].wpinfo) {
this.formData.teams[index].parameter.dataAll.push(this.formData.teams[index].wpinfo[key].id)
}
this.formData.teams[index].invoking.selected_num = 0
this.formData.teams[index].invoking.isIndeterminate = false
this.formData.teams[index].invoking.checkedCities = []
this.formData.teams[index].invoking.checkAll = false
},
removeGoods(index) { //拿出
let formData = this.formData.teams[index].parameter.checkedCities
for (const key in formData) {
for (const k in this.formData.teams[index].wpinfo) {
if (this.formData.teams[index].wpinfo[k].id == formData[key]) {
this.allData.push.apply(this.allData, this.formData.teams[index].wpinfo.splice(k, 1))
}
}
}
this.formData.teams[index].parameter.selected_num = 0
this.formData.teams[index].parameter.isIndeterminate = false
this.formData.teams[index].parameter.checkedCities = []
this.formData.teams[index].parameter.checkAll = false
},
// ----------------------------
handleCheckAllChange(val, index, falg) { //点击全选
let tmpArr = [];
this.allData.forEach(item=>{
tmpArr.push(item.id);
});
if (falg) {
this.formData.teams[index].invoking.checkedCities = val ? tmpArr : [];
this.formData.teams[index].invoking.selected_num = val ? tmpArr.length : 0
this.formData.teams[index].invoking.isIndeterminate = false;
} else {
this.formData.teams[index].parameter.checkedCities = val ? this.formData.teams[index].parameter.dataAll : []
this.formData.teams[index].parameter.selected_num = val ? this.formData.teams[index].parameter.dataAll.length : 0
this.formData.teams[index].parameter.isIndeterminate = false;
}
},
handleCheckedCitiesChange(value, index, falg) { //判断是否触发全选
if (falg) {
this.formData.teams[index].invoking.selected_num = value.length
value.length >= 1 ? this.formData.teams[index].invoking.isIndeterminate = true : this.formData.teams[index].invoking.isIndeterminate = false
if (this.allData.length == value.length) {
this.formData.teams[index].invoking.checkAll = true
this.formData.teams[index].invoking.isIndeterminate = false
} else {
this.formData.teams[index].invoking.checkAll = false
}
} else {
this.formData.teams[index].parameter.selected_num = value.length
value.length >= 1 ? this.formData.teams[index].parameter.isIndeterminate = true : this.formData.teams[index].parameter.isIndeterminate = false
if (this.formData.teams[index].wpinfo.length == value.length) {
this.formData.teams[index].parameter.checkAll = true
this.formData.teams[index].parameter.isIndeterminate = false
} else {
this.formData.teams[index].parameter.checkAll = false
}
}
},
getUserList() {
getUserList().then(res => {
this.allData = res;
this.tmpArr = res;
})
},
createMeeting() {
this.formData.teams.forEach(item => {
item.createTime = getTime_extent(0).currentDate;
item.wpinfo.forEach(item1 => {
item.member.push(item1.account);
})
});
createChatRoom(this.formData).then(res => {
if (res == '创建成功') {
this.$message.success('聊天室创建成功!');
}
}).catch(error => {
this.$message.error(error);
})
}
},
watch: {
'formData.chatroomOwner'(newVal, oldVal) {
let tmp = this.tmpArr.filter(item => { return item.account == oldVal });
if (tmp.length>0) {
this.allData.push(tmp[0]);
}
this.allData = this.allData.filter(item => { return item.account != newVal });
}
},
mounted() {
this.getUserList();
}
}
</script>
<style lang="scss">
.addDdkzConfig {
width: 100%;
height: 100%;
overflow-y: auto;
.myForm {
.el-input {
.el-input__inner {
width: 40%;
color: white !important;
background: none !important;
border: 1px solid #3a5f94c9 !important;
box-shadow: 0 0 10px #3a5f94c9;
}
}
.el-select {
.el-input__inner {
width: 200px;
}
}
}
.yhf {
width: 48%;
float: left;
margin-top: 2%;
margin-left: 1%;
border: 1px solid #3a5f94c9;
padding: 20px;
box-sizing: border-box;
border-radius: 4px;
&>div:first-child,
&>:nth-child(2) {
margin-top: 10px;
display: flex;
&>div:first-child {
width: 150px;
}
.el-input__inner {
width: 200px;
}
}
.el-transfer-panel {
width: 170px !important;
}
.myTransfer {
margin-top: 30px;
}
.ta-transfer {
width: 100%;
height: 400px;
margin-bottom: 50px;
box-sizing: border-box;
display: flex;
justify-content: space-between;
align-items: center;
.ta-transfer_left,
.ta-transfer_right {
width: 30%;
height: 100%;
background-color: #ffffff;
border: 1px solid #ebeef5;
border-radius: 5px;
.transfer-view-head {
width: 100%;
height: 50px;
background-color: #f5f7fa;
border-bottom: 1px solid #ebeef5;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 10px;
box-sizing: border-box;
.head_left {
display: flex;
width: 70%;
height: 100%;
.el-checkbox {
display: flex;
align-items: center;
height: 100%;
width: 100%;
}
.el-checkbox__label {
font-size: 16px;
}
}
.head_right {
width: 30%;
span {
font-size: 14px;
color: #909399;
}
}
}
.transfer-view-main {
width: 100%;
height: calc(100% - 50px);
padding: 10px 10px 0 10px;
box-sizing: border-box;
overflow-y: auto;
.transfer-view-item {
margin-bottom: 10px;
width: 100%;
height: 20px;
// background-color: #c5c1c1;
display: flex;
align-items: center;
.el-checkbox {
display: flex;
align-items: center;
width: 100%;
height: 100%;
.el-checkbox__label {
color: #606266;
}
.el-checkbox__input.is-checked+.el-checkbox__label {
color: #409eff;
}
}
.el-checkbox:hover {
.el-checkbox__label {
color: #409eff;
}
}
}
}
}
.ta-transfer_btn {
display: flex;
justify-content: center;
align-items: center;
width: 30%;
height: 100px;
}
}
}
.el-form-item__label {
color: white;
}
}
</style>
\ No newline at end of file
<template>
<div class="ddkzConfigList">
<div class="ddkzCondition">
<el-date-picker value-format="yyyy-MM-dd HH:mm:ss" v-model="dateRange" type="daterange" range-separator="至"
start-placeholder="开始时间" end-placeholder="结束时间" :default-time="['00:00:00', '23:59:59']">
</el-date-picker>
<div class="searchButton" @click="searchChatList">搜索</div>
</div>
<div class="ddkzContent">
<el-table :data="meetingList" tooltip-effect="dark" style="width: 100%;" height="calc(100% - 60px)"
@selection-change="handleSelectionChange">
<!-- <el-table-column type="selection" width="55">
</el-table-column> -->
<el-table-column prop="nickname" label="主题" align="center"></el-table-column>
<el-table-column prop="chatroomOwner" label="支持人" align="center"></el-table-column>
<el-table-column prop="createTime" label="日期" align="center"></el-table-column>
<!-- <el-table-column label="操作" align="center" width="500">
<template slot-scope="scope">
<el-button size="mini" type="danger" @click="deleteMeeting(scope.row)">删除</el-button>
</template>
</el-table-column> -->
</el-table>
</div>
</div>
</template>
<script>
import { getChatRoomList } from "@/api/chat/chatRoom";
export default {
data() {
return {
dateRange: [],
meetingList: []
}
},
methods: {
handleSelectionChange() { },
deleteMeeting(item) { },
queryChatRoomListFn(param) {
getChatRoomList(param).then(res => {
this.meetingList = res;
});
},
searchChatList(){
if(this.dateRange.length==2){
this.queryChatRoomListFn({startTime:this.dateRange[0],endTime:this.dateRange[1],userId:this.userInfo.account})
}else{
this.queryChatRoomListFn({userId:this.userInfo.account})
}
}
},
computed: {
userInfo() {
if (this.$store.getters.userInfo) {
return this.$store.getters.userInfo;
} else {
return { account: "" };
}
}
},
mounted() {
this.queryChatRoomListFn({userId:this.userInfo.account});
}
}
</script>
<style lang="scss">
.ddkzConfigList {
width: 100%;
height: 100%;
.ddkzCondition {
width: 100%;
height: 80px;
display: flex;
.el-date-editor {
background: none;
span {
color: white;
}
.el-range-input {
color: white;
background: none;
}
}
.el-input__inner {
border: 1px solid #3a5f94c9 !important;
}
.searchButton {
width: 80px;
height: 30px;
line-height: 30px;
margin-top: 4px;
margin-left: 20px;
font-size: 14px;
text-align: center;
// background-image: url(../../../assets/img/fzjc/7.png);
background-size: 100% 100%;
background-repeat: no-repeat;
border: 1px solid #3a5f94c9 !important;
border-radius: 5px;
cursor: pointer;
}
}
.ddkzContent {
width: 100%;
height: calc(100% - 50px);
overflow-y: auto;
.el-table tr {
background-color: transparent !important;
color: #ffffffc7;
}
.el-table thead tr {
height: 40px;
background: url(../../../assets/img/setting/tr1.png) no-repeat;
background-size: 100% 100%;
}
.el-table th {
background-color: transparent;
}
tbody tr {
border-bottom: 1px solid #252631;
}
.el-table td {
border-bottom: 1px solid #252631;
border-right: unset;
}
.el-table--enable-row-hover .el-table__body tr:hover>td {
background-color: #82848a78;
}
.el-table th {
border: unset;
}
.el-table--fit {
background: none !important;
border: unset;
}
.el-icon-delete-solid {
color: red;
cursor: pointer;
font-size: 18px;
}
.el-icon-edit {
color: #1172d8;
cursor: pointer;
font-size: 20px;
}
.el-icon-view {
color: #00ffff;
font-size: 20px;
cursor: pointer;
}
.el-table--group::after,
.el-table--border::after,
.el-table::before {
background-color: unset;
}
.pagination-div {
width: 100%;
height: 50px;
.el-pagination {
margin-top: 9px;
text-align: right;
.el-pagination__total {
color: white;
}
.el-pagination__jump {
color: white;
}
}
.myPagination.is-background .el-pager li:not(.disabled).active {
color: #fff;
border: 1px solid #146a80;
box-shadow: 0 0 10px #1b6097;
background-color: #1d2d46;
}
}
}
}
</style>
\ No newline at end of file
......@@ -13,6 +13,11 @@ module.exports = {
filename: '[name].[contenthash:8].js',
path: path.resolve(__dirname, './dist') // 打包后的目录
},
resolve:{
alias:{
'@':path.join(__dirname,'./src/')
}
},
plugins: [
new HtmlWebpackPlugin({
template: path.resolve(__dirname, './index.html'),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment