247 lines
5.9 KiB
Vue
247 lines
5.9 KiB
Vue
<template>
|
|
<div class="search-room-input">
|
|
<el-tooltip
|
|
v-model="showTips"
|
|
:manual="true"
|
|
effect="dark"
|
|
:content="tipsContent"
|
|
>
|
|
<el-input
|
|
v-model.trim="content"
|
|
v-loading="loading"
|
|
:class="{
|
|
success: roomProfile.id && roomProfile.id > 0,
|
|
fail: (!roomProfile.id || roomProfile.id < 0) && failShow
|
|
}"
|
|
placeholder="请输入房间ID"
|
|
class="input-with-select"
|
|
@blur="clickSearch"
|
|
>
|
|
<el-select
|
|
slot="prepend"
|
|
v-model="selectType"
|
|
placeholder="类型"
|
|
@change="clickSearch"
|
|
>
|
|
<el-option label="长ID" value="LONG_ID" />
|
|
<el-option label="短ID" value="SHORT_ID" />
|
|
</el-select>
|
|
</el-input>
|
|
</el-tooltip>
|
|
|
|
<el-dialog
|
|
title="房间搜索"
|
|
:visible="visibleSelecteDialog"
|
|
:before-close="handleClose"
|
|
:append-to-body="true"
|
|
>
|
|
<span>找到多个结果, 请选择您期望</span>
|
|
<div class="select-room">
|
|
<div
|
|
v-for="(item, index) in roomProfiles"
|
|
:key="index"
|
|
class="user-item flex-l"
|
|
>
|
|
<el-image
|
|
style="width: 40px; height: 40px; margin-right:10px;border-radius: 100%; flex-shrink: 0;"
|
|
:src="item.roomCover"
|
|
:preview-src-list="[item.roomCover]"
|
|
>
|
|
<div slot="error" class="image-slot">
|
|
<i class="el-icon-picture-outline" />
|
|
</div>
|
|
</el-image>
|
|
<sys-origin-icon :icon="item.sysOrigin" />
|
|
<div class="nickname nowrap-ellipsis">
|
|
{{ item.roomName }}
|
|
</div>
|
|
<div class="selected-but">
|
|
<el-button type="text" @click="clickSelected(item)">选择</el-button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</el-dialog>
|
|
</div>
|
|
</template>
|
|
<script>
|
|
import {
|
|
getRoomProfileBySysOriginAccount,
|
|
listRoomProfileByAccount
|
|
} from "@/api/room";
|
|
export default {
|
|
name: "SearchRoomInput",
|
|
props: {
|
|
sysOrigin: {
|
|
type: String,
|
|
require: false,
|
|
default: ""
|
|
},
|
|
roomId: {
|
|
type: String,
|
|
require: false,
|
|
default: ""
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
showTips: false,
|
|
tipsContent: "",
|
|
loading: false,
|
|
content: "",
|
|
selectType: "SHORT_ID",
|
|
failShow: false,
|
|
roomProfile: {},
|
|
roomProfiles: [],
|
|
visibleSelecteDialog: false
|
|
};
|
|
},
|
|
watch: {
|
|
roomId: {
|
|
handler(val) {
|
|
if (val === "") {
|
|
return;
|
|
}
|
|
if (val.length > 15) {
|
|
this.selectType = "LONG_ID";
|
|
this.content = val;
|
|
this.clickSearch();
|
|
return;
|
|
}
|
|
if (val.length < 15) {
|
|
this.selectType = "SHORT_ID";
|
|
this.content = val;
|
|
return;
|
|
}
|
|
},
|
|
immediate: true
|
|
}
|
|
},
|
|
methods: {
|
|
handleClose() {
|
|
this.$emit("closeSelectDialog");
|
|
this.visibleSelecteDialog = false;
|
|
},
|
|
clickSelected(item) {
|
|
this.visibleSelecteDialog = false;
|
|
this.$emit("success", item);
|
|
},
|
|
emitFail() {
|
|
this.roomProfiles = [];
|
|
this.roomProfile = {};
|
|
this.failShow = true;
|
|
this.$emit("fail");
|
|
},
|
|
failTipsContent(content) {
|
|
this.emitFail();
|
|
this.showTips = true;
|
|
this.tipsContent = content;
|
|
},
|
|
clickSearch() {
|
|
const that = this;
|
|
that.$emit("load");
|
|
that.failShow = false;
|
|
that.showTips = false;
|
|
if (!that.content) {
|
|
that.emitFail();
|
|
that.showTips = false;
|
|
that.failShow = false;
|
|
return;
|
|
}
|
|
if (!/\d+/.test(that.content)) {
|
|
that.failTipsContent("输入内容必须是正整数!");
|
|
return;
|
|
}
|
|
if (that.content.length < 1) {
|
|
that.failTipsContent("输入账号必须>=1位数!");
|
|
return;
|
|
}
|
|
if (
|
|
that.roomProfile &&
|
|
(that.roomProfile.roomAccount === that.content ||
|
|
that.roomProfile.roomAccount === that.content)
|
|
) {
|
|
that.$emit("success", that.roomProfile);
|
|
return;
|
|
}
|
|
if (this.selectType === "LONG_ID") return;
|
|
|
|
that.loading = true;
|
|
that
|
|
.search(that.selectType, that.content)
|
|
.then(res => {
|
|
that.loading = false;
|
|
const result = res.body;
|
|
if (!result) {
|
|
that.failTipsContent("没有找到房间信息!");
|
|
return;
|
|
}
|
|
|
|
if (result.length > 0) {
|
|
this.failShow = false;
|
|
that.roomProfiles = result;
|
|
if (that.roomProfiles.length === 1) {
|
|
that.roomProfile = that.roomProfiles[0];
|
|
that.$emit("success", that.roomProfile);
|
|
return;
|
|
}
|
|
that.visibleSelecteDialog = true;
|
|
return;
|
|
}
|
|
|
|
if (result.length === 0) {
|
|
that.failTipsContent("没有找到房间信息!");
|
|
return;
|
|
}
|
|
|
|
that.roomProfile = result;
|
|
that.$emit("success", that.roomProfile);
|
|
})
|
|
.catch(er => {
|
|
that.loading = false;
|
|
console.error("clickSearch", er);
|
|
that.failTipsContent("请求数据错误!");
|
|
});
|
|
},
|
|
search(type, id) {
|
|
if (type === "LONG_ID") {
|
|
// return getRoomProfileByRoomId(id)
|
|
}
|
|
if (type === "SHORT_ID") {
|
|
return this.sysOrigin
|
|
? getRoomProfileBySysOriginAccount(this.sysOrigin, id)
|
|
: listRoomProfileByAccount(id);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
</script>
|
|
<style lang="scss">
|
|
.search-room-input {
|
|
.el-select .el-input {
|
|
width: 100px;
|
|
}
|
|
.success > .el-input__inner {
|
|
border: 1px solid #67c23a;
|
|
}
|
|
.fail > .el-input__inner {
|
|
border: 1px solid #f56c6c;
|
|
}
|
|
}
|
|
</style>
|
|
<style scoped lang="scss">
|
|
.search-room-input {
|
|
.select-room {
|
|
.user-item {
|
|
padding: 5px 0rem;
|
|
img {
|
|
border-radius: 100%;
|
|
}
|
|
.nickname {
|
|
width: 100%;
|
|
padding: 10px;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</style>
|