Skip to content

Commit

Permalink
会话页面
Browse files Browse the repository at this point in the history
  • Loading branch information
moohng committed Sep 16, 2017
1 parent b0e8027 commit b39e96c
Show file tree
Hide file tree
Showing 14 changed files with 155 additions and 201 deletions.
8 changes: 8 additions & 0 deletions src/App.vue
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,14 @@ export default {
transMode: ''
}
},
async mounted () {
// 检查登陆态
const data = await this.$check()
sessionStorage.setItem('username', data.user.username)
// 连接socket
await this.$connect()
this.$receive(data => console.log(data))
},
watch: {
$route (to, from) {
if (!from.name) {
Expand Down
18 changes: 1 addition & 17 deletions src/components/message/chat/chat-bar.vue
Original file line number Diff line number Diff line change
Expand Up @@ -34,34 +34,18 @@ import IconVoice from './icons/voice'
import IconEmoji from './icons/emoji'
import IconMore from './icons/more'
import { mapGetters } from 'vuex'
export default {
data () {
return {
showSend: false
}
},
props: ['to'],
computed: {
...mapGetters(['account'])
},
methods: {
send (el) {
const text = el.innerText
if (text.length === 0) return
console.log(text)
// 封装消息
const time = new Date()
const message = {
to: this.to,
content: {
text
},
time: time.getHours() + ':' + time.getMinutes()
}
this.$store.dispatch('vx_send', message)
this.$emit('send', text)
el.innerText = ''
this.showSend = false
},
Expand Down
43 changes: 31 additions & 12 deletions src/components/message/chat/chat-dialog.vue
Original file line number Diff line number Diff line change
@@ -1,30 +1,49 @@
<template>
<li class="chat-dialog">
<div class="wrap" v-if="date">
<span class="date">{{ message.time }}</span>
<span class="date">{{ date }}</span>
</div>
<div class="wrap content" :class="{reverse}">
<div class="icon">
<img src="" alt="">
<div class="context">
<p>{{ message.content.text }}</p>
</div>
<img :src="message.from.head_icon || head_icon">
</div>
<div class="context">
<p>{{ message.content.text }}</p>
</div>
</div>
</li>
</template>

<script>
import { format } from '../../../utils'
export default {
props: ['message', 'date'],
data () {
return {
head_icon: 'http://iph.href.lu/200x200?text=%E9%BB%98%E8%AE%A4%E5%A4%B4%E5%83%8F'
}
},
props: ['message'],
computed: {
reverse () {
if (this.message.from) {
return false
}
else {
return true
date () {
const date = new Date(this.message.date)
const now = new Date()
const diff = now - date
if (diff < 2 * 60 * 1000) return
const day = 24 * 60 * 60 * 1000
let time
if (diff < day && date.getDate() === now.getDate()) { // 今天
time = format(date, 'hh:mm')
} else if (diff > day && diff < 2 * day && date.getDate() === now.getDate() + 1) { // 昨天
time = '昨天'
} else if (diff > 2 * day) {
time = format(date, 'MM月dd日')
}
return time
},
reverse () {
const username = sessionStorage.getItem('username')
return this.message.from.username === username
}
}
}
Expand Down
127 changes: 61 additions & 66 deletions src/components/message/chat/chat.vue
Original file line number Diff line number Diff line change
@@ -1,82 +1,77 @@
<template>
<view-box class="chat">
<x-header slot="header">
<span slot="default">{{ title }}</span>
</x-header>
<ul slot="default" v-scroll="messages">
<chat-dialog v-for="(message, index) in messages"
:date="date(message, index)", :message="message"></chat-dialog>
</ul>
<chat-bar slot="bottom"></chat-bar>
</view-box>
<view-box class="chat">
<x-header slot="header">
<span slot="default">{{ session.name }}</span>
</x-header>
<ul slot="default" v-scroll>
<chat-dialog v-for="message in session.messages"
:message="message"></chat-dialog>
</ul>
<chat-bar slot="bottom" @send="send"></chat-bar>
</view-box>
</template>

<script>
import { ViewBox, XHeader } from 'vux'
import ChatDialog from './chat-dialog'
import ChatBar from './chat-bar'
import { mapState } from 'vuex'
export default {
computed: {
...mapState (['sessionList']),
title () {
return this.$route.query.title
},
index () {
// 遍历会话列表,看会话是否存在
let _index = false
this.sessionList.forEach((session, index) => {
if (session.title === this.title) {
// 存在 记录索引
_index = index
return
}
})
return _index
},
messages () {
if (this.index !== false) {
return this.sessionList[this.index].messages
}
else {
return []
}
}
},
methods: {
date (message, index) {
if (index >= 1) {
// 判断是否显示时间 先将就着用吧
const time = message.time.substr(3, 2)
const lastTime = this.messages[index - 1].time.substr(3, 2)
return time - lastTime > 0
}
return false
computed: {
...mapState (['sessionList']),
session () {
const { index, username } = this.$route.query
if (username) {
return {
name: username,
members: [username],
messages: []
}
},
directives: {
// 自动滚动
scroll: {
bind (el) {
setTimeout(() => {
el.parentNode.scrollTop = el.scrollHeight
}, 1)
},
update (el) {
setTimeout(() => {
el.parentNode.scrollTop = el.scrollHeight
}, 1)
}
}
return this.sessionList[index]
}
},
methods: {
send (text) {
// 封装消息
const { id, name, members } = this.session
const username = sessionStorage.getItem('username')
const data = {
session: { id, name, members },
message: {
from: { username },
content: { text },
date: Date.now()
}
},
components: {
ViewBox,
XHeader,
ChatDialog,
ChatBar
}
// 发送消息
this.$send(JSON.stringify(data))
// 保存消息
this.$store.commit('addMessage', data)
}
},
directives: {
// 自动滚动
scroll: {
bind (el) {
setTimeout(() => {
el.parentNode.scrollTop = el.scrollHeight
}, 1)
},
update (el) {
setTimeout(() => {
el.parentNode.scrollTop = el.scrollHeight
}, 1)
}
}
},
components: {
ViewBox,
XHeader,
ChatDialog,
ChatBar
}
}
</script>

38 changes: 19 additions & 19 deletions src/components/message/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@
<div class="message">
<search :autoFixed="false"></search>
<group :gutter="0">
<cell v-for="session in sessionList"
:title="session.name"
@click.native.stop="$router.push({name: 'chat'})">
<img slot="icon" src="" class="cell-hd__icon">
<cell v-for="session, index in sessionList"
:key="session.id"
:title="session.name"
@click.native.stop="$router.push({ name: 'chat' , query: { index } })">
<img slot="icon" :src="session.head_icon || head_icon" class="cell-hd__icon">
<span slot="inline-desc" class="cell-desc">{{ session | lastMessage | messageText }}</span>
<span slot="default" class="cell-time">{{ session | lastMessage | messageTime }}</span>
</cell>
Expand All @@ -20,6 +21,11 @@ import { format } from '../../utils'
export default {
name: 'message',
data () {
return {
head_icon: 'http://iph.href.lu/200x200?text=%E9%BB%98%E8%AE%A4%E5%A4%B4%E5%83%8F'
}
},
computed: mapState(['sessionList']),
filters: {
lastMessage (session) {
Expand All @@ -29,21 +35,16 @@ export default {
messageText: message => message.content.text,
messageTime (message) {
const date = new Date(message.date)
const messageDay = format(date, 'dd')
const nowDay = format(new Date(), 'dd')
const now = new Date()
const diff = now - date
const day = 24 * 60 * 60 * 1000
let time
switch (nowDay - messageDay) {
case 0:
time: format(date, 'hh:mm')
break
case 1:
time: '昨天'
break
case 2:
time: '前天'
break
default:
time: format(date, 'MM月dd日')
if (diff < day && date.getDate() === now.getDate()) { // 今天
time = format(date, 'hh:mm')
} else if (diff > day && diff < 2 * day && date.getDate() === now.getDate() + 1) { // 昨天
time = '昨天'
} else if (diff > 2 * day) {
time = format(date, 'MM月dd日')
}
return time
}
Expand All @@ -62,7 +63,6 @@ export default {
.message {
.cell-hd__icon {
width: 48px; height: 48px;
border: 1px solid #000;
}
.cell-desc { @include textHidden }
.cell-time {
Expand Down
10 changes: 5 additions & 5 deletions src/components/wellcome/login.vue
Original file line number Diff line number Diff line change
Expand Up @@ -36,22 +36,22 @@ export default {
},
methods: {
async login () {
this.$vux.loading.show('登录中...')
this.$loading('登录中...')
// 登录
const res = await this.$login({
username: this.username,
password: this.password
})
// 连接socket
await this.$connect()
this.$vux.loading.hide()
if (res.code === 0) {
// 连接socket
await this.$connect()
this.$hide()
this.$router.replace({
name: 'message',
query: { mode: 'modal' }
})
} else {
this.$vux.toast.text(res.message, 'bottom')
this.$toast(res.message)
}
}
},
Expand Down
Loading

0 comments on commit b39e96c

Please sign in to comment.