38 changed files with 4411 additions and 195 deletions
@ -0,0 +1,63 @@ |
|||||
|
import request from '@/utils/request'; |
||||
|
import { AxiosPromise } from 'axios'; |
||||
|
import { GroupVO, GroupBanDTO, GroupUnbanDTO, GroupQuery } from '@/api/im/group/types'; |
||||
|
|
||||
|
/** |
||||
|
* 查询群列表 |
||||
|
* @param query |
||||
|
* @returns {*} |
||||
|
*/ |
||||
|
|
||||
|
export const listGroup = (query?: GroupQuery): AxiosPromise<GroupVO[]> => { |
||||
|
return request({ |
||||
|
url: '/im/group/list', |
||||
|
method: 'get', |
||||
|
params: query |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* 查询群详细 |
||||
|
* @param id |
||||
|
*/ |
||||
|
export const getGroup = (id: string | number): AxiosPromise<GroupVO> => { |
||||
|
return request({ |
||||
|
url: '/im/group/' + id, |
||||
|
method: 'get' |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* 封禁用户 |
||||
|
* @param data |
||||
|
*/ |
||||
|
export const ban = (data: GroupBanDTO) => { |
||||
|
return request({ |
||||
|
url: '/im/group/ban', |
||||
|
method: 'put', |
||||
|
data: data |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 解封用户 |
||||
|
* @param data |
||||
|
*/ |
||||
|
export const unban = (data: GroupUnbanDTO) => { |
||||
|
return request({ |
||||
|
url: '/im/group/unban', |
||||
|
method: 'put', |
||||
|
data: data |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
|
||||
|
export const findGroupByName = (name?: String): AxiosPromise<GroupVO[]> => { |
||||
|
return request({ |
||||
|
url: '/im/group/findByName?name='+name, |
||||
|
method: 'get' |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
@ -0,0 +1,193 @@ |
|||||
|
export interface GroupVO { |
||||
|
/** |
||||
|
* id |
||||
|
*/ |
||||
|
id: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 群名字 |
||||
|
*/ |
||||
|
name: string; |
||||
|
|
||||
|
/** |
||||
|
* 群主id |
||||
|
*/ |
||||
|
ownerId: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 群头像 |
||||
|
*/ |
||||
|
headImage: string; |
||||
|
|
||||
|
/** |
||||
|
* 群头像Url |
||||
|
*/ |
||||
|
headImageUrl: string; |
||||
|
/** |
||||
|
* 群头像缩略图 |
||||
|
*/ |
||||
|
headImageThumb: string; |
||||
|
|
||||
|
/** |
||||
|
* 群公告 |
||||
|
*/ |
||||
|
notice: string; |
||||
|
/** |
||||
|
* 是否已解散 |
||||
|
*/ |
||||
|
dissolve: number; |
||||
|
|
||||
|
/** |
||||
|
* 创建时间 |
||||
|
*/ |
||||
|
createdTime: string; |
||||
|
|
||||
|
/** |
||||
|
* 是否被封禁 0:否 1:是 |
||||
|
*/ |
||||
|
isBanned: number; |
||||
|
|
||||
|
/** |
||||
|
* 被封禁原因 |
||||
|
*/ |
||||
|
reason: string; |
||||
|
|
||||
|
/** |
||||
|
* 成员数量 |
||||
|
*/ |
||||
|
memberCount: number; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
export interface GroupForm extends BaseEntity { |
||||
|
/** |
||||
|
* id |
||||
|
*/ |
||||
|
id?: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 群名字 |
||||
|
*/ |
||||
|
name?: string; |
||||
|
|
||||
|
/** |
||||
|
* 群主id |
||||
|
*/ |
||||
|
ownerId?: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 群主 |
||||
|
*/ |
||||
|
ownerUserName: string, |
||||
|
/** |
||||
|
* 群头像 |
||||
|
*/ |
||||
|
headImage?: string; |
||||
|
|
||||
|
/** |
||||
|
* 群头像缩略图 |
||||
|
*/ |
||||
|
headImageThumb?: string; |
||||
|
|
||||
|
/** |
||||
|
* 群公告 |
||||
|
*/ |
||||
|
notice?: string; |
||||
|
|
||||
|
/** |
||||
|
* 是否已解散 |
||||
|
*/ |
||||
|
dissolve?: number; |
||||
|
|
||||
|
/** |
||||
|
* 创建时间 |
||||
|
*/ |
||||
|
createdTime?: string; |
||||
|
|
||||
|
/** |
||||
|
* 是否被封禁 0:否 1:是 |
||||
|
*/ |
||||
|
isBanned?: number; |
||||
|
|
||||
|
/** |
||||
|
* 被封禁原因 |
||||
|
*/ |
||||
|
reason?: string; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
export interface GroupQuery extends PageQuery { |
||||
|
|
||||
|
/** |
||||
|
* 群名字 |
||||
|
*/ |
||||
|
name?: string; |
||||
|
|
||||
|
/** |
||||
|
* 群主id |
||||
|
*/ |
||||
|
ownerId?: number; |
||||
|
|
||||
|
/** |
||||
|
* 群头像 |
||||
|
*/ |
||||
|
headImage?: string; |
||||
|
|
||||
|
/** |
||||
|
* 群头像缩略图 |
||||
|
*/ |
||||
|
headImageThumb?: string; |
||||
|
|
||||
|
/** |
||||
|
* 群公告 |
||||
|
*/ |
||||
|
notice?: string; |
||||
|
|
||||
|
/** |
||||
|
* 是否已解散 |
||||
|
*/ |
||||
|
dissolve?: number; |
||||
|
|
||||
|
/** |
||||
|
* 创建时间 |
||||
|
*/ |
||||
|
createdTime?: string; |
||||
|
|
||||
|
/** |
||||
|
* 是否被封禁 0:否 1:是 |
||||
|
*/ |
||||
|
isBanned?: number; |
||||
|
|
||||
|
/** |
||||
|
* 被封禁原因 |
||||
|
*/ |
||||
|
reason?: string; |
||||
|
|
||||
|
/** |
||||
|
* 日期范围参数 |
||||
|
*/ |
||||
|
params?: any; |
||||
|
} |
||||
|
|
||||
|
export interface GroupBanDTO { |
||||
|
|
||||
|
/** |
||||
|
* id |
||||
|
*/ |
||||
|
id?: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 被封禁原因 |
||||
|
*/ |
||||
|
reason?: string; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
export interface GroupUnbanDTO { |
||||
|
|
||||
|
/** |
||||
|
* id |
||||
|
*/ |
||||
|
id?: string | number; |
||||
|
} |
||||
|
|
||||
@ -0,0 +1,18 @@ |
|||||
|
import request from '@/utils/request'; |
||||
|
import { AxiosPromise } from 'axios'; |
||||
|
import { GroupMemberVO, GroupMemberQuery } from '@/api/im/groupMember/types'; |
||||
|
|
||||
|
/** |
||||
|
* 查询群成员列表 |
||||
|
* @param query |
||||
|
* @returns {*} |
||||
|
*/ |
||||
|
|
||||
|
export const listGroupMember = (query?: GroupMemberQuery): AxiosPromise<GroupMemberVO[]> => { |
||||
|
return request({ |
||||
|
url: '/im/group/member/list', |
||||
|
method: 'get', |
||||
|
params: query |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
@ -0,0 +1,173 @@ |
|||||
|
export interface GroupMemberVO { |
||||
|
/** |
||||
|
* id |
||||
|
*/ |
||||
|
id: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 群id |
||||
|
*/ |
||||
|
groupId: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 用户id |
||||
|
*/ |
||||
|
userId: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 组内显示名称 |
||||
|
*/ |
||||
|
remarkNickName: string; |
||||
|
|
||||
|
/** |
||||
|
* 用户头像 |
||||
|
*/ |
||||
|
headImage: string; |
||||
|
|
||||
|
/** |
||||
|
* 用户头像Url |
||||
|
*/ |
||||
|
headImageUrl: string; |
||||
|
/** |
||||
|
* 群名备注 |
||||
|
*/ |
||||
|
remarkGroupName: string; |
||||
|
|
||||
|
/** |
||||
|
* 是否已退出 |
||||
|
*/ |
||||
|
quit: number; |
||||
|
|
||||
|
/** |
||||
|
* 创建时间 |
||||
|
*/ |
||||
|
createdTime: string; |
||||
|
|
||||
|
/** |
||||
|
* 退出时间 |
||||
|
*/ |
||||
|
quitTime: string; |
||||
|
|
||||
|
/** |
||||
|
* 用户昵称 |
||||
|
*/ |
||||
|
userNickName: string; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
export interface GroupMemberForm extends BaseEntity { |
||||
|
/** |
||||
|
* id |
||||
|
*/ |
||||
|
id?: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 群id |
||||
|
*/ |
||||
|
groupId?: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 用户id |
||||
|
*/ |
||||
|
userId?: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 组内显示名称 |
||||
|
*/ |
||||
|
remarkNickName?: string; |
||||
|
|
||||
|
/** |
||||
|
* 用户头像 |
||||
|
*/ |
||||
|
headImage?: string; |
||||
|
|
||||
|
/** |
||||
|
* 群名备注 |
||||
|
*/ |
||||
|
remarkGroupName?: string; |
||||
|
|
||||
|
/** |
||||
|
* 是否已退出 |
||||
|
*/ |
||||
|
quit?: number; |
||||
|
|
||||
|
/** |
||||
|
* 创建时间 |
||||
|
*/ |
||||
|
createdTime?: string; |
||||
|
|
||||
|
/** |
||||
|
* 退出时间 |
||||
|
*/ |
||||
|
quitTime?: string; |
||||
|
|
||||
|
/** |
||||
|
* 用户昵称 |
||||
|
*/ |
||||
|
userNickName?: string; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
export interface GroupMemberQuery extends PageQuery { |
||||
|
|
||||
|
/** |
||||
|
* 群id |
||||
|
*/ |
||||
|
groupId?: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 用户id |
||||
|
*/ |
||||
|
userId?: number; |
||||
|
|
||||
|
/** |
||||
|
* 用户名 |
||||
|
*/ |
||||
|
userName: String, |
||||
|
|
||||
|
/** |
||||
|
* 组内显示名称 |
||||
|
*/ |
||||
|
remarkNickName?: string; |
||||
|
|
||||
|
/** |
||||
|
* 用户头像 |
||||
|
*/ |
||||
|
headImage?: string; |
||||
|
|
||||
|
/** |
||||
|
* 群名备注 |
||||
|
*/ |
||||
|
remarkGroupName?: string; |
||||
|
|
||||
|
/** |
||||
|
* 是否已退出 |
||||
|
*/ |
||||
|
quit?: number; |
||||
|
|
||||
|
/** |
||||
|
* 创建时间 |
||||
|
*/ |
||||
|
createdTime?: string; |
||||
|
|
||||
|
/** |
||||
|
* 退出时间 |
||||
|
*/ |
||||
|
quitTime?: string; |
||||
|
|
||||
|
/** |
||||
|
* 用户昵称 |
||||
|
*/ |
||||
|
userNickName?: string; |
||||
|
/** |
||||
|
* 群内显示名 |
||||
|
*/ |
||||
|
showNickName?: string; |
||||
|
/** |
||||
|
* 日期范围参数 |
||||
|
*/ |
||||
|
params?: any; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
@ -0,0 +1,63 @@ |
|||||
|
import request from '@/utils/request'; |
||||
|
import { AxiosPromise } from 'axios'; |
||||
|
import { GroupMessageVO, GroupMessageForm, GroupMessageQuery } from '@/api/im/groupMessage/types'; |
||||
|
|
||||
|
/** |
||||
|
* 查询群消息列表 |
||||
|
* @param query |
||||
|
* @returns {*} |
||||
|
*/ |
||||
|
|
||||
|
export const listGroupMessage = (query?: GroupMessageQuery): AxiosPromise<GroupMessageVO[]> => { |
||||
|
return request({ |
||||
|
url: '/im/groupMessage/list', |
||||
|
method: 'get', |
||||
|
params: query |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* 查询群消息详细 |
||||
|
* @param id |
||||
|
*/ |
||||
|
export const getGroupMessage = (id: string | number): AxiosPromise<GroupMessageVO> => { |
||||
|
return request({ |
||||
|
url: '/im/groupMessage/' + id, |
||||
|
method: 'get' |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* 新增群消息 |
||||
|
* @param data |
||||
|
*/ |
||||
|
export const addGroupMessage = (data: GroupMessageForm) => { |
||||
|
return request({ |
||||
|
url: '/im/groupMessage', |
||||
|
method: 'post', |
||||
|
data: data |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* 修改群消息 |
||||
|
* @param data |
||||
|
*/ |
||||
|
export const updateGroupMessage = (data: GroupMessageForm) => { |
||||
|
return request({ |
||||
|
url: '/im/groupMessage', |
||||
|
method: 'put', |
||||
|
data: data |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* 删除群消息 |
||||
|
* @param id |
||||
|
*/ |
||||
|
export const delGroupMessage = (id: string | number | Array<string | number>) => { |
||||
|
return request({ |
||||
|
url: '/im/groupMessage/' + id, |
||||
|
method: 'delete' |
||||
|
}); |
||||
|
}; |
||||
@ -0,0 +1,191 @@ |
|||||
|
export interface GroupMessageVO { |
||||
|
/** |
||||
|
* id |
||||
|
*/ |
||||
|
id: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 群id |
||||
|
*/ |
||||
|
groupId: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 发送用户id |
||||
|
*/ |
||||
|
sendId: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 发送用户昵称 |
||||
|
*/ |
||||
|
sendNickName: string; |
||||
|
|
||||
|
/** |
||||
|
* 被@用户id列表,逗号分隔 |
||||
|
*/ |
||||
|
atUserIds: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 发送内容 |
||||
|
*/ |
||||
|
content: string; |
||||
|
|
||||
|
/** |
||||
|
* |
||||
|
*/ |
||||
|
status: number; |
||||
|
|
||||
|
/** |
||||
|
* 消息类型 0:文字 1:图片 2:文件 |
||||
|
*/ |
||||
|
type: number; |
||||
|
|
||||
|
/** |
||||
|
* 发送时间 |
||||
|
*/ |
||||
|
sendTime: string; |
||||
|
|
||||
|
/** |
||||
|
* 回执消息是否完成 |
||||
|
*/ |
||||
|
receiptOk: number; |
||||
|
|
||||
|
/** |
||||
|
* 是否回执消息 |
||||
|
*/ |
||||
|
receipt: number; |
||||
|
|
||||
|
/** |
||||
|
* 接收用户id,逗号分隔,为空表示发给所有成员 |
||||
|
*/ |
||||
|
recvIds: string | number; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
export interface GroupMessageForm extends BaseEntity { |
||||
|
/** |
||||
|
* id |
||||
|
*/ |
||||
|
id?: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 群id |
||||
|
*/ |
||||
|
groupId?: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 发送用户id |
||||
|
*/ |
||||
|
sendId?: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 发送用户昵称 |
||||
|
*/ |
||||
|
sendNickName?: string; |
||||
|
|
||||
|
/** |
||||
|
* 被@用户id列表,逗号分隔 |
||||
|
*/ |
||||
|
atUserIds?: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 发送内容 |
||||
|
*/ |
||||
|
content?: string; |
||||
|
|
||||
|
/** |
||||
|
* |
||||
|
*/ |
||||
|
status?: number; |
||||
|
|
||||
|
/** |
||||
|
* 消息类型 0:文字 1:图片 2:文件 |
||||
|
*/ |
||||
|
type?: number; |
||||
|
|
||||
|
/** |
||||
|
* 发送时间 |
||||
|
*/ |
||||
|
sendTime?: string; |
||||
|
|
||||
|
/** |
||||
|
* 回执消息是否完成 |
||||
|
*/ |
||||
|
receiptOk?: number; |
||||
|
|
||||
|
/** |
||||
|
* 是否回执消息 |
||||
|
*/ |
||||
|
receipt?: number; |
||||
|
|
||||
|
/** |
||||
|
* 接收用户id,逗号分隔,为空表示发给所有成员 |
||||
|
*/ |
||||
|
recvIds?: string | number; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
export interface GroupMessageQuery extends PageQuery { |
||||
|
|
||||
|
/** |
||||
|
* 群id |
||||
|
*/ |
||||
|
groupId?: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 发送用户id |
||||
|
*/ |
||||
|
sendId?: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 发送用户昵称 |
||||
|
*/ |
||||
|
sendNickName?: string; |
||||
|
|
||||
|
/** |
||||
|
* 被@用户id列表,逗号分隔 |
||||
|
*/ |
||||
|
atUserIds?: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 发送内容 |
||||
|
*/ |
||||
|
content?: string; |
||||
|
|
||||
|
/** |
||||
|
* |
||||
|
*/ |
||||
|
status?: number; |
||||
|
|
||||
|
/** |
||||
|
* 消息类型 0:文字 1:图片 2:文件 |
||||
|
*/ |
||||
|
type?: number; |
||||
|
|
||||
|
/** |
||||
|
* 发送时间 |
||||
|
*/ |
||||
|
sendTime?: string; |
||||
|
|
||||
|
/** |
||||
|
* 回执消息是否完成 |
||||
|
*/ |
||||
|
receiptOk?: number; |
||||
|
|
||||
|
/** |
||||
|
* 是否回执消息 |
||||
|
*/ |
||||
|
receipt?: number; |
||||
|
|
||||
|
/** |
||||
|
* 接收用户id,逗号分隔,为空表示发给所有成员 |
||||
|
*/ |
||||
|
recvIds?: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 日期范围参数 |
||||
|
*/ |
||||
|
params?: any; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
@ -0,0 +1,29 @@ |
|||||
|
import request from '@/utils/request'; |
||||
|
import { AxiosPromise } from 'axios'; |
||||
|
import { PrivateMessageVO, PrivateMessageQuery } from '@/api/im/privateMessage/types'; |
||||
|
|
||||
|
/** |
||||
|
* 查询私聊消息列表 |
||||
|
* @param query |
||||
|
* @returns {*} |
||||
|
*/ |
||||
|
|
||||
|
export const listPrivateMessage = (query?: PrivateMessageQuery): AxiosPromise<PrivateMessageVO[]> => { |
||||
|
return request({ |
||||
|
url: '/im/privateMessage/list', |
||||
|
method: 'get', |
||||
|
params: query |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* 查询私聊消息详细 |
||||
|
* @param id |
||||
|
*/ |
||||
|
export const getPrivateMessage = (id: string | number): AxiosPromise<PrivateMessageVO> => { |
||||
|
return request({ |
||||
|
url: '/im/privateMessage/' + id, |
||||
|
method: 'get' |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
@ -0,0 +1,129 @@ |
|||||
|
export interface PrivateMessageVO { |
||||
|
/** |
||||
|
* id |
||||
|
*/ |
||||
|
id: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 发送用户id |
||||
|
*/ |
||||
|
sendId: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 接收用户id |
||||
|
*/ |
||||
|
recvId: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 发送内容 |
||||
|
*/ |
||||
|
content: string; |
||||
|
|
||||
|
/** |
||||
|
* 消息类型 0:文字 1:图片 2:文件 |
||||
|
*/ |
||||
|
type: number; |
||||
|
|
||||
|
/** |
||||
|
* 状态 0:未读 1:已读 |
||||
|
*/ |
||||
|
status: number; |
||||
|
|
||||
|
/** |
||||
|
* 发送时间 |
||||
|
*/ |
||||
|
sendTime: string; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
export interface PrivateMessageForm extends BaseEntity { |
||||
|
/** |
||||
|
* id |
||||
|
*/ |
||||
|
id?: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 发送用户id |
||||
|
*/ |
||||
|
sendId?: string | number; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 发送用户id |
||||
|
*/ |
||||
|
sendUserName: string; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 接收用户id |
||||
|
*/ |
||||
|
recvId?: string | number; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 接收用户 |
||||
|
*/ |
||||
|
recvUserName: string; |
||||
|
|
||||
|
/** |
||||
|
* 发送内容 |
||||
|
*/ |
||||
|
content?: string; |
||||
|
|
||||
|
/** |
||||
|
* 消息类型 0:文字 1:图片 2:文件 |
||||
|
*/ |
||||
|
type?: number; |
||||
|
|
||||
|
/** |
||||
|
* 状态 0:未读 1:已读 |
||||
|
*/ |
||||
|
status?: number; |
||||
|
|
||||
|
/** |
||||
|
* 发送时间 |
||||
|
*/ |
||||
|
sendTime?: string; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
export interface PrivateMessageQuery extends PageQuery { |
||||
|
|
||||
|
/** |
||||
|
* 发送用户id |
||||
|
*/ |
||||
|
sendId?: number; |
||||
|
|
||||
|
/** |
||||
|
* 接收用户id |
||||
|
*/ |
||||
|
recvId?: number; |
||||
|
|
||||
|
/** |
||||
|
* 发送内容 |
||||
|
*/ |
||||
|
content?: string; |
||||
|
|
||||
|
/** |
||||
|
* 消息类型 0:文字 1:图片 2:文件 |
||||
|
*/ |
||||
|
type?: number; |
||||
|
|
||||
|
/** |
||||
|
* 状态 0:未读 1:已读 |
||||
|
*/ |
||||
|
status?: number; |
||||
|
|
||||
|
/** |
||||
|
* 发送时间 |
||||
|
*/ |
||||
|
sendTime?: string; |
||||
|
|
||||
|
/** |
||||
|
* 日期范围参数 |
||||
|
*/ |
||||
|
params?: any; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
@ -0,0 +1,63 @@ |
|||||
|
import request from '@/utils/request'; |
||||
|
import { AxiosPromise } from 'axios'; |
||||
|
import { SensitiveWordVO, SensitiveWordForm, SensitiveWordQuery } from '@/api/im/sensitiveWord/types'; |
||||
|
|
||||
|
/** |
||||
|
* 查询敏感词列表 |
||||
|
* @param query |
||||
|
* @returns {*} |
||||
|
*/ |
||||
|
|
||||
|
export const listSensitiveWord = (query?: SensitiveWordQuery): AxiosPromise<SensitiveWordVO[]> => { |
||||
|
return request({ |
||||
|
url: '/im/sensitiveWord/list', |
||||
|
method: 'get', |
||||
|
params: query |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* 查询敏感词详细 |
||||
|
* @param id |
||||
|
*/ |
||||
|
export const getSensitiveWord = (id: string | number): AxiosPromise<SensitiveWordVO> => { |
||||
|
return request({ |
||||
|
url: '/im/sensitiveWord/' + id, |
||||
|
method: 'get' |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* 新增敏感词 |
||||
|
* @param data |
||||
|
*/ |
||||
|
export const addSensitiveWord = (data: SensitiveWordForm) => { |
||||
|
return request({ |
||||
|
url: '/im/sensitiveWord', |
||||
|
method: 'post', |
||||
|
data: data |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* 修改敏感词 |
||||
|
* @param data |
||||
|
*/ |
||||
|
export const updateSensitiveWord = (data: SensitiveWordForm) => { |
||||
|
return request({ |
||||
|
url: '/im/sensitiveWord', |
||||
|
method: 'put', |
||||
|
data: data |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* 删除敏感词 |
||||
|
* @param id |
||||
|
*/ |
||||
|
export const delSensitiveWord = (id: string | number | Array<string | number>) => { |
||||
|
return request({ |
||||
|
url: '/im/sensitiveWord/' + id, |
||||
|
method: 'delete' |
||||
|
}); |
||||
|
}; |
||||
@ -0,0 +1,71 @@ |
|||||
|
export interface SensitiveWordVO { |
||||
|
/** |
||||
|
* id |
||||
|
*/ |
||||
|
id: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 敏感词内容 |
||||
|
*/ |
||||
|
content: string; |
||||
|
|
||||
|
/** |
||||
|
* 是否启用 0:未启用 1:启用 |
||||
|
*/ |
||||
|
enabled: number; |
||||
|
|
||||
|
/** |
||||
|
* 创建者 |
||||
|
*/ |
||||
|
creator: number; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
export interface SensitiveWordForm extends BaseEntity { |
||||
|
/** |
||||
|
* id |
||||
|
*/ |
||||
|
id?: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 敏感词内容 |
||||
|
*/ |
||||
|
content?: string; |
||||
|
|
||||
|
/** |
||||
|
* 是否启用 0:未启用 1:启用 |
||||
|
*/ |
||||
|
enabled?: number; |
||||
|
|
||||
|
/** |
||||
|
* 创建者 |
||||
|
*/ |
||||
|
creator?: number; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
export interface SensitiveWordQuery extends PageQuery { |
||||
|
|
||||
|
/** |
||||
|
* 敏感词内容 |
||||
|
*/ |
||||
|
content?: string; |
||||
|
|
||||
|
/** |
||||
|
* 是否启用 0:未启用 1:启用 |
||||
|
*/ |
||||
|
enabled?: number; |
||||
|
|
||||
|
/** |
||||
|
* 创建者 |
||||
|
*/ |
||||
|
creator?: number; |
||||
|
|
||||
|
/** |
||||
|
* 日期范围参数 |
||||
|
*/ |
||||
|
params?: any; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
@ -0,0 +1,63 @@ |
|||||
|
import request from '@/utils/request'; |
||||
|
import { AxiosPromise } from 'axios'; |
||||
|
import { SmPushTaskVO, SmPushTaskForm, SmPushTaskQuery } from '@/api/im/smPushTask/types'; |
||||
|
|
||||
|
/** |
||||
|
* 查询系统消息推送任务列表 |
||||
|
* @param query |
||||
|
* @returns {*} |
||||
|
*/ |
||||
|
|
||||
|
export const listSmPushTask = (query?: SmPushTaskQuery): AxiosPromise<SmPushTaskVO[]> => { |
||||
|
return request({ |
||||
|
url: '/im/smPushTask/list', |
||||
|
method: 'get', |
||||
|
params: query |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* 查询系统消息推送任务详细 |
||||
|
* @param id |
||||
|
*/ |
||||
|
export const getSmPushTask = (id: string | number): AxiosPromise<SmPushTaskVO> => { |
||||
|
return request({ |
||||
|
url: '/im/smPushTask/' + id, |
||||
|
method: 'get' |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* 新增系统消息推送任务 |
||||
|
* @param data |
||||
|
*/ |
||||
|
export const addSmPushTask = (data: SmPushTaskForm) => { |
||||
|
return request({ |
||||
|
url: '/im/smPushTask', |
||||
|
method: 'post', |
||||
|
data: data |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* 修改系统消息推送任务 |
||||
|
* @param data |
||||
|
*/ |
||||
|
export const updateSmPushTask = (data: SmPushTaskForm) => { |
||||
|
return request({ |
||||
|
url: '/im/smPushTask', |
||||
|
method: 'put', |
||||
|
data: data |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* 删除系统消息推送任务 |
||||
|
* @param id |
||||
|
*/ |
||||
|
export const delSmPushTask = (id: string | number | Array<string | number>) => { |
||||
|
return request({ |
||||
|
url: '/im/smPushTask/' + id, |
||||
|
method: 'delete' |
||||
|
}); |
||||
|
}; |
||||
@ -0,0 +1,161 @@ |
|||||
|
export interface SmPushTaskVO { |
||||
|
/** |
||||
|
* id |
||||
|
*/ |
||||
|
id: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 系统消息id |
||||
|
*/ |
||||
|
messageId: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 发送序列号 |
||||
|
*/ |
||||
|
seqNo: number; |
||||
|
|
||||
|
/** |
||||
|
* 推送时间 |
||||
|
*/ |
||||
|
sendTime: string; |
||||
|
|
||||
|
/** |
||||
|
* 状态 1:待发送 2:发送中 3:已发送 4:已取消 |
||||
|
*/ |
||||
|
status: number; |
||||
|
|
||||
|
/** |
||||
|
* 是否发送给全体用户 |
||||
|
*/ |
||||
|
sendToAll: number; |
||||
|
|
||||
|
/** |
||||
|
* 接收用户id,逗号分隔,send_to_all为false时有效 |
||||
|
*/ |
||||
|
recvIds: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 删除标识 0:正常 1:已删除 |
||||
|
*/ |
||||
|
deleted: number; |
||||
|
|
||||
|
/** |
||||
|
* 创建者 |
||||
|
*/ |
||||
|
creator: number; |
||||
|
|
||||
|
/** |
||||
|
* 更新者 |
||||
|
*/ |
||||
|
updater: number; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
export interface SmPushTaskForm extends BaseEntity { |
||||
|
/** |
||||
|
* id |
||||
|
*/ |
||||
|
id?: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 系统消息id |
||||
|
*/ |
||||
|
messageId?: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 发送序列号 |
||||
|
*/ |
||||
|
seqNo?: number; |
||||
|
|
||||
|
/** |
||||
|
* 推送时间 |
||||
|
*/ |
||||
|
sendTime?: string; |
||||
|
|
||||
|
/** |
||||
|
* 状态 1:待发送 2:发送中 3:已发送 4:已取消 |
||||
|
*/ |
||||
|
status?: number; |
||||
|
|
||||
|
/** |
||||
|
* 是否发送给全体用户 |
||||
|
*/ |
||||
|
sendToAll?: number; |
||||
|
|
||||
|
/** |
||||
|
* 接收用户id,逗号分隔,send_to_all为false时有效 |
||||
|
*/ |
||||
|
recvIds?: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 删除标识 0:正常 1:已删除 |
||||
|
*/ |
||||
|
deleted?: number; |
||||
|
|
||||
|
/** |
||||
|
* 创建者 |
||||
|
*/ |
||||
|
creator?: number; |
||||
|
|
||||
|
/** |
||||
|
* 更新者 |
||||
|
*/ |
||||
|
updater?: number; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
export interface SmPushTaskQuery extends PageQuery { |
||||
|
|
||||
|
/** |
||||
|
* 系统消息id |
||||
|
*/ |
||||
|
messageId?: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 发送序列号 |
||||
|
*/ |
||||
|
seqNo?: number; |
||||
|
|
||||
|
/** |
||||
|
* 推送时间 |
||||
|
*/ |
||||
|
sendTime?: string; |
||||
|
|
||||
|
/** |
||||
|
* 状态 1:待发送 2:发送中 3:已发送 4:已取消 |
||||
|
*/ |
||||
|
status?: number; |
||||
|
|
||||
|
/** |
||||
|
* 是否发送给全体用户 |
||||
|
*/ |
||||
|
sendToAll?: number; |
||||
|
|
||||
|
/** |
||||
|
* 接收用户id,逗号分隔,send_to_all为false时有效 |
||||
|
*/ |
||||
|
recvIds?: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 删除标识 0:正常 1:已删除 |
||||
|
*/ |
||||
|
deleted?: number; |
||||
|
|
||||
|
/** |
||||
|
* 创建者 |
||||
|
*/ |
||||
|
creator?: number; |
||||
|
|
||||
|
/** |
||||
|
* 更新者 |
||||
|
*/ |
||||
|
updater?: number; |
||||
|
|
||||
|
/** |
||||
|
* 日期范围参数 |
||||
|
*/ |
||||
|
params?: any; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
@ -0,0 +1,63 @@ |
|||||
|
import request from '@/utils/request'; |
||||
|
import { AxiosPromise } from 'axios'; |
||||
|
import { SystemMessageVO, SystemMessageForm, SystemMessageQuery } from '@/api/im/systemMessage/types'; |
||||
|
|
||||
|
/** |
||||
|
* 查询系统消息列表 |
||||
|
* @param query |
||||
|
* @returns {*} |
||||
|
*/ |
||||
|
|
||||
|
export const listSystemMessage = (query?: SystemMessageQuery): AxiosPromise<SystemMessageVO[]> => { |
||||
|
return request({ |
||||
|
url: '/im/systemMessage/list', |
||||
|
method: 'get', |
||||
|
params: query |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* 查询系统消息详细 |
||||
|
* @param id |
||||
|
*/ |
||||
|
export const getSystemMessage = (id: string | number): AxiosPromise<SystemMessageVO> => { |
||||
|
return request({ |
||||
|
url: '/im/systemMessage/' + id, |
||||
|
method: 'get' |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* 新增系统消息 |
||||
|
* @param data |
||||
|
*/ |
||||
|
export const addSystemMessage = (data: SystemMessageForm) => { |
||||
|
return request({ |
||||
|
url: '/im/systemMessage', |
||||
|
method: 'post', |
||||
|
data: data |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* 修改系统消息 |
||||
|
* @param data |
||||
|
*/ |
||||
|
export const updateSystemMessage = (data: SystemMessageForm) => { |
||||
|
return request({ |
||||
|
url: '/im/systemMessage', |
||||
|
method: 'put', |
||||
|
data: data |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* 删除系统消息 |
||||
|
* @param id |
||||
|
*/ |
||||
|
export const delSystemMessage = (id: string | number | Array<string | number>) => { |
||||
|
return request({ |
||||
|
url: '/im/systemMessage/' + id, |
||||
|
method: 'delete' |
||||
|
}); |
||||
|
}; |
||||
@ -0,0 +1,161 @@ |
|||||
|
export interface SystemMessageVO { |
||||
|
/** |
||||
|
* id |
||||
|
*/ |
||||
|
id: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 标题 |
||||
|
*/ |
||||
|
title: string; |
||||
|
|
||||
|
/** |
||||
|
* 封面 |
||||
|
*/ |
||||
|
coverUrl: string; |
||||
|
|
||||
|
/** |
||||
|
* 简介 |
||||
|
*/ |
||||
|
intro: string; |
||||
|
|
||||
|
/** |
||||
|
* 内容类型 0:富文本 1:外部链接 |
||||
|
*/ |
||||
|
contentType: number; |
||||
|
|
||||
|
/** |
||||
|
* 富文本内容,base64编码 |
||||
|
*/ |
||||
|
richText: string; |
||||
|
|
||||
|
/** |
||||
|
* 外部链接 |
||||
|
*/ |
||||
|
externLink: string; |
||||
|
|
||||
|
/** |
||||
|
* 删除标识 0:正常 1:已删除 |
||||
|
*/ |
||||
|
deleted: number; |
||||
|
|
||||
|
/** |
||||
|
* 创建者 |
||||
|
*/ |
||||
|
creator: number; |
||||
|
|
||||
|
/** |
||||
|
* 更新者 |
||||
|
*/ |
||||
|
updater: number; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
export interface SystemMessageForm extends BaseEntity { |
||||
|
/** |
||||
|
* id |
||||
|
*/ |
||||
|
id?: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 标题 |
||||
|
*/ |
||||
|
title?: string; |
||||
|
|
||||
|
/** |
||||
|
* 封面 |
||||
|
*/ |
||||
|
coverUrl?: string; |
||||
|
|
||||
|
/** |
||||
|
* 简介 |
||||
|
*/ |
||||
|
intro?: string; |
||||
|
|
||||
|
/** |
||||
|
* 内容类型 0:富文本 1:外部链接 |
||||
|
*/ |
||||
|
contentType?: number; |
||||
|
|
||||
|
/** |
||||
|
* 富文本内容,base64编码 |
||||
|
*/ |
||||
|
richText?: string; |
||||
|
|
||||
|
/** |
||||
|
* 外部链接 |
||||
|
*/ |
||||
|
externLink?: string; |
||||
|
|
||||
|
/** |
||||
|
* 删除标识 0:正常 1:已删除 |
||||
|
*/ |
||||
|
deleted?: number; |
||||
|
|
||||
|
/** |
||||
|
* 创建者 |
||||
|
*/ |
||||
|
creator?: number; |
||||
|
|
||||
|
/** |
||||
|
* 更新者 |
||||
|
*/ |
||||
|
updater?: number; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
export interface SystemMessageQuery extends PageQuery { |
||||
|
|
||||
|
/** |
||||
|
* 标题 |
||||
|
*/ |
||||
|
title?: string; |
||||
|
|
||||
|
/** |
||||
|
* 封面 |
||||
|
*/ |
||||
|
coverUrl?: string; |
||||
|
|
||||
|
/** |
||||
|
* 简介 |
||||
|
*/ |
||||
|
intro?: string; |
||||
|
|
||||
|
/** |
||||
|
* 内容类型 0:富文本 1:外部链接 |
||||
|
*/ |
||||
|
contentType?: number; |
||||
|
|
||||
|
/** |
||||
|
* 富文本内容,base64编码 |
||||
|
*/ |
||||
|
richText?: string; |
||||
|
|
||||
|
/** |
||||
|
* 外部链接 |
||||
|
*/ |
||||
|
externLink?: string; |
||||
|
|
||||
|
/** |
||||
|
* 删除标识 0:正常 1:已删除 |
||||
|
*/ |
||||
|
deleted?: number; |
||||
|
|
||||
|
/** |
||||
|
* 创建者 |
||||
|
*/ |
||||
|
creator?: number; |
||||
|
|
||||
|
/** |
||||
|
* 更新者 |
||||
|
*/ |
||||
|
updater?: number; |
||||
|
|
||||
|
/** |
||||
|
* 日期范围参数 |
||||
|
*/ |
||||
|
params?: any; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
@ -0,0 +1,63 @@ |
|||||
|
import request from '@/utils/request'; |
||||
|
import { AxiosPromise } from 'axios'; |
||||
|
import { UserVO, UserBanDTO, UserUnbanDTO, UserQuery } from '@/api/im/user/types'; |
||||
|
|
||||
|
/** |
||||
|
* 查询用户列表 |
||||
|
* @param query |
||||
|
* @returns {*} |
||||
|
*/ |
||||
|
|
||||
|
export const listUser = (query?: UserQuery): AxiosPromise<UserVO[]> => { |
||||
|
return request({ |
||||
|
url: '/im/user/list', |
||||
|
method: 'get', |
||||
|
params: query |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
/** |
||||
|
* 查询用户详细 |
||||
|
* @param id |
||||
|
*/ |
||||
|
export const getUser = (id: string | number): AxiosPromise<UserVO> => { |
||||
|
return request({ |
||||
|
url: '/im/user/' + id, |
||||
|
method: 'get' |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 封禁用户 |
||||
|
* @param data |
||||
|
*/ |
||||
|
export const ban = (data: UserBanDTO) => { |
||||
|
return request({ |
||||
|
url: '/im/user/ban', |
||||
|
method: 'put', |
||||
|
data: data |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
/** |
||||
|
* 解封用户 |
||||
|
* @param data |
||||
|
*/ |
||||
|
export const unban = (data: UserUnbanDTO) => { |
||||
|
return request({ |
||||
|
url: '/im/user/unban', |
||||
|
method: 'put', |
||||
|
data: data |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
export const findUserByName = (name?: String): AxiosPromise<UserVO[]> => { |
||||
|
return request({ |
||||
|
url: '/im/user/findByName?name='+name, |
||||
|
method: 'get' |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
@ -0,0 +1,204 @@ |
|||||
|
export interface UserVO { |
||||
|
/** |
||||
|
* id |
||||
|
*/ |
||||
|
id: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 用户名 |
||||
|
*/ |
||||
|
userName: string; |
||||
|
|
||||
|
/** |
||||
|
* 用户昵称 |
||||
|
*/ |
||||
|
nickName: string; |
||||
|
|
||||
|
/** |
||||
|
* 用户头像 |
||||
|
*/ |
||||
|
headImage: string; |
||||
|
|
||||
|
/** |
||||
|
* 用户头像Url |
||||
|
*/ |
||||
|
headImageUrl: string; |
||||
|
/** |
||||
|
* 用户头像缩略图 |
||||
|
*/ |
||||
|
headImageThumb: string; |
||||
|
|
||||
|
/** |
||||
|
* 密码(明文) |
||||
|
*/ |
||||
|
password: string; |
||||
|
|
||||
|
/** |
||||
|
* 性别 0:男 1::女 |
||||
|
*/ |
||||
|
sex: number; |
||||
|
|
||||
|
/** |
||||
|
* 个性签名 |
||||
|
*/ |
||||
|
signature: string; |
||||
|
|
||||
|
/** |
||||
|
* 最后登录时间 |
||||
|
*/ |
||||
|
lastLoginTime: string; |
||||
|
|
||||
|
/** |
||||
|
* 创建时间 |
||||
|
*/ |
||||
|
createdTime: string; |
||||
|
|
||||
|
/** |
||||
|
* |
||||
|
*/ |
||||
|
type: number; |
||||
|
|
||||
|
/** |
||||
|
* 是否被封禁 0:否 1:是 |
||||
|
*/ |
||||
|
isBanned: number; |
||||
|
|
||||
|
/** |
||||
|
* 被封禁原因 |
||||
|
*/ |
||||
|
reason: string; |
||||
|
|
||||
|
/** |
||||
|
* 客户端id,用于uni-push推送 |
||||
|
*/ |
||||
|
cid: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 状态 0:正常 1:已注销 |
||||
|
*/ |
||||
|
status: number; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
export interface UserForm extends BaseEntity { |
||||
|
/** |
||||
|
* id |
||||
|
*/ |
||||
|
id?: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 用户名 |
||||
|
*/ |
||||
|
userName?: string; |
||||
|
|
||||
|
/** |
||||
|
* 用户昵称 |
||||
|
*/ |
||||
|
nickName?: string; |
||||
|
|
||||
|
/** |
||||
|
* 用户头像 |
||||
|
*/ |
||||
|
headImage?: string; |
||||
|
|
||||
|
/** |
||||
|
* 用户头像缩略图 |
||||
|
*/ |
||||
|
headImageThumb?: string; |
||||
|
|
||||
|
/** |
||||
|
* 密码(明文) |
||||
|
*/ |
||||
|
password?: string; |
||||
|
|
||||
|
/** |
||||
|
* 性别 0:男 1::女 |
||||
|
*/ |
||||
|
sex?: number; |
||||
|
|
||||
|
/** |
||||
|
* 个性签名 |
||||
|
*/ |
||||
|
signature?: string; |
||||
|
|
||||
|
/** |
||||
|
* 最后登录时间 |
||||
|
*/ |
||||
|
lastLoginTime?: string; |
||||
|
|
||||
|
/** |
||||
|
* 创建时间 |
||||
|
*/ |
||||
|
createdTime?: string; |
||||
|
|
||||
|
/** |
||||
|
* |
||||
|
*/ |
||||
|
type?: number; |
||||
|
|
||||
|
/** |
||||
|
* 是否被封禁 0:否 1:是 |
||||
|
*/ |
||||
|
isBanned?: number; |
||||
|
|
||||
|
/** |
||||
|
* 被封禁原因 |
||||
|
*/ |
||||
|
reason?: string; |
||||
|
|
||||
|
/** |
||||
|
* 客户端id,用于uni-push推送 |
||||
|
*/ |
||||
|
cid?: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 状态 0:正常 1:已注销 |
||||
|
*/ |
||||
|
status?: number; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
export interface UserQuery extends PageQuery { |
||||
|
|
||||
|
/** |
||||
|
* 用户名 |
||||
|
*/ |
||||
|
userName?: string; |
||||
|
|
||||
|
/** |
||||
|
* 用户昵称 |
||||
|
*/ |
||||
|
nickName?: string; |
||||
|
/** |
||||
|
* 创建时间 |
||||
|
*/ |
||||
|
createdTime?: string; |
||||
|
/** |
||||
|
* 日期范围参数 |
||||
|
*/ |
||||
|
params?: any; |
||||
|
} |
||||
|
|
||||
|
export interface UserBanDTO { |
||||
|
|
||||
|
/** |
||||
|
* id |
||||
|
*/ |
||||
|
id?: string | number; |
||||
|
|
||||
|
/** |
||||
|
* 被封禁原因 |
||||
|
*/ |
||||
|
reason?: string; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
export interface UserUnbanDTO { |
||||
|
|
||||
|
/** |
||||
|
* id |
||||
|
*/ |
||||
|
id?: string | number; |
||||
|
} |
||||
|
|
||||
|
|
||||
@ -0,0 +1,52 @@ |
|||||
|
<template> |
||||
|
<el-select v-model="groupIds" :multiple="multiple" filterable remote clearable |
||||
|
:placeholder="placeholder" :remote-method="handleRemote" :loading="loading" |
||||
|
style="width: 240px"> |
||||
|
<el-option v-for="group in options" :key="group.id" :label="group.name" :value="group.id" /> |
||||
|
</el-select> |
||||
|
</template> |
||||
|
|
||||
|
<script setup lang="ts" name="ImGroupSelect"> |
||||
|
|
||||
|
import { computed } from 'vue' |
||||
|
import { ref } from 'vue' |
||||
|
import { findGroupByName } from '@/api/im/group' |
||||
|
|
||||
|
const props = defineProps({ |
||||
|
multiple: { |
||||
|
type: Boolean, |
||||
|
required: false, |
||||
|
default: () => false |
||||
|
}, |
||||
|
placeholder: { |
||||
|
type: String, |
||||
|
required: false, |
||||
|
default: () => '' |
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
const loading = ref(false) |
||||
|
const options = ref() |
||||
|
const model = defineModel<number | Array<Number>>() |
||||
|
const groupIds = computed({ |
||||
|
get() { |
||||
|
if(model.value != undefined){ |
||||
|
return model.value |
||||
|
}else if(props.multiple){ |
||||
|
return [] |
||||
|
} |
||||
|
}, |
||||
|
set(value) { |
||||
|
model.value = value |
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
const handleRemote = (name: String)=>{ |
||||
|
loading.value = true |
||||
|
findGroupByName().then((res) => { |
||||
|
loading.value = false; |
||||
|
options.value = res.data; |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
</script> |
||||
@ -0,0 +1,39 @@ |
|||||
|
<template> |
||||
|
<div> |
||||
|
<div v-if="message.type == 1" > |
||||
|
<image-preview :src="JSON.parse(message.content).thumbUrl" :full-src="JSON.parse(message.content).originUrl" :width="40" :height="40" /> |
||||
|
</div> |
||||
|
<div v-else-if="message.type == 2"> |
||||
|
<el-link type="primary" :href="JSON.parse(message.content).url" :download="JSON.parse(message.content).name" target="_blank"> |
||||
|
{{ JSON.parse(message.content).name }} |
||||
|
</el-link> |
||||
|
</div> |
||||
|
<div v-else-if="message.type == 3"> |
||||
|
<audio style="height: 40px;" controls :src="JSON.parse(message.content).url"></audio> |
||||
|
</div> |
||||
|
<div v-else-if="message.type == 4"> |
||||
|
<video style="max-height: 120px;max-width: 200px;" controls :poster="JSON.parse(message.content).coverUrl" :src="JSON.parse(message.content).videoUrl"></video> |
||||
|
</div> |
||||
|
<div v-else> |
||||
|
{{ message.content }} |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup lang="ts" name="ImMessageContent"> |
||||
|
import { ref} from 'vue' |
||||
|
|
||||
|
const props = defineProps({ |
||||
|
message: { |
||||
|
type: Object, |
||||
|
required: true |
||||
|
} |
||||
|
}) |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.link { |
||||
|
color: inherit; |
||||
|
text-decoration: none; |
||||
|
} |
||||
|
</style> |
||||
@ -0,0 +1,51 @@ |
|||||
|
<template> |
||||
|
<el-select v-model="messageIds" :multiple="multiple" filterable remote clearable |
||||
|
:placeholder="placeholder" :remote-method="handleRemote" :loading="loading"> |
||||
|
<el-option v-for="message in options" :key="message.id" :label="message.title" :value="message.id" /> |
||||
|
</el-select> |
||||
|
</template> |
||||
|
|
||||
|
<script setup lang="ts" name="ImSmSelect"> |
||||
|
|
||||
|
import { computed } from 'vue' |
||||
|
import { ref } from 'vue' |
||||
|
import { listSystemMessage } from '@/api/im/systemMessage' |
||||
|
|
||||
|
const props = defineProps({ |
||||
|
multiple: { |
||||
|
type: Boolean, |
||||
|
required: false, |
||||
|
default: () => false |
||||
|
}, |
||||
|
placeholder: { |
||||
|
type: String, |
||||
|
required: false, |
||||
|
default: () => '' |
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
const loading = ref(false) |
||||
|
const options = ref() |
||||
|
const model = defineModel<number | Array<Number>>() |
||||
|
const messageIds = computed({ |
||||
|
get() { |
||||
|
if(model.value != undefined){ |
||||
|
return model.value |
||||
|
}else if(props.multiple){ |
||||
|
return [] |
||||
|
} |
||||
|
}, |
||||
|
set(value) { |
||||
|
model.value = value |
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
const handleRemote = (name: string)=>{ |
||||
|
loading.value = true |
||||
|
listSystemMessage().then((res) => { |
||||
|
loading.value = false; |
||||
|
options.value = res.data; |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
</script> |
||||
@ -0,0 +1,51 @@ |
|||||
|
<template> |
||||
|
<el-select v-model="userIds" :multiple="multiple" filterable remote clearable |
||||
|
:placeholder="placeholder" :remote-method="handleRemote" :loading="loading"> |
||||
|
<el-option v-for="user in options" :key="user.id" :label="user.userName" :value="user.id" /> |
||||
|
</el-select> |
||||
|
</template> |
||||
|
|
||||
|
<script setup lang="ts" name="ImUserSelect"> |
||||
|
|
||||
|
import { computed } from 'vue' |
||||
|
import { ref } from 'vue' |
||||
|
import { findUserByName } from '@/api/im/user' |
||||
|
|
||||
|
const props = defineProps({ |
||||
|
multiple: { |
||||
|
type: Boolean, |
||||
|
required: false, |
||||
|
default: () => false |
||||
|
}, |
||||
|
placeholder: { |
||||
|
type: String, |
||||
|
required: false, |
||||
|
default: () => '' |
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
const loading = ref(false) |
||||
|
const options = ref() |
||||
|
const model = defineModel<number | Array<Number>>() |
||||
|
const userIds = computed({ |
||||
|
get() { |
||||
|
if(model.value != undefined){ |
||||
|
return model.value |
||||
|
}else if(props.multiple){ |
||||
|
return [] |
||||
|
} |
||||
|
}, |
||||
|
set(value) { |
||||
|
model.value = value |
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
const handleRemote = (name: String)=>{ |
||||
|
loading.value = true |
||||
|
findUserByName(name).then((res) => { |
||||
|
loading.value = false; |
||||
|
options.value = res.data; |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
</script> |
||||
@ -0,0 +1,292 @@ |
|||||
|
<template> |
||||
|
<div class="p-2"> |
||||
|
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" |
||||
|
:leave-active-class="proxy?.animate.searchAnimate.leave"> |
||||
|
<div v-show="showSearch" class="mb-[10px]"> |
||||
|
<el-card shadow="hover"> |
||||
|
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> |
||||
|
<el-form-item label="群名" prop="name"> |
||||
|
<el-input v-model="queryParams.name" placeholder="请输入群名字" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="群主" prop="ownerIds"> |
||||
|
<im-user-select v-model="queryParams.ownerId"></im-user-select> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="创建时间" prop="createdTime"> |
||||
|
<el-date-picker |
||||
|
v-model="dateRange" |
||||
|
value-format="YYYY-MM-DD HH:mm:ss" |
||||
|
type="daterange" |
||||
|
range-separator="-" |
||||
|
start-placeholder="开始日期" |
||||
|
end-placeholder="结束日期" |
||||
|
:default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" |
||||
|
></el-date-picker> |
||||
|
</el-form-item> |
||||
|
<el-form-item> |
||||
|
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> |
||||
|
<el-button icon="Refresh" @click="resetQuery">重置</el-button> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
</el-card> |
||||
|
</div> |
||||
|
</transition> |
||||
|
|
||||
|
<el-card shadow="never"> |
||||
|
<template #header> |
||||
|
<el-row :gutter="10" class="mb8"> |
||||
|
<el-col :span="1.5"> |
||||
|
<el-button type="warning" plain icon="Download" @click="handleExport" |
||||
|
v-hasPermi="['im:group:export']">导出</el-button> |
||||
|
</el-col> |
||||
|
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
||||
|
</el-row> |
||||
|
</template> |
||||
|
|
||||
|
<el-table v-loading="loading" :data="groupList" @selection-change="handleSelectionChange"> |
||||
|
<el-table-column type="selection" width="55" align="center" /> |
||||
|
<el-table-column label="群头像" align="center" prop="headImage" width="100"> |
||||
|
<template #default="scope"> |
||||
|
<image-preview :src="scope.row.headImageThumb" :full-src="scope.row.headImage" :width="40" :height="40" /> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="群名" align="center" prop="name" /> |
||||
|
<el-table-column label="群主" align="center" prop="ownerUserName" /> |
||||
|
<el-table-column label="成员数量" align="center" prop="memberCount" /> |
||||
|
<el-table-column label="创建时间" align="center" prop="createdTime" width="180"> |
||||
|
<template #default="scope"> |
||||
|
<span>{{ parseTime(scope.row.createdTime, '{y}-{m}-{d}') }}</span> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="是否解散" align="center" prop="dissolve"> |
||||
|
<template #default="scope"> |
||||
|
<dict-tag :options="sys_bool" :value="scope.row.dissolve" /> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="是否封禁" align="center" prop="isBanned"> |
||||
|
<template #default="scope"> |
||||
|
<dict-tag :options="sys_bool" :value="scope.row.isBanned" /> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
||||
|
<template #default="scope"> |
||||
|
<el-tooltip content="详情" placement="top"> |
||||
|
<el-button link type="primary" v-hasPermi="['im:group:query']" |
||||
|
@click="handleDetail(scope.row)">详情</el-button> |
||||
|
</el-tooltip> |
||||
|
<el-tooltip v-if="scope.row.isBanned" placement="top"> |
||||
|
<el-button link type="danger" v-hasPermi="['im:group:ban']" @click="handleUnban(scope.row)">解封</el-button> |
||||
|
</el-tooltip> |
||||
|
<el-tooltip v-else placement="top"> |
||||
|
<el-button link type="danger" v-hasPermi="['im:group:ban']" @click="handleBan(scope.row)">封禁</el-button> |
||||
|
</el-tooltip> |
||||
|
<el-tooltip placement="top"> |
||||
|
<el-button link type="primary" @click="handleShowMember(scope.row.id)">查看成员</el-button> |
||||
|
</el-tooltip> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
</el-table> |
||||
|
|
||||
|
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" |
||||
|
v-model:limit="queryParams.pageSize" @pagination="getList" /> |
||||
|
</el-card> |
||||
|
<!-- 添加或修改群对话框 --> |
||||
|
<el-dialog :title="dialog.title" v-model="dialog.visible" width="800px" append-to-body> |
||||
|
<el-form ref="groupFormRef" :model="form" label-width="100px" disabled> |
||||
|
<el-form-item label="群头像" prop="headImage"> |
||||
|
<image-preview :src="form.headImageThumb" :full-src="form.headImage" :width="50" :height="50" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="群名字" prop="name"> |
||||
|
<el-input v-model="form.name" placeholder="请输入群名字" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="群主" prop="name"> |
||||
|
<el-input v-model="form.ownerUserName" placeholder="请输入群名字" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="创建时间" prop="createdTime"> |
||||
|
<el-date-picker clearable v-model="form.createdTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss"> |
||||
|
</el-date-picker> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="是否已解散" prop="dissolve"> |
||||
|
<dict-tag :options="sys_bool" :value="form.dissolve" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="是否被封禁" prop="isBanned"> |
||||
|
<dict-tag :options="sys_bool" :value="form.isBanned" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item v-if="form.isBanned" label="被封禁原因" prop="reason"> |
||||
|
<el-input v-model="form.reason" placeholder="请输入被封禁原因" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="群公告" prop="notice"> |
||||
|
<el-input type="textarea" v-model="form.notice"></el-input> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
<template #footer> |
||||
|
<div class="dialog-footer"> |
||||
|
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button> |
||||
|
</div> |
||||
|
</template> |
||||
|
</el-dialog> |
||||
|
<el-drawer v-model="memberVisible" title="成员列表" :size="900" :close-on-press-escape="false" :close-on-click-modal="true"> |
||||
|
<member ref="memberRef"></member> |
||||
|
</el-drawer> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup name="Group" lang="ts"> |
||||
|
import { listGroup, getGroup, ban, unban } from '@/api/im/group'; |
||||
|
import { GroupVO, GroupQuery, GroupForm } from '@/api/im/group/types'; |
||||
|
import member from './member.vue'; |
||||
|
|
||||
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance; |
||||
|
|
||||
|
const groupList = ref<GroupVO[]>([]); |
||||
|
const buttonLoading = ref(false); |
||||
|
const loading = ref(true); |
||||
|
const showSearch = ref(true); |
||||
|
const ids = ref<Array<string | number>>([]); |
||||
|
const single = ref(true); |
||||
|
const multiple = ref(true); |
||||
|
const total = ref(0); |
||||
|
const memberVisible = ref(false); |
||||
|
const dateRange = ref<[DateModelType, DateModelType]>(['', '']); |
||||
|
const queryFormRef = ref<ElFormInstance>(); |
||||
|
const groupFormRef = ref<ElFormInstance>(); |
||||
|
const memberRef = ref(); |
||||
|
|
||||
|
const dialog = reactive<DialogOption>({ |
||||
|
visible: false, |
||||
|
title: '' |
||||
|
}); |
||||
|
|
||||
|
const initFormData: GroupForm = { |
||||
|
id: undefined, |
||||
|
name: undefined, |
||||
|
ownerId: undefined, |
||||
|
ownerUserName: undefined, |
||||
|
headImage: undefined, |
||||
|
headImageThumb: undefined, |
||||
|
notice: undefined, |
||||
|
dissolve: undefined, |
||||
|
createdTime: undefined, |
||||
|
isBanned: undefined, |
||||
|
reason: undefined |
||||
|
} |
||||
|
const data = reactive<PageData<GroupForm, GroupQuery>>({ |
||||
|
form: { ...initFormData }, |
||||
|
queryParams: { |
||||
|
pageNum: 1, |
||||
|
pageSize: 10, |
||||
|
name: undefined, |
||||
|
ownerId: undefined, |
||||
|
headImage: undefined, |
||||
|
headImageThumb: undefined, |
||||
|
notice: undefined, |
||||
|
dissolve: undefined, |
||||
|
createdTime: undefined, |
||||
|
isBanned: undefined, |
||||
|
reason: undefined, |
||||
|
params: { |
||||
|
} |
||||
|
}, |
||||
|
rules: { |
||||
|
|
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
const { queryParams, form } = toRefs(data); |
||||
|
const { sys_bool } = toRefs<any>(proxy?.useDict('sys_bool')); |
||||
|
|
||||
|
/** 查询群列表 */ |
||||
|
const getList = async () => { |
||||
|
loading.value = true; |
||||
|
const res = await listGroup(proxy?.addDateRange(queryParams.value, dateRange.value)); |
||||
|
groupList.value = res.rows; |
||||
|
total.value = res.total; |
||||
|
loading.value = false; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
/** 表单重置 */ |
||||
|
const reset = () => { |
||||
|
form.value = { ...initFormData }; |
||||
|
groupFormRef.value?.resetFields(); |
||||
|
} |
||||
|
|
||||
|
/** 搜索按钮操作 */ |
||||
|
const handleQuery = () => { |
||||
|
queryParams.value.pageNum = 1; |
||||
|
getList(); |
||||
|
} |
||||
|
|
||||
|
/** 重置按钮操作 */ |
||||
|
const resetQuery = () => { |
||||
|
dateRange.value = ['', '']; |
||||
|
queryFormRef.value?.resetFields(); |
||||
|
handleQuery(); |
||||
|
} |
||||
|
|
||||
|
/** 多选框选中数据 */ |
||||
|
const handleSelectionChange = (selection: GroupVO[]) => { |
||||
|
ids.value = selection.map(item => item.id); |
||||
|
single.value = selection.length != 1; |
||||
|
multiple.value = !selection.length; |
||||
|
} |
||||
|
|
||||
|
/** 详情按钮操作 */ |
||||
|
const handleDetail = async (row?: GroupVO) => { |
||||
|
reset(); |
||||
|
const _id = row?.id || ids.value[0] |
||||
|
const res = await getGroup(_id); |
||||
|
Object.assign(form.value, res.data); |
||||
|
dialog.visible = true; |
||||
|
dialog.title = "用户信息"; |
||||
|
} |
||||
|
|
||||
|
const handleBan = (group: any) => { |
||||
|
ElMessageBox.prompt('封禁原因:', '确定对该群组进行封禁?', { |
||||
|
inputPattern: /\S/, |
||||
|
inputErrorMessage: '请输入封禁原因', |
||||
|
confirmButtonText: '确定', |
||||
|
cancelButtonText: '取消' |
||||
|
}).then(({ value }) => { |
||||
|
const data = { id: group.id, reason: value } |
||||
|
ban(data).then(() => { |
||||
|
group.isBanned = true; |
||||
|
ElMessage.success(`群组'${group.name}'已被封禁`); |
||||
|
}) |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
const handleUnban = (group: any) => { |
||||
|
ElMessageBox.confirm('确定解除该群组的封禁状态?', '提示', { |
||||
|
confirmButtonText: '确定', |
||||
|
cancelButtonText: '取消' |
||||
|
}).then(() => { |
||||
|
const data = { id: group.id } |
||||
|
unban(data).then(() => { |
||||
|
group.isBanned = false; |
||||
|
ElMessage.success(`群组'${group.name}'解封成功`); |
||||
|
}) |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
const handleShowMember = (id: number) => { |
||||
|
memberVisible.value = true; |
||||
|
nextTick(() => memberRef.value.init(id)); |
||||
|
} |
||||
|
|
||||
|
/** 提交按钮 */ |
||||
|
const submitForm = () => { |
||||
|
dialog.visible = false; |
||||
|
} |
||||
|
|
||||
|
/** 导出按钮操作 */ |
||||
|
const handleExport = () => { |
||||
|
proxy?.download('im/group/export', { |
||||
|
...queryParams.value |
||||
|
}, `group_${new Date().getTime()}.xlsx`) |
||||
|
} |
||||
|
|
||||
|
onMounted(() => { |
||||
|
getList(); |
||||
|
}); |
||||
|
</script> |
||||
@ -0,0 +1,99 @@ |
|||||
|
<template> |
||||
|
<div class="p-2"> |
||||
|
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" |
||||
|
:leave-active-class="proxy?.animate.searchAnimate.leave"> |
||||
|
<div v-show="showSearch" class="mb-[10px]"> |
||||
|
<el-card shadow="hover"> |
||||
|
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> |
||||
|
<el-form-item label="用户" prop="userId"> |
||||
|
<im-user-select v-model="queryParams.userId"></im-user-select> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="昵称" prop="userNickName"> |
||||
|
<el-input v-model="queryParams.userNickName" placeholder="请输入用户昵称" clearable /> |
||||
|
</el-form-item> |
||||
|
<el-form-item> |
||||
|
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> |
||||
|
<el-button icon="Refresh" @click="resetQuery">重置</el-button> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
</el-card> |
||||
|
</div> |
||||
|
</transition> |
||||
|
<el-card shadow="never"> |
||||
|
<el-table v-loading="loading" :data="groupMemberList"> |
||||
|
<el-table-column label="头像" align="center" prop="headImage" width="100"> |
||||
|
<template #default="scope"> |
||||
|
<image-preview :src="scope.row.headImage" :width="50" :height="50" /> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="用户" align="center" prop="userName" /> |
||||
|
<el-table-column label="群内昵称" align="center" prop="showNickName" /> |
||||
|
<el-table-column label="进群时间" align="center" prop="createdTime" width="180"> |
||||
|
<template #default="scope"> |
||||
|
<span>{{ parseTime(scope.row.createdTime, '{y}-{m}-{d}') }}</span> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
</el-table> |
||||
|
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" |
||||
|
v-model:limit="queryParams.pageSize" @pagination="getList" /> |
||||
|
</el-card> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup name="member" lang="ts"> |
||||
|
import { listGroupMember } from '@/api/im/groupMember'; |
||||
|
import { GroupMemberVO, GroupMemberQuery } from '@/api/im/groupMember/types'; |
||||
|
|
||||
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance; |
||||
|
const groupMemberList = ref<GroupMemberVO[]>([]); |
||||
|
const loading = ref(true); |
||||
|
const showSearch = ref(true); |
||||
|
const total = ref(0); |
||||
|
const queryFormRef = ref<ElFormInstance>(); |
||||
|
|
||||
|
const queryParams = ref<GroupMemberQuery>({ |
||||
|
pageNum: 1, |
||||
|
pageSize: 10, |
||||
|
groupId: undefined, |
||||
|
userId: undefined, |
||||
|
userName: undefined, |
||||
|
remarkNickName: undefined, |
||||
|
headImage: undefined, |
||||
|
remarkGroupName: undefined, |
||||
|
quit: undefined, |
||||
|
createdTime: undefined, |
||||
|
quitTime: undefined, |
||||
|
userNickName: undefined, |
||||
|
showNickName: undefined |
||||
|
}) |
||||
|
|
||||
|
/** 查询群成员列表 */ |
||||
|
const getList = async () => { |
||||
|
loading.value = true; |
||||
|
const res = await listGroupMember(queryParams.value); |
||||
|
groupMemberList.value = res.rows; |
||||
|
total.value = res.total; |
||||
|
loading.value = false; |
||||
|
} |
||||
|
|
||||
|
/** 搜索按钮操作 */ |
||||
|
const handleQuery = () => { |
||||
|
queryParams.value.pageNum = 1; |
||||
|
getList(); |
||||
|
} |
||||
|
|
||||
|
/** 重置按钮操作 */ |
||||
|
const resetQuery = () => { |
||||
|
queryFormRef.value?.resetFields(); |
||||
|
handleQuery(); |
||||
|
} |
||||
|
|
||||
|
const init = (id: number) => { |
||||
|
queryParams.value.groupId = id; |
||||
|
getList(); |
||||
|
} |
||||
|
|
||||
|
defineExpose({ |
||||
|
init |
||||
|
}) |
||||
|
</script> |
||||
@ -0,0 +1,339 @@ |
|||||
|
<template> |
||||
|
<div class="p-2"> |
||||
|
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
||||
|
<div v-show="showSearch" class="mb-[10px]"> |
||||
|
<el-card shadow="hover"> |
||||
|
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> |
||||
|
<el-form-item label="群id" prop="groupId"> |
||||
|
<el-input v-model="queryParams.groupId" placeholder="请输入群id" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="用户id" prop="userId"> |
||||
|
<el-input v-model="queryParams.userId" placeholder="请输入用户id" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="组内显示名称" prop="remarkNickName"> |
||||
|
<el-input v-model="queryParams.remarkNickName" placeholder="请输入组内显示名称" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="群名备注" prop="remarkGroupName"> |
||||
|
<el-input v-model="queryParams.remarkGroupName" placeholder="请输入群名备注" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="是否已退出" prop="quit"> |
||||
|
<el-input v-model="queryParams.quit" placeholder="请输入是否已退出" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="创建时间" prop="createdTime"> |
||||
|
<el-date-picker clearable |
||||
|
v-model="queryParams.createdTime" |
||||
|
type="date" |
||||
|
value-format="YYYY-MM-DD" |
||||
|
placeholder="请选择创建时间" |
||||
|
/> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="退出时间" prop="quitTime"> |
||||
|
<el-date-picker clearable |
||||
|
v-model="queryParams.quitTime" |
||||
|
type="date" |
||||
|
value-format="YYYY-MM-DD" |
||||
|
placeholder="请选择退出时间" |
||||
|
/> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="用户昵称" prop="userNickName"> |
||||
|
<el-input v-model="queryParams.userNickName" placeholder="请输入用户昵称" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item> |
||||
|
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> |
||||
|
<el-button icon="Refresh" @click="resetQuery">重置</el-button> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
</el-card> |
||||
|
</div> |
||||
|
</transition> |
||||
|
|
||||
|
<el-card shadow="never"> |
||||
|
<template #header> |
||||
|
<el-row :gutter="10" class="mb8"> |
||||
|
<el-col :span="1.5"> |
||||
|
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['im:groupMember:add']">新增</el-button> |
||||
|
</el-col> |
||||
|
<el-col :span="1.5"> |
||||
|
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['im:groupMember:edit']">修改</el-button> |
||||
|
</el-col> |
||||
|
<el-col :span="1.5"> |
||||
|
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['im:groupMember:remove']">删除</el-button> |
||||
|
</el-col> |
||||
|
<el-col :span="1.5"> |
||||
|
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['im:groupMember:export']">导出</el-button> |
||||
|
</el-col> |
||||
|
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
||||
|
</el-row> |
||||
|
</template> |
||||
|
|
||||
|
<el-table v-loading="loading" :data="groupMemberList" @selection-change="handleSelectionChange"> |
||||
|
<el-table-column type="selection" width="55" align="center" /> |
||||
|
<el-table-column label="id" align="center" prop="id" v-if="true" /> |
||||
|
<el-table-column label="群id" align="center" prop="groupId" /> |
||||
|
<el-table-column label="用户id" align="center" prop="userId" /> |
||||
|
<el-table-column label="组内显示名称" align="center" prop="remarkNickName" /> |
||||
|
<el-table-column label="用户头像" align="center" prop="headImageUrl" width="100"> |
||||
|
<template #default="scope"> |
||||
|
<image-preview :src="scope.row.headImageUrl" :width="50" :height="50"/> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="群名备注" align="center" prop="remarkGroupName" /> |
||||
|
<el-table-column label="是否已退出" align="center" prop="quit" /> |
||||
|
<el-table-column label="创建时间" align="center" prop="createdTime" width="180"> |
||||
|
<template #default="scope"> |
||||
|
<span>{{ parseTime(scope.row.createdTime, '{y}-{m}-{d}') }}</span> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="退出时间" align="center" prop="quitTime" width="180"> |
||||
|
<template #default="scope"> |
||||
|
<span>{{ parseTime(scope.row.quitTime, '{y}-{m}-{d}') }}</span> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="用户昵称" align="center" prop="userNickName" /> |
||||
|
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
||||
|
<template #default="scope"> |
||||
|
<el-tooltip content="修改" placement="top"> |
||||
|
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['im:groupMember:edit']"></el-button> |
||||
|
</el-tooltip> |
||||
|
<el-tooltip content="删除" placement="top"> |
||||
|
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['im:groupMember:remove']"></el-button> |
||||
|
</el-tooltip> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
</el-table> |
||||
|
|
||||
|
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
||||
|
</el-card> |
||||
|
<!-- 添加或修改群成员对话框 --> |
||||
|
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> |
||||
|
<el-form ref="groupMemberFormRef" :model="form" :rules="rules" label-width="80px"> |
||||
|
<el-form-item label="群id" prop="groupId"> |
||||
|
<el-input v-model="form.groupId" placeholder="请输入群id" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="用户id" prop="userId"> |
||||
|
<el-input v-model="form.userId" placeholder="请输入用户id" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="组内显示名称" prop="remarkNickName"> |
||||
|
<el-input v-model="form.remarkNickName" placeholder="请输入组内显示名称" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="用户头像" prop="headImage"> |
||||
|
<image-upload v-model="form.headImage"/> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="群名备注" prop="remarkGroupName"> |
||||
|
<el-input v-model="form.remarkGroupName" placeholder="请输入群名备注" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="是否已退出" prop="quit"> |
||||
|
<el-input v-model="form.quit" placeholder="请输入是否已退出" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="创建时间" prop="createdTime"> |
||||
|
<el-date-picker clearable |
||||
|
v-model="form.createdTime" |
||||
|
type="datetime" |
||||
|
value-format="YYYY-MM-DD HH:mm:ss" |
||||
|
placeholder="请选择创建时间"> |
||||
|
</el-date-picker> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="退出时间" prop="quitTime"> |
||||
|
<el-date-picker clearable |
||||
|
v-model="form.quitTime" |
||||
|
type="datetime" |
||||
|
value-format="YYYY-MM-DD HH:mm:ss" |
||||
|
placeholder="请选择退出时间"> |
||||
|
</el-date-picker> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="用户昵称" prop="userNickName"> |
||||
|
<el-input v-model="form.userNickName" placeholder="请输入用户昵称" /> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
<template #footer> |
||||
|
<div class="dialog-footer"> |
||||
|
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button> |
||||
|
<el-button @click="cancel">取 消</el-button> |
||||
|
</div> |
||||
|
</template> |
||||
|
</el-dialog> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup name="GroupMember" lang="ts"> |
||||
|
import { listGroupMember, getGroupMember, delGroupMember, addGroupMember, updateGroupMember } from '@/api/im/groupMember'; |
||||
|
import { GroupMemberVO, GroupMemberQuery, GroupMemberForm } from '@/api/im/groupMember/types'; |
||||
|
|
||||
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance; |
||||
|
|
||||
|
const groupMemberList = ref<GroupMemberVO[]>([]); |
||||
|
const buttonLoading = ref(false); |
||||
|
const loading = ref(true); |
||||
|
const showSearch = ref(true); |
||||
|
const ids = ref<Array<string | number>>([]); |
||||
|
const single = ref(true); |
||||
|
const multiple = ref(true); |
||||
|
const total = ref(0); |
||||
|
|
||||
|
const queryFormRef = ref<ElFormInstance>(); |
||||
|
const groupMemberFormRef = ref<ElFormInstance>(); |
||||
|
|
||||
|
const dialog = reactive<DialogOption>({ |
||||
|
visible: false, |
||||
|
title: '' |
||||
|
}); |
||||
|
|
||||
|
const initFormData: GroupMemberForm = { |
||||
|
id: undefined, |
||||
|
groupId: undefined, |
||||
|
userId: undefined, |
||||
|
remarkNickName: undefined, |
||||
|
headImage: undefined, |
||||
|
remarkGroupName: undefined, |
||||
|
quit: undefined, |
||||
|
createdTime: undefined, |
||||
|
quitTime: undefined, |
||||
|
userNickName: undefined |
||||
|
} |
||||
|
const data = reactive<PageData<GroupMemberForm, GroupMemberQuery>>({ |
||||
|
form: {...initFormData}, |
||||
|
queryParams: { |
||||
|
pageNum: 1, |
||||
|
pageSize: 10, |
||||
|
groupId: undefined, |
||||
|
userId: undefined, |
||||
|
remarkNickName: undefined, |
||||
|
headImage: undefined, |
||||
|
remarkGroupName: undefined, |
||||
|
quit: undefined, |
||||
|
createdTime: undefined, |
||||
|
quitTime: undefined, |
||||
|
userNickName: undefined, |
||||
|
params: { |
||||
|
} |
||||
|
}, |
||||
|
rules: { |
||||
|
id: [ |
||||
|
{ required: true, message: "id不能为空", trigger: "blur" } |
||||
|
], |
||||
|
groupId: [ |
||||
|
{ required: true, message: "群id不能为空", trigger: "blur" } |
||||
|
], |
||||
|
userId: [ |
||||
|
{ required: true, message: "用户id不能为空", trigger: "blur" } |
||||
|
], |
||||
|
remarkNickName: [ |
||||
|
{ required: true, message: "组内显示名称不能为空", trigger: "blur" } |
||||
|
], |
||||
|
headImage: [ |
||||
|
{ required: true, message: "用户头像不能为空", trigger: "blur" } |
||||
|
], |
||||
|
remarkGroupName: [ |
||||
|
{ required: true, message: "群名备注不能为空", trigger: "blur" } |
||||
|
], |
||||
|
quit: [ |
||||
|
{ required: true, message: "是否已退出不能为空", trigger: "blur" } |
||||
|
], |
||||
|
createdTime: [ |
||||
|
{ required: true, message: "创建时间不能为空", trigger: "blur" } |
||||
|
], |
||||
|
quitTime: [ |
||||
|
{ required: true, message: "退出时间不能为空", trigger: "blur" } |
||||
|
], |
||||
|
userNickName: [ |
||||
|
{ required: true, message: "用户昵称不能为空", trigger: "blur" } |
||||
|
] |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
const { queryParams, form, rules } = toRefs(data); |
||||
|
|
||||
|
/** 查询群成员列表 */ |
||||
|
const getList = async () => { |
||||
|
loading.value = true; |
||||
|
const res = await listGroupMember(queryParams.value); |
||||
|
groupMemberList.value = res.rows; |
||||
|
total.value = res.total; |
||||
|
loading.value = false; |
||||
|
} |
||||
|
|
||||
|
/** 取消按钮 */ |
||||
|
const cancel = () => { |
||||
|
reset(); |
||||
|
dialog.visible = false; |
||||
|
} |
||||
|
|
||||
|
/** 表单重置 */ |
||||
|
const reset = () => { |
||||
|
form.value = {...initFormData}; |
||||
|
groupMemberFormRef.value?.resetFields(); |
||||
|
} |
||||
|
|
||||
|
/** 搜索按钮操作 */ |
||||
|
const handleQuery = () => { |
||||
|
queryParams.value.pageNum = 1; |
||||
|
getList(); |
||||
|
} |
||||
|
|
||||
|
/** 重置按钮操作 */ |
||||
|
const resetQuery = () => { |
||||
|
queryFormRef.value?.resetFields(); |
||||
|
handleQuery(); |
||||
|
} |
||||
|
|
||||
|
/** 多选框选中数据 */ |
||||
|
const handleSelectionChange = (selection: GroupMemberVO[]) => { |
||||
|
ids.value = selection.map(item => item.id); |
||||
|
single.value = selection.length != 1; |
||||
|
multiple.value = !selection.length; |
||||
|
} |
||||
|
|
||||
|
/** 新增按钮操作 */ |
||||
|
const handleAdd = () => { |
||||
|
reset(); |
||||
|
dialog.visible = true; |
||||
|
dialog.title = "添加群成员"; |
||||
|
} |
||||
|
|
||||
|
/** 修改按钮操作 */ |
||||
|
const handleUpdate = async (row?: GroupMemberVO) => { |
||||
|
reset(); |
||||
|
const _id = row?.id || ids.value[0] |
||||
|
const res = await getGroupMember(_id); |
||||
|
Object.assign(form.value, res.data); |
||||
|
dialog.visible = true; |
||||
|
dialog.title = "修改群成员"; |
||||
|
} |
||||
|
|
||||
|
/** 提交按钮 */ |
||||
|
const submitForm = () => { |
||||
|
groupMemberFormRef.value?.validate(async (valid: boolean) => { |
||||
|
if (valid) { |
||||
|
buttonLoading.value = true; |
||||
|
if (form.value.id) { |
||||
|
await updateGroupMember(form.value).finally(() => buttonLoading.value = false); |
||||
|
} else { |
||||
|
await addGroupMember(form.value).finally(() => buttonLoading.value = false); |
||||
|
} |
||||
|
proxy?.$modal.msgSuccess("操作成功"); |
||||
|
dialog.visible = false; |
||||
|
await getList(); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
/** 删除按钮操作 */ |
||||
|
const handleDelete = async (row?: GroupMemberVO) => { |
||||
|
const _ids = row?.id || ids.value; |
||||
|
await proxy?.$modal.confirm('是否确认删除群成员编号为"' + _ids + '"的数据项?').finally(() => loading.value = false); |
||||
|
await delGroupMember(_ids); |
||||
|
proxy?.$modal.msgSuccess("删除成功"); |
||||
|
await getList(); |
||||
|
} |
||||
|
|
||||
|
/** 导出按钮操作 */ |
||||
|
const handleExport = () => { |
||||
|
proxy?.download('im/groupMember/export', { |
||||
|
...queryParams.value |
||||
|
}, `groupMember_${new Date().getTime()}.xlsx`) |
||||
|
} |
||||
|
|
||||
|
onMounted(() => { |
||||
|
getList(); |
||||
|
}); |
||||
|
</script> |
||||
@ -0,0 +1,333 @@ |
|||||
|
<template> |
||||
|
<div class="p-2"> |
||||
|
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
||||
|
<div v-show="showSearch" class="mb-[10px]"> |
||||
|
<el-card shadow="hover"> |
||||
|
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> |
||||
|
<el-form-item label="群id" prop="groupId"> |
||||
|
<el-input v-model="queryParams.groupId" placeholder="请输入群id" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="发送用户id" prop="sendId"> |
||||
|
<el-input v-model="queryParams.sendId" placeholder="请输入发送用户id" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="发送用户昵称" prop="sendNickName"> |
||||
|
<el-input v-model="queryParams.sendNickName" placeholder="请输入发送用户昵称" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="被@用户id列表,逗号分隔" prop="atUserIds"> |
||||
|
<el-input v-model="queryParams.atUserIds" placeholder="请输入被@用户id列表,逗号分隔" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="发送时间" prop="sendTime"> |
||||
|
<el-date-picker clearable |
||||
|
v-model="queryParams.sendTime" |
||||
|
type="date" |
||||
|
value-format="YYYY-MM-DD" |
||||
|
placeholder="请选择发送时间" |
||||
|
/> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="回执消息是否完成" prop="receiptOk"> |
||||
|
<el-input v-model="queryParams.receiptOk" placeholder="请输入回执消息是否完成" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="是否回执消息" prop="receipt"> |
||||
|
<el-input v-model="queryParams.receipt" placeholder="请输入是否回执消息" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="接收用户id,逗号分隔,为空表示发给所有成员" prop="recvIds"> |
||||
|
<el-input v-model="queryParams.recvIds" placeholder="请输入接收用户id,逗号分隔,为空表示发给所有成员" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item> |
||||
|
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> |
||||
|
<el-button icon="Refresh" @click="resetQuery">重置</el-button> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
</el-card> |
||||
|
</div> |
||||
|
</transition> |
||||
|
|
||||
|
<el-card shadow="never"> |
||||
|
<template #header> |
||||
|
<el-row :gutter="10" class="mb8"> |
||||
|
<el-col :span="1.5"> |
||||
|
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['im:groupMessage:add']">新增</el-button> |
||||
|
</el-col> |
||||
|
<el-col :span="1.5"> |
||||
|
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['im:groupMessage:edit']">修改</el-button> |
||||
|
</el-col> |
||||
|
<el-col :span="1.5"> |
||||
|
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['im:groupMessage:remove']">删除</el-button> |
||||
|
</el-col> |
||||
|
<el-col :span="1.5"> |
||||
|
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['im:groupMessage:export']">导出</el-button> |
||||
|
</el-col> |
||||
|
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
||||
|
</el-row> |
||||
|
</template> |
||||
|
|
||||
|
<el-table v-loading="loading" :data="groupMessageList" @selection-change="handleSelectionChange"> |
||||
|
<el-table-column type="selection" width="55" align="center" /> |
||||
|
<el-table-column label="id" align="center" prop="id" v-if="true" /> |
||||
|
<el-table-column label="群id" align="center" prop="groupId" /> |
||||
|
<el-table-column label="发送用户id" align="center" prop="sendId" /> |
||||
|
<el-table-column label="发送用户昵称" align="center" prop="sendNickName" /> |
||||
|
<el-table-column label="被@用户id列表,逗号分隔" align="center" prop="atUserIds" /> |
||||
|
<el-table-column label="发送内容" align="center" prop="content" /> |
||||
|
<el-table-column label="" align="center" prop="status" /> |
||||
|
<el-table-column label="消息类型" align="center" prop="type" /> |
||||
|
<el-table-column label="发送时间" align="center" prop="sendTime" width="180"> |
||||
|
<template #default="scope"> |
||||
|
<span>{{ parseTime(scope.row.sendTime, '{y}-{m}-{d}') }}</span> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="回执消息是否完成" align="center" prop="receiptOk" /> |
||||
|
<el-table-column label="是否回执消息" align="center" prop="receipt" /> |
||||
|
<el-table-column label="接收用户id,逗号分隔,为空表示发给所有成员" align="center" prop="recvIds" /> |
||||
|
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
||||
|
<template #default="scope"> |
||||
|
<el-tooltip content="修改" placement="top"> |
||||
|
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['im:groupMessage:edit']"></el-button> |
||||
|
</el-tooltip> |
||||
|
<el-tooltip content="删除" placement="top"> |
||||
|
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['im:groupMessage:remove']"></el-button> |
||||
|
</el-tooltip> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
</el-table> |
||||
|
|
||||
|
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
||||
|
</el-card> |
||||
|
<!-- 添加或修改群消息对话框 --> |
||||
|
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> |
||||
|
<el-form ref="groupMessageFormRef" :model="form" :rules="rules" label-width="80px"> |
||||
|
<el-form-item label="群id" prop="groupId"> |
||||
|
<el-input v-model="form.groupId" placeholder="请输入群id" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="发送用户id" prop="sendId"> |
||||
|
<el-input v-model="form.sendId" placeholder="请输入发送用户id" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="发送用户昵称" prop="sendNickName"> |
||||
|
<el-input v-model="form.sendNickName" placeholder="请输入发送用户昵称" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="被@用户id列表,逗号分隔" prop="atUserIds"> |
||||
|
<el-input v-model="form.atUserIds" placeholder="请输入被@用户id列表,逗号分隔" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="发送内容"> |
||||
|
<editor v-model="form.content" :min-height="192"/> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="发送时间" prop="sendTime"> |
||||
|
<el-date-picker clearable |
||||
|
v-model="form.sendTime" |
||||
|
type="datetime" |
||||
|
value-format="YYYY-MM-DD HH:mm:ss" |
||||
|
placeholder="请选择发送时间"> |
||||
|
</el-date-picker> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="回执消息是否完成" prop="receiptOk"> |
||||
|
<el-input v-model="form.receiptOk" placeholder="请输入回执消息是否完成" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="是否回执消息" prop="receipt"> |
||||
|
<el-input v-model="form.receipt" placeholder="请输入是否回执消息" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="接收用户id,逗号分隔,为空表示发给所有成员" prop="recvIds"> |
||||
|
<el-input v-model="form.recvIds" placeholder="请输入接收用户id,逗号分隔,为空表示发给所有成员" /> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
<template #footer> |
||||
|
<div class="dialog-footer"> |
||||
|
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button> |
||||
|
<el-button @click="cancel">取 消</el-button> |
||||
|
</div> |
||||
|
</template> |
||||
|
</el-dialog> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup name="GroupMessage" lang="ts"> |
||||
|
import { listGroupMessage, getGroupMessage, delGroupMessage, addGroupMessage, updateGroupMessage } from '@/api/im/groupMessage'; |
||||
|
import { GroupMessageVO, GroupMessageQuery, GroupMessageForm } from '@/api/im/groupMessage/types'; |
||||
|
|
||||
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance; |
||||
|
|
||||
|
const groupMessageList = ref<GroupMessageVO[]>([]); |
||||
|
const buttonLoading = ref(false); |
||||
|
const loading = ref(true); |
||||
|
const showSearch = ref(true); |
||||
|
const ids = ref<Array<string | number>>([]); |
||||
|
const single = ref(true); |
||||
|
const multiple = ref(true); |
||||
|
const total = ref(0); |
||||
|
|
||||
|
const queryFormRef = ref<ElFormInstance>(); |
||||
|
const groupMessageFormRef = ref<ElFormInstance>(); |
||||
|
|
||||
|
const dialog = reactive<DialogOption>({ |
||||
|
visible: false, |
||||
|
title: '' |
||||
|
}); |
||||
|
|
||||
|
const initFormData: GroupMessageForm = { |
||||
|
id: undefined, |
||||
|
groupId: undefined, |
||||
|
sendId: undefined, |
||||
|
sendNickName: undefined, |
||||
|
atUserIds: undefined, |
||||
|
content: undefined, |
||||
|
status: undefined, |
||||
|
type: undefined, |
||||
|
sendTime: undefined, |
||||
|
receiptOk: undefined, |
||||
|
receipt: undefined, |
||||
|
recvIds: undefined |
||||
|
} |
||||
|
const data = reactive<PageData<GroupMessageForm, GroupMessageQuery>>({ |
||||
|
form: {...initFormData}, |
||||
|
queryParams: { |
||||
|
pageNum: 1, |
||||
|
pageSize: 10, |
||||
|
groupId: undefined, |
||||
|
sendId: undefined, |
||||
|
sendNickName: undefined, |
||||
|
atUserIds: undefined, |
||||
|
content: undefined, |
||||
|
status: undefined, |
||||
|
type: undefined, |
||||
|
sendTime: undefined, |
||||
|
receiptOk: undefined, |
||||
|
receipt: undefined, |
||||
|
recvIds: undefined, |
||||
|
params: { |
||||
|
} |
||||
|
}, |
||||
|
rules: { |
||||
|
id: [ |
||||
|
{ required: true, message: "id不能为空", trigger: "blur" } |
||||
|
], |
||||
|
groupId: [ |
||||
|
{ required: true, message: "群id不能为空", trigger: "blur" } |
||||
|
], |
||||
|
sendId: [ |
||||
|
{ required: true, message: "发送用户id不能为空", trigger: "blur" } |
||||
|
], |
||||
|
sendNickName: [ |
||||
|
{ required: true, message: "发送用户昵称不能为空", trigger: "blur" } |
||||
|
], |
||||
|
atUserIds: [ |
||||
|
{ required: true, message: "被@用户id列表,逗号分隔不能为空", trigger: "blur" } |
||||
|
], |
||||
|
content: [ |
||||
|
{ required: true, message: "发送内容不能为空", trigger: "blur" } |
||||
|
], |
||||
|
status: [ |
||||
|
{ required: true, message: "不能为空", trigger: "change" } |
||||
|
], |
||||
|
type: [ |
||||
|
{ required: true, message: "消息类型 0:文字 1:图片 2:文件不能为空", trigger: "change" } |
||||
|
], |
||||
|
sendTime: [ |
||||
|
{ required: true, message: "发送时间不能为空", trigger: "blur" } |
||||
|
], |
||||
|
receiptOk: [ |
||||
|
{ required: true, message: "回执消息是否完成不能为空", trigger: "blur" } |
||||
|
], |
||||
|
receipt: [ |
||||
|
{ required: true, message: "是否回执消息不能为空", trigger: "blur" } |
||||
|
], |
||||
|
recvIds: [ |
||||
|
{ required: true, message: "接收用户id,逗号分隔,为空表示发给所有成员不能为空", trigger: "blur" } |
||||
|
] |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
const { queryParams, form, rules } = toRefs(data); |
||||
|
|
||||
|
/** 查询群消息列表 */ |
||||
|
const getList = async () => { |
||||
|
loading.value = true; |
||||
|
const res = await listGroupMessage(queryParams.value); |
||||
|
groupMessageList.value = res.rows; |
||||
|
total.value = res.total; |
||||
|
loading.value = false; |
||||
|
} |
||||
|
|
||||
|
/** 取消按钮 */ |
||||
|
const cancel = () => { |
||||
|
reset(); |
||||
|
dialog.visible = false; |
||||
|
} |
||||
|
|
||||
|
/** 表单重置 */ |
||||
|
const reset = () => { |
||||
|
form.value = {...initFormData}; |
||||
|
groupMessageFormRef.value?.resetFields(); |
||||
|
} |
||||
|
|
||||
|
/** 搜索按钮操作 */ |
||||
|
const handleQuery = () => { |
||||
|
queryParams.value.pageNum = 1; |
||||
|
getList(); |
||||
|
} |
||||
|
|
||||
|
/** 重置按钮操作 */ |
||||
|
const resetQuery = () => { |
||||
|
queryFormRef.value?.resetFields(); |
||||
|
handleQuery(); |
||||
|
} |
||||
|
|
||||
|
/** 多选框选中数据 */ |
||||
|
const handleSelectionChange = (selection: GroupMessageVO[]) => { |
||||
|
ids.value = selection.map(item => item.id); |
||||
|
single.value = selection.length != 1; |
||||
|
multiple.value = !selection.length; |
||||
|
} |
||||
|
|
||||
|
/** 新增按钮操作 */ |
||||
|
const handleAdd = () => { |
||||
|
reset(); |
||||
|
dialog.visible = true; |
||||
|
dialog.title = "添加群消息"; |
||||
|
} |
||||
|
|
||||
|
/** 修改按钮操作 */ |
||||
|
const handleUpdate = async (row?: GroupMessageVO) => { |
||||
|
reset(); |
||||
|
const _id = row?.id || ids.value[0] |
||||
|
const res = await getGroupMessage(_id); |
||||
|
Object.assign(form.value, res.data); |
||||
|
dialog.visible = true; |
||||
|
dialog.title = "修改群消息"; |
||||
|
} |
||||
|
|
||||
|
/** 提交按钮 */ |
||||
|
const submitForm = () => { |
||||
|
groupMessageFormRef.value?.validate(async (valid: boolean) => { |
||||
|
if (valid) { |
||||
|
buttonLoading.value = true; |
||||
|
if (form.value.id) { |
||||
|
await updateGroupMessage(form.value).finally(() => buttonLoading.value = false); |
||||
|
} else { |
||||
|
await addGroupMessage(form.value).finally(() => buttonLoading.value = false); |
||||
|
} |
||||
|
proxy?.$modal.msgSuccess("操作成功"); |
||||
|
dialog.visible = false; |
||||
|
await getList(); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
/** 删除按钮操作 */ |
||||
|
const handleDelete = async (row?: GroupMessageVO) => { |
||||
|
const _ids = row?.id || ids.value; |
||||
|
await proxy?.$modal.confirm('是否确认删除群消息编号为"' + _ids + '"的数据项?').finally(() => loading.value = false); |
||||
|
await delGroupMessage(_ids); |
||||
|
proxy?.$modal.msgSuccess("删除成功"); |
||||
|
await getList(); |
||||
|
} |
||||
|
|
||||
|
/** 导出按钮操作 */ |
||||
|
const handleExport = () => { |
||||
|
proxy?.download('im/groupMessage/export', { |
||||
|
...queryParams.value |
||||
|
}, `groupMessage_${new Date().getTime()}.xlsx`) |
||||
|
} |
||||
|
|
||||
|
onMounted(() => { |
||||
|
getList(); |
||||
|
}); |
||||
|
</script> |
||||
@ -0,0 +1,231 @@ |
|||||
|
<template> |
||||
|
<div class="p-2"> |
||||
|
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
||||
|
<div v-show="showSearch" class="mb-[10px]"> |
||||
|
<el-card shadow="hover"> |
||||
|
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> |
||||
|
<el-form-item label="发送时间" prop="createdTime"> |
||||
|
<el-date-picker |
||||
|
v-model="dateRange" |
||||
|
value-format="YYYY-MM-DD HH:mm:ss" |
||||
|
type="daterange" |
||||
|
range-separator="-" |
||||
|
start-placeholder="开始日期" |
||||
|
end-placeholder="结束日期" |
||||
|
:default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" |
||||
|
></el-date-picker> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="发送用户" prop="sendId"> |
||||
|
<im-user-select v-model="queryParams.sendId"></im-user-select> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="接收用户" prop="recvId"> |
||||
|
<im-user-select v-model="queryParams.recvId"></im-user-select> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="内容" prop="content"> |
||||
|
<el-input v-model="queryParams.content"></el-input> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="消息类型" prop="type"> |
||||
|
<el-select v-model="queryParams.type" clearable> |
||||
|
<el-option v-for="dict in im_message_type" :key="dict.value" :label="dict.label" :value="dict.value" /> |
||||
|
</el-select> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="消息类型" prop="status"> |
||||
|
<el-select v-model="queryParams.status" clearable> |
||||
|
<el-option v-for="dict in im_message_status" :key="dict.value" :label="dict.label" :value="dict.value" /> |
||||
|
</el-select> |
||||
|
</el-form-item> |
||||
|
<el-form-item> |
||||
|
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> |
||||
|
<el-button icon="Refresh" @click="resetQuery">重置</el-button> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
</el-card> |
||||
|
</div> |
||||
|
</transition> |
||||
|
|
||||
|
<el-card shadow="never"> |
||||
|
<el-table v-loading="loading" :data="privateMessageList" @selection-change="handleSelectionChange"> |
||||
|
<el-table-column label="发送用户" align="center" prop="sendUserName" /> |
||||
|
<el-table-column label="接收用户" align="center" prop="recvUserName" /> |
||||
|
<el-table-column label="发送内容" align="center" prop="content" > |
||||
|
<template #default="scope"> |
||||
|
<im-message-content :message="scope.row" ></im-message-content> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="消息类型" align="center" prop="type" > |
||||
|
<template #default="scope"> |
||||
|
<dict-tag :options="im_message_type" :value="scope.row.type" /> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="状态 " align="center" prop="status" > |
||||
|
<template #default="scope"> |
||||
|
<dict-tag :options="im_message_status" :value="scope.row.status" /> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="发送时间" align="center" prop="sendTime" width="180"> |
||||
|
<template #default="scope"> |
||||
|
<span>{{ parseTime(scope.row.sendTime, '{y}-{m}-{d}') }}</span> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
||||
|
<template #default="scope"> |
||||
|
<el-tooltip content="详情" placement="top"> |
||||
|
<el-button link type="primary" @click="handleUpdate(scope.row)" v-hasPermi="['im:privateMessage:query']">详情</el-button> |
||||
|
</el-tooltip> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
</el-table> |
||||
|
|
||||
|
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
||||
|
</el-card> |
||||
|
<!-- 添加或修改私聊消息对话框 --> |
||||
|
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> |
||||
|
<el-form ref="privateMessageFormRef" :model="form" :rules="rules" label-width="80px" disabled> |
||||
|
<el-form-item label="发送用户" prop="sendUserName"> |
||||
|
<el-input v-model="form.sendUserName" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="接收用户" prop="sendUserName"> |
||||
|
<el-input v-model="form.recvUserName" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="发送内容"> |
||||
|
<el-input v-model="form.content" :min-height="192"/> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="发送时间" prop="sendTime"> |
||||
|
<el-date-picker clearable |
||||
|
v-model="form.sendTime" |
||||
|
type="datetime" |
||||
|
value-format="YYYY-MM-DD HH:mm:ss" |
||||
|
placeholder="请选择发送时间"> |
||||
|
</el-date-picker> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="消息类型"> |
||||
|
<dict-tag :options="im_message_type" :value="form.type" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="消息状态"> |
||||
|
<dict-tag :options="im_message_status" :value="form.status" /> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
<template #footer> |
||||
|
<div class="dialog-footer"> |
||||
|
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button> |
||||
|
</div> |
||||
|
</template> |
||||
|
</el-dialog> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup name="PrivateMessage" lang="ts"> |
||||
|
import { listPrivateMessage, getPrivateMessage } from '@/api/im/privateMessage'; |
||||
|
import { PrivateMessageVO, PrivateMessageQuery, PrivateMessageForm } from '@/api/im/privateMessage/types'; |
||||
|
|
||||
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance; |
||||
|
|
||||
|
const privateMessageList = ref<PrivateMessageVO[]>([]); |
||||
|
const buttonLoading = ref(false); |
||||
|
const loading = ref(true); |
||||
|
const showSearch = ref(true); |
||||
|
const ids = ref<Array<string | number>>([]); |
||||
|
const single = ref(true); |
||||
|
const multiple = ref(true); |
||||
|
const total = ref(0); |
||||
|
|
||||
|
const queryFormRef = ref<ElFormInstance>(); |
||||
|
const privateMessageFormRef = ref<ElFormInstance>(); |
||||
|
const dateRange = ref<[DateModelType, DateModelType]>(['', '']); |
||||
|
|
||||
|
const dialog = reactive<DialogOption>({ |
||||
|
visible: false, |
||||
|
title: '' |
||||
|
}); |
||||
|
|
||||
|
const initFormData: PrivateMessageForm = { |
||||
|
id: undefined, |
||||
|
sendId: undefined, |
||||
|
sendUserName: undefined, |
||||
|
recvUserName: undefined, |
||||
|
recvId: undefined, |
||||
|
content: undefined, |
||||
|
type: undefined, |
||||
|
status: undefined, |
||||
|
sendTime: undefined |
||||
|
} |
||||
|
const data = reactive<PageData<PrivateMessageForm, PrivateMessageQuery>>({ |
||||
|
form: {...initFormData}, |
||||
|
queryParams: { |
||||
|
pageNum: 1, |
||||
|
pageSize: 10, |
||||
|
sendId: undefined, |
||||
|
recvId: undefined, |
||||
|
content: undefined, |
||||
|
type: undefined, |
||||
|
status: undefined, |
||||
|
sendTime: undefined, |
||||
|
params: { |
||||
|
} |
||||
|
}, |
||||
|
rules: { |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
const { queryParams, form, rules } = toRefs(data); |
||||
|
const { im_message_type, im_message_status } = toRefs<any>(proxy?.useDict('im_message_type', 'im_message_status')); |
||||
|
/** 查询私聊消息列表 */ |
||||
|
const getList = async () => { |
||||
|
loading.value = true; |
||||
|
const res = await listPrivateMessage(proxy?.addDateRange(queryParams.value, dateRange.value)); |
||||
|
privateMessageList.value = res.rows; |
||||
|
total.value = res.total; |
||||
|
loading.value = false; |
||||
|
} |
||||
|
|
||||
|
/** 确定按钮 */ |
||||
|
const submitForm = () => { |
||||
|
dialog.visible = false; |
||||
|
} |
||||
|
|
||||
|
/** 表单重置 */ |
||||
|
const reset = () => { |
||||
|
form.value = {...initFormData}; |
||||
|
privateMessageFormRef.value?.resetFields(); |
||||
|
} |
||||
|
|
||||
|
/** 搜索按钮操作 */ |
||||
|
const handleQuery = () => { |
||||
|
queryParams.value.pageNum = 1; |
||||
|
getList(); |
||||
|
} |
||||
|
|
||||
|
/** 重置按钮操作 */ |
||||
|
const resetQuery = () => { |
||||
|
queryFormRef.value?.resetFields(); |
||||
|
handleQuery(); |
||||
|
} |
||||
|
|
||||
|
/** 多选框选中数据 */ |
||||
|
const handleSelectionChange = (selection: PrivateMessageVO[]) => { |
||||
|
ids.value = selection.map(item => item.id); |
||||
|
single.value = selection.length != 1; |
||||
|
multiple.value = !selection.length; |
||||
|
} |
||||
|
|
||||
|
/** 修改按钮操作 */ |
||||
|
const handleUpdate = async (row?: PrivateMessageVO) => { |
||||
|
reset(); |
||||
|
const _id = row?.id || ids.value[0] |
||||
|
const res = await getPrivateMessage(_id); |
||||
|
Object.assign(form.value, res.data); |
||||
|
dialog.visible = true; |
||||
|
dialog.title = "消息详情"; |
||||
|
} |
||||
|
|
||||
|
/** 导出按钮操作 */ |
||||
|
const handleExport = () => { |
||||
|
proxy?.download('im/privateMessage/export', { |
||||
|
...queryParams.value |
||||
|
}, `privateMessage_${new Date().getTime()}.xlsx`) |
||||
|
} |
||||
|
|
||||
|
onMounted(() => { |
||||
|
getList(); |
||||
|
}); |
||||
|
</script> |
||||
@ -0,0 +1,304 @@ |
|||||
|
<template> |
||||
|
<div class="p-2"> |
||||
|
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
||||
|
<div v-show="showSearch" class="mb-[10px]"> |
||||
|
<el-card shadow="hover"> |
||||
|
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> |
||||
|
<el-form-item label="标题" prop="title"> |
||||
|
<el-input v-model="queryParams.title" placeholder="请输入标题" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="封面" prop="coverUrl"> |
||||
|
<el-input v-model="queryParams.coverUrl" placeholder="请输入封面" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="简介" prop="intro"> |
||||
|
<el-input v-model="queryParams.intro" placeholder="请输入简介" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="富文本内容,base64编码" prop="richText"> |
||||
|
<el-input v-model="queryParams.richText" placeholder="请输入富文本内容,base64编码" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="外部链接" prop="externLink"> |
||||
|
<el-input v-model="queryParams.externLink" placeholder="请输入外部链接" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="删除标识 0:正常 1:已删除" prop="deleted"> |
||||
|
<el-input v-model="queryParams.deleted" placeholder="请输入删除标识 0:正常 1:已删除" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="创建者" prop="creator"> |
||||
|
<el-input v-model="queryParams.creator" placeholder="请输入创建者" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="更新者" prop="updater"> |
||||
|
<el-input v-model="queryParams.updater" placeholder="请输入更新者" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item> |
||||
|
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> |
||||
|
<el-button icon="Refresh" @click="resetQuery">重置</el-button> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
</el-card> |
||||
|
</div> |
||||
|
</transition> |
||||
|
|
||||
|
<el-card shadow="never"> |
||||
|
<template #header> |
||||
|
<el-row :gutter="10" class="mb8"> |
||||
|
<el-col :span="1.5"> |
||||
|
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['im:systemMessage:add']">新增</el-button> |
||||
|
</el-col> |
||||
|
<el-col :span="1.5"> |
||||
|
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['im:systemMessage:edit']">修改</el-button> |
||||
|
</el-col> |
||||
|
<el-col :span="1.5"> |
||||
|
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['im:systemMessage:remove']">删除</el-button> |
||||
|
</el-col> |
||||
|
<el-col :span="1.5"> |
||||
|
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['im:systemMessage:export']">导出</el-button> |
||||
|
</el-col> |
||||
|
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
||||
|
</el-row> |
||||
|
</template> |
||||
|
|
||||
|
<el-table v-loading="loading" :data="systemMessageList" @selection-change="handleSelectionChange"> |
||||
|
<el-table-column type="selection" width="55" align="center" /> |
||||
|
<el-table-column label="id" align="center" prop="id" v-if="true" /> |
||||
|
<el-table-column label="标题" align="center" prop="title" /> |
||||
|
<el-table-column label="封面" align="center" prop="coverUrl" /> |
||||
|
<el-table-column label="简介" align="center" prop="intro" /> |
||||
|
<el-table-column label="内容类型 0:富文本 1:外部链接" align="center" prop="contentType" /> |
||||
|
<el-table-column label="富文本内容,base64编码" align="center" prop="richText" /> |
||||
|
<el-table-column label="外部链接" align="center" prop="externLink" /> |
||||
|
<el-table-column label="删除标识 0:正常 1:已删除" align="center" prop="deleted" /> |
||||
|
<el-table-column label="创建者" align="center" prop="creator" /> |
||||
|
<el-table-column label="更新者" align="center" prop="updater" /> |
||||
|
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
||||
|
<template #default="scope"> |
||||
|
<el-tooltip content="修改" placement="top"> |
||||
|
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['im:systemMessage:edit']"></el-button> |
||||
|
</el-tooltip> |
||||
|
<el-tooltip content="删除" placement="top"> |
||||
|
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['im:systemMessage:remove']"></el-button> |
||||
|
</el-tooltip> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
</el-table> |
||||
|
|
||||
|
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
||||
|
</el-card> |
||||
|
<!-- 添加或修改系统消息对话框 --> |
||||
|
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> |
||||
|
<el-form ref="systemMessageFormRef" :model="form" :rules="rules" label-width="80px"> |
||||
|
<el-form-item label="标题" prop="title"> |
||||
|
<el-input v-model="form.title" placeholder="请输入标题" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="封面" prop="coverUrl"> |
||||
|
<el-input v-model="form.coverUrl" placeholder="请输入封面" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="简介" prop="intro"> |
||||
|
<el-input v-model="form.intro" placeholder="请输入简介" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="富文本内容,base64编码" prop="richText"> |
||||
|
<el-input v-model="form.richText" type="textarea" placeholder="请输入内容" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="外部链接" prop="externLink"> |
||||
|
<el-input v-model="form.externLink" placeholder="请输入外部链接" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="删除标识 0:正常 1:已删除" prop="deleted"> |
||||
|
<el-input v-model="form.deleted" placeholder="请输入删除标识 0:正常 1:已删除" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="创建者" prop="creator"> |
||||
|
<el-input v-model="form.creator" placeholder="请输入创建者" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="更新者" prop="updater"> |
||||
|
<el-input v-model="form.updater" placeholder="请输入更新者" /> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
<template #footer> |
||||
|
<div class="dialog-footer"> |
||||
|
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button> |
||||
|
<el-button @click="cancel">取 消</el-button> |
||||
|
</div> |
||||
|
</template> |
||||
|
</el-dialog> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup name="SystemMessage" lang="ts"> |
||||
|
import { listSystemMessage, getSystemMessage, delSystemMessage, addSystemMessage, updateSystemMessage } from '@/api/im/systemMessage'; |
||||
|
import { SystemMessageVO, SystemMessageQuery, SystemMessageForm } from '@/api/im/systemMessage/types'; |
||||
|
|
||||
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance; |
||||
|
|
||||
|
const systemMessageList = ref<SystemMessageVO[]>([]); |
||||
|
const buttonLoading = ref(false); |
||||
|
const loading = ref(true); |
||||
|
const showSearch = ref(true); |
||||
|
const ids = ref<Array<string | number>>([]); |
||||
|
const single = ref(true); |
||||
|
const multiple = ref(true); |
||||
|
const total = ref(0); |
||||
|
|
||||
|
const queryFormRef = ref<ElFormInstance>(); |
||||
|
const systemMessageFormRef = ref<ElFormInstance>(); |
||||
|
|
||||
|
const dialog = reactive<DialogOption>({ |
||||
|
visible: false, |
||||
|
title: '' |
||||
|
}); |
||||
|
|
||||
|
const initFormData: SystemMessageForm = { |
||||
|
id: undefined, |
||||
|
title: undefined, |
||||
|
coverUrl: undefined, |
||||
|
intro: undefined, |
||||
|
contentType: undefined, |
||||
|
richText: undefined, |
||||
|
externLink: undefined, |
||||
|
deleted: undefined, |
||||
|
creator: undefined, |
||||
|
updater: undefined, |
||||
|
} |
||||
|
const data = reactive<PageData<SystemMessageForm, SystemMessageQuery>>({ |
||||
|
form: {...initFormData}, |
||||
|
queryParams: { |
||||
|
pageNum: 1, |
||||
|
pageSize: 10, |
||||
|
title: undefined, |
||||
|
coverUrl: undefined, |
||||
|
intro: undefined, |
||||
|
contentType: undefined, |
||||
|
richText: undefined, |
||||
|
externLink: undefined, |
||||
|
deleted: undefined, |
||||
|
creator: undefined, |
||||
|
updater: undefined, |
||||
|
params: { |
||||
|
} |
||||
|
}, |
||||
|
rules: { |
||||
|
id: [ |
||||
|
{ required: true, message: "id不能为空", trigger: "blur" } |
||||
|
], |
||||
|
title: [ |
||||
|
{ required: true, message: "标题不能为空", trigger: "blur" } |
||||
|
], |
||||
|
coverUrl: [ |
||||
|
{ required: true, message: "封面不能为空", trigger: "blur" } |
||||
|
], |
||||
|
intro: [ |
||||
|
{ required: true, message: "简介不能为空", trigger: "blur" } |
||||
|
], |
||||
|
contentType: [ |
||||
|
{ required: true, message: "内容类型 0:富文本 1:外部链接不能为空", trigger: "change" } |
||||
|
], |
||||
|
richText: [ |
||||
|
{ required: true, message: "富文本内容,base64编码不能为空", trigger: "blur" } |
||||
|
], |
||||
|
externLink: [ |
||||
|
{ required: true, message: "外部链接不能为空", trigger: "blur" } |
||||
|
], |
||||
|
deleted: [ |
||||
|
{ required: true, message: "删除标识 0:正常 1:已删除不能为空", trigger: "blur" } |
||||
|
], |
||||
|
creator: [ |
||||
|
{ required: true, message: "创建者不能为空", trigger: "blur" } |
||||
|
], |
||||
|
updater: [ |
||||
|
{ required: true, message: "更新者不能为空", trigger: "blur" } |
||||
|
], |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
const { queryParams, form, rules } = toRefs(data); |
||||
|
|
||||
|
/** 查询系统消息列表 */ |
||||
|
const getList = async () => { |
||||
|
loading.value = true; |
||||
|
const res = await listSystemMessage(queryParams.value); |
||||
|
systemMessageList.value = res.rows; |
||||
|
total.value = res.total; |
||||
|
loading.value = false; |
||||
|
} |
||||
|
|
||||
|
/** 取消按钮 */ |
||||
|
const cancel = () => { |
||||
|
reset(); |
||||
|
dialog.visible = false; |
||||
|
} |
||||
|
|
||||
|
/** 表单重置 */ |
||||
|
const reset = () => { |
||||
|
form.value = {...initFormData}; |
||||
|
systemMessageFormRef.value?.resetFields(); |
||||
|
} |
||||
|
|
||||
|
/** 搜索按钮操作 */ |
||||
|
const handleQuery = () => { |
||||
|
queryParams.value.pageNum = 1; |
||||
|
getList(); |
||||
|
} |
||||
|
|
||||
|
/** 重置按钮操作 */ |
||||
|
const resetQuery = () => { |
||||
|
queryFormRef.value?.resetFields(); |
||||
|
handleQuery(); |
||||
|
} |
||||
|
|
||||
|
/** 多选框选中数据 */ |
||||
|
const handleSelectionChange = (selection: SystemMessageVO[]) => { |
||||
|
ids.value = selection.map(item => item.id); |
||||
|
single.value = selection.length != 1; |
||||
|
multiple.value = !selection.length; |
||||
|
} |
||||
|
|
||||
|
/** 新增按钮操作 */ |
||||
|
const handleAdd = () => { |
||||
|
reset(); |
||||
|
dialog.visible = true; |
||||
|
dialog.title = "添加系统消息"; |
||||
|
} |
||||
|
|
||||
|
/** 修改按钮操作 */ |
||||
|
const handleUpdate = async (row?: SystemMessageVO) => { |
||||
|
reset(); |
||||
|
const _id = row?.id || ids.value[0] |
||||
|
const res = await getSystemMessage(_id); |
||||
|
Object.assign(form.value, res.data); |
||||
|
dialog.visible = true; |
||||
|
dialog.title = "修改系统消息"; |
||||
|
} |
||||
|
|
||||
|
/** 提交按钮 */ |
||||
|
const submitForm = () => { |
||||
|
systemMessageFormRef.value?.validate(async (valid: boolean) => { |
||||
|
if (valid) { |
||||
|
buttonLoading.value = true; |
||||
|
if (form.value.id) { |
||||
|
await updateSystemMessage(form.value).finally(() => buttonLoading.value = false); |
||||
|
} else { |
||||
|
await addSystemMessage(form.value).finally(() => buttonLoading.value = false); |
||||
|
} |
||||
|
proxy?.$modal.msgSuccess("操作成功"); |
||||
|
dialog.visible = false; |
||||
|
await getList(); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
/** 删除按钮操作 */ |
||||
|
const handleDelete = async (row?: SystemMessageVO) => { |
||||
|
const _ids = row?.id || ids.value; |
||||
|
await proxy?.$modal.confirm('是否确认删除系统消息编号为"' + _ids + '"的数据项?').finally(() => loading.value = false); |
||||
|
await delSystemMessage(_ids); |
||||
|
proxy?.$modal.msgSuccess("删除成功"); |
||||
|
await getList(); |
||||
|
} |
||||
|
|
||||
|
/** 导出按钮操作 */ |
||||
|
const handleExport = () => { |
||||
|
proxy?.download('im/systemMessage/export', { |
||||
|
...queryParams.value |
||||
|
}, `systemMessage_${new Date().getTime()}.xlsx`) |
||||
|
} |
||||
|
|
||||
|
onMounted(() => { |
||||
|
getList(); |
||||
|
}); |
||||
|
</script> |
||||
@ -0,0 +1,318 @@ |
|||||
|
<template> |
||||
|
<div class="p-2"> |
||||
|
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
||||
|
<div v-show="showSearch" class="mb-[10px]"> |
||||
|
<el-card shadow="hover"> |
||||
|
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> |
||||
|
<el-form-item label="系统消息id" prop="messageId"> |
||||
|
<el-input v-model="queryParams.messageId" placeholder="请输入系统消息id" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="发送序列号" prop="seqNo"> |
||||
|
<el-input v-model="queryParams.seqNo" placeholder="请输入发送序列号" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="推送时间" prop="sendTime"> |
||||
|
<el-date-picker clearable |
||||
|
v-model="queryParams.sendTime" |
||||
|
type="date" |
||||
|
value-format="YYYY-MM-DD" |
||||
|
placeholder="请选择推送时间" |
||||
|
/> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="是否发送给全体用户" prop="sendToAll"> |
||||
|
<el-input v-model="queryParams.sendToAll" placeholder="请输入是否发送给全体用户" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="接收用户id,逗号分隔,send_to_all为false时有效" prop="recvIds"> |
||||
|
<el-input v-model="queryParams.recvIds" placeholder="请输入接收用户id,逗号分隔,send_to_all为false时有效" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="删除标识 0:正常 1:已删除" prop="deleted"> |
||||
|
<el-input v-model="queryParams.deleted" placeholder="请输入删除标识 0:正常 1:已删除" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="创建者" prop="creator"> |
||||
|
<el-input v-model="queryParams.creator" placeholder="请输入创建者" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="更新者" prop="updater"> |
||||
|
<el-input v-model="queryParams.updater" placeholder="请输入更新者" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item> |
||||
|
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> |
||||
|
<el-button icon="Refresh" @click="resetQuery">重置</el-button> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
</el-card> |
||||
|
</div> |
||||
|
</transition> |
||||
|
|
||||
|
<el-card shadow="never"> |
||||
|
<template #header> |
||||
|
<el-row :gutter="10" class="mb8"> |
||||
|
<el-col :span="1.5"> |
||||
|
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['im:smPushTask:add']">新增</el-button> |
||||
|
</el-col> |
||||
|
<el-col :span="1.5"> |
||||
|
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['im:smPushTask:edit']">修改</el-button> |
||||
|
</el-col> |
||||
|
<el-col :span="1.5"> |
||||
|
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['im:smPushTask:remove']">删除</el-button> |
||||
|
</el-col> |
||||
|
<el-col :span="1.5"> |
||||
|
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['im:smPushTask:export']">导出</el-button> |
||||
|
</el-col> |
||||
|
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
||||
|
</el-row> |
||||
|
</template> |
||||
|
|
||||
|
<el-table v-loading="loading" :data="smPushTaskList" @selection-change="handleSelectionChange"> |
||||
|
<el-table-column type="selection" width="55" align="center" /> |
||||
|
<el-table-column label="id" align="center" prop="id" v-if="true" /> |
||||
|
<el-table-column label="系统消息id" align="center" prop="messageId" /> |
||||
|
<el-table-column label="发送序列号" align="center" prop="seqNo" /> |
||||
|
<el-table-column label="推送时间" align="center" prop="sendTime" width="180"> |
||||
|
<template #default="scope"> |
||||
|
<span>{{ parseTime(scope.row.sendTime, '{y}-{m}-{d}') }}</span> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="状态 1:待发送 2:发送中 3:已发送 4:已取消" align="center" prop="status" /> |
||||
|
<el-table-column label="是否发送给全体用户" align="center" prop="sendToAll" /> |
||||
|
<el-table-column label="接收用户id,逗号分隔,send_to_all为false时有效" align="center" prop="recvIds" /> |
||||
|
<el-table-column label="删除标识 0:正常 1:已删除" align="center" prop="deleted" /> |
||||
|
<el-table-column label="创建者" align="center" prop="creator" /> |
||||
|
<el-table-column label="更新者" align="center" prop="updater" /> |
||||
|
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
||||
|
<template #default="scope"> |
||||
|
<el-tooltip content="修改" placement="top"> |
||||
|
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['im:smPushTask:edit']"></el-button> |
||||
|
</el-tooltip> |
||||
|
<el-tooltip content="删除" placement="top"> |
||||
|
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['im:smPushTask:remove']"></el-button> |
||||
|
</el-tooltip> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
</el-table> |
||||
|
|
||||
|
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
||||
|
</el-card> |
||||
|
<!-- 添加或修改系统消息推送任务对话框 --> |
||||
|
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> |
||||
|
<el-form ref="smPushTaskFormRef" :model="form" :rules="rules" label-width="80px"> |
||||
|
<el-form-item label="系统消息id" prop="messageId"> |
||||
|
<el-input v-model="form.messageId" placeholder="请输入系统消息id" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="发送序列号" prop="seqNo"> |
||||
|
<el-input v-model="form.seqNo" placeholder="请输入发送序列号" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="推送时间" prop="sendTime"> |
||||
|
<el-date-picker clearable |
||||
|
v-model="form.sendTime" |
||||
|
type="datetime" |
||||
|
value-format="YYYY-MM-DD HH:mm:ss" |
||||
|
placeholder="请选择推送时间"> |
||||
|
</el-date-picker> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="是否发送给全体用户" prop="sendToAll"> |
||||
|
<el-input v-model="form.sendToAll" placeholder="请输入是否发送给全体用户" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="接收用户id,逗号分隔,send_to_all为false时有效" prop="recvIds"> |
||||
|
<el-input v-model="form.recvIds" placeholder="请输入接收用户id,逗号分隔,send_to_all为false时有效" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="删除标识 0:正常 1:已删除" prop="deleted"> |
||||
|
<el-input v-model="form.deleted" placeholder="请输入删除标识 0:正常 1:已删除" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="创建者" prop="creator"> |
||||
|
<el-input v-model="form.creator" placeholder="请输入创建者" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="更新者" prop="updater"> |
||||
|
<el-input v-model="form.updater" placeholder="请输入更新者" /> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
<template #footer> |
||||
|
<div class="dialog-footer"> |
||||
|
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button> |
||||
|
<el-button @click="cancel">取 消</el-button> |
||||
|
</div> |
||||
|
</template> |
||||
|
</el-dialog> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup name="SmPushTask" lang="ts"> |
||||
|
import { listSmPushTask, getSmPushTask, delSmPushTask, addSmPushTask, updateSmPushTask } from '@/api/im/smPushTask'; |
||||
|
import { SmPushTaskVO, SmPushTaskQuery, SmPushTaskForm } from '@/api/im/smPushTask/types'; |
||||
|
|
||||
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance; |
||||
|
|
||||
|
const smPushTaskList = ref<SmPushTaskVO[]>([]); |
||||
|
const buttonLoading = ref(false); |
||||
|
const loading = ref(true); |
||||
|
const showSearch = ref(true); |
||||
|
const ids = ref<Array<string | number>>([]); |
||||
|
const single = ref(true); |
||||
|
const multiple = ref(true); |
||||
|
const total = ref(0); |
||||
|
|
||||
|
const queryFormRef = ref<ElFormInstance>(); |
||||
|
const smPushTaskFormRef = ref<ElFormInstance>(); |
||||
|
|
||||
|
const dialog = reactive<DialogOption>({ |
||||
|
visible: false, |
||||
|
title: '' |
||||
|
}); |
||||
|
|
||||
|
const initFormData: SmPushTaskForm = { |
||||
|
id: undefined, |
||||
|
messageId: undefined, |
||||
|
seqNo: undefined, |
||||
|
sendTime: undefined, |
||||
|
status: undefined, |
||||
|
sendToAll: undefined, |
||||
|
recvIds: undefined, |
||||
|
deleted: undefined, |
||||
|
creator: undefined, |
||||
|
updater: undefined, |
||||
|
} |
||||
|
const data = reactive<PageData<SmPushTaskForm, SmPushTaskQuery>>({ |
||||
|
form: {...initFormData}, |
||||
|
queryParams: { |
||||
|
pageNum: 1, |
||||
|
pageSize: 10, |
||||
|
messageId: undefined, |
||||
|
seqNo: undefined, |
||||
|
sendTime: undefined, |
||||
|
status: undefined, |
||||
|
sendToAll: undefined, |
||||
|
recvIds: undefined, |
||||
|
deleted: undefined, |
||||
|
creator: undefined, |
||||
|
updater: undefined, |
||||
|
params: { |
||||
|
} |
||||
|
}, |
||||
|
rules: { |
||||
|
id: [ |
||||
|
{ required: true, message: "id不能为空", trigger: "blur" } |
||||
|
], |
||||
|
messageId: [ |
||||
|
{ required: true, message: "系统消息id不能为空", trigger: "blur" } |
||||
|
], |
||||
|
seqNo: [ |
||||
|
{ required: true, message: "发送序列号不能为空", trigger: "blur" } |
||||
|
], |
||||
|
sendTime: [ |
||||
|
{ required: true, message: "推送时间不能为空", trigger: "blur" } |
||||
|
], |
||||
|
status: [ |
||||
|
{ required: true, message: "状态 1:待发送 2:发送中 3:已发送 4:已取消不能为空", trigger: "change" } |
||||
|
], |
||||
|
sendToAll: [ |
||||
|
{ required: true, message: "是否发送给全体用户不能为空", trigger: "blur" } |
||||
|
], |
||||
|
recvIds: [ |
||||
|
{ required: true, message: "接收用户id,逗号分隔,send_to_all为false时有效不能为空", trigger: "blur" } |
||||
|
], |
||||
|
deleted: [ |
||||
|
{ required: true, message: "删除标识 0:正常 1:已删除不能为空", trigger: "blur" } |
||||
|
], |
||||
|
creator: [ |
||||
|
{ required: true, message: "创建者不能为空", trigger: "blur" } |
||||
|
], |
||||
|
updater: [ |
||||
|
{ required: true, message: "更新者不能为空", trigger: "blur" } |
||||
|
], |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
const { queryParams, form, rules } = toRefs(data); |
||||
|
|
||||
|
/** 查询系统消息推送任务列表 */ |
||||
|
const getList = async () => { |
||||
|
loading.value = true; |
||||
|
const res = await listSmPushTask(queryParams.value); |
||||
|
smPushTaskList.value = res.rows; |
||||
|
total.value = res.total; |
||||
|
loading.value = false; |
||||
|
} |
||||
|
|
||||
|
/** 取消按钮 */ |
||||
|
const cancel = () => { |
||||
|
reset(); |
||||
|
dialog.visible = false; |
||||
|
} |
||||
|
|
||||
|
/** 表单重置 */ |
||||
|
const reset = () => { |
||||
|
form.value = {...initFormData}; |
||||
|
smPushTaskFormRef.value?.resetFields(); |
||||
|
} |
||||
|
|
||||
|
/** 搜索按钮操作 */ |
||||
|
const handleQuery = () => { |
||||
|
queryParams.value.pageNum = 1; |
||||
|
getList(); |
||||
|
} |
||||
|
|
||||
|
/** 重置按钮操作 */ |
||||
|
const resetQuery = () => { |
||||
|
queryFormRef.value?.resetFields(); |
||||
|
handleQuery(); |
||||
|
} |
||||
|
|
||||
|
/** 多选框选中数据 */ |
||||
|
const handleSelectionChange = (selection: SmPushTaskVO[]) => { |
||||
|
ids.value = selection.map(item => item.id); |
||||
|
single.value = selection.length != 1; |
||||
|
multiple.value = !selection.length; |
||||
|
} |
||||
|
|
||||
|
/** 新增按钮操作 */ |
||||
|
const handleAdd = () => { |
||||
|
reset(); |
||||
|
dialog.visible = true; |
||||
|
dialog.title = "添加系统消息推送任务"; |
||||
|
} |
||||
|
|
||||
|
/** 修改按钮操作 */ |
||||
|
const handleUpdate = async (row?: SmPushTaskVO) => { |
||||
|
reset(); |
||||
|
const _id = row?.id || ids.value[0] |
||||
|
const res = await getSmPushTask(_id); |
||||
|
Object.assign(form.value, res.data); |
||||
|
dialog.visible = true; |
||||
|
dialog.title = "修改系统消息推送任务"; |
||||
|
} |
||||
|
|
||||
|
/** 提交按钮 */ |
||||
|
const submitForm = () => { |
||||
|
smPushTaskFormRef.value?.validate(async (valid: boolean) => { |
||||
|
if (valid) { |
||||
|
buttonLoading.value = true; |
||||
|
if (form.value.id) { |
||||
|
await updateSmPushTask(form.value).finally(() => buttonLoading.value = false); |
||||
|
} else { |
||||
|
await addSmPushTask(form.value).finally(() => buttonLoading.value = false); |
||||
|
} |
||||
|
proxy?.$modal.msgSuccess("操作成功"); |
||||
|
dialog.visible = false; |
||||
|
await getList(); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
/** 删除按钮操作 */ |
||||
|
const handleDelete = async (row?: SmPushTaskVO) => { |
||||
|
const _ids = row?.id || ids.value; |
||||
|
await proxy?.$modal.confirm('是否确认删除系统消息推送任务编号为"' + _ids + '"的数据项?').finally(() => loading.value = false); |
||||
|
await delSmPushTask(_ids); |
||||
|
proxy?.$modal.msgSuccess("删除成功"); |
||||
|
await getList(); |
||||
|
} |
||||
|
|
||||
|
/** 导出按钮操作 */ |
||||
|
const handleExport = () => { |
||||
|
proxy?.download('im/smPushTask/export', { |
||||
|
...queryParams.value |
||||
|
}, `smPushTask_${new Date().getTime()}.xlsx`) |
||||
|
} |
||||
|
|
||||
|
onMounted(() => { |
||||
|
getList(); |
||||
|
}); |
||||
|
</script> |
||||
@ -0,0 +1,235 @@ |
|||||
|
<template> |
||||
|
<div class="p-2"> |
||||
|
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> |
||||
|
<div v-show="showSearch" class="mb-[10px]"> |
||||
|
<el-card shadow="hover"> |
||||
|
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> |
||||
|
<el-form-item label="是否启用 0:未启用 1:启用" prop="enabled"> |
||||
|
<el-input v-model="queryParams.enabled" placeholder="请输入是否启用 0:未启用 1:启用" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="创建者" prop="creator"> |
||||
|
<el-input v-model="queryParams.creator" placeholder="请输入创建者" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item> |
||||
|
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> |
||||
|
<el-button icon="Refresh" @click="resetQuery">重置</el-button> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
</el-card> |
||||
|
</div> |
||||
|
</transition> |
||||
|
|
||||
|
<el-card shadow="never"> |
||||
|
<template #header> |
||||
|
<el-row :gutter="10" class="mb8"> |
||||
|
<el-col :span="1.5"> |
||||
|
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['im:sensitiveWord:add']">新增</el-button> |
||||
|
</el-col> |
||||
|
<el-col :span="1.5"> |
||||
|
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['im:sensitiveWord:edit']">修改</el-button> |
||||
|
</el-col> |
||||
|
<el-col :span="1.5"> |
||||
|
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['im:sensitiveWord:remove']">删除</el-button> |
||||
|
</el-col> |
||||
|
<el-col :span="1.5"> |
||||
|
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['im:sensitiveWord:export']">导出</el-button> |
||||
|
</el-col> |
||||
|
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
||||
|
</el-row> |
||||
|
</template> |
||||
|
|
||||
|
<el-table v-loading="loading" :data="sensitiveWordList" @selection-change="handleSelectionChange"> |
||||
|
<el-table-column type="selection" width="55" align="center" /> |
||||
|
<el-table-column label="id" align="center" prop="id" v-if="true" /> |
||||
|
<el-table-column label="敏感词内容" align="center" prop="content" /> |
||||
|
<el-table-column label="是否启用 0:未启用 1:启用" align="center" prop="enabled" /> |
||||
|
<el-table-column label="创建者" align="center" prop="creator" /> |
||||
|
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
||||
|
<template #default="scope"> |
||||
|
<el-tooltip content="修改" placement="top"> |
||||
|
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['im:sensitiveWord:edit']"></el-button> |
||||
|
</el-tooltip> |
||||
|
<el-tooltip content="删除" placement="top"> |
||||
|
<el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['im:sensitiveWord:remove']"></el-button> |
||||
|
</el-tooltip> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
</el-table> |
||||
|
|
||||
|
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> |
||||
|
</el-card> |
||||
|
<!-- 添加或修改敏感词对话框 --> |
||||
|
<el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> |
||||
|
<el-form ref="sensitiveWordFormRef" :model="form" :rules="rules" label-width="80px"> |
||||
|
<el-form-item label="敏感词内容"> |
||||
|
<editor v-model="form.content" :min-height="192"/> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="是否启用 0:未启用 1:启用" prop="enabled"> |
||||
|
<el-input v-model="form.enabled" placeholder="请输入是否启用 0:未启用 1:启用" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="创建者" prop="creator"> |
||||
|
<el-input v-model="form.creator" placeholder="请输入创建者" /> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
<template #footer> |
||||
|
<div class="dialog-footer"> |
||||
|
<el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button> |
||||
|
<el-button @click="cancel">取 消</el-button> |
||||
|
</div> |
||||
|
</template> |
||||
|
</el-dialog> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup name="SensitiveWord" lang="ts"> |
||||
|
import { listSensitiveWord, getSensitiveWord, delSensitiveWord, addSensitiveWord, updateSensitiveWord } from '@/api/im/sensitiveWord'; |
||||
|
import { SensitiveWordVO, SensitiveWordQuery, SensitiveWordForm } from '@/api/im/sensitiveWord/types'; |
||||
|
|
||||
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance; |
||||
|
|
||||
|
const sensitiveWordList = ref<SensitiveWordVO[]>([]); |
||||
|
const buttonLoading = ref(false); |
||||
|
const loading = ref(true); |
||||
|
const showSearch = ref(true); |
||||
|
const ids = ref<Array<string | number>>([]); |
||||
|
const single = ref(true); |
||||
|
const multiple = ref(true); |
||||
|
const total = ref(0); |
||||
|
|
||||
|
const queryFormRef = ref<ElFormInstance>(); |
||||
|
const sensitiveWordFormRef = ref<ElFormInstance>(); |
||||
|
|
||||
|
const dialog = reactive<DialogOption>({ |
||||
|
visible: false, |
||||
|
title: '' |
||||
|
}); |
||||
|
|
||||
|
const initFormData: SensitiveWordForm = { |
||||
|
id: undefined, |
||||
|
content: undefined, |
||||
|
enabled: undefined, |
||||
|
creator: undefined, |
||||
|
} |
||||
|
const data = reactive<PageData<SensitiveWordForm, SensitiveWordQuery>>({ |
||||
|
form: {...initFormData}, |
||||
|
queryParams: { |
||||
|
pageNum: 1, |
||||
|
pageSize: 10, |
||||
|
content: undefined, |
||||
|
enabled: undefined, |
||||
|
creator: undefined, |
||||
|
params: { |
||||
|
} |
||||
|
}, |
||||
|
rules: { |
||||
|
id: [ |
||||
|
{ required: true, message: "id不能为空", trigger: "blur" } |
||||
|
], |
||||
|
content: [ |
||||
|
{ required: true, message: "敏感词内容不能为空", trigger: "blur" } |
||||
|
], |
||||
|
enabled: [ |
||||
|
{ required: true, message: "是否启用 0:未启用 1:启用不能为空", trigger: "blur" } |
||||
|
], |
||||
|
creator: [ |
||||
|
{ required: true, message: "创建者不能为空", trigger: "blur" } |
||||
|
], |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
const { queryParams, form, rules } = toRefs(data); |
||||
|
|
||||
|
/** 查询敏感词列表 */ |
||||
|
const getList = async () => { |
||||
|
loading.value = true; |
||||
|
const res = await listSensitiveWord(queryParams.value); |
||||
|
sensitiveWordList.value = res.rows; |
||||
|
total.value = res.total; |
||||
|
loading.value = false; |
||||
|
} |
||||
|
|
||||
|
/** 取消按钮 */ |
||||
|
const cancel = () => { |
||||
|
reset(); |
||||
|
dialog.visible = false; |
||||
|
} |
||||
|
|
||||
|
/** 表单重置 */ |
||||
|
const reset = () => { |
||||
|
form.value = {...initFormData}; |
||||
|
sensitiveWordFormRef.value?.resetFields(); |
||||
|
} |
||||
|
|
||||
|
/** 搜索按钮操作 */ |
||||
|
const handleQuery = () => { |
||||
|
queryParams.value.pageNum = 1; |
||||
|
getList(); |
||||
|
} |
||||
|
|
||||
|
/** 重置按钮操作 */ |
||||
|
const resetQuery = () => { |
||||
|
queryFormRef.value?.resetFields(); |
||||
|
handleQuery(); |
||||
|
} |
||||
|
|
||||
|
/** 多选框选中数据 */ |
||||
|
const handleSelectionChange = (selection: SensitiveWordVO[]) => { |
||||
|
ids.value = selection.map(item => item.id); |
||||
|
single.value = selection.length != 1; |
||||
|
multiple.value = !selection.length; |
||||
|
} |
||||
|
|
||||
|
/** 新增按钮操作 */ |
||||
|
const handleAdd = () => { |
||||
|
reset(); |
||||
|
dialog.visible = true; |
||||
|
dialog.title = "添加敏感词"; |
||||
|
} |
||||
|
|
||||
|
/** 修改按钮操作 */ |
||||
|
const handleUpdate = async (row?: SensitiveWordVO) => { |
||||
|
reset(); |
||||
|
const _id = row?.id || ids.value[0] |
||||
|
const res = await getSensitiveWord(_id); |
||||
|
Object.assign(form.value, res.data); |
||||
|
dialog.visible = true; |
||||
|
dialog.title = "修改敏感词"; |
||||
|
} |
||||
|
|
||||
|
/** 提交按钮 */ |
||||
|
const submitForm = () => { |
||||
|
sensitiveWordFormRef.value?.validate(async (valid: boolean) => { |
||||
|
if (valid) { |
||||
|
buttonLoading.value = true; |
||||
|
if (form.value.id) { |
||||
|
await updateSensitiveWord(form.value).finally(() => buttonLoading.value = false); |
||||
|
} else { |
||||
|
await addSensitiveWord(form.value).finally(() => buttonLoading.value = false); |
||||
|
} |
||||
|
proxy?.$modal.msgSuccess("操作成功"); |
||||
|
dialog.visible = false; |
||||
|
await getList(); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
/** 删除按钮操作 */ |
||||
|
const handleDelete = async (row?: SensitiveWordVO) => { |
||||
|
const _ids = row?.id || ids.value; |
||||
|
await proxy?.$modal.confirm('是否确认删除敏感词编号为"' + _ids + '"的数据项?').finally(() => loading.value = false); |
||||
|
await delSensitiveWord(_ids); |
||||
|
proxy?.$modal.msgSuccess("删除成功"); |
||||
|
await getList(); |
||||
|
} |
||||
|
|
||||
|
/** 导出按钮操作 */ |
||||
|
const handleExport = () => { |
||||
|
proxy?.download('im/sensitiveWord/export', { |
||||
|
...queryParams.value |
||||
|
}, `sensitiveWord_${new Date().getTime()}.xlsx`) |
||||
|
} |
||||
|
|
||||
|
onMounted(() => { |
||||
|
getList(); |
||||
|
}); |
||||
|
</script> |
||||
@ -0,0 +1,284 @@ |
|||||
|
<template> |
||||
|
<div class="p-2"> |
||||
|
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" |
||||
|
:leave-active-class="proxy?.animate.searchAnimate.leave"> |
||||
|
<div v-show="showSearch" class="mb-[10px]"> |
||||
|
<el-card shadow="hover"> |
||||
|
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> |
||||
|
<el-form-item label="用户名" prop="userName"> |
||||
|
<el-input v-model="queryParams.userName" placeholder="请输入用户名" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="用户昵称" prop="nickName"> |
||||
|
<el-input v-model="queryParams.nickName" placeholder="请输入用户昵称" clearable @keyup.enter="handleQuery" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item> |
||||
|
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> |
||||
|
<el-button icon="Refresh" @click="resetQuery">重置</el-button> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
</el-card> |
||||
|
</div> |
||||
|
</transition> |
||||
|
|
||||
|
<el-card shadow="never"> |
||||
|
<template #header> |
||||
|
<el-row :gutter="10" class="mb8"> |
||||
|
<el-col :span="1.5"> |
||||
|
<el-button type="warning" plain icon="Download" @click="handleExport" |
||||
|
v-hasPermi="['im:user:export']">导出</el-button> |
||||
|
</el-col> |
||||
|
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> |
||||
|
</el-row> |
||||
|
</template> |
||||
|
|
||||
|
<el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange"> |
||||
|
<el-table-column type="selection" width="55" align="center" /> |
||||
|
|
||||
|
<el-table-column label="用户名" align="center" prop="userName" /> |
||||
|
<el-table-column label="用户昵称" align="center" prop="nickName" /> |
||||
|
<el-table-column label="用户头像" align="center" prop="headImageThumb" width="100"> |
||||
|
<template #default="scope"> |
||||
|
<image-preview :src="scope.row.headImageThumb" :full-src="scope.row.headImage" :width="50" :height="50" /> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="性别" align="center" prop="sex"> |
||||
|
<template #default="scope"> |
||||
|
<dict-tag :options="sys_user_sex" :value="scope.row.sex" /> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="是否被封禁" align="center" prop="isBanned"> |
||||
|
<template #default="scope"> |
||||
|
<dict-tag :options="sys_bool" :value="scope.row.isBanned" /> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="状态" align="center" prop="status"> |
||||
|
<template #default="scope"> |
||||
|
<dict-tag :options="im_user_status" :value="scope.row.status" /> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="注册时间" align="center" prop="createdTime" width="180"> |
||||
|
<template #default="scope"> |
||||
|
<span>{{ parseTime(scope.row.createdTime, '{y}-{m}-{d}') }}</span> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="最后登录时间" align="center" prop="lastLoginTime" width="180"> |
||||
|
<template #default="scope"> |
||||
|
<span>{{ parseTime(scope.row.lastLoginTime, '{y}-{m}-{d}') }}</span> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> |
||||
|
<template #default="scope"> |
||||
|
<el-tooltip content="详情" placement="top"> |
||||
|
<el-button link type="primary" v-hasPermi="['im:user:query']" |
||||
|
@click="handleDetail(scope.row)">详情</el-button> |
||||
|
</el-tooltip> |
||||
|
<el-tooltip v-if="scope.row.isBanned" content="解封" placement="top"> |
||||
|
<el-button link type="danger" v-hasPermi="['im:user:ban']" @click="unbanHandle(scope.row)">解封</el-button> |
||||
|
</el-tooltip> |
||||
|
<el-tooltip v-else content="封禁" placement="top"> |
||||
|
<el-button link type="danger" v-hasPermi="['im:user:ban']" @click="banHandle(scope.row)">封禁</el-button> |
||||
|
</el-tooltip> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
</el-table> |
||||
|
|
||||
|
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" |
||||
|
v-model:limit="queryParams.pageSize" @pagination="getList" /> |
||||
|
</el-card> |
||||
|
<!-- 添加或修改用户对话框 --> |
||||
|
<el-dialog :title="dialog.title" v-model="dialog.visible" width="800px" append-to-body> |
||||
|
<el-form ref="userFormRef" :model="form" :rules="rules" label-width="100px" disabled> |
||||
|
<el-form-item label="用户头像" prop="headImage"> |
||||
|
<image-preview :src="form.headImageThumb" :full-src="form.headImage" :width="100" :height="100" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="用户名" prop="userName"> |
||||
|
<el-input v-model="form.userName" placeholder="请输入用户名" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="性别" prop="sex"> |
||||
|
<dict-tag :options="sys_user_sex" :value="form.sex" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="用户昵称" prop="nickName"> |
||||
|
<el-input v-model="form.nickName" placeholder="请输入用户昵称" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="个性签名" prop="signature"> |
||||
|
<el-input v-model="form.signature" placeholder="请输入个性签名" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="最后登录时间" prop="lastLoginTime"> |
||||
|
<el-date-picker clearable v-model="form.lastLoginTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" |
||||
|
placeholder="请选择最后登录时间"> |
||||
|
</el-date-picker> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="注册时间" prop="createdTime"> |
||||
|
<el-date-picker clearable v-model="form.createdTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" |
||||
|
placeholder="请选择创建时间"> |
||||
|
</el-date-picker> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="是否被封禁" prop="isBanned"> |
||||
|
<dict-tag :options="sys_bool" :value="form.isBanned" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item v-if="form.isBanned" label="被封禁原因" prop="reason"> |
||||
|
<el-input v-model="form.reason" placeholder="请输入被封禁原因" /> |
||||
|
</el-form-item> |
||||
|
<el-form-item label="客户端id" prop="cid"> |
||||
|
<el-input v-model="form.cid" placeholder="请输入客户端id,用于uni-push推送" /> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
<template #footer> |
||||
|
<div class="dialog-footer"> |
||||
|
<el-button type="primary" @click="submitForm">确 定</el-button> |
||||
|
</div> |
||||
|
</template> |
||||
|
</el-dialog> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup name="User" lang="ts"> |
||||
|
import { listUser, getUser, ban, unban } from '@/api/im/user'; |
||||
|
import { UserVO, UserQuery, UserForm } from '@/api/im/user/types'; |
||||
|
|
||||
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance; |
||||
|
|
||||
|
const userList = ref<UserVO[]>([]); |
||||
|
const loading = ref(true); |
||||
|
const showSearch = ref(true); |
||||
|
const ids = ref<Array<string | number>>([]); |
||||
|
const single = ref(true); |
||||
|
const multiple = ref(true); |
||||
|
const total = ref(0); |
||||
|
|
||||
|
const queryFormRef = ref<ElFormInstance>(); |
||||
|
const userFormRef = ref<ElFormInstance>(); |
||||
|
const dialog = reactive<DialogOption>({ |
||||
|
visible: false, |
||||
|
title: '' |
||||
|
}); |
||||
|
|
||||
|
const initFormData: UserForm = { |
||||
|
id: undefined, |
||||
|
userName: undefined, |
||||
|
nickName: undefined, |
||||
|
headImage: undefined, |
||||
|
headImageThumb: undefined, |
||||
|
password: undefined, |
||||
|
sex: undefined, |
||||
|
signature: undefined, |
||||
|
lastLoginTime: undefined, |
||||
|
createdTime: undefined, |
||||
|
type: undefined, |
||||
|
isBanned: undefined, |
||||
|
reason: undefined, |
||||
|
cid: undefined, |
||||
|
status: undefined |
||||
|
} |
||||
|
const data = reactive<PageData<UserForm, UserQuery>>({ |
||||
|
form: { ...initFormData }, |
||||
|
queryParams: { |
||||
|
pageNum: 1, |
||||
|
pageSize: 10, |
||||
|
userName: undefined, |
||||
|
nickName: undefined, |
||||
|
params: { |
||||
|
} |
||||
|
}, |
||||
|
rules: {} |
||||
|
}); |
||||
|
const { queryParams, form, rules } = toRefs(data); |
||||
|
|
||||
|
const { sys_bool } = toRefs<any>(proxy?.useDict('sys_bool')); |
||||
|
const { im_user_status } = toRefs<any>(proxy?.useDict('im_user_status')); |
||||
|
const { sys_user_sex } = toRefs<any>(proxy?.useDict('sys_user_sex')); |
||||
|
|
||||
|
/** 查询用户列表 */ |
||||
|
const getList = async () => { |
||||
|
loading.value = true; |
||||
|
const res = await listUser(queryParams.value); |
||||
|
userList.value = res.rows; |
||||
|
total.value = res.total; |
||||
|
loading.value = false; |
||||
|
console.log("getList") |
||||
|
} |
||||
|
/** 搜索按钮操作 */ |
||||
|
const handleQuery = () => { |
||||
|
queryParams.value.pageNum = 1; |
||||
|
getList(); |
||||
|
console.log("handleQuery") |
||||
|
} |
||||
|
|
||||
|
/** 重置按钮操作 */ |
||||
|
const resetQuery = () => { |
||||
|
queryFormRef.value?.resetFields(); |
||||
|
handleQuery(); |
||||
|
console.log("handleQuery") |
||||
|
} |
||||
|
|
||||
|
/** 多选框选中数据 */ |
||||
|
const handleSelectionChange = (selection: UserVO[]) => { |
||||
|
ids.value = selection.map(item => item.id); |
||||
|
single.value = selection.length != 1; |
||||
|
multiple.value = !selection.length; |
||||
|
console.log("handleSelectionChange") |
||||
|
} |
||||
|
|
||||
|
/** 表单重置 */ |
||||
|
const reset = () => { |
||||
|
form.value = { ...initFormData }; |
||||
|
userFormRef.value?.resetFields(); |
||||
|
console.log("reset") |
||||
|
} |
||||
|
|
||||
|
/** 修改按钮操作 */ |
||||
|
const handleDetail = async (row?: UserVO) => { |
||||
|
reset(); |
||||
|
const _id = row?.id || ids.value[0] |
||||
|
const res = await getUser(_id); |
||||
|
Object.assign(form.value, res.data); |
||||
|
dialog.visible = true; |
||||
|
dialog.title = "用户信息"; |
||||
|
} |
||||
|
|
||||
|
/** 提交按钮 */ |
||||
|
const submitForm = () => { |
||||
|
dialog.visible = false; |
||||
|
} |
||||
|
|
||||
|
const banHandle = (user: any) => { |
||||
|
ElMessageBox.prompt('封禁原因:', '确定对该用户进行封禁?', { |
||||
|
inputPattern: /\S/, |
||||
|
inputErrorMessage: '请输入封禁原因', |
||||
|
confirmButtonText: '确定', |
||||
|
cancelButtonText: '取消' |
||||
|
}).then(({ value }) => { |
||||
|
const data = { id: user.id, reason: value } |
||||
|
ban(data).then(() => { |
||||
|
user.isBanned = true |
||||
|
ElMessage.success(`用户'${user.userName}'已被封禁`); |
||||
|
}) |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
const unbanHandle = (user: any) => { |
||||
|
ElMessageBox.confirm('确定解除该用户的封禁状态??', '提示', { |
||||
|
confirmButtonText: '确定', |
||||
|
cancelButtonText: '取消' |
||||
|
}).then(() => { |
||||
|
const data = { id: user.id } |
||||
|
unban(data).then(() => { |
||||
|
user.isBanned = false |
||||
|
ElMessage.success(`用户'${user.userName}'解锁成功`); |
||||
|
}) |
||||
|
|
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
/** 导出按钮操作 */ |
||||
|
const handleExport = () => { |
||||
|
proxy?.download('im/user/export', { |
||||
|
...queryParams.value |
||||
|
}, `user_${new Date().getTime()}.xlsx`) |
||||
|
} |
||||
|
|
||||
|
|
||||
|
onMounted(() => { |
||||
|
getList(); |
||||
|
}); |
||||
|
</script> |
||||
Loading…
Reference in new issue