Commit 0d88cc7c authored by 张冬's avatar 张冬

开标大厅样式和上传等待

parent ba1041d5
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -171,6 +171,7 @@ img { ...@@ -171,6 +171,7 @@ img {
position: absolute; position: absolute;
right: 10px; right: 10px;
bottom: 10px; bottom: 10px;
width: 400px;
} }
.content-head > h3 { .content-head > h3 {
font-weight: bold; font-weight: bold;
......
<template> <template>
<div class="hello"> <div class="hello">
<el-upload <el-upload
  
:on-remove="handleRemove" :on-remove="handleRemove"
:on-success="handleSuccess" :on-success="handleSuccess"
:before-remove="beforeRemove" :before-remove="beforeRemove"
...@@ -12,7 +13,7 @@ ...@@ -12,7 +13,7 @@
:http-request="handleUpload" :http-request="handleUpload"
multiple multiple
> >
<el-button size="small" type="primary">点击上传</el-button> <el-button size="small" type="primary" v-loading.fullscreen.lock="loading">点击上传</el-button>
<div slot="tip" class="el-upload__tip"> <div slot="tip" class="el-upload__tip">
{{ tip }} {{ tip }}
</div> </div>
...@@ -97,6 +98,7 @@ export default { ...@@ -97,6 +98,7 @@ export default {
this.$emit('input', value); this.$emit('input', value);
}, },
beforeUpload(file) { beforeUpload(file) {
this.loading=true
const max = this.max; const max = this.max;
const isLt2M = file.size / 1024 / 1024 < max; const isLt2M = file.size / 1024 / 1024 < max;
if (!isLt2M) { if (!isLt2M) {
...@@ -114,6 +116,7 @@ export default { ...@@ -114,6 +116,7 @@ export default {
console.log(res); console.log(res);
this.fileList.push(res); this.fileList.push(res);
this.emitInput(this.fileList); this.emitInput(this.fileList);
this.loading=false
}); });
}, },
handleRemove(file, fileList, index) { handleRemove(file, fileList, index) {
...@@ -121,9 +124,6 @@ export default { ...@@ -121,9 +124,6 @@ export default {
this.fileList = fileList; this.fileList = fileList;
this.emitInput(fileList); this.emitInput(fileList);
}, },
// handlePreview(file) {
// this.$emit('on-preview', file);
// },
beforeRemove(file, fileList) { beforeRemove(file, fileList) {
return this.$confirm(`确定移除 ${file.name}?`); return this.$confirm(`确定移除 ${file.name}?`);
}, },
......
...@@ -98,4 +98,5 @@ export default { ...@@ -98,4 +98,5 @@ export default {
.sidebar > ul { .sidebar > ul {
height: 100%; height: 100%;
} }
.el-menu-item i{color:#AFB0B3}
</style> </style>
<template> <template>
<div> <div>
<div class="content"> <div>
<dataBreadcrumb :breads="breads"></dataBreadcrumb> <dataBreadcrumb :breads="breads"></dataBreadcrumb>
<div>中国标准时间:{{ currentTime }}</div> <div class="back-fff" style="padding: 10px 0 0 10px">中国标准时间:{{ currentTime }}</div>
<div class="hal"> <div class="hal">
<h2 style="text-align: center;">{{projectName}}项目开标大厅</h2> <h2 class="back-fff" style="text-align: center">{{ projectName }}项目开标大厅</h2>
<div class="time-message flex-between"> <div class="back-fff flex-center time">
<div class="flex"> <div class="time-message flex-between">
<p>截标倒计时:</p> <div class="flex">
<timeDown :remain-time="remaintime" @countDowmEnd="remaintimeEnd"></timeDown> <p>截标倒计时:</p>
</div> <timeDown :remain-time="remaintime" @countDowmEnd="remaintimeEnd"></timeDown>
<!-- <div class="flex" v-show="decodeTime"> --> </div>
<div class="flex" v-show="openStatus==2"> <!-- <div class="flex" v-show="decodeTime"> -->
<p>解密倒计时:</p> <div class="flex" v-show="openStatus == 2">
<timeDown :remain-time="decodeTime" @countDowmEnd="decodeTimeEnd"></timeDown> <p>解密倒计时:</p>
</div> <timeDown :remain-time="decodeTime" @countDowmEnd="decodeTimeEnd"></timeDown>
<!-- <div class="flex" v-show="signatureTime"> --> </div>
<div class="flex" v-show="openStatus==2"> <!-- <div class="flex" v-show="signatureTime"> -->
<p>签名倒计时:</p> <div class="flex" v-show="openStatus == 2">
<timeDown :remain-time="signatureTime" @countDowmEnd="signatureTimeEnd"></timeDown> <p>签名倒计时:</p>
</div> <timeDown :remain-time="signatureTime" @countDowmEnd="signatureTimeEnd"></timeDown>
</div> </div>
<div class="flex"> </div>
<div class="hal-left"> </div>
<div>
<h1>签到{{leftmessage.signIn}}</h1> <div class="flex">
<h1>解密{{leftmessage.decode}}</h1> <div class="hal-left back-fff flex-colunm">
<h1>签名{{leftmessage.signature}}</h1> <h1>签到{{ leftmessage.signIn }}</h1>
</div> <h1>解密{{ leftmessage.decode }}</h1>
<div @click="isMessge=true">签到解密签名情况</div> <h1>签名{{ leftmessage.signature }}</h1>
</div> <div @click="isMessge = true">签到解密签名情况 ></div>
<div class="hal-center" v-chat-scroll> </div>
<ul> <div class="hal-center back-fff" v-chat-scroll>
<li v-for="(item,index) in halList" :key="index" class="flex-item textheight"> <ul>
<div>{{item.time}}</div> <li v-for="(item, index) in halList" :key="index" class="flex-item textheight">
<div>{{item.name}}</div> <div>{{ item.time }}</div>
<div>{{item.behavior}}</div> <div>{{ item.name }}</div>
</li> <div>{{ item.behavior }}</div>
</ul> </li>
</div> </ul>
<div class="hal-right"> </div>
<el-button @click="isdialogue">在线对话<i class="el-icon-chat-dot-round"></i></el-button> <div class="hal-right">
<div class="button-pos"> <el-button type="primary" @click="isdialogue"><i class="el-icon-chat-dot-round"></i>在线对话</el-button>
<el-button v-if="openStatus==1" type="primary" @click="confirm" style="margin-left: 10px;" :disabled="!openbidButton">立即开标</el-button> <el-button type="primary" @click="openInfo1" :disabled="!endbidButton" v-if="!issueTable">下发开标一览表</el-button>
<el-button v-if="openStatus==2" type="primary" @click="end" style="margin-top: 10px;" :disabled="!endbidButton">结束开标</el-button> <el-button type="primary" @click="openInfo" :disabled="!issueTable">查看开标一览表</el-button>
</div> </div>
</div> <!-- 在线对话 -->
<!-- 在线对话 --> <div class="dialogue" style="margin-top: 30px" v-show="dialogue">
<div class="dialogue" style="margin-top: 30px;" v-show="dialogue"> <JwChat :taleList="dialogueList" scrollType="scroll" @enter="bindEnter" v-model="content" :toolConfig="tool">
<JwChat :taleList="dialogueList" scrollType="scroll" @enter="bindEnter" v-model="content" :toolConfig="tool" > <el-button slot="tools" style="float: right" class="abs" @click="dialogue = false">关闭聊天框</el-button>
<el-button slot="tools" style="float:right" class="abs" @click="dialogue=false">关闭聊天框</el-button> </JwChat>
</JwChat> </div>
</div> <!--
<!--
<ul class="dialogueList" v-chat-scroll> <ul class="dialogueList" v-chat-scroll>
<li v-for="(item,index) in dialogueList" :key="index" :class="myId==item.userId?'flex-left':'flex-right'"> <li v-for="(item,index) in dialogueList" :key="index" :class="myId==item.userId?'flex-left':'flex-right'">
<div> <div>
...@@ -68,649 +67,647 @@ ...@@ -68,649 +67,647 @@
<el-input placeholder="请输入内容" v-model="content" clearable @keyup.enter.native="send" maxlength="30"> <el-input placeholder="请输入内容" v-model="content" clearable @keyup.enter.native="send" maxlength="30">
</el-input> </el-input>
</div> --> </div> -->
</div> </div>
<!-- 最下面一栏 --> <!-- 最下面一栏 -->
<div class="flex-between buttons"> <div class="flex-center buttons">
<el-button @click="isfailInfo=true" v-if="!isFailed">流标</el-button> <div>
<el-button @click="failDetail" v-else>流标信息</el-button> <el-button type="primary" @click="isfailInfo = true" v-if="!isFailed">流标</el-button>
<div> <el-button type="primary" @click="failDetail" v-else>流标信息</el-button>
<!-- <el-button icon="el-icon-refresh" @click="refrsh">刷新</el-button> --> </div>
<el-button @click="openInfo1" :disabled="!endbidButton" v-if="!issueTable">下发开标一览表</el-button> <div>
<el-button @click="openInfo" :disabled="!issueTable">查看开标一览表</el-button> <el-button type="primary" @click="back">退出大厅</el-button>
</div> </div>
<el-button @click="back">退出大厅<i class="el-icon-right"></i></el-button> <div>
</div> <!-- <el-button icon="el-icon-refresh" @click="refrsh">刷新</el-button> -->
</div> <el-button
<!--确认开标窗口 --> v-if="openStatus == 1"
<el-dialog :visible.sync="isOpenbid" title="确认开标" width="35%"> type="primary"
<div class="flex bid-message" style="width: 70%;margin:0 auto"> @click="confirm"
<div>项目编号:{{projectCode}}</div> style="margin-left: 10px"
<div>项目名称:{{ projectName}}</div> :disabled="!openbidButton"
<div style="margin-right:120px;">投标人数:{{startDetail.bidFileCount}}</div> >立即开标</el-button
<div>缴纳保证金人数:{{startDetail.earnestFeeCount}}</div> >
<div>签到人数:{{startDetail.signInCount}}</div> <el-button v-if="openStatus == 2" type="primary" @click="end" style="margin-top: 10px" :disabled="!endbidButton"
</div> >结束开标</el-button
<div slot="footer" class="dialog-footer"> >
<el-button @click="isOpenbid = false">取消开标</el-button> </div>
<el-button type="primary" @click="openbid">确定开标 </el-button> </div>
</div> </div>
</el-dialog> <!--确认开标窗口 -->
<!-- 详细信息 --> <el-dialog :visible.sync="isOpenbid" title="确认开标" width="35%">
<el-dialog :visible.sync="isMessge" title="详细信息" width="60%"> <div class="flex bid-message" style="width: 70%; margin: 0 auto">
<dataTable :columns="columns" :page-obj="pageObj" :margin-top="0" :margin-bottom="0" url="/open-bid/sign/detail"> <div>项目编号:{{ projectCode }}</div>
<el-table-column slot="operate" label="是否买断账期" align="center" fixed="right"> <div>项目名称:{{ projectName }}</div>
<template slot-scope="scope"> <div style="margin-right: 120px">投标人数:{{ startDetail.bidFileCount }}</div>
<div v-if="scope.row.isPayment"></div> <div>缴纳保证金人数:{{ startDetail.earnestFeeCount }}</div>
<div v-else></div> <div>签到人数:{{ startDetail.signInCount }}</div>
</template> </div>
</el-table-column> <div slot="footer" class="dialog-footer">
<el-table-column slot="operate" label="是否递交投标文件" align="center" fixed="right"> <el-button @click="isOpenbid = false">取消开标</el-button>
<template slot-scope="scope"> <el-button type="primary" @click="openbid">确定开标 </el-button>
<div v-if="scope.row.bidFileId"></div> </div>
<div v-else></div> </el-dialog>
</template> <!-- 详细信息 -->
</el-table-column> <el-dialog :visible.sync="isMessge" title="详细信息" width="60%">
<el-table-column slot="operate" label="签到" align="center" fixed="right"> <dataTable :columns="columns" :page-obj="pageObj" :margin-top="0" :margin-bottom="0" url="/open-bid/sign/detail">
<template slot-scope="scope"> <el-table-column slot="operate" label="是否买断账期" align="center" fixed="right">
<div v-if="scope.row.signIn"></div> <template slot-scope="scope">
<div v-else></div> <div v-if="scope.row.isPayment"></div>
</template> <div v-else></div>
</el-table-column> </template>
<el-table-column slot="operate" label="解密" align="center" fixed="right"> </el-table-column>
<template slot-scope="scope"> <el-table-column slot="operate" label="是否递交投标文件" align="center" fixed="right">
<div v-if="scope.row.decode"></div> <template slot-scope="scope">
<div v-else></div> <div v-if="scope.row.bidFileId"></div>
</template> <div v-else></div>
</el-table-column> </template>
<el-table-column slot="operate" label="签名" align="center" fixed="right"> </el-table-column>
<template slot-scope="scope"> <el-table-column slot="operate" label="签到" align="center" fixed="right">
<div v-if="scope.row.signature"></div> <template slot-scope="scope">
<div v-else></div> <div v-if="scope.row.signIn"></div>
</template> <div v-else></div>
</el-table-column> </template>
</dataTable> </el-table-column>
<div slot="footer" class="dialog-footer"> <el-table-column slot="operate" label="解密" align="center" fixed="right">
<el-button @click="isMessge = false">关闭</el-button> <template slot-scope="scope">
</div> <div v-if="scope.row.decode"></div>
</el-dialog> <div v-else></div>
<!-- 开标一览表 --> </template>
<el-dialog :visible.sync="isopenInfo" title="开标一览表"> </el-table-column>
<nopageTable :tableData="tableData" :columns="nopagecolumns" :margin-top="0" :margin-bottom="0"> <el-table-column slot="operate" label="签名" align="center" fixed="right">
</nopageTable> <template slot-scope="scope">
<div slot="footer" class="dialog-footer"> <div v-if="scope.row.signature"></div>
<el-button @click="isopenInfo=false">关闭 </el-button> <div v-else></div>
</div> </template>
</el-dialog> </el-table-column>
<!-- 下发开标一览表 --> </dataTable>
<el-dialog :visible.sync="isopenInfo1" title="下发开标一览表"> <div slot="footer" class="dialog-footer">
<nopageTable :tableData="tableData" :columns="nopagecolumns" :margin-top="0" :margin-bottom="0"> <el-button @click="isMessge = false">关闭</el-button>
</nopageTable> </div>
<div slot="footer" class="dialog-footer"> </el-dialog>
<el-button @click="isopenInfo1=false">关闭 </el-button> <!-- 开标一览表 -->
<el-button @click="issue" type="primary">下发 </el-button> <el-dialog :visible.sync="isopenInfo" title="开标一览表">
</div> <nopageTable :tableData="tableData" :columns="nopagecolumns" :margin-top="0" :margin-bottom="0"> </nopageTable>
</el-dialog> <div slot="footer" class="dialog-footer">
<!-- 流标框提交 --> <el-button @click="isopenInfo = false">关闭 </el-button>
<el-dialog :visible.sync="isfailInfo" title="流标"> </div>
<el-form :model="form" :rules="rules" ref="form" label-width="100px"> </el-dialog>
<el-form-item label="操作人"> <!-- 下发开标一览表 -->
<div>{{userName}}</div> <el-dialog :visible.sync="isopenInfo1" title="下发开标一览表">
</el-form-item> <nopageTable :tableData="tableData" :columns="nopagecolumns" :margin-top="0" :margin-bottom="0"> </nopageTable>
<el-form-item label="流标原因" prop="reason"> <div slot="footer" class="dialog-footer">
<el-input v-model.trim="form.reason" maxlength="300" type="textarea" :rows="2"></el-input> <el-button @click="isopenInfo1 = false">关闭 </el-button>
</el-form-item> <el-button @click="issue" type="primary">下发 </el-button>
<el-form-item label="上传附件"> </div>
<singleUpload :limit="1" :max="10" tip="支持上传1份附件,不差过10M." @input="getfile"></singleUpload> </el-dialog>
</el-form-item> <!-- 流标框提交 -->
</el-form> <el-dialog :visible.sync="isfailInfo" title="流标">
<div slot="footer" class="dialog-footer"> <el-form :model="form" :rules="rules" ref="form" label-width="100px">
<el-button @click="isfailInfo = false">取 消</el-button> <el-form-item label="操作人">
<el-button type="primary" @click="failbid">确 定</el-button> <div>{{ userName }}</div>
</div> </el-form-item>
</el-dialog> <el-form-item label="流标原因" prop="reason">
<!-- 流标详情 --> <el-input v-model.trim="form.reason" maxlength="300" type="textarea" :rows="2"></el-input>
<el-dialog :visible.sync="isfailDetail" title="流标信息"> </el-form-item>
<el-form :model="form" :rules="rules" ref="form" label-width="100px"> <el-form-item label="上传附件">
<el-form-item label="操作人"> <singleUpload :limit="1" :max="10" tip="支持上传1份附件,不差过10M." @input="getfile"></singleUpload>
<div>{{userName}}</div> </el-form-item>
</el-form-item> </el-form>
<el-form-item label="流标原因" prop="reason"> <div slot="footer" class="dialog-footer">
<div>{{faildetail.reason}}</div> <el-button @click="isfailInfo = false">取 消</el-button>
</el-form-item> <el-button type="primary" @click="failbid">确 定</el-button>
<el-form-item label="上传附件" v-if="faildetail.fileName"> </div>
<div @click="down(faildetail.fileUrl)">{{faildetail.fileName}}</div> </el-dialog>
</el-form-item> <!-- 流标详情 -->
</el-form> <el-dialog :visible.sync="isfailDetail" title="流标信息">
<div slot="footer" class="dialog-footer"> <el-form :model="form" :rules="rules" ref="form" label-width="100px">
<el-button @click="isfailDetail= false">取 消</el-button> <el-form-item label="操作人">
</div> <div>{{ userName }}</div>
</el-dialog> </el-form-item>
</div> <el-form-item label="流标原因" prop="reason">
</div> <div>{{ faildetail.reason }}</div>
</el-form-item>
<el-form-item label="上传附件" v-if="faildetail.fileName">
<div @click="down(faildetail.fileUrl)">{{ faildetail.fileName }}</div>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="isfailDetail = false">取 消</el-button>
</div>
</el-dialog>
</div>
</div>
</template> </template>
<script> <script>
import { import { openUrl } from '@utils/common';
openUrl import { getTime } from '@utils/time';
} from '@utils/common' import {
import { timeInfo,
getTime startInfo,
} from '@utils/time' openInfo,
import { signdetail,
timeInfo, startbid,
startInfo, openbidFailed,
openInfo, bidFaileddetail,
signdetail, bidFinish,
startbid, issueopenInfo
openbidFailed, } from '@api/purchaser/bid';
bidFaileddetail, import dataBreadcrumb from '@components/dataBreadcrumb.vue';
bidFinish, import timeDown from '@components/timeDown.vue';
issueopenInfo import dataTable from '@components/dataTable.vue';
} from '@api/purchaser/bid' import nopageTable from '@components/nopageTable.vue';
import dataBreadcrumb from '@components/dataBreadcrumb.vue' import singleUpload from '@components/Upload/Upload.vue';
import timeDown from '@components/timeDown.vue' export default {
import dataTable from '@components/dataTable.vue' components: {
import nopageTable from '@components/nopageTable.vue' dataBreadcrumb,
import singleUpload from '@components/Upload/Upload.vue' timeDown,
export default { dataTable,
components: { nopageTable,
dataBreadcrumb, singleUpload
timeDown, },
dataTable, data() {
nopageTable, return {
singleUpload tool: {
}, show: ['11'],
data() { callback: this.toolEvent,
return { showEmoji: false
tool: { },
show: ['11'], issueTable: false,
callback: this.toolEvent, openStatus: '',
showEmoji: false, faildetail: '',
}, isfailDetail: false,
issueTable: false, projectCode: '',
openStatus: '', projectName: '',
faildetail: "", userName: '',
isfailDetail: false, isFailed: true,
projectCode: "", rules: {
projectName: "", reason: [
userName: "", {
isFailed: true, required: true,
rules: { message: '请输入',
reason: [{ trigger: 'blur'
required: true, }
message: '请输入', ]
trigger: 'blur' },
}] form: {
}, reason: '',
form: { filePOList: []
reason: '', },
filePOList: [] isfailInfo: false,
}, endbidButton: false,
isfailInfo: false, tableData: [],
endbidButton: false, isopenInfo: false,
tableData: [], isopenInfo1: false,
isopenInfo: false, startDetail: '',
isopenInfo1: false, dialogue: false,
startDetail: "", remaintime: '',
dialogue: false, storagedecodeTime: '',
remaintime: "", storagesignatureTime: '',
storagedecodeTime: "", decodeTime: '',
storagesignatureTime: "", signatureTime: '',
decodeTime: "", isMessge: false,
signatureTime: "", pageObj: {
isMessge: false, size: 10,
pageObj: { currentPage: 1,
size: 10, func: (currentPage) => {
currentPage: 1, this.pageTurning(currentPage);
func: (currentPage) => { }
this.pageTurning(currentPage) },
} nopagecolumns: [
}, {
nopagecolumns: [{ label: '投标人名称',
label: '投标人名称', prop: 'companyName'
prop: 'companyName' },
}, {
{ label: '投标报价(元)',
label: '投标报价(元)', prop: 'price'
prop: 'price' },
}, {
{ label: '是否签名',
label: '是否签名', prop: 'isSign'
prop: 'isSign', }
}, ], //
], // columns: [
columns: [{ {
label: '投标公司', label: '投标公司',
prop: 'companyName' prop: 'companyName'
}, },
{ {
label: '联系人', label: '联系人',
prop: 'contactsName' prop: 'contactsName'
}, },
{ {
label: '手机号', label: '手机号',
prop: 'phone' prop: 'phone'
}, },
{ {
slot: 'operate' slot: 'operate'
} }
], // ], //
isOpenbid: false, isOpenbid: false,
buttonWords: '立即开标', buttonWords: '立即开标',
openbidButton: false, openbidButton: false,
halList: [], halList: [],
minutes: '', minutes: '',
seconds: '', seconds: '',
currentTime: '', currentTime: '',
breads: ['招标管理', '招标项目管理', '工作台'], breads: ['招标管理', '招标项目管理', '工作台'],
websock: null, websock: null,
content: "", content: '',
dialogueList: [], dialogueList: [],
myId: "", myId: '',
leftmessage: "", leftmessage: '',
timer: "" timer: ''
} };
}, },
created() { created() {
this.projectCode = localStorage.getItem("projectCode") this.projectCode = localStorage.getItem('projectCode');
this.projectName = localStorage.getItem("projectName") this.projectName = localStorage.getItem('projectName');
this.userName = JSON.parse(localStorage.getItem("userInfo")).name this.userName = JSON.parse(localStorage.getItem('userInfo')).name;
// this.gettimeInfo(); // this.gettimeInfo();
this.getsigndetail(); this.getsigndetail();
this.myId = JSON.parse(localStorage.getItem("userInfo")).userId this.myId = JSON.parse(localStorage.getItem('userInfo')).userId;
this.pageObj.companyId = localStorage.getItem("companyId") this.pageObj.companyId = localStorage.getItem('companyId');
this.pageObj.projectId = localStorage.getItem("projectId") this.pageObj.projectId = localStorage.getItem('projectId');
// 中国标准时间 // 中国标准时间
let currentTime = getTime() let currentTime = getTime();
this.currentTime = currentTime this.currentTime = currentTime;
this.timer1 = setInterval(() => { this.timer1 = setInterval(() => {
let currentTime = getTime() let currentTime = getTime();
this.currentTime = currentTime this.currentTime = currentTime;
}, 1000) }, 1000);
// websocket // websocket
this.createWebSocket() this.createWebSocket();
// 长轮训获取 // 长轮训获取
this.timer = setInterval(() => { this.timer = setInterval(() => {
this.getsigndetail() this.getsigndetail();
}, 5000); }, 5000);
}, },
methods: { methods: {
openInfo() { openInfo() {
this.isopenInfo = true this.isopenInfo = true;
this.getopenInfo(); this.getopenInfo();
}, },
openInfo1() { openInfo1() {
this.isopenInfo1 = true this.isopenInfo1 = true;
this.getopenInfo(); this.getopenInfo();
}, },
// 下发 // 下发
async issue() { async issue() {
let projectId = localStorage.getItem("projectId") let projectId = localStorage.getItem('projectId');
try { try {
const { const { msg, code } = await issueopenInfo(projectId);
msg, if (code == 200) {
code this.getsigndetail();
} = await issueopenInfo(projectId) this.$message({
if (code == 200) { message: msg,
this.getsigndetail() type: 'success',
this.$message({ duration: 1500
message: msg, });
type: 'success', this.isopenInfo1 = false;
duration: 1500 }
}) } catch (e) {
this.isopenInfo1 = false console.log(e);
} }
} catch (e) { },
console.log(e) /* refrsh() {
}
},
/* refrsh() {
history.go(0) history.go(0)
}, */ }, */
async end() { async end() {
try { try {
let projectId = localStorage.getItem("projectId") let projectId = localStorage.getItem('projectId');
const { const { msg, code } = await bidFinish(projectId);
msg, if (code == 200) {
code this.$message({
} = await bidFinish(projectId) message: msg,
if (code == 200) { type: 'success',
this.$message({ duration: 1500
message: msg, });
type: 'success', setTimeout(() => {
duration: 1500 this.$router.go(-1);
}) }, 1500);
setTimeout(() => { } else {
this.$router.go(-1) this.$message.error(msg);
}, 1500) }
} else { } catch (e) {
this.$message.error(msg) console.log(e);
} }
} catch (e) { },
console.log(e) down(url) {
} window.open(url);
}, },
down(url) { // 流标详情
window.open(url) async failDetail() {
}, this.isfailDetail = true;
// 流标详情 let projectId = localStorage.getItem('projectId');
async failDetail() { const { data, code } = await bidFaileddetail(projectId);
this.isfailDetail = true if (code == 200) {
let projectId = localStorage.getItem("projectId") this.faildetail = data;
const { }
data, },
code // 确定流标
} = await bidFaileddetail(projectId) async failbid() {
if (code == 200) { try {
this.faildetail = data let valid = await this.$refs['form'].validate();
} if (valid) {
}, let form = this.form;
// 确定流标 form.projectId = localStorage.getItem('projectId');
async failbid() { const { code, msg } = await openbidFailed(form);
try { if (code === 200) {
let valid = await this.$refs['form'].validate() this.$message.success(msg);
if (valid) { this.isfailInfo = false;
let form = this.form; this.isFailed = false;
form.projectId = localStorage.getItem("projectId") } else if (code === 500) {
const { this.$message.error(msg);
code, this.isfailInfo = false;
msg this.isFailed = false;
} = await openbidFailed(form) }
if (code === 200) { }
this.$message.success(msg) } catch (e) {
this.isfailInfo = false console.log(e);
this.isFailed = false }
} else if (code === 500) { },
this.$message.error(msg) isdialogue() {
this.isfailInfo = false this.dialogue = !this.dialogue;
this.isFailed = false },
} getfile(val) {
} this.form.filePOList = val;
} catch (e) { },
console.log(e) // 时间信息
} // async gettimeInfo() {
}, // try {
isdialogue() { // let projectId = localStorage.getItem("projectId")
this.dialogue = !this.dialogue
},
getfile(val) {
this.form.filePOList = val
},
// 时间信息
// async gettimeInfo() {
// try {
// let projectId = localStorage.getItem("projectId")
// } catch (e) { // } catch (e) {
// console.log(e) // console.log(e)
// } // }
// }, // },
// 开标按钮上三个信息(投标人数,缴纳保证金人数,签到人数) // 开标按钮上三个信息(投标人数,缴纳保证金人数,签到人数)
async getstartInfo() { async getstartInfo() {
try { try {
let projectId = localStorage.getItem("projectId") let projectId = localStorage.getItem('projectId');
const { const { data, code } = await startInfo(projectId);
data, if (code == 200) {
code this.startDetail = data;
} = await startInfo(projectId) }
if (code == 200) { } catch (e) {
this.startDetail = data console.log(e);
} }
} catch (e) { },
console.log(e) //签到解密略简
} async getsigndetail() {
}, try {
//签到解密略简 let projectId = localStorage.getItem('projectId');
async getsigndetail() { var { data, code, msg } = await timeInfo(projectId);
try { if (code == 200) {
let projectId = localStorage.getItem("projectId") let remaintime = Number(data.remainTime);
var { if (remaintime < 0) {
data, this.openbidButton = true;
code, } else {
msg this.remaintime = remaintime;
} = await timeInfo(projectId) }
if (code == 200) { this.storagedecodeTime = Number(data.decodeTime);
let remaintime = Number(data.remainTime); this.storagesignatureTime = Number(data.signatureTime);
if (remaintime < 0) { } else {
this.openbidButton = true this.$message({
} else { message: msg,
this.remaintime = remaintime type: 'error',
} duration: 3000
this.storagedecodeTime = Number(data.decodeTime) });
this.storagesignatureTime = Number(data.signatureTime) setTimeout(() => {
} else { this.$router.go(-1);
this.$message({ }, 3000);
message: msg, }
type: 'error', var { data, code } = await signdetail(projectId);
duration: 3000 if (code == 200) {
}) this.leftmessage = data;
setTimeout(() => { this.openStatus = data.openStatus;
this.$router.go(-1) this.isFailed = data.isFailed;
}, 3000) this.issueTable = data.issueTable;
} if (data.openStatus == 2) {
var { let localTime = new Date().getTime();
data, console.log(this.storagedecodeTime, '..............');
code let comparyTime = this.storagedecodeTime - (localTime - data.openBidTime) / 1000;
} = await signdetail(projectId) console.log(comparyTime);
if (code == 200) { if (comparyTime > 0) {
this.leftmessage = data this.decodeTime = comparyTime;
this.openStatus = data.openStatus this.signatureTime = this.storagesignatureTime - (localTime - data.openBidTime) / 1000;
this.isFailed = data.isFailed console.log('大于');
this.issueTable = data.issueTable } else {
if (data.openStatus == 2) { console.log('小于');
let localTime = new Date().getTime(); this.endbidButton = true;
console.log(this.storagedecodeTime, "..............") }
let comparyTime = this.storagedecodeTime - (localTime - data.openBidTime) / 1000 }
console.log(comparyTime) }
if (comparyTime > 0) { } catch (e) {
this.decodeTime = comparyTime console.log(e);
this.signatureTime = this.storagesignatureTime - (localTime - data.openBidTime) / 1000 }
console.log("大于") },
} else { // 开标一栏表
console.log("小于") async getopenInfo() {
this.endbidButton = true try {
} let projectId = localStorage.getItem('projectId');
} const { data, code } = await openInfo(projectId);
} if (code == 200) {
} catch (e) { for (let item of data) {
console.log(e) if (item.isSign) {
} item.isSign = '是';
}, } else {
// 开标一栏表 item.isSign = '否';
async getopenInfo() { }
try { }
let projectId = localStorage.getItem("projectId") this.tableData = data;
const { }
data, } catch (e) {
code console.log(e);
} = await openInfo(projectId) }
if (code == 200) { },
for (let item of data) { back() {
if (item.isSign) { this.$router.go(-1);
item.isSign = "是" },
} else { // 计算分秒倒计时
item.isSign = "否" // add: function() {
} // var _this = this
} // var time = window.setInterval(function() {
this.tableData = data // if (_this.seconds === 0 && _this.minutes !== 0) {
} // _this.seconds = 59
} catch (e) { // _this.minutes -= 1
console.log(e) // } else if (_this.minutes === 0 && _this.seconds === 0) {
} // _this.seconds = 0
}, // window.clearInterval(time)
back() { // } else {
this.$router.go(-1) // _this.seconds -= 1
}, // }
// 计算分秒倒计时 // }, 1000)
// add: function() { // },
// var _this = this // 截标时间到了
// var time = window.setInterval(function() { remaintimeEnd(val) {
// if (_this.seconds === 0 && _this.minutes !== 0) { this.openbidButton = val;
// _this.seconds = 59 console.log('截标时间到了');
// _this.minutes -= 1 },
// } else if (_this.minutes === 0 && _this.seconds === 0) { // 解密时间到了
// _this.seconds = 0 decodeTimeEnd(val) {
// window.clearInterval(time) this.endbidButton = val;
// } else { console.log('解密时间到了');
// _this.seconds -= 1 },
// } // 签名时间到了
// }, 1000) signatureTimeEnd(val) {},
// }, // 开标
// 截标时间到了 async openbid() {
remaintimeEnd(val) { try {
this.openbidButton = val let projectId = localStorage.getItem('projectId');
console.log("截标时间到了") const { code, msg } = await startbid(projectId);
}, if (code == 200) {
// 解密时间到了 this.isOpenbid = false;
decodeTimeEnd(val) { this.openbidButton = false;
this.endbidButton = val this.buttonWords = '停止开标';
console.log("解密时间到了") // this.decodeTime = this.storagedecodeTime
}, // this.signatureTime = this.storagesignatureTime
// 签名时间到了 this.getsigndetail();
signatureTimeEnd(val) {}, this.$message({
// 开标 message: '开标成功',
async openbid() { type: 'success'
try { });
let projectId = localStorage.getItem("projectId") } else {
const { this.$message({
code, message: msg,
msg type: 'error'
} = await startbid(projectId) });
if (code == 200) { }
this.isOpenbid = false } catch (e) {
this.openbidButton = false console.log(e);
this.buttonWords = '停止开标' }
// this.decodeTime = this.storagedecodeTime },
// this.signatureTime = this.storagesignatureTime // 开标提示
this.getsigndetail(); confirm() {
this.$message({ this.$alert('请立即开标', '请立即开标', {
message: '开标成功', confirmButtonText: '知道了',
type: 'success' callback: (action) => {
}) if (action === 'confirm') {
} else { this.isOpenbid = true;
this.$message({ this.getstartInfo();
message: msg, }
type: 'error' }
}) });
} },
} catch (e) { // websocket
console.log(e) createWebSocket() {
} let token = localStorage.getItem('token');
}, let projectId = localStorage.getItem('projectId');
// 开标提示 this.websocket = new WebSocket(`ws:${openUrl}/webSocket/${projectId}/${token}`);
confirm() { // this.websocket = new WebSocket('ws://192.168.3.35:8085/webSocket/' + projectId + "/" + token)
this.$alert('请立即开标', '请立即开标', { // this.websocket = new WebSocket('ws://60.205.251.80:8085/webSocket/' + projectId +"/"+token )
confirmButtonText: '知道了', // 连接成功时
callback: action => { this.websocket.onopen = () => {};
if (action === 'confirm') { this.websocket.onmessage = (event) => {
this.isOpenbid = true // 后端发送的消息在event.data中
this.getstartInfo() let data = JSON.parse(event.data);
} console.log(data);
} if (data.type == 1) {
}) if (data.userId == this.myId) {
}, data.mine = true;
// websocket } else {
createWebSocket() { data.mine = false;
let token = localStorage.getItem("token") }
let projectId = localStorage.getItem("projectId") const msgObj = {
this.websocket = new WebSocket(`ws:${openUrl}/webSocket/${projectId}/${token}`) date: data.time,
// this.websocket = new WebSocket('ws://192.168.3.35:8085/webSocket/' + projectId + "/" + token) text: {
// this.websocket = new WebSocket('ws://60.205.251.80:8085/webSocket/' + projectId +"/"+token ) text: data.chatContent
// 连接成功时 },
this.websocket.onopen = () => {} mine: data.mine,
this.websocket.onmessage = event => { name: data.name,
// 后端发送的消息在event.data中 img: 'http://hsz1997.oss-cn-beijing.aliyuncs.com/img/1603292025286_67c099c6tou.jpg'
let data = JSON.parse(event.data); };
console.log(data) this.dialogueList.push(msgObj);
if (data.type == 1) { } else {
if(data.userId==this.myId){ this.halList.push(data);
data.mine=true }
}else{ };
data.mine=false this.websocket.onclose = function () {
} console.log('关闭了');
const msgObj = { };
"date":data.time , // 路由跳转时结束websocket链接
"text": { // this.$router.afterEach(function() {
"text": data.chatContent // this.websocket.close()
}, // })
"mine": data.mine, // 监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常
"name": data.name, window.onbeforeunload = function () {
"img": "http://hsz1997.oss-cn-beijing.aliyuncs.com/img/1603292025286_67c099c6tou.jpg" console.log('窗口关闭');
} this.websocket.close();
this.dialogueList.push(msgObj) };
} else { },
this.halList.push(data) bindEnter() {
} const content = this.content;
} if (!content) return;
this.websocket.onclose = function() { this.websocket.send(content);
console.log('关闭了') }
} },
// 路由跳转时结束websocket链接
// this.$router.afterEach(function() {
// this.websocket.close()
// })
// 监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常
window.onbeforeunload = function() {
console.log("窗口关闭")
this.websocket.close()
}
},
bindEnter() {
const content = this.content
if (!content) return;
this.websocket.send(content)
}
},
destroyed() { destroyed() {
//清除定时器 //清除定时器
clearInterval(this.timer); clearInterval(this.timer);
clearInterval(this.timer1); clearInterval(this.timer1);
console.log("定时器关闭") console.log('定时器关闭');
this.websocket.close() this.websocket.close();
} }
} };
</script> </script>
<style scoped> <style scoped>
.abs{ .time {
position: absolute; height: 48px;
right:100px; margin-bottom: 10px;
bottom:-91px }
} .abs {
.flex-left { position: absolute;
display: flex; right: 100px;
justify-content: flex-start; bottom: -91px;
} }
.flex-left {
.flex-right { display: flex;
display: flex; justify-content: flex-start;
justify-content: flex-end; }
}
.dialogue {
position: absolute;
top: 10%;
right: 10%;
border:1px solid #CCCCCC;
padding:10px
}
.hal { .flex-right {
position: relative; display: flex;
} justify-content: flex-end;
}
.buttons { .dialogue {
margin: 100px 0; position: absolute;
} top: 10%;
right: 10%;
border: 1px solid #cccccc;
padding: 10px;
}
.hal-left { .hal {
width: 150px; position: relative;
}
.hal > h2 {
width: 100%;
height: 55px;
line-height: 55px;
border-bottom: 1px solid #dadada;
}
} .back-fff {
background: #fff;
}
.buttons {
margin: 100px 0;
}
.buttons>div{
margin-right:20px
}
.hal-left {
width: 198px;
height: 218px;
background: #ffffff;
}
/*
.hal-left>div:first-child { .hal-left>div:first-child {
width: 100%; width: 100%;
height: 300px; height: 300px;
...@@ -727,73 +724,74 @@ ...@@ -727,73 +724,74 @@
text-align: center; text-align: center;
border: 1px solid #000; border: 1px solid #000;
margin-top: 50px; margin-top: 50px;
} } */
.hal-right { .hal-right {
width: 150px; width: 150px;
height: 500px; height: 500px;
} }
.hal-right>button{
.hal-center { margin-bottom:16px
flex: 1; }
height: 500px;
border: 1px solid #000;
margin: 0 50px;
box-sizing: border-box;
padding: 30px;
overflow: auto
}
.hal-center>ul>li { .hal-center {
margin-bottom: 30px; flex: 1;
} height: 500px;
margin: 0 14px;
box-sizing: border-box;
padding: 30px;
overflow: auto;
}
.hal-center>ul>li>div { .hal-center > ul > li {
margin-right: 10px; margin-bottom: 30px;
font-size: 16px; }
}
.button-pos { .hal-center > ul > li > div {
margin-top: 50px; margin-right: 10px;
} font-size: 16px;
}
.time-message { .button-pos {
width: 60%; margin-top: 50px;
margin: 10px auto; }
font-size: 16px;
}
.hal-left h1 { .time-message {
margin-bottom: 50px; width: 60%;
/* letter-spacing:5px */ margin: 0px auto;
font-size: 24px; font-size: 16px;
} }
.bid-message { .hal-left h1 {
flex-wrap: wrap; margin-bottom: 24px;
font-size: 16px; /* letter-spacing:5px */
} font-size: 18px;
}
.bid-message>div { .bid-message {
margin-right: 50px; flex-wrap: wrap;
margin-bottom: 30px; font-size: 16px;
} }
.dialogue>.dialogueList { .bid-message > div {
box-sizing: border-box; margin-right: 50px;
padding: 20px; margin-bottom: 30px;
overflow: auto; }
border: 1px solid #DCDFE6;
width: 400px;
height: 300px;
}
.dialogue > .dialogueList {
box-sizing: border-box;
padding: 20px;
overflow: auto;
border: 1px solid #dcdfe6;
width: 400px;
height: 300px;
}
.dialogueList>li { .dialogueList > li {
margin-bottom: 20px; margin-bottom: 20px;
} }
.textheight{ .textheight {
line-height:20.8px; line-height: 20.8px;
display: flex; display: flex;
justify-content: flex-start; justify-content: flex-start;
} }
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
</div> </div>
<div class="flex" v-else> <div class="flex" v-else>
<div class="adjustment">上传附件:</div> <div class="adjustment">上传附件:</div>
<singleUpload :limit="1" tip="支持上传1个附件,不超过20M" @input="getfile"></singleUpload> <singleUpload :limit="1" tip="支持上传1个附件,不超过20M" :max="20" @input="getfile"></singleUpload>
</div> </div>
</div> </div>
<div class="form"> <div class="form">
......
<template> <template>
<div> <div>
<div class="content"> <div>
<dataBreadcrumb :breads="breads"></dataBreadcrumb> <dataBreadcrumb :breads="breads"></dataBreadcrumb>
<div>中国标准时间:{{ currentTime }}</div> <div class="back-fff" style="padding: 10px 0 0 10px">中国标准时间:{{ currentTime }}</div>
<div class="hal"> <div class="hal">
<h3 style="text-align: center">{{ projectName }}项目开标大厅</h3> <h2 class="back-fff" style="text-align: center">{{ projectName }}项目开标大厅</h2>
<div class="time-message flex-between"> <div class="back-fff flex-center time">
<div class="flex"> <div class="time-message flex-between">
<p>截标倒计时:</p> <div class="flex">
<timeDown :remain-time="remaintime" @countDowmEnd="remaintimeEnd"></timeDown> <p>截标倒计时:</p>
</div> <timeDown :remain-time="remaintime" @countDowmEnd="remaintimeEnd"></timeDown>
<div class="flex" v-show="openStatus == 2"> </div>
<p>解密倒计时:</p> <div class="flex" v-show="openStatus == 2">
<timeDown :remain-time="decodeTime" @countDowmEnd="decodeTimeEnd"></timeDown> <p>解密倒计时:</p>
</div> <timeDown :remain-time="decodeTime" @countDowmEnd="decodeTimeEnd"></timeDown>
<div class="flex" v-show="openStatus == 2"> </div>
<p>签名倒计时:</p> <div class="flex" v-show="openStatus == 2">
<timeDown :remain-time="signatureTime" @countDowmEnd="signatureTimeEnd"></timeDown> <p>签名倒计时:</p>
<timeDown :remain-time="signatureTime" @countDowmEnd="signatureTimeEnd"></timeDown>
</div>
</div> </div>
</div> </div>
<div class="flex"> <div class="flex">
<div class="hal-left"> <div class="hal-left back-fff flex-colunm">
<div> <h1>签到 {{ !leftmessage.signIn ? '否' : '是' }}</h1>
<h1>签到 {{ !leftmessage.signIn ? '否' : '是' }}</h1> <h1>解密 {{ !leftmessage.decode ? '否' : '是' }}</h1>
<h1>解密 {{ !leftmessage.decode ? '否' : '是' }}</h1> <h1>签名 {{ !leftmessage.signature ? '否' : '是' }}</h1>
<h1>签名 {{ !leftmessage.signature ? '否' : '是' }}</h1>
</div>
</div> </div>
<div class="hal-center" v-chat-scroll> <div class="hal-center back-fff" v-chat-scroll>
<ul> <ul>
<li v-for="(item, index) in halList" :key="index" class="flex-item textheight"> <li v-for="(item, index) in halList" :key="index" class="flex-item textheight">
<div>{{ item.time }}</div> <div>{{ item.time }}</div>
...@@ -38,19 +38,13 @@ ...@@ -38,19 +38,13 @@
</ul> </ul>
</div> </div>
<div class="hal-right"> <div class="hal-right">
<el-button @click="dialogFormVisible = true" style="margin-left: 10px">开标规则说明</el-button> <el-button type="primary" @click="dialogFormVisible = true" >开标规则说明</el-button>
<el-button @click="isdialogue">在线对话<i class="el-icon-chat-dot-round"></i></el-button> <el-button type="primary" @click="isdialogue">在线对话<i class="el-icon-chat-dot-round"></i></el-button>
<el-button <el-button type="primary" @click="openInfo" :disabled="!issueTable">查看开标一览表</el-button>
:disabled="!isDecode"
v-show="openStatus == 2 && !leftmessage.decode"
@click="changeDecode"
type="primary"
>解密投标文件</el-button
>
</div> </div>
<!-- 在线对话 --> <!-- 在线对话 -->
<div class="dialogue" style="margin-top: 30px" v-show="dialogue" id="msg"> <div class="dialogue" style="margin-top: 30px" v-show="dialogue" id="msg">
<JwChat :taleList="dialogueList" scrollType="scroll" @enter="bindEnter" v-model="content" :toolConfig="tool" > <JwChat :taleList="dialogueList" scrollType="scroll" @enter="bindEnter" v-model="content" :toolConfig="tool">
<el-button slot="tools" style="float: right" class="abs" @click="dialogue = false">关闭聊天框</el-button> <el-button slot="tools" style="float: right" class="abs" @click="dialogue = false">关闭聊天框</el-button>
</JwChat> </JwChat>
</div> </div>
...@@ -62,7 +56,7 @@ ...@@ -62,7 +56,7 @@
<div v-if="myId==item.userId"></div> <div v-if="myId==item.userId"></div>
<div v-else>{{item.name}}</div> <div v-else>{{item.name}}</div>
<div>({{item.time}})</div> <div>({{item.time}})</div>
</div> </div>
<div>{{item.chatContent}}</div> <div>{{item.chatContent}}</div>
</div> </div>
</li> </li>
...@@ -73,9 +67,14 @@ ...@@ -73,9 +67,14 @@
</div> </div>
<div class="flex-center buttons"> <div class="flex-center buttons">
<div> <div>
<el-button icon="el-icon-refresh" @click="refrsh">刷新</el-button> <el-button type="primary" @click="back">退出大厅</el-button>
<el-button @click="openInfo" :disabled="!issueTable">查看开标一览表</el-button> <el-button
<el-button @click="back">退出大厅<i class="el-icon-right"></i></el-button> :disabled="!isDecode"
v-show="openStatus == 2 && !leftmessage.decode"
@click="changeDecode"
type="primary"
>解密投标文件</el-button
>
</div> </div>
</div> </div>
</div> </div>
...@@ -86,13 +85,15 @@ ...@@ -86,13 +85,15 @@
<h1>开标说明</h1> <h1>开标说明</h1>
<div>1、网上开标共有解密、签名两个环节,投标人根据开标大厅中间滚动提示进行相应操作。</div> <div>1、网上开标共有解密、签名两个环节,投标人根据开标大厅中间滚动提示进行相应操作。</div>
<div>2、截标前当天大厅开放,已上传投标文件的投标人可在解密倒计时结東前进入开标大厅。</div> <div>2、截标前当天大厅开放,已上传投标文件的投标人可在解密倒计时结東前进入开标大厅。</div>
<div>3、截标后主持人宣布开标,所有投标人进行解密操作,解密时间共计30分钟投标人须在解密倒计时结束前 <div>
完成解密。解密倒计时结東后,因投标人原因造成投标文件未解密的根据《电子招标投标办法其投标文件》视 3、截标后主持人宣布开标,所有投标人进行解密操作,解密倒计时结束后,因投标人原因造成投标文件未
为撤销。</div> 解密的根据《电子招标投标办法》其投标文件视为撤销。
<div>4、解密倒计时结東或所有投标文件均已解密,投标人可查询所有投标人的开标情况并进行签名,签名时间 </div>
共计10分钟。</div> <div>4、解密倒计时结束或所有投标文件均已解密,投标人可查询所有投标人的开标情况并进行签名。</div>
<div>5.、所有投标人完成签名操作或签名倒计时结束后,项目经理开标结束,投标人可离开开标大厅。开标过程 <div>
中,投标人可点击开标大厅右上角在线聊天与主持人沟通。开标结束后视为开标过程无异议。</div> 5.、所有投标人完成签名操作或签名倒计时结束后,项目经理开标结束,投标人可离开开标大厅。开标过程
中,投标人可点击开标大厅右上角在线聊天与主持人沟通。开标结束后视为开标过程无异议。
</div>
</div> </div>
<div class="flex-center"> <div class="flex-center">
<el-button type="primary" @click="dialogFormVisible = false">关闭</el-button> <el-button type="primary" @click="dialogFormVisible = false">关闭</el-button>
...@@ -287,59 +288,58 @@ export default { ...@@ -287,59 +288,58 @@ export default {
}, },
// websocket // websocket
createWebSocket() { createWebSocket() {
let token = localStorage.getItem("token") let token = localStorage.getItem('token');
let projectId = localStorage.getItem("projectId") let projectId = localStorage.getItem('projectId');
this.websocket = new WebSocket(`ws:${openUrl}/webSocket/${projectId}/${token}`) this.websocket = new WebSocket(`ws:${openUrl}/webSocket/${projectId}/${token}`);
// this.websocket = new WebSocket('ws://192.168.3.35:8085/webSocket/' + projectId + "/" + token) // this.websocket = new WebSocket('ws://192.168.3.35:8085/webSocket/' + projectId + "/" + token)
// this.websocket = new WebSocket('ws://60.205.251.80:8085/webSocket/' + projectId +"/"+token ) // this.websocket = new WebSocket('ws://60.205.251.80:8085/webSocket/' + projectId +"/"+token )
// 连接成功时 // 连接成功时
this.websocket.onopen = () => {} this.websocket.onopen = () => {};
this.websocket.onmessage = event => { this.websocket.onmessage = (event) => {
// 后端发送的消息在event.data中 // 后端发送的消息在event.data中
let data = JSON.parse(event.data); let data = JSON.parse(event.data);
console.log(data) console.log(data);
if (data.type == 1) { if (data.type == 1) {
if(data.userId==this.myId){ if (data.userId == this.myId) {
data.mine=true data.mine = true;
}else{ } else {
data.mine=false data.mine = false;
} }
const msgObj = { const msgObj = {
"date":data.time , date: data.time,
"text": { text: {
"text": data.chatContent text: data.chatContent
}, },
"mine": data.mine, mine: data.mine,
"name": data.name, name: data.name,
"img": "http://hsz1997.oss-cn-beijing.aliyuncs.com/img/1603292025286_67c099c6tou.jpg" img: 'http://hsz1997.oss-cn-beijing.aliyuncs.com/img/1603292025286_67c099c6tou.jpg'
} };
this.dialogueList.push(msgObj) this.dialogueList.push(msgObj);
} else { } else {
this.halList.push(data) this.halList.push(data);
} }
} };
this.websocket.onclose = function() { this.websocket.onclose = function () {
console.log('关闭了') console.log('关闭了');
} };
// 路由跳转时结束websocket链接 // 路由跳转时结束websocket链接
// this.$router.afterEach(function() { // this.$router.afterEach(function() {
// this.websocket.close() // this.websocket.close()
// }) // })
// 监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常 // 监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常
window.onbeforeunload = function() { window.onbeforeunload = function () {
console.log("窗口关闭") console.log('窗口关闭');
this.websocket.close() this.websocket.close();
} };
}, },
bindEnter() { bindEnter() {
const content = this.content; const content = this.content;
if (!content) return; if (!content) return;
this.websocket.send(content); this.websocket.send(content);
this.$nextTick(() => { this.$nextTick(() => {
let msg = document.getElementsByClassName('dialogue') // 获取对象 let msg = document.getElementsByClassName('dialogue'); // 获取对象
msg.scrollTop = msg.scrollHeight // 滚动高度 msg.scrollTop = msg.scrollHeight; // 滚动高度
}) });
}, },
back() { back() {
this.$router.go(-1); this.$router.go(-1);
...@@ -393,15 +393,15 @@ export default { ...@@ -393,15 +393,15 @@ export default {
this.storagedecodeTime = Number(data.decodeTime); this.storagedecodeTime = Number(data.decodeTime);
this.storagesignatureTime = Number(data.signatureTime); this.storagesignatureTime = Number(data.signatureTime);
} else { } else {
this.$message({ this.$message({
message: msg, message: msg,
type: 'error', type: 'error',
duration: 3000 duration: 3000
}) });
/* setTimeout(() => { /* setTimeout(() => {
this.$router.go(-1) this.$router.go(-1)
}, 3000) */ }, 3000) */
} }
var { data, code } = await signdetail(projectId); var { data, code } = await signdetail(projectId);
if (code == 200) { if (code == 200) {
this.openStatus = data.openStatus; this.openStatus = data.openStatus;
...@@ -466,6 +466,13 @@ export default { ...@@ -466,6 +466,13 @@ export default {
</script> </script>
<style scoped> <style scoped>
.time {
height: 48px;
margin-bottom: 10px;
}
.back-fff {
background: #fff;
}
.abs { .abs {
position: absolute; position: absolute;
right: 100px; right: 100px;
...@@ -484,6 +491,12 @@ export default { ...@@ -484,6 +491,12 @@ export default {
.hal { .hal {
position: relative; position: relative;
} }
.hal > h2 {
width: 100%;
height: 55px;
line-height: 55px;
border-bottom: 1px solid #dadada;
}
.dialogue { .dialogue {
position: absolute; position: absolute;
...@@ -516,15 +529,16 @@ export default { ...@@ -516,15 +529,16 @@ export default {
} }
.hal-left { .hal-left {
width: 200px; width: 198px;
height: 218px;
background: #ffffff;
} }
.hal-left h1 {
.hal-left > div { margin-bottom: 24px;
width: 100%; font-size: 18px;
height: 300px; }
border: 1px solid #000; .hal-left > h1:last-child {
box-sizing: border-box; margin-bottom: 0px;
padding: 40px 20px;
} }
.hal-right { .hal-right {
...@@ -539,8 +553,7 @@ export default { ...@@ -539,8 +553,7 @@ export default {
.hal-center { .hal-center {
flex: 1; flex: 1;
height: 500px; height: 500px;
border: 1px solid #000; margin: 0 14px;
margin: 0 50px;
box-sizing: border-box; box-sizing: border-box;
padding: 30px; padding: 30px;
overflow: auto; overflow: auto;
...@@ -565,10 +578,6 @@ export default { ...@@ -565,10 +578,6 @@ export default {
font-size: 16px; font-size: 16px;
} }
.hal-left h1 {
margin-bottom: 50px;
}
.bid-message { .bid-message {
flex-wrap: wrap; flex-wrap: wrap;
font-size: 16px; font-size: 16px;
...@@ -578,8 +587,8 @@ export default { ...@@ -578,8 +587,8 @@ export default {
margin-right: 50px; margin-right: 50px;
margin-bottom: 30px; margin-bottom: 30px;
} }
.textheight{ .textheight {
line-height:20.8px; line-height: 20.8px;
display: flex; display: flex;
justify-content: flex-start; justify-content: flex-start;
} }
......
...@@ -126,7 +126,7 @@ ...@@ -126,7 +126,7 @@
duration: 1500 duration: 1500
}) })
setTimeout(() => { setTimeout(() => {
this.$router.go(-1) this.$router.push("/supply/bid/joinProject/projectList")
}, 1500) }, 1500)
}else if(code==500){ }else if(code==500){
this.$message({ this.$message({
......
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