Browse Source

style: 工作台菜单栏移动端样式

master
tiantian 5 months ago
parent
commit
05f3ea206d
  1. 432
      frontend/src/components/chat/Chat.vue
  2. 170
      frontend/src/components/chat/ChatMenu.vue

432
frontend/src/components/chat/Chat.vue

@ -1,46 +1,46 @@
<script setup lang="ts">
import { useChatStore } from "@/stores/chat";
import { getWorkflowUrl } from "@/system/config";
import { Search } from "@element-plus/icons-vue";
const store = useChatStore();
const workUrl = getWorkflowUrl();
onMounted(() => {
store.initChat();
});
import { useChatStore } from "@/stores/chat";
import { getWorkflowUrl } from "@/system/config";
import { Search } from "@element-plus/icons-vue";
const store = useChatStore();
const workUrl = getWorkflowUrl();
onMounted(() => {
store.initChat();
});
const generateData = () => {
return store.allUserList.map((user: any) => ({
key: user.id,
label: user.nickname,
avatar: user.avatar, //
}));
};
const generateData = () => {
return store.allUserList.map((user: any) => ({
key: user.id,
label: user.nickname,
avatar: user.avatar, //
}));
};
const data = ref(generateData());
// users any[]
let users = ref<any[]>([]);
const myTransfer = ref();
const data = ref(generateData());
// users any[]
let users = ref<any[]>([]);
const myTransfer = ref();
watchEffect(() => {
if (store.allUserList.length > 0) {
data.value = generateData();
}
});
watchEffect(() => {
if (store.allUserList.length > 0) {
data.value = generateData();
}
});
// searchList
watch(
() => store.searchInput,
(newSearchInput) => {
if (newSearchInput === "") {
store.searchList = []; //
} else {
store.searchList = store.chatList.filter(
(user: { displayName: string | string[] }) =>
user.displayName.includes(newSearchInput)
);
}
// searchList
watch(
() => store.searchInput,
(newSearchInput) => {
if (newSearchInput === "") {
store.searchList = []; //
} else {
store.searchList = store.chatList.filter(
(user: { displayName: string | string[] }) =>
user.displayName.includes(newSearchInput)
);
}
);
}
);
</script>
<template>
<el-container class="container">
@ -48,24 +48,13 @@
<el-aside class="menu">
<chat-menu />
</el-aside>
<el-container
class="side"
v-if="store.currentNavId < 4"
>
<el-container class="side" v-if="store.currentNavId < 4">
<!--搜索栏-->
<div v-if="store.currentNavId < 2">
<el-header class="search">
<el-input
placeholder="搜索"
:prefix-icon="Search"
class="search-input"
v-model="store.searchInput"
/>
<el-input placeholder="搜索" :prefix-icon="Search" class="search-input" v-model="store.searchInput" />
<!-- 邀请群聊 -->
<button
class="inviteGroupChats"
@click="store.setGroupChatInvitedDialogVisible(true)"
>
<button class="inviteGroupChats" @click="store.setGroupChatInvitedDialogVisible(true)">
<el-icon>
<Plus />
</el-icon>
@ -86,68 +75,35 @@
<chat-user-info v-if="store.currentNavId == 1"></chat-user-info>
<ai-chat-main v-if="store.currentNavId == 3" />
</el-container>
<el-container
class="chat-setting"
v-if="store.currentNavId == 2"
>
<iframe
class="workflow"
:src="workUrl"
></iframe>
<el-container class="chat-setting" v-if="store.currentNavId == 2">
<iframe class="workflow" :src="workUrl"></iframe>
</el-container>
<el-container
class="chat-setting"
v-if="store.currentNavId == 5"
>
<el-container class="chat-setting" v-if="store.currentNavId == 5">
<ChatUserSetting />
</el-container>
</el-container>
<!-- 邀请群聊弹窗 -->
<el-dialog
v-model="store.groupChatInvitedDialogVisible"
width="80%"
title="创建群聊"
style="height: 550px"
align-center
>
<el-dialog v-model="store.groupChatInvitedDialogVisible" width="80%" title="创建群聊" style="height: 550px"
align-center>
<div class="dialog-body">
<!-- 添加输入部门名的输入框 -->
<div>
<el-form label-position="top">
<el-form-item label="群聊名称:">
<el-input
maxlength="8"
show-word-limit
style="width: 240px; height: 30px"
class="department-name"
v-model="store.departmentName"
placeholder="请输入群聊名称"
></el-input>
<el-input maxlength="8" show-word-limit style="width: 240px; height: 30px"
class="department-name" v-model="store.departmentName" placeholder="请输入群聊名称"></el-input>
</el-form-item>
</el-form>
</div>
<!-- 使用 Element el-transfer 组件替换自定义穿梭框 -->
<el-transfer
v-model="users"
:data="data"
:titles="['可选项', '已选项']"
filterable
style="height: 250px"
filter-placeholder="搜索用户名"
:props="{ key: 'key', label: 'label', avatar: 'avatar' }"
:left-default-checked="[]"
class="transfer-container"
ref="myTransfer"
>
<el-transfer v-model="users" :data="data" :titles="['可选项', '已选项']" filterable style="height: 250px"
filter-placeholder="搜索用户名" :props="{ key: 'key', label: 'label', avatar: 'avatar' }"
:left-default-checked="[]" class="transfer-container" ref="myTransfer">
<!-- 自定义穿梭框列表项模板 -->
<template #default="{ option }">
<el-avatar
:src="option.avatar"
size="small"
style="margin-right: 5px"
/>
<el-avatar :src="option.avatar" size="small" style="margin-right: 5px" />
<span>{{ option.label }}</span>
</template>
</el-transfer>
@ -155,175 +111,181 @@
<template #footer>
<span class="dialog-footer">
<el-button
style="background-color: #0078d4; color: #fff"
@click="store.groupChatInvitedDialogVisible = false"
>取消</el-button
>
<el-button
style="background-color: #0078d4; color: #fff"
@click="store.createGroupChat(users)"
>确定</el-button
>
<el-button style="background-color: #0078d4; color: #fff"
@click="store.groupChatInvitedDialogVisible = false">取消</el-button>
<el-button style="background-color: #0078d4; color: #fff"
@click="store.createGroupChat(users)">确定</el-button>
</span>
</template>
</el-dialog>
</template>
<style scoped>
:deep(.el-transfer) {
:deep(.el-transfer) {
display: flex;
flex-direction: row;
/* 将布局方向设置为横向 */
width: 550px;
/* 让穿梭框占满宽度 */
justify-content: center;
align-items: center;
.el-transfer__buttons {
display: flex;
flex-direction: row;
/* 将布局方向设置为横向 */
width: 550px;
/* 让穿梭框占满宽度 */
justify-content: center;
justify-content: space-evenly;
align-items: center;
width: 120px;
padding: 0 0 !important;
.el-transfer__buttons {
display: flex;
justify-content: space-evenly;
align-items: center;
width: 120px;
padding: 0 0 !important;
.el-button {
width: 40px !important;
height: 30px !important;
background-color: #0078d4;
color: #fff;
}
.el-button {
width: 40px !important;
height: 30px !important;
background-color: #0078d4;
color: #fff;
}
}
}
::v-deep .el-dialog .el-dialog__header {
border: none !important;
}
::v-deep .el-dialog .el-dialog__header {
border: none !important;
}
::v-deep .el-transfer-panel {
width: 270px !important;
/* 设置每个穿梭框面板的宽度 */
height: 250px !important;
}
::v-deep .el-transfer-panel {
width: 270px !important;
/* 设置每个穿梭框面板的宽度 */
height: 250px !important;
}
::v-deep .el-transfer-panel__body {
height: 200px !important;
}
::v-deep .el-transfer-panel__body {
height: 200px !important;
}
::v-deep .el-checkbox__label {
margin-left: 10px !important;
}
::v-deep .el-checkbox__label {
margin-left: 10px !important;
}
.container {
display: flex;
height: 100%;
width: 100%;
overflow-y: hidden;
overflow-x: hidden;
border-top: 1px solid #e8e8e8;
}
.container {
display: flex;
height: 100%;
width: 100%;
overflow-y: hidden;
overflow-x: hidden;
border-top: 1px solid #e8e8e8;
}
.menu {
width: 55px;
background-color: #ffffff;
overflow-y: hidden;
overflow-x: hidden;
-webkit-app-region: drag;
}
.menu {
width: 55px;
background-color: #ffffff;
overflow-y: hidden;
overflow-x: hidden;
-webkit-app-region: drag;
}
.side {
flex: 1;
/* 占据剩余宽度 */
/* max-width: 200px; */
/* min-width: 200px; */
min-height: 650px;
max-height: max-content;
border-right: 1px solid #e8e8e8;
overflow-y: hidden;
overflow-x: hidden;
}
.side {
flex: 1;
/* 占据剩余宽度 */
/* max-width: 200px; */
/* min-width: 200px; */
min-height: 650px;
max-height: max-content;
border-right: 1px solid #e8e8e8;
overflow-y: hidden;
overflow-x: hidden;
}
.search {
display: flex;
align-items: center;
justify-content: space-evenly;
width: 100%;
height: 50px;
padding: 0;
padding-right: 10px;
-webkit-app-region: drag;
border-bottom: 1px solid #e8e8e8;
border-left: 1px solid #e8e8e8;
}
.search {
display: flex;
align-items: center;
justify-content: space-evenly;
width: 100%;
height: 50px;
padding: 0;
padding-right: 10px;
-webkit-app-region: drag;
border-bottom: 1px solid #e8e8e8;
border-left: 1px solid #e8e8e8;
}
.inviteGroupChats {
width: 40px;
height: 30px;
border: none;
border-radius: 4px;
background-color: #f0f0f0;
}
.inviteGroupChats {
width: 40px;
height: 30px;
border: none;
border-radius: 4px;
background-color: #f0f0f0;
}
.user-item {
width: 100%;
height: 30px;
display: flex;
align-items: center;
}
.user-item {
width: 100%;
height: 30px;
display: flex;
align-items: center;
}
.search-input {
width: calc(100% - 20px);
margin: 10px;
height: 32px;
-webkit-app-region: no-drag;
--el-input-placeholder-color: #bfbfbf !important;
--el-input-icon-color: #bfbfbf !important;
}
.search-input {
width: calc(100% - 20px);
margin: 10px;
height: 32px;
-webkit-app-region: no-drag;
--el-input-placeholder-color: #bfbfbf !important;
--el-input-icon-color: #bfbfbf !important;
}
.list {
width: 100%;
height: 100%;
padding: 0;
overflow-y: hidden;
overflow-x: hidden;
border-left: 1px solid #e8e8e8;
}
.list {
width: 100%;
height: 100%;
padding: 0;
overflow-y: hidden;
overflow-x: hidden;
border-left: 1px solid #e8e8e8;
}
.dialog-body {
width: 100%;
height: 350px;
}
.dialog-body {
width: 100%;
height: 350px;
}
.chat-box {
flex: 3;
width: 100%;
height: 100%;
max-height: max-content;
background-color: #ffffff;
}
.chat-box {
flex: 3;
width: 100%;
height: 100%;
max-height: max-content;
background-color: #ffffff;
}
.chat-setting {
width: calc(100% - 65px);
height: 100%;
overflow: hidden;
}
.chat-setting {
width: calc(100% - 65px);
height: 100%;
overflow: hidden;
}
.workflow {
width: 100%;
height: 100%;
object-fit: contain;
border: none;
}
.workflow {
width: 100%;
height: 100%;
object-fit: contain;
border: none;
}
.no-message-container {
height: 100%;
margin: 120px auto;
text-align: center;
font-size: 14px;
justify-content: center;
.no-message-container {
height: 100%;
margin: 120px auto;
text-align: center;
font-size: 14px;
justify-content: center;
}
.department-name {
margin: 10px 0;
}
@media screen and (max-width: 768px) {
.container {
height: calc(100% - 60px);
}
.department-name {
margin: 10px 0;
.menu {
width: 100vw;
position: fixed;
bottom: 0;
}
}
</style>

170
frontend/src/components/chat/ChatMenu.vue

@ -1,76 +1,117 @@
<script setup>
import { useChatStore } from "@/stores/chat";
import { isMobileDevice } from "@/util/device";
import { Setting as SettingIcon } from "@element-plus/icons-vue";
const store = useChatStore();
</script>
<template>
<!-- 头像 -->
<el-row>
<el-avatar shape="square" :size="30" class="userAvatar" :src="store.userInfo.avatar" />
</el-row>
<template v-if="!isMobileDevice()">
<!-- 头像 -->
<el-row>
<el-avatar shape="square" :size="30" class="userAvatar" :src="store.userInfo.avatar" />
</el-row>
<!-- 菜单按钮 -->
<el-row @click="store.setCurrentNavId(0)">
<div class="menu-icon-box">
<el-icon v-if="store.currentNavId === 0" class="menu-icon-on">
<Comment />
</el-icon>
<el-icon v-else class="menu-icon">
<Comment />
</el-icon>
</div>
</el-row>
<!-- 菜单按钮 -->
<el-row @click="store.setCurrentNavId(0)">
<div class="menu-icon-box">
<el-icon v-if="store.currentNavId === 0" class="menu-icon-on">
<Comment />
</el-icon>
<el-icon v-else class="menu-icon">
<Comment />
</el-icon>
</div>
</el-row>
<el-row @click="store.setCurrentNavId(1)">
<div class="menu-icon-box">
<el-icon v-if="store.currentNavId === 1" class="menu-icon-on">
<UserFilled />
</el-icon>
<el-icon v-else class="menu-icon">
<User />
</el-icon>
</div>
</el-row>
<el-row @click="store.setCurrentNavId(3)">
<div class="menu-icon-box">
<el-icon v-if="store.currentNavId === 3" class="menu-icon-on">
<Promotion />
</el-icon>
<el-icon v-else class="menu-icon">
<Position />
</el-icon>
</div>
</el-row>
<el-row @click="store.setCurrentNavId(2)">
<div class="menu-icon-box">
<el-icon
v-if="store.currentNavId === 2"
class="menu-icon-on"
>
<Platform />
</el-icon>
<el-icon
v-else
class="menu-icon"
>
<Monitor />
</el-icon>
</div>
</el-row>
<el-row @click="store.setCurrentNavId(1)">
<div class="menu-icon-box">
<el-icon v-if="store.currentNavId === 1" class="menu-icon-on">
<UserFilled />
</el-icon>
<el-icon v-else class="menu-icon">
<User />
</el-icon>
</div>
</el-row>
<el-row @click="store.setCurrentNavId(3)">
<div class="menu-icon-box">
<el-icon v-if="store.currentNavId === 3" class="menu-icon-on">
<Promotion />
</el-icon>
<el-icon v-else class="menu-icon">
<Position />
</el-icon>
</div>
</el-row>
<el-row @click="store.setCurrentNavId(2)">
<div class="menu-icon-box">
<el-icon v-if="store.currentNavId === 2" class="menu-icon-on">
<Platform />
</el-icon>
<el-icon v-else class="menu-icon">
<Monitor />
</el-icon>
</div>
</el-row>
<!-- 设置按钮固定在底部 -->
<el-row class="settings-icon-row" @click="store.setCurrentNavId(5)">
<div class="menu-icon-box">
<el-icon v-if="store.currentNavId === 5" class="menu-icon-on">
<Tools />
</el-icon>
<el-icon v-else class="menu-icon">
<Tools />
</el-icon>
<!-- 设置按钮固定在底部 -->
<el-row class="settings-icon-row" @click="store.setCurrentNavId(5)">
<div class="menu-icon-box">
<el-icon v-if="store.currentNavId === 5" class="menu-icon-on">
<Tools />
</el-icon>
<el-icon v-else class="menu-icon">
<Tools />
</el-icon>
</div>
</el-row>
</template>
<template v-else>
<div class="menubar">
<div class="menu-icon-box" @click="store.setCurrentNavId(0)">
<el-icon v-if="store.currentNavId === 0" class="menu-icon-on">
<Comment />
</el-icon>
<el-icon v-else class="menu-icon">
<Comment />
</el-icon>
</div>
<div class="menu-icon-box" @click="store.setCurrentNavId(1)">
<el-icon v-if="store.currentNavId === 1" class="menu-icon-on">
<UserFilled />
</el-icon>
<el-icon v-else class="menu-icon">
<User />
</el-icon>
</div>
<div class="menu-icon-box" @click="store.setCurrentNavId(3)">
<el-icon v-if="store.currentNavId === 3" class="menu-icon-on">
<Promotion />
</el-icon>
<el-icon v-else class="menu-icon">
<Position />
</el-icon>
</div>
<div class="menu-icon-box" @click="store.setCurrentNavId(2)">
<el-icon v-if="store.currentNavId === 2" class="menu-icon-on">
<Platform />
</el-icon>
<el-icon v-else class="menu-icon">
<Monitor />
</el-icon>
</div>
<div class="menu-icon-box" @click="store.setCurrentNavId(5)">
<el-icon v-if="store.currentNavId === 5" class="menu-icon-on">
<Tools />
</el-icon>
<el-icon v-else class="menu-icon">
<Tools />
</el-icon>
</div>
</div>
</el-row>
</template>
</template>
<style scoped>
@ -117,4 +158,11 @@ const store = useChatStore();
width: 55px;
height: 55px;
}
@media screen and (max-width: 768px) {
.menubar {
display: flex;
height: 60px;
}
}
</style>

Loading…
Cancel
Save