Files
ks-app-employment-service/pages/chat/chat.vue
2025-04-07 09:10:55 +08:00

307 lines
9.0 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="container">
<!-- 抽屉遮罩层 -->
<view v-if="isDrawerOpen" class="overlay" @click="toggleDrawer"></view>
<!-- 抽屉窗口 -->
<view class="drawer" :class="{ open: isDrawerOpen }">
<view class="drawer-content">
<view class="drawer-title">AI+</view>
<view class="drawer-input-content">
<input
class="drawer-input"
type="text"
v-model="searchText"
placeholder-class="input-placeholder"
placeholder="请输入搜索历史对话"
/>
<uni-icons class="input-search" type="search" size="20"></uni-icons>
</view>
<scroll-view scroll-y :show-scrollbar="false" class="chat-scroll">
<view
class="drawer-rows"
@click="changeDialogue(item)"
v-for="(item, index) in filteredList"
:key="item.id"
>
<view
v-if="!item.isTitle"
class="drawer-row-list"
:class="{ 'drawer-row-active': item.sessionId === chatSessionID }"
>
{{ item.title }}
</view>
<view class="drawer-row-title" v-else>
{{ item.title }}
</view>
</view>
</scroll-view>
<view class="drawer-user">
<image class="drawer-user-img" v-if="userInfo.age === '0'" src="/static/icon/boy.png"></image>
<image class="drawer-user-img" v-else src="/static/icon/girl.png"></image>
<text>{{ userInfo.name || '暂无用户名' }}</text>
<image
class="drawer-user-setting button-click"
src="/static/icon/setting.png"
@click="updateSetting"
></image>
</view>
</view>
</view>
<!-- 主要内容挤压效果 -->
<view class="main-content" :class="{ shift: isDrawerOpen }">
<!-- header -->
<header class="head">
<view class="main-header">
<image src="/static/icon/Hamburger-button.png" @click="toggleDrawer"></image>
<view class="title">青岛市岗位推荐</view>
<image src="/static/icon/Comment-one.png" @click="addNewDialogue"></image>
</view>
</header>
<view class="chatmain-warpper">
<ai-paging ref="paging"></ai-paging>
</view>
</view>
</view>
</template>
<script setup>
import { ref, inject, nextTick, computed } from 'vue';
const { $api, navTo, insertSortData } = inject('globalFunction');
import { onLoad, onShow, onHide } from '@dcloudio/uni-app';
import useChatGroupDBStore from '@/stores/userChatGroupStore';
import useUserStore from '@/stores/useUserStore';
import aiPaging from './components/ai-paging.vue';
import { storeToRefs } from 'pinia';
const { isTyping, tabeList, chatSessionID } = storeToRefs(useChatGroupDBStore());
const { userInfo } = storeToRefs(useUserStore());
const isDrawerOpen = ref(false);
const scrollIntoView = ref(false);
import config from '@/config';
const searchText = ref('');
const paging = ref(null);
// 实时过滤
const filteredList = computed(() => {
if (!searchText.value) return tabeList.value;
const list = tabeList.value.filter((item) => !item.isTitle && item.title.includes(searchText.value));
const [result, lastData] = $api.insertSortData(list);
return result;
});
onLoad(() => {
// useChatGroupDBStore().getHistory();
});
onShow(() => {
nextTick(() => {
paging.value?.colseFile();
});
});
onHide(() => {
paging.value?.handleTouchCancel();
});
const toggleDrawer = () => {
isDrawerOpen.value = !isDrawerOpen.value;
};
const addNewDialogue = () => {
$api.msg('新对话');
paging.value?.changeQueries();
useChatGroupDBStore().addNewDialogue();
};
const changeDialogue = (item) => {
if (item.sessionId) {
paging.value?.closeGuess();
useChatGroupDBStore().changeDialogue(item);
toggleDrawer();
nextTick(() => {
paging.value?.scrollToBottom();
});
}
};
function updateSetting() {
$api.msg('该功能正在开发中,敬请期待后续更新!');
}
</script>
<style lang="stylus" scoped>
/* 页面容器 */
.container {
position: fixed;
z-index: 1000;
width: 100vw;
height: calc(100vh - var(--window-top) - var(--status-bar-height) - var(--window-bottom));
overflow: hidden;
}
/* 遮罩层 */
.overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.4);
z-index: 999;
}
/* 抽屉窗口 */
.drawer {
position: fixed;
top: 0;
left: 0; /* 如果要右侧弹出改为 right: 0; */
width: 523rpx;
height: 100vh;
background: #e7e7e6;
transform: translateX(-100%);
transition: transform 0.3s ease-in-out;
z-index: 1000;
}
/* 抽屉展开 */
.drawer.open {
box-shadow: 4rpx 0 20rpx rgba(0, 0, 0, 0.2);
transform: translateX(0);
}
.drawer-input-content
margin: 0 28rpx
padding: 0 24rpx
height: 72rpx;
background: #F6F6F6;
border-radius: 16rpx 16rpx 16rpx 16rpx;
display: flex
align-items: center
justify-content: center
.drawer-input
font-size: 28rpx
width: 100%
.input-placeholder
font-weight: 500;
font-size: 28rpx;
color: #A6A6A6;
.input-search
margin-left: 20rpx
/* 抽屉内容 */
.drawer-content
height: 100%
background: #FFFFFF;
display: flex
flex-direction: column
.drawer-user
border-top: 1rpx solid rgba(0,0,0,.1);
padding: 20rpx 28rpx
display: flex
font-weight: 500;
align-items: center
position: relative
margin-bottom: constant(safe-area-inset-bottom); /*兼容 IOS<11.2*/
margin-bottom: env(safe-area-inset-bottom); /*兼容 IOS>11.2*/
color: #000000
.drawer-user-img
width: 57.2rpx;
height: 57.2rpx
margin-right: 20rpx
.drawer-user-setting
width: 48rpx
height: 48rpx
position: absolute
top: 50%
right: 28rpx
transform: translate(0,-50%)
.drawer-title
height: calc(88rpx + env(safe-area-inset-top));
line-height: calc(88rpx + env(safe-area-inset-top));
padding: 0 52rpx;
color: #333333;
font-size: 32rpx
font-weight: bold
.chat-scroll
flex: 1
overflow: hidden
.drawer-rows
padding: 0 28rpx;
// border-bottom: 2rpx dashed #e8e8e8
overflow:hidden; //超出的文本隐藏
text-overflow:ellipsis; //溢出用省略号显示
white-space:nowrap; //溢出不换行
.drawer-row-title
color: #A6A6A6;
font-weight: 500;
font-weight: bold;
font-size: 28rpx
padding: 0 24rpx
margin-top: 50rpx
margin-bottom: 16rpx
.drawer-row-list
height: 66rpx;
line-height: 66rpx
font-size: 28rpx
overflow: hidden
text-overflow: ellipsis
font-weight: 500;
color: #595959;
padding: 0 24rpx
.drawer-row-active
.drawer-row-list:active
color: #333333;
background: #F6F6F6;
border-radius: 16rpx 16rpx 16rpx 16rpx;
/* 主要内容区域 */
.main-content
width: 100%;
height: 100vh;
// background: #f8f8f8;
transition: margin-left 0.3s ease-in-out;
position: relative
background: #FFFFFF
.head
display: block;
box-sizing: border-box;
height: calc(88rpx + env(safe-area-inset-top));
user-select: none;
.main-header
position: fixed;
left: var(--window-left);
right: var(--window-right);
height: calc(88rpx + env(safe-area-inset-top));
padding-top: calc(14rpx + env(safe-area-inset-top));
border: 2rpx solid #F4F4F4;
background: #FFFFFF
z-index: 998;
transition-property: all;
display: flex;
align-items: center;
justify-content: space-between
font-size: 32rpx
color: #000000
padding: 0 30rpx;
font-weight: bold
text-align: center
image
width: 36rpx;
height: 37rpx;
.chatmain-warpper
height: calc(100% - 88rpx - env(safe-area-inset-top));
position: relative;
display: block;
box-sizing: border-box;
width: 100%;
/* 页面被挤压时向右移动 */
.main-content.shift {
margin-left: 500rpx;
}
</style>