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