Browse Source

整理代码风格

master
xie.bx 3 years ago
parent
commit
76e9662b01
  1. 32
      im-platform/src/main/java/com/lx/implatform/controller/FriendController.java
  2. 4
      im-platform/src/main/java/com/lx/implatform/entity/Friend.java
  3. 4
      im-platform/src/main/java/com/lx/implatform/mapper/FriendMapper.java
  4. 29
      im-platform/src/main/java/com/lx/implatform/service/IFriendService.java
  5. 29
      im-platform/src/main/java/com/lx/implatform/service/IFriendsService.java
  6. 124
      im-platform/src/main/java/com/lx/implatform/service/impl/FriendServiceImpl.java
  7. 124
      im-platform/src/main/java/com/lx/implatform/service/impl/FriendsServiceImpl.java
  8. 10
      im-platform/src/main/java/com/lx/implatform/service/impl/GroupServiceImpl.java
  9. 6
      im-platform/src/main/java/com/lx/implatform/service/impl/SingleMessageServiceImpl.java
  10. 2
      im-platform/src/main/java/com/lx/implatform/vo/FriendVO.java
  11. 6
      im-platform/src/main/resources/db/db.sql
  12. 10
      im-server/src/main/java/com/lx/implatform/imserver/IMServerApp.java
  13. 2
      im-server/src/main/java/com/lx/implatform/imserver/websocket/WebsocketServer.java
  14. 119
      im-ui/src/components/friend/AddFriends.vue
  15. 114
      im-ui/src/components/friend/FriendsItem.vue
  16. 4
      im-ui/src/router/index.js
  17. 90
      im-ui/src/store/friendsStore.js
  18. 6
      im-ui/src/store/index.js
  19. 12
      im-ui/src/view/Chat.vue
  20. 184
      im-ui/src/view/Friends.vue
  21. 4
      im-ui/src/view/Home.vue

32
im-platform/src/main/java/com/lx/implatform/controller/FriendsController.java → im-platform/src/main/java/com/lx/implatform/controller/FriendController.java

@ -4,10 +4,10 @@ package com.lx.implatform.controller;
import com.lx.common.result.Result;
import com.lx.common.result.ResultUtils;
import com.lx.common.util.BeanUtils;
import com.lx.implatform.entity.Friends;
import com.lx.implatform.service.IFriendsService;
import com.lx.implatform.entity.Friend;
import com.lx.implatform.service.IFriendService;
import com.lx.implatform.session.SessionContext;
import com.lx.implatform.vo.FriendsVO;
import com.lx.implatform.vo.FriendVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
@ -20,18 +20,18 @@ import java.util.stream.Collectors;
@Api(tags = "好友")
@RestController
@RequestMapping("/friends")
public class FriendsController {
@RequestMapping("/friend")
public class FriendController {
@Autowired
private IFriendsService friendsService;
private IFriendService friendService;
@GetMapping("/list")
@ApiOperation(value = "好友列表",notes="获取好友列表")
public Result< List<FriendsVO>> findFriends(){
List<Friends> friendsList = friendsService.findFriendsByUserId(SessionContext.getSession().getId());
List<FriendsVO> vos = friendsList.stream().map(f->{
FriendsVO vo = BeanUtils.copyProperties(f,FriendsVO.class);
public Result< List<FriendVO>> findFriends(){
List<Friend> friends = friendService.findFriendByUserId(SessionContext.getSession().getId());
List<FriendVO> vos = friends.stream().map(f->{
FriendVO vo = BeanUtils.copyProperties(f, FriendVO.class);
return vo;
}).collect(Collectors.toList());
return ResultUtils.success(vos);
@ -41,22 +41,22 @@ public class FriendsController {
@PostMapping("/add")
@ApiOperation(value = "添加好友",notes="双方建立好友关系")
public Result addFriends(@NotEmpty(message = "好友id不可为空") @RequestParam("friendId") Long friendId){
friendsService.addFriends(friendId);
public Result addFriend(@NotEmpty(message = "好友id不可为空") @RequestParam("friendId") Long friendId){
friendService.addFriend(friendId);
return ResultUtils.success();
}
@DeleteMapping("/delete")
@ApiOperation(value = "删除好友",notes="解除好友关系")
public Result delFriends(@NotEmpty(message = "好友id不可为空") @RequestParam("friendId") Long friendId){
friendsService.delFriends(friendId);
public Result delFriend(@NotEmpty(message = "好友id不可为空") @RequestParam("friendId") Long friendId){
friendService.delFriend(friendId);
return ResultUtils.success();
}
@PutMapping("/update")
@ApiOperation(value = "更新好友信息",notes="更新好友头像或昵称")
public Result modifyFriends(@Valid @RequestBody FriendsVO vo){
friendsService.update(vo);
public Result modifyFriend(@Valid @RequestBody FriendVO vo){
friendService.update(vo);
return ResultUtils.success();
}

4
im-platform/src/main/java/com/lx/implatform/entity/Friends.java → im-platform/src/main/java/com/lx/implatform/entity/Friend.java

@ -21,8 +21,8 @@ import java.util.Date;
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("im_friends")
public class Friends extends Model<Friends> {
@TableName("im_friend")
public class Friend extends Model<Friend> {
private static final long serialVersionUID=1L;

4
im-platform/src/main/java/com/lx/implatform/mapper/FriendsMapper.java → im-platform/src/main/java/com/lx/implatform/mapper/FriendMapper.java

@ -1,7 +1,7 @@
package com.lx.implatform.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lx.implatform.entity.Friends;
import com.lx.implatform.entity.Friend;
/**
* <p>
@ -11,6 +11,6 @@ import com.lx.implatform.entity.Friends;
* @author blue
* @since 2022-10-22
*/
public interface FriendsMapper extends BaseMapper<Friends> {
public interface FriendMapper extends BaseMapper<Friend> {
}

29
im-platform/src/main/java/com/lx/implatform/service/IFriendService.java

@ -0,0 +1,29 @@
package com.lx.implatform.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.lx.implatform.entity.Friend;
import com.lx.implatform.vo.FriendVO;
import java.util.List;
/**
* <p>
* 服务类
* </p>
*
* @author blue
* @since 2022-10-22
*/
public interface IFriendService extends IService<Friend> {
Boolean isFriend(Long userId1, long userId2);
List<Friend> findFriendByUserId(long UserId);
void addFriend(long friendId);
void delFriend(long friendId);
void update(FriendVO vo);
}

29
im-platform/src/main/java/com/lx/implatform/service/IFriendsService.java

@ -1,29 +0,0 @@
package com.lx.implatform.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.lx.implatform.entity.Friends;
import com.lx.implatform.vo.FriendsVO;
import java.util.List;
/**
* <p>
* 服务类
* </p>
*
* @author blue
* @since 2022-10-22
*/
public interface IFriendsService extends IService<Friends> {
Boolean isFriends(Long userId1,long userId2);
List<Friends> findFriendsByUserId(long UserId);
void addFriends(long friendId);
void delFriends(long friendId);
void update(FriendsVO vo);
}

124
im-platform/src/main/java/com/lx/implatform/service/impl/FriendServiceImpl.java

@ -0,0 +1,124 @@
package com.lx.implatform.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lx.common.enums.ResultCode;
import com.lx.implatform.entity.Friend;
import com.lx.implatform.entity.User;
import com.lx.implatform.exception.GlobalException;
import com.lx.implatform.mapper.FriendMapper;
import com.lx.implatform.service.IFriendService;
import com.lx.implatform.service.IUserService;
import com.lx.implatform.session.SessionContext;
import com.lx.implatform.vo.FriendVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* <p>
* 好友服务实现类
* </p>
*
* @author blue
* @since 2022-10-22
*/
@Service
public class FriendServiceImpl extends ServiceImpl<FriendMapper, Friend> implements IFriendService {
@Autowired
private IUserService userService;
@Override
public List<Friend> findFriendByUserId(long UserId) {
QueryWrapper<Friend> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(Friend::getUserId,UserId);
List<Friend> friends = this.list(queryWrapper);
return friends;
}
@Transactional
@Override
public void addFriend(long friendId) {
long userId = SessionContext.getSession().getId();
if(userId == friendId){
throw new GlobalException(ResultCode.PROGRAM_ERROR,"不允许添加自己为好友");
}
// 互相绑定好友关系
bindFriend(userId,friendId);
bindFriend(friendId,userId);
}
@Transactional
@Override
public void delFriend(long friendId) {
long userId = SessionContext.getSession().getId();
// 互相解除好友关系
unbindFriend(userId,friendId);
unbindFriend(friendId,userId);
}
@Override
public Boolean isFriend(Long userId1, long userId2) {
QueryWrapper<Friend> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda()
.eq(Friend::getUserId,userId1)
.eq(Friend::getFriendId,userId2);
return this.count(queryWrapper) > 0;
}
@Override
public void update(FriendVO vo) {
long userId = SessionContext.getSession().getId();
QueryWrapper<Friend> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda()
.eq(Friend::getUserId,userId)
.eq(Friend::getFriendId,vo.getFriendId());
Friend f = this.getOne(queryWrapper);
if(f == null){
throw new GlobalException(ResultCode.PROGRAM_ERROR,"对方不是您的好友");
}
f.setFriendHeadImage(vo.getFriendHeadImage());
f.setFriendNickName(vo.getFriendNickName());
this.updateById(f);
}
private void bindFriend(long userId, long friendId) {
QueryWrapper<Friend> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda()
.eq(Friend::getUserId,userId)
.eq(Friend::getFriendId,friendId);
if(this.count(queryWrapper)==0){
Friend friend = new Friend();
friend.setUserId(userId);
friend.setFriendId(friendId);
User friendInfo = userService.getById(friendId);
friend.setFriendHeadImage(friendInfo.getHeadImage());
friend.setFriendNickName(friendInfo.getNickName());
this.save(friend);
}
}
private void unbindFriend(long userId, long friendId) {
QueryWrapper<Friend> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda()
.eq(Friend::getUserId,userId)
.eq(Friend::getFriendId,friendId);
List<Friend> friends = this.list(queryWrapper);
friends.stream().forEach(friend -> {
this.removeById(friend.getId());
});
}
}

124
im-platform/src/main/java/com/lx/implatform/service/impl/FriendsServiceImpl.java

@ -1,124 +0,0 @@
package com.lx.implatform.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lx.common.enums.ResultCode;
import com.lx.implatform.entity.Friends;
import com.lx.implatform.entity.User;
import com.lx.implatform.exception.GlobalException;
import com.lx.implatform.mapper.FriendsMapper;
import com.lx.implatform.service.IFriendsService;
import com.lx.implatform.service.IUserService;
import com.lx.implatform.session.SessionContext;
import com.lx.implatform.vo.FriendsVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* <p>
* 好友服务实现类
* </p>
*
* @author blue
* @since 2022-10-22
*/
@Service
public class FriendsServiceImpl extends ServiceImpl<FriendsMapper, Friends> implements IFriendsService {
@Autowired
private IUserService userService;
@Override
public List<Friends> findFriendsByUserId(long UserId) {
QueryWrapper<Friends> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(Friends::getUserId,UserId);
List<Friends> friendsList = this.list(queryWrapper);
return friendsList;
}
@Transactional
@Override
public void addFriends(long friendId) {
long userId = SessionContext.getSession().getId();
if(userId == friendId){
throw new GlobalException(ResultCode.PROGRAM_ERROR,"不允许添加自己为好友");
}
// 互相绑定好友关系
bindFriends(userId,friendId);
bindFriends(friendId,userId);
}
@Transactional
@Override
public void delFriends(long friendId) {
long userId = SessionContext.getSession().getId();
// 互相解除好友关系
unbindFriends(userId,friendId);
unbindFriends(friendId,userId);
}
@Override
public Boolean isFriends(Long userId1, long userId2) {
QueryWrapper<Friends> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda()
.eq(Friends::getUserId,userId1)
.eq(Friends::getFriendId,userId2);
return this.count(queryWrapper) > 0;
}
@Override
public void update(FriendsVO vo) {
long userId = SessionContext.getSession().getId();
QueryWrapper<Friends> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda()
.eq(Friends::getUserId,userId)
.eq(Friends::getFriendId,vo.getFriendId());
Friends f = this.getOne(queryWrapper);
if(f == null){
throw new GlobalException(ResultCode.PROGRAM_ERROR,"对方不是您的好友");
}
f.setFriendHeadImage(vo.getFriendHeadImage());
f.setFriendNickName(vo.getFriendNickName());
this.updateById(f);
}
private void bindFriends(long userId, long friendsId) {
QueryWrapper<Friends> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda()
.eq(Friends::getUserId,userId)
.eq(Friends::getFriendId,friendsId);
if(this.count(queryWrapper)==0){
Friends friends = new Friends();
friends.setUserId(userId);
friends.setFriendId(friendsId);
User friendsInfo = userService.getById(friendsId);
friends.setFriendHeadImage(friendsInfo.getHeadImage());
friends.setFriendNickName(friendsInfo.getNickName());
this.save(friends);
}
}
private void unbindFriends(long userId, long friendsId) {
QueryWrapper<Friends> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda()
.eq(Friends::getUserId,userId)
.eq(Friends::getFriendId,friendsId);
List<Friends> friendsList = this.list(queryWrapper);
friendsList.stream().forEach(friends -> {
this.removeById(friends.getId());
});
}
}

10
im-platform/src/main/java/com/lx/implatform/service/impl/GroupServiceImpl.java

@ -3,13 +3,13 @@ package com.lx.implatform.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.lx.common.enums.ResultCode;
import com.lx.common.util.BeanUtils;
import com.lx.implatform.entity.Friends;
import com.lx.implatform.entity.Friend;
import com.lx.implatform.entity.Group;
import com.lx.implatform.entity.GroupMember;
import com.lx.implatform.entity.User;
import com.lx.implatform.exception.GlobalException;
import com.lx.implatform.mapper.GroupMapper;
import com.lx.implatform.service.IFriendsService;
import com.lx.implatform.service.IFriendService;
import com.lx.implatform.service.IGroupMemberService;
import com.lx.implatform.service.IGroupService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -36,7 +36,7 @@ public class GroupServiceImpl extends ServiceImpl<GroupMapper, Group> implements
private IGroupMemberService groupMemberService;
@Autowired
private IFriendsService friendsService;
private IFriendService friendsService;
/**
* 创建新群聊
@ -154,8 +154,8 @@ public class GroupServiceImpl extends ServiceImpl<GroupMapper, Group> implements
throw new GlobalException(ResultCode.PROGRAM_ERROR, "部分用户已经在群中,邀请失败");
}
// 找出好友信息
List<Friends> friends = friendsService.findFriendsByUserId(session.getId());
List<Friends> friendsList = vo.getFriendIds().stream().map(id ->
List<Friend> friends = friendsService.findFriendByUserId(session.getId());
List<Friend> friendsList = vo.getFriendIds().stream().map(id ->
friends.stream().filter(f -> f.getFriendId().equals(id)).findFirst().get()).collect(Collectors.toList());
if (friendsList.size() != vo.getFriendIds().size()) {
throw new GlobalException(ResultCode.PROGRAM_ERROR, "部分用户不是您的好友,邀请失败");

6
im-platform/src/main/java/com/lx/implatform/service/impl/SingleMessageServiceImpl.java

@ -10,7 +10,7 @@ import com.lx.common.util.BeanUtils;
import com.lx.implatform.entity.SingleMessage;
import com.lx.implatform.exception.GlobalException;
import com.lx.implatform.mapper.SingleMessageMapper;
import com.lx.implatform.service.IFriendsService;
import com.lx.implatform.service.IFriendService;
import com.lx.implatform.service.ISingleMessageService;
import com.lx.implatform.session.SessionContext;
import com.lx.implatform.vo.SingleMessageVO;
@ -28,14 +28,14 @@ import java.util.stream.Collectors;
public class SingleMessageServiceImpl extends ServiceImpl<SingleMessageMapper, SingleMessage> implements ISingleMessageService {
@Autowired
private IFriendsService friendsService;
private IFriendService friendService;
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Override
public void sendMessage(SingleMessageVO vo) {
Long userId = SessionContext.getSession().getId();
Boolean isFriends = friendsService.isFriends(userId,vo.getRecvUserId());
Boolean isFriends = friendService.isFriend(userId,vo.getRecvUserId());
if(!isFriends){
throw new GlobalException(ResultCode.PROGRAM_ERROR,"您已不是对方好友,无法发送消息");
}

2
im-platform/src/main/java/com/lx/implatform/vo/FriendsVO.java → im-platform/src/main/java/com/lx/implatform/vo/FriendVO.java

@ -9,7 +9,7 @@ import javax.validation.constraints.NotNull;
@Data
@ApiModel("好友信息VO")
public class FriendsVO {
public class FriendVO {
@NotNull(message = "好友id不可为空")
@ApiModelProperty(value = "好友id")

6
im-platform/src/main/resources/db/db.sql

@ -14,12 +14,12 @@ create table `im_user`(
key `idx_nick_name`(nick_name)
) ENGINE=InnoDB CHARSET=utf8mb3 comment '用户';
create table `im_friends`(
create table `im_friend`(
`id` bigint not null auto_increment primary key comment 'id',
`user_id` bigint not null comment '用户id',
`friend_id` bigint not null comment '好友id',
`friend_nick_name` varchar(255) not null comment '用户昵称',
`friend_head_image` varchar(255) default '' comment '用户头像',
`friend_nick_name` varchar(255) not null comment '好友昵称',
`friend_head_image` varchar(255) default '' comment '好友头像',
`created_time` datetime DEFAULT CURRENT_TIMESTAMP comment '创建时间',
key `idx_user_id` (`user_id`),
key `idx_friend_id` (`friend_id`)

10
im-server/src/main/java/com/lx/implatform/imserver/IMServerApp.java

@ -15,12 +15,18 @@ import org.springframework.scheduling.annotation.EnableScheduling;
@EnableScheduling
@ComponentScan(basePackages={"com.lx"})
@SpringBootApplication
public class IMServerApp {
public class IMServerApp implements CommandLineRunner {
@Value("${websocket.port}")
private int port;
public static void main(String[] args) {
SpringApplication.run(IMServerApp.class);
}
}
public void run(String... args) throws Exception {
new WebsocketServer().start(port);
}
}

2
im-server/src/main/java/com/lx/implatform/imserver/websocket/WebsocketServer.java

@ -27,7 +27,7 @@ public class WebsocketServer {
private int port;
@PostConstruct
public void init(){
this.start(port);
//this.start(port);
}
public void start(int port) {

119
im-ui/src/components/friend/AddFriends.vue

@ -1,119 +0,0 @@
<template>
<el-dialog title="添加好友" :visible.sync="dialogVisible" width="350px" :before-close="onClose">
<el-input width="200px" placeholder="搜索好友" class="input-with-select" v-model="searchText" @keyup.enter.native="onSearch()">
<el-button slot="append" icon="el-icon-search" @click="onSearch()"></el-button>
</el-input>
<el-scrollbar style="height:400px">
<div v-for="(userInfo) in users" :key="userInfo.id">
<div class="item">
<div class="avatar">
<head-image :url="userInfo.headImage"></head-image>
</div>
<div class="add-friend-text">
<div>{{userInfo.nickName}}</div>
<div :class="userInfo.online ? 'online-status online':'online-status'">{{ userInfo.online?"[在线]":"[离线]"}}</div>
</div>
<el-button type="success" v-show="!isFriend(userInfo.id)" plain @click="onAddFriends(userInfo)">添加</el-button>
<el-button type="info" v-show="isFriend(userInfo.id)" plain disabled>已添加</el-button>
</div>
</div>
</el-scrollbar>
</el-dialog>
</template>
<script>
import HeadImage from '../common/HeadImage.vue'
export default {
name: "addFriends",
components:{HeadImage},
data() {
return {
users: [],
searchText: ""
}
},
props: {
dialogVisible: {
type: Boolean
}
},
methods: {
onClose() {
this.$emit("close");
},
onSearch() {
this.$http({
url: "/api/user/findByNickName",
method: "get",
params: {
nickName: this.searchText
}
}).then((data) => {
this.users = data;
})
},
onAddFriends(userInfo){
this.$http({
url: "/api/friends/add",
method: "post",
params: {
friendId: userInfo.id
}
}).then((data) => {
this.$store.commit("")
this.$message.success("添加成功,对方已成为您的好友");
let friendsInfo = {
friendId:userInfo.id,
friendNickName: userInfo.nickName,
friendHeadImage: userInfo.headImage,
online: userInfo.online
}
this.$store.commit("addFriends",friendsInfo);
})
},
isFriend(userId){
let friendList = this.$store.state.friendsStore.friendsList;
let friend = friendList.find((f)=> f.friendId==userId);
return friend != undefined;
}
},
mounted() {
this.onSearch();
}
}
</script>
<style scoped lang="scss">
.item {
height: 80px;
display: flex;
position: relative;
padding-left: 15px;
align-items: center;
padding-right: 25px;
.add-friend-text {
margin-left: 15px;
line-height: 80px;
flex: 3;
display: flex;
flex-direction: row;
height: 100%;
flex-shrink: 0;
overflow: hidden;
.online-status{
font-size: 12px;
font-weight: 600;
&.online{
color: #5fb878;
}
}
}
}
</style>

114
im-ui/src/components/friend/FriendsItem.vue

@ -1,114 +0,0 @@
<template>
<div class="item" :class="active ? 'active' : ''">
<div class="avatar">
<head-image :url="friendsInfo.friendHeadImage" > </head-image>
</div>
<div class="text">
<div>{{ friendsInfo.friendNickName}}</div>
<div :class="online ? 'online-status online':'online-status'">{{ online?"[在线]":"[离线]"}}</div>
</div>
<div class="close" @click.stop="$emit('del',friendsInfo,index)">
<i class="el-icon-close" style="border: none; font-size: 20px;color: black;" title="添加好友"></i>
</div>
</div>
</template>
<script>
import HeadImage from '../common/HeadImage.vue';
export default {
name: "frinedsItem",
components: {HeadImage},
data() {
return {
}
},
props: {
friendsInfo: {
type: Object
},
active:{
type: Boolean
},
index:{
type: Number
}
},
computed:{
online(){
return this.$store.state.friendsStore.friendsList[this.index].online;
}
}
}
</script>
<style scope lang="scss">
.item {
height: 65px;
display: flex;
margin-bottom: 1px;
position: relative;
padding-left: 15px;
align-items: center;
padding-right: 5px;
background-color: #eeeeee;
&:hover {
background-color: #dddddd;
}
&.active{
background-color: #cccccc;
}
.close {
width: 1.5rem;
height: 1.5rem;
right: 10px;
top: 1.825rem;
cursor: pointer;
display: none;
}
&:hover {
.close {
display: block;
}
}
.avatar {
display: flex;
justify-content: center;
align-items: center;
width: 45px;
height: 45px;
}
.text {
margin-left: 15px;
flex: 3;
display: flex;
flex-direction: column;
justify-content: space-around;
height: 100%;
flex-shrink: 0;
overflow: hidden;
&>div {
display: flex;
justify-content: flex-start;
}
.online-status{
font-size: 12px;
font-weight: 600;
&.online{
color: #5fb878;
}
}
}
}
.active {
background-color: #eeeeee;
}
</style>

4
im-ui/src/router/index.js

@ -34,8 +34,8 @@ export default new VueRouter({
},
{
name: "Friends",
path: "/home/friends",
component: () => import("../view/Friends"),
path: "/home/friend",
component: () => import("../view/Friend"),
},
{
name: "Friends",

90
im-ui/src/store/friendsStore.js

@ -1,90 +0,0 @@
import httpRequest from '../api/httpRequest.js'
export default {
state: {
friendsList: [],
activeIndex: -1,
timer: null
},
mutations: {
initFriendsStore(state) {
httpRequest({
url: '/api/friends/list',
method: 'get'
}).then((friendsList) => {
this.commit("setFriendsList",friendsList);
this.commit("refreshOnlineStatus");
})
},
setFriendsList(state, friendsList) {
state.friendsList = friendsList;
},
updateFriends(state,friendsInfo){
console.log(friendsInfo)
state.friendsList.forEach((f,index)=>{
if(f.friendId==friendsInfo.friendId){
state.friendsList[index] = friendsInfo;
}
})
},
activeFriends(state, index) {
state.activeIndex = index;
},
removeFriends(state, index) {
state.friendsList.splice(index, 1);
},
addFriends(state, friendsInfo) {
state.friendsList.push(friendsInfo);
},
refreshOnlineStatus(state){
let userIds = [];
if(state.friendsList.length ==0){
return;
}
state.friendsList.forEach((f)=>{userIds.push(f.friendId)});
httpRequest({
url: '/api/user/online',
method: 'get',
params: {userIds: userIds.join(',')}
}).then((onlineIds) => {
this.commit("setOnlineStatus",onlineIds);
})
// 30s后重新拉取
clearTimeout(state.timer);
state.timer = setTimeout(()=>{
this.commit("refreshOnlineStatus");
},30000)
},
setOnlineStatus(state,onlineIds){
state.friendsList.forEach((f)=>{
let onlineFriend = onlineIds.find((id)=> f.friendId==id);
f.online = onlineFriend != undefined;
console.log(f.friendNickName+":"+f.online);
});
let activeFriend = state.friendsList[state.activeIndex];
state.friendsList.sort((f1,f2)=>{
if(f1.online&&!f2.online){
return -1;
}
if(f2.online&&!f1.online){
return 1;
}
return 0;
});
// 重新排序后,activeIndex指向的好友可能会变化,需要重新指定
if(state.activeIndex >=0){
state.friendsList.forEach((f,i)=>{
if(f.friendId == activeFriend.friendId){
state.activeIndex = i;
}
})
}
}
}
}

6
im-ui/src/store/index.js

@ -1,7 +1,7 @@
import Vue from 'vue';
import Vuex from 'vuex';
import chatStore from './chatStore.js';
import friendsStore from './friendsStore.js';
import friendStore from './friendStore.js';
import userStore from './userStore.js';
import VuexPersistence from 'vuex-persist'
@ -14,7 +14,7 @@ const vuexLocal = new VuexPersistence({
Vue.use(Vuex)
export default new Vuex.Store({
modules: {chatStore,friendsStore,userStore},
modules: {chatStore,friendStore,userStore},
state: {
userInfo: {}
},
@ -22,7 +22,7 @@ export default new Vuex.Store({
mutations: {
initStore(state){
this.commit("initFriendsStore");
this.commit("initFriendStore");
}
},

12
im-ui/src/view/Chat.vue

@ -10,7 +10,7 @@
</el-header>
<el-main>
<div v-for="(chat,index) in chatStore.chats" :key="chat.targetId">
<chat-item :chat="chat" :index="index" @click.native="onClickItem(index)" @del="onDelItem(chat,index)" :active="index === chatStore.activeIndex"></chat-item>
<chat-item :chat="chat" :index="index" @click.native="handleActiveItem(index)" @del="handleDelItem(chat,index)" :active="index === chatStore.activeIndex"></chat-item>
</div>
</el-main>
</el-aside>
@ -54,10 +54,10 @@
</div>
<div class="el-icon-chat-dot-round"></div>
</div>
<textarea v-model="messageContent" ref="sendBox" class="send-text-area" @keyup.enter="onSendMessage()"></textarea>
<textarea v-model="messageContent" ref="sendBox" class="send-text-area" @keyup.enter="handleSendMessage()"></textarea>
<div class="im-chat-send">
<el-button type="primary" @click="onSendMessage()">发送</el-button>
<el-button type="primary" @click="handleSendMessage()">发送</el-button>
</div>
</el-footer>
</el-container>
@ -87,7 +87,7 @@
}
},
methods: {
onClickItem(index) {
handleActiveItem(index) {
this.$store.commit("activeChat", index);
//
let userId = this.chatStore.chats[index].targetId;
@ -103,7 +103,7 @@
}
})
},
onSendMessage() {
handleSendMessage() {
let msgInfo = {
recvUserId: this.activeChat.targetId,
content: this.messageContent,
@ -112,7 +112,7 @@
this.sendMessage(msgInfo);
},
onDelItem(chat, index) {
handleDelItem(chat, index) {
this.$store.commit("removeChat", index);
},

184
im-ui/src/view/Friends.vue

@ -1,184 +0,0 @@
<template>
<el-container>
<el-aside width="250px" class="l-friend-box">
<el-header class="l-friend-header" height="60px">
<div class="l-friend-search">
<el-input width="200px" placeholder="搜索好友" v-model="searchText">
<el-button slot="append" icon="el-icon-search"></el-button>
</el-input>
</div>
<el-button plain icon="el-icon-plus" style="border: none; padding:12px; font-size: 20px;color: black;" title="添加好友" @click="onShowAddFriends"></el-button>
<add-friends :dialogVisible="showAddFriend" @close="onCloseAddFriends" @add="onAddFriend()">
</add-friends>
</el-header>
<el-main>
<div v-for="(friendsInfo,index) in $store.state.friendsStore.friendsList" :key="friendsInfo.id">
<friends-item v-show="friendsInfo.friendNickName.startsWith(searchText)" :friendsInfo="friendsInfo" :index="index"
:active="index === $store.state.friendsStore.activeIndex" @del="onDelItem(friendsInfo,index)" @click.native="onClickItem(friendsInfo,index)">
</friends-item>
</div>
</el-main>
</el-aside>
<el-container class="r-friend-box">
<div v-show="$store.state.friendsStore.activeIndex>=0">
<div class="user-detail">
<head-image class="detail-head-image" :url="activeUserInfo.headImage"></head-image>
<div class="info-item">
<el-descriptions title="好友信息" class="description" :column="1">
<el-descriptions-item label="用户名">{{ activeUserInfo.userName }}
</el-descriptions-item>
<el-descriptions-item label="昵称">{{ activeUserInfo.nickName }}
</el-descriptions-item>
<el-descriptions-item label="性别">{{ activeUserInfo.sex==0?"男":"女" }}</el-descriptions-item>
<el-descriptions-item label="签名">{{ activeUserInfo.signature }}</el-descriptions-item>
</el-descriptions>
</div>
</div>
<div class="btn-group">
<el-button class="send-btn" @click="onSend()">发消息</el-button>
</div>
</div>
</el-container>
</el-container>
</template>
<script>
import FriendsItem from "../components/friend/FriendsItem.vue";
import AddFriends from "../components/friend/AddFriends.vue";
import HeadImage from "../components/common/HeadImage.vue";
export default {
name: "friends",
components: {
FriendsItem,
AddFriends,
HeadImage
},
data() {
return {
searchText: "",
showAddFriend: false,
activeUserInfo: {}
}
},
methods: {
onShowAddFriends() {
this.showAddFriend = true;
},
onCloseAddFriends() {
this.showAddFriend = false;
},
onClickItem(friendsInfo, index) {
this.$store.commit("activeFriends", index);
this.$http({
url: `/api/user/find/${friendsInfo.friendId}`,
method: 'get'
}).then((userInfo) => {
this.activeUserInfo = userInfo;
//
if (userInfo.headImageThumb != friendsInfo.friendHeadImage ||
userInfo.nickName != friendsInfo.friendNickName) {
this.updateFriendInfo(friendsInfo, userInfo, index)
}
})
},
onDelItem(friendsInfo, index) {
this.$http({
url: '/api/friends/delete',
method: 'delete',
params: {
friendId: friendsInfo.friendId
}
}).then((data) => {
this.$message.success("删除好友成功");
this.$store.commit("removeFriends", index);
})
},
onSend() {
let userInfo = this.activeUserInfo;
let chatInfo = {
type: 'single',
targetId: userInfo.id,
showName: userInfo.nickName,
headImage: userInfo.headImage,
};
this.$store.commit("openChat", chatInfo);
this.$store.commit("activeChat", 0);
this.$router.push("/home/chat");
},
updateFriendInfo(friendsInfo, userInfo, index) {
friendsInfo.friendHeadImage = userInfo.headImageThumb;
friendsInfo.friendNickName = userInfo.nickName;
this.$http({
url: "/api/friends/update",
method: "put",
data: friendsInfo
}).then(() => {
this.$store.commit("updateFriends", friendsInfo);
this.$store.commit("setChatUserInfo", userInfo);
})
}
}
}
</script>
<style scoped lang="scss">
.el-container {
.l-friend-box {
border: #dddddd solid 1px;
background: #eeeeee;
.l-friend-header {
display: flex;
align-items: center;
padding: 5px;
background-color: white;
.l-friend-search{
flex: 1;
}
}
.el-main {
padding: 0;
}
}
.r-friend-box {
.user-detail {
width: 100%;
display: flex;
padding: 50px 10px 10px 50px;
text-align: center;
justify-content: space-around;
.detail-head-image {
width: 200px;
height: 200px;
}
.info-item {
width: 400px;
height: 200px;
background-color: #ffffff;
}
.description {
padding: 20px 20px 0px 20px;
}
}
.btn-group {
text-align: left !important;
padding-left: 100px;
}
}
}
</style>

4
im-ui/src/view/Home.vue

@ -12,7 +12,7 @@
</router-link>
</el-menu-item >
<el-menu-item title="好友" >
<router-link v-bind:to="'/home/friends'">
<router-link v-bind:to="'/home/friend'">
<span class="el-icon-user"></span>
</router-link>
</el-menu-item>
@ -73,7 +73,7 @@
},
handleSingleMessage(msg){
//
let f = this.$store.state.friendsStore.friendsList.find((f)=>f.friendId==msg.sendUserId);
let f = this.$store.state.friendStore.friends.find((f)=>f.friendId==msg.sendUserId);
let chatInfo = {
type: 'single',
targetId: f.friendId,

Loading…
Cancel
Save