main
lsh 6 days ago
parent 022a3d9dfd
commit 4265c0abc9

@ -35,6 +35,6 @@ export default {
#app { #app {
width: 100vw; width: 100vw;
height: 100vh; height: 100vh;
background-color: rgb(151,157,167); background-color: rgb(255, 255, 255);
} }
</style> </style>

@ -0,0 +1,41 @@
<template>
<div id="app">
<Home></Home>
</div>
</template>
<script>
import Home from './view/home.vue'
export default {
name: 'App',
components: {
Home
}
}
</script>
<style lang="scss">
@import url(./assets/font/iconfont.css);
.iconfont {
font-family: "iconfont" !important;
font-style: normal;
font-size: 25px;
vertical-align: middle;
color: rgb(117,120,137);
transition: .3s;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
* {
padding: 0;
margin: 0;
}
#app {
width: 100vw;
height: 100vh;
background-color: rgb(255, 255, 255);
}
</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 812 KiB

@ -69,10 +69,10 @@ export default {
.emoji { .emoji {
width: 400px; width: 400px;
height: 200px; height: 200px;
background-color: rgb(39, 42, 55); background-color: white;
position: absolute; position: absolute;
top: -220px; top: -220px;
left: -10px; left: 12px;
border-radius: 10px; border-radius: 10px;
transition: 0.3s; transition: 0.3s;
z-index: 3; z-index: 3;
@ -82,7 +82,7 @@ export default {
display: block; display: block;
width: 0; width: 0;
height: 0; height: 0;
border-top: 10px solid rgb(39, 42, 55); border-top: 10px solid whitesmoke;
border-right: 10px solid transparent; border-right: 10px solid transparent;
border-left: 10px solid transparent; border-left: 10px solid transparent;
position: absolute; position: absolute;
@ -91,28 +91,31 @@ export default {
z-index: 100; z-index: 100;
} }
.emoji-wrapper { .emoji-wrapper {
background-color: whitesmoke;
width: 100%; width: 100%;
height: 100%; height: 100%;
overflow-y: scroll; overflow-y: scroll;
padding: 10px; padding: 10px;
box-sizing: border-box; box-sizing: border-box;
position: relative; position: relative;
border-radius: 5px;
&::-webkit-scrollbar { &::-webkit-scrollbar {
/*滚动条整体样式*/ /*滚动条整体样式*/
width: 4px; /*高宽分别对应横竖滚动条的尺寸*/ width: 0; /* Safari,Chrome 隐藏滚动条 */
height: 1px; height: 0; /* Safari,Chrome 隐藏滚动条 */
display: none; /* 移动端、pad 上SafariChrome隐藏滚动条 */
} }
&::-webkit-scrollbar-thumb { &::-webkit-scrollbar-thumb {
/*滚动条里面小方块*/ /*滚动条里面小方块*/
border-radius: 10px; border-radius: 10px;
box-shadow: inset 0 0 5px rgba(97, 184, 179, 0.1); box-shadow: inset 0 0 5px rgba(97, 184, 179, 0.1);
background: rgb(95, 101, 122); background: white;
} }
&::-webkit-scrollbar-track { &::-webkit-scrollbar-track {
/*滚动条里面轨道*/ /*滚动条里面轨道*/
box-shadow: inset 0 0 5px rgba(87, 175, 187, 0.1); box-shadow: inset 0 0 5px rgba(87, 175, 187, 0.1);
border-radius: 10px; border-radius: 10px;
background: rgb(39, 42, 55); background: white;
} }
.emoji-list { .emoji-list {
display: flex; display: flex;
@ -128,7 +131,7 @@ export default {
position: relative; position: relative;
cursor: pointer; cursor: pointer;
&:hover { &:hover {
background-color: rgb(50, 54, 68); background-color: rgba(128, 128, 128, 0.158);
} }
img { img {
width: 35px; width: 35px;

@ -42,7 +42,7 @@ export default {
.file-card { .file-card {
width: 250px; width: 250px;
height: 100px; height: 100px;
background-color: rgb(45, 48, 63); background-color: rgb(255, 255, 255);
border-radius: 20px; border-radius: 20px;
display: flex; display: flex;
justify-content: center; justify-content: center;
@ -51,7 +51,7 @@ export default {
box-sizing: border-box; box-sizing: border-box;
cursor: pointer; cursor: pointer;
&:hover { &:hover {
background-color: rgb(33, 36, 54); background-color: rgb(8, 250, 226);
} }
img { img {
width: 60px; width: 60px;
@ -64,7 +64,7 @@ export default {
span { span {
width: 90%; width: 90%;
display: inline-block; display: inline-block;
color: #fff; color: #090000;
} }
span:first-child { span:first-child {
font-size: 14px; font-size: 14px;
@ -74,7 +74,7 @@ export default {
} }
span:last-child { span:last-child {
font-size: 12px; font-size: 12px;
color: rgb(180, 180, 180); color: rgb(10, 0, 0);
} }
} }
} }

@ -18,7 +18,7 @@ export default {
height: 50px; height: 50px;
border-radius: 50%; border-radius: 50%;
// border: 2px solid rgb(137,140,151); // border: 2px solid rgb(137,140,151);
border: 2px solid rgb(255, 255, 255); border: 2px solid rgb(12, 12, 12);
position:relative; position:relative;
&::before { &::before {
content: ''; content: '';

@ -0,0 +1,56 @@
<template>
<nav class="navbar">
<ul class="nav-links">
<li><router-link to="/ChatHome">首页</router-link></li>
<li><router-link to="/ReCommend">匹配推荐</router-link></li>
<li><router-link to="/LinVite1n">个人资料</router-link></li>
<li><router-link to="#">设置</router-link></li>
</ul>
</nav>
</template>
<script>
export default {
}
</script>
<style scoped>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.navbar {
width: 100%;
background-color: #0073e6;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
font-family: 'Open Sans', sans-serif;
}
.nav-links {
list-style-type: none;
margin: 0;
padding: 0;
display: flex;
justify-content: space-around;
align-items: center;
height: 50px;
}
.nav-links li {
font-weight: 600;
}
.nav-links li a {
text-decoration: none;
color: white;
font-size: 25px;
transition: color 0.3s;
padding: 0 15px;
}
.nav-links li a:hover {
color: #d0e7ff;
}
</style>

@ -4,7 +4,7 @@
<HeadPortrait :imgUrl="personInfo.headImg"></HeadPortrait> <HeadPortrait :imgUrl="personInfo.headImg"></HeadPortrait>
<div class="info-detail"> <div class="info-detail">
<div class="name">{{ personInfo.name }}</div> <div class="name">{{ personInfo.name }}</div>
<div class="detail">{{ personInfo.detail }}</div> <!-- <div class="detail">{{ personInfo.detail }}</div> -->
</div> </div>
</div> </div>
@ -47,12 +47,11 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.person-card { .person-card {
width: 250px; width: 280px;
height: 80px; height: 80px;
border-radius: 10px; border-radius: 0px;
background-color: rgb(50, 54, 68); background-color: white;
position: relative; position: relative;
margin: 25px 0;
cursor: pointer; cursor: pointer;
.info { .info {
position: absolute; position: absolute;
@ -66,14 +65,14 @@ export default {
margin-top: 5px; margin-top: 5px;
margin-left: 20px; margin-left: 20px;
.name { .name {
color: #fff; color: #070707;
overflow: hidden; overflow: hidden;
white-space: nowrap; white-space: nowrap;
text-overflow: ellipsis; text-overflow: ellipsis;
margin-bottom: 5px; margin-bottom: 5px;
} }
.detail { .detail {
color: #5c6675; color: #3f5f8f;
overflow: hidden; overflow: hidden;
white-space: nowrap; white-space: nowrap;
text-overflow: ellipsis; text-overflow: ellipsis;
@ -84,7 +83,7 @@ export default {
&:hover { &:hover {
background-color: #1d90f5; background-color: #1d90f5;
transition: 0.3s; transition: 0.3s;
box-shadow: 0px 0px 10px 0px rgba(0, 136, 255); // box-shadow: 0px 0px 10px 0px rgba(0, 136, 255);
// box-shadow: 0 5px 20px rgba(251, 152, 11, .5); // box-shadow: 0 5px 20px rgba(251, 152, 11, .5);
.info { .info {
.info-detail { .info-detail {
@ -98,7 +97,7 @@ export default {
.activeCard { .activeCard {
background-color: #1d90f5; background-color: #1d90f5;
transition: 0.3s; transition: 0.3s;
box-shadow: 3px 2px 10px 0px rgba(0, 136, 255); // box-shadow: 3px 2px 10px 0px rgba(0, 136, 255);
.info { .info {
.info-detail { .info-detail {
.detail { .detail {

@ -44,6 +44,16 @@ let friendList = Mock.mock(
headImg: require("@/assets/img/head_portrait3.jpg"), headImg: require("@/assets/img/head_portrait3.jpg"),
}, },
{
img: "",
name: "小红",
detail: "我是喜欢音乐的有趣灵魂",
lastMsg: "to do",
id: "1005",
headImg: require("@/assets/img/head_portrait1.jpg"),
},
] ]
) )

@ -4,19 +4,40 @@ import ChatHome from '../view/pages/chatHome/index.vue'
import Video from '../view/pages/video.vue' import Video from '../view/pages/video.vue'
import Lingting from '../view/pages/lingting.vue' import Lingting from '../view/pages/lingting.vue'
import Setting from '../view/pages/setting.vue' import Setting from '../view/pages/setting.vue'
import ChatWindow from '../view/pages/chatHome/chatwindow.vue' import LinVite1n from '../view/pages/LnVite1n.vue'
import ReCommend from '../view/pages/ReCommend.vue'
import LoginPage from '@/view/LoginPage.vue'
export default new VueRouter({ export default new VueRouter({
mode: 'hash',
routes: [ routes: [
{
path:'/',
name: 'Login',
component:LoginPage
},
{ {
path: "/", path: "/home",
redirect: "/ChatHome", name: "Home",
}, redirect: '/ChatHome'
},
{ {
path: "/ChatHome", path: "/ChatHome",
name: "ChatHome", name: "ChatHome",
component: ChatHome, component: ChatHome,
}, },
{
path: "/LinVite1n",
name: "LinVite1n",
component: LinVite1n
},
{
path: "/Recommend",
name: "Recommend",
component: ReCommend
},
{ {
path: "/Video", path: "/Video",
name: "Video", name: "Video",

@ -0,0 +1,23 @@
<template>
<div class="hello">
<h1>mian首页</h1>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
props: {
msg: String
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
div {
background-color: aqua;
padding: 0;
margin: 0;
}
</style>

@ -0,0 +1,169 @@
<template>
<div class="app-background">
<div class="login-container">
<div class="login-box">
<h1>欢迎登录</h1>
<form @submit.prevent="login">
<div class="input-group">
<label for="username">用户名:</label>
<input type="text" v-model="formData.username" id="username" required />
</div>
<div class="input-group">
<label for="password">密码:</label>
<input type="password" v-model="formData.password" id="password" required />
</div>
<button type="submit">登录</button>
</form>
<button @click="register" class="register-button">注册账号</button>
</div>
</div>
</div>
</template>
<script>
import axios from 'axios';
export default {
data() {
return {
formData:{
username: '',
password: ''
}
};
},
methods: {
async login() {
const response = await axios.post('http://127.0.0.1:8000/login', this.formData);
console.log(response.data); //
if(response.data.code === 200){
alert("登录成功")
this.$router.push('/home').then(() => {
location.reload();//
}).catch(() => {});
}else if (response.data.code === 400){
alert("密码错误")
}else{
alert("用户不存在")
}
}
}
};
</script>
<style scoped>
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
margin: 0;
padding: 0;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
overflow: hidden; /* 防止滚动条 */
}
.app-background {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: url("../assets/R.jpg") no-repeat center center;
background-size: cover;
z-index: 1;
}
.login-container {
text-align: center;
max-width: 600px; /* 宽度 */
margin: 0 0 0 auto;
background: rgba(255, 255, 255, 0.9);
background-color: hwb(207 71% 7% / 0.959);
border-radius: 50px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
padding: 200px; /* 内边距 */
box-sizing: border-box;
left: 150px;
z-index: 2; /* 确保登录框在背景图之上 */
position: relative;
left: -30px;
max-height: 700px;
top:16px;
}
.login-box h1 {
font-size: 3em;
margin-bottom: 20px;
color: #0b70b4c1;
position: relative;
bottom: 50px;
}
.input-group {
margin-bottom: 20px;
display: flex;
flex-direction: column;
align-items: center;
}
.input-group label {
display: block;
margin-bottom: 10px;
color: #333;
}
.input-group input {
width: 180%;
padding: 15px;
margin-top: 5px;
border: 1px solid #ddd;
border-radius: 5px;
box-sizing: border-box;
font-size: 1.2em;
margin: auto;
position: relative;
left: -80px;
}
button {
width: 180%;
padding: 15px;
background-color: #538edb;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
transition: background-color 0.3s ease;
font-size: 1.2em;
position: relative;
left: -80px;
}
.register-button {
margin-top: 10px; /* 按钮与登录按钮之间的间距 */
padding: 5px; /* 内边距 */
background-color: transparent; /* */
color: rgb(27, 150, 227);
border: none;
border-radius: 5px;
cursor: pointer;
transition: background-color 0.3s ease;
font-size: 0.8em; /* 字体大小 */
width: 50%; /* 调整按钮宽度 */
align-self: center; /* 居中对齐按钮 */
position: relative;
left: 150px
}
button:hover {
background-color: #e55b54;
}
</style>

@ -1,10 +1,8 @@
<template> <template>
<div class="home"> <div class="home">
<el-container height="100%"> <el-container height="100%">
<el-aside width="100px"> <el-main style="padding: 0;">
<Nav></Nav> <Navi></Navi>
</el-aside>
<el-main>
<router-view></router-view> <router-view></router-view>
</el-main> </el-main>
</el-container> </el-container>
@ -12,23 +10,24 @@
</template> </template>
<script> <script>
import Nav from "../components/Nav.vue"; import Navi from "@/components/Navi.vue";
export default { export default {
name: "App",
components: { components: {
Nav, Navi,
}, },
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
//
.home { .home {
width: 90vw; width: 100vw;
height: 90vh; height: 100vh;
background-color: rgb(39, 42, 55); background-color:rgb(255, 255, 255);
border-radius: 15px; border-radius: 15px;
position: absolute; position: absolute;
left: 50%; margin-left: 50%;
top: 50%; top: 50%;
transform: translate(-50%, -50%); transform: translate(-50%, -50%);
} }

@ -0,0 +1,220 @@
<template>
<div class="user-info-page">
<div class="user-info-container">
<!-- 左侧用户基本信息 -->
<div class="user-basic-info">
<div class="user-details">
<img :src="userInfo.avatarUrl" alt="用户头像" />
<p class="nickname">{{ userInfo.nickname }}</p> <!-- 使用 nickname -->
<p class="information">性别{{ userInfo.gender }}</p>
<p class="information">年龄{{ userInfo.age }}</p>
<p class="information">居住地{{ userInfo.residence }}</p>
</div>
</div>
<!-- 右侧交友要求和基本资料 -->
<div class="user-other-info">
<div class="dating-requirements">
<h2>详细信息</h2>
</div>
<div class="basic-profile">
<div class="i1">
<p class="i11">昵称</p>
<p class="i12">{{userInfo.nickname }}</p>
</div>
<div class="i2">
<p class="i11">当前状态</p>
<p class="i12">{{ userInfo.currentStatus }}</p>
</div>
<div class="i1">
<p class="i11">我在寻找</p>
<p class="i12">{{ userInfo.lookingFor }}</p>
</div>
<div class="i2">
<p class="i11">性别</p>
<p class="i12">{{ userInfo.gender }}</p>
</div>
<div class="i1">
<p class="i11">年龄</p>
<p class="i12">{{ userInfo.age }}</p>
</div>
<div class="i2">
<p class="i11">身高</p>
<p class="i12">{{ userInfo.height }}</p>
</div>
<div class="i1">
<p class="i11">体重</p>
<p class="i12">{{ userInfo.weight }}</p>
</div>
<div class="i2">
<p class="i11">居住在</p>
<p class="i12">{{ userInfo.residence }}</p>
</div>
<div class="i1">
<p class="i11">学历</p>
<p class="i12">{{ userInfo.education }}</p>
</div>
<div class="i2">
<p class="i11">毕业院校</p>
<p class="i12">{{ userInfo.graduateSchool }}</p>
</div>
<div class="i1">
<p class="i11">行业</p>
<p class="i12">{{ userInfo.industry }}</p>
</div>
<div class="i2">
<p class="i11">工作单位</p>
<p class="i12">{{ userInfo.workUnit }}</p>
</div>
<div class="i1">
<p class="i11">目前职位</p>
<p class="i12">{{ userInfo.currentPosition }}</p>
</div>
<div class="i2">
<p class="i11">月收入</p>
<p class="i12">{{ userInfo.monthlyIncome }}</p>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
userInfo: {
avatarUrl: "https://picture.gptkong.com/20241115/20437780c5227d4025ac097d3c32517fc7.jpg", // URL
nickname: "abc",
gender: "男",
age: "20岁",
residence: "福建福州",
currentStatus: "未婚",
lookingFor: "恋人",
height: "173cm",
weight: "60kg",
education: "本科",
graduateSchool: "福州大学",
industry: "互联网/IT",
workUnit: "xxx",
currentPosition: "普通职员",
monthlyIncome: "4000-6000元",
},
datingLocation: "",
datingAgeMin: "",
datingAgeMax: "",
};
},
methods: {
saveInfo() {
alert("信息已保存(暂未与后端交互,仅为示例提示)");
},
},
};
</script>
<style scoped>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
background-color: #aeabab;
}
.user-info-page {
margin-top: 0;
}
.user-info-container {
display: flex; /* 使用 Flexbox 布局 */
width: 100%; /* 让容器宽度填满网页 */
min-height: calc(100vh - 60px); /* 对应导航栏高度调整内容区 height */
}
.user-basic-info {
display: flex;
flex-direction: column;
align-items: center;
width: 15%;
background-color: whitesmoke; /* 设置背景色 */
border-right: 1px solid gray;
height: 93.2vh;
}
.information {
font-size: 18px;
margin-top: 20px;
display: flex;
flex-direction: column;
text-align: center;
background-color: whitesmoke;
}
.user-other-info {
width: 85%;
background-color: whitesmoke; /* 设置背景色 */
}
img {
margin-top: 30px;
width: 145px; /* 调整头像宽度为160px */
height: 145px; /* 调整头像高度为160px */
border-radius: 50%; /* 圆形头像 */
border: 1px solid #000102; /* 头像边框 */
}
.nickname {
text-align: center;
margin-top: 10px;
font-size: 40px; /* 增大昵称字体 */
color: #000000; /* 设置昵称的颜色 */
}
.basic-profile {
font-size: 16px; /* 可选择适当减小字体 */
}
.dating-requirements {
display: flex;
justify-content: center;
align-items: center;
height: 50px;
text-align: center;
border-bottom: 1px solid gray;
}
.i1,.i2 {
display: flex;
flex-direction: row;
height: 45.6px;
border-bottom: 1px solid gray;
}
.i1 {
background-color: rgba(255, 255, 255, 0.43);
}
.i2 {
background-color: rgba(15, 238, 238, 0.051);
}
.i11 {
display: flex;
align-items: center;
justify-content: center;
width: 100px;
border-right: 0.5px solid gray;
}
.i12 {
margin-left: 10px;
display: flex;
align-items: center;
width: 621px;
}
</style>

@ -0,0 +1,277 @@
<template>
<div id="app">
<!-- 搜索框和关键词示例 -->
<div class="search-container">
<input type="text" v-model="searchQuery" placeholder="没有心仪的?尝试搜索一下吧">
</div>
<div class="keyword-suggestions">
<button @click="applyKeyword('杭州市')"></button>
<button @click="applyKeyword('跳舞')"></button>
<button @click="applyKeyword('健身')"></button>
<button @click="applyKeyword('美术')"></button>
<button @click="applyKeyword('文艺')"></button>
</div>
<!-- 刷新按钮 -->
<div class="refresh-button" @click="refreshUsers" style=" margin-right: -500px">
🔄刷新一下
</div>
<!-- 推荐用户列表 -->
<div class="match-list">
<div class="match-card" v-for="user in filteredUsers" :key="user.name">
<img :src="user.avatar" alt="user-avatar">
<div class="match-info">
<h3>{{ user.name }} ({{ user.age }})</h3>
<p>{{ user.city }}</p>
<p>{{ user.description }}</p>
<p>{{ user.hobby }}</p>
</div>
<div class="match-buttons">
<a class="match-button" href="">了解详细信息</a>
<router-link to="/home" class="chat-button">开始聊天</router-link>
</div>
</div>
</div>
</div>
</template>
<script>
import Navi from "../../components/Navi.vue";
export default{
data() {
return {
searchQuery: '', //
users: [ //
{ name: "小红", age: 22, hobby: "追剧,跳舞", city: "杭州市", description: "我是喜欢音乐的有趣灵魂", avatar: require('@/assets/1.jpg') },
{ name: "李娜", age: 23, hobby: "唱歌,跳舞", city: "北京市", description: "我喜欢旅行和美食", avatar: require('@/assets/2.jpg') },
{ name: "李华", age: 24, hobby: "吃饭,健身", city: "上海市", description: "热爱健身和阅读", avatar: require('@/assets/3.jpg') },
{ name: "赵丽", age: 25, hobby: "美术,旅行", city: "广州市", description: "美术爱好者,喜欢安静", avatar: require('@/assets/4.jpg') },
{ name: "孙甜", age: 26, hobby: "登山,篮球", city: "成都市", description: "科技迷,热衷编程", avatar: require('@/assets/5.jpg') },
{ name: "王梅", age: 27, hobby: "跑步,跳舞", city: "重庆市", description: "热爱户外运动", avatar: require('@/assets/6.jpg') },
{ name: "李蔷", age: 28, hobby: "唱歌,钢琴", city: "天津市", description: "文艺青年,诗词爱好者", avatar: require('@/assets/logo.png') }
]
};
},
components: {
Navi,
},
computed: {
//
filteredUsers() {
const query = this.searchQuery.toLowerCase(); //
return this.users.filter(user => {
//
return (
user.name.toLowerCase().includes(query) ||
user.city.toLowerCase().includes(query) ||
user.description.toLowerCase().includes(query) ||
user.hobby.toLowerCase().includes(query)
);
});
}
},
methods: {
//
applyKeyword(keyword) {
this.searchQuery = keyword;
},
// 4
refreshUsers() {
this.users = this.users.sort(() => Math.random() - 0.5); //
}
}
};
</script>
<style scoped>
body {
font-family: Arial, sans-serif;
background-color: #87ceeb;
color: #333;
margin: 0;
padding: 0;
min-height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.navbar {
width: 100%;
background-color: #0073e6;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
margin-bottom: 10px;
font-family: "Open Sans", sans-serif;
position: fixed; /* 设置为固定定位 */
top: 0; /* 置顶 */
left: 0; /* 对齐到左边 */
right: 0; /* 对齐到右边 */
z-index: 1000; /* 确保在其他元素之上 */
}
.nav-links {
list-style-type: none;
margin: 0;
padding: 0;
display: flex;
justify-content: space-around;
align-items: center;
height: 50px;
}
.nav-links li {
font-weight: 600;
}
.nav-links li router-link {
text-decoration: none;
color: white;
font-size: 25px;
transition: color 0.3s;
padding: 0 15px;
}
.nav-links li router-link:hover {
color: #d0e7ff;
}
#app {
display: flex;
background: #fff;
border-radius: 8px;
overflow: hidden;
flex-direction: column;
align-items: center;
height: 200vh;
max-height: 675px;
overflow-y: auto;
}
.search-container {
width: 100%;
max-width: 600px;
margin-top: 50px;
margin-bottom: 15px;
position: relative;
}
.search-container input[type="text"] {
width: 100%;
padding: 12px;
font-size: 16px;
border: 1px solid #0073e6;
border-radius: 25px;
box-sizing: border-box;
outline: none;
padding-left: 40px;
}
.search-container::before {
content: "🔍";
position: absolute;
left: 12px;
top: 50%;
transform: translateY(-50%);
font-size: 16px;
color: #0073e6;
}
.keyword-suggestions {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 10px;
}
.keyword-suggestions button {
padding: 5px 12px;
background-color: transparent;
color: #0073e6;
border: 1px solid #0073e6;
border-radius: 20px;
font-size: 14px;
cursor: pointer;
transition: background-color 0.3s;
}
.keyword-suggestions button:hover {
background-color: #d0e7ff;
}
.match-list {
width: 100%;
max-width: 600px;
margin-top: 20px;
}
/* 刷新按钮 */
.refresh-button {
display: flex;
align-items: center;
cursor: pointer;
color: #0073e6;
font-size: 16px;
font-weight: bold;
margin-bottom: 10px;
}
.match-card {
display: flex;
align-items: center;
padding: 15px;
border-radius: 8px;
background-color: #d0e7ff;
margin-bottom: 10px;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
}
.match-card img {
width: 60px;
height: 60px;
border-radius: 50%;
margin-right: 15px;
}
.match-info {
flex: 1;
}
.match-info h3 {
margin: 0;
font-size: 18px;
color: #333;
}
.match-buttons {
display: flex;
flex-direction: column;
gap: 20px;
width: 30%;
}
.match-button,
.chat-button {
padding: 8px 12px;
background-color: #0073e6;
color: white;
font-size: 14px;
font-weight: bold;
border: none;
border-radius: 4px;
cursor: pointer;
text-align: center;
}
.chat-button {
background-color: #ff6600;
}
.match-buttons a {
text-decoration: none;
}
</style>

@ -6,11 +6,8 @@
</div> </div>
<div class="info-detail"> <div class="info-detail">
<div class="name">{{ frinedInfo.name }}</div> <div class="name">{{ frinedInfo.name }}</div>
<div class="detail">{{ frinedInfo.detail }}</div>
</div> </div>
<div class="other-fun"> <div class="other-fun">
<span class="iconfont icon-shipin" @click="video"> </span>
<span class="iconfont icon-gf-telephone" @click="telephone"></span>
<label for="docFile"> <label for="docFile">
<span class="iconfont icon-wenjian"></span> <span class="iconfont icon-wenjian"></span>
</label> </label>
@ -38,6 +35,10 @@
<div class="chat-content" ref="chatContent"> <div class="chat-content" ref="chatContent">
<div class="chat-wrapper" v-for="item in chatList" :key="item.id"> <div class="chat-wrapper" v-for="item in chatList" :key="item.id">
<div class="chat-friend" v-if="item.uid !== '1001'"> <div class="chat-friend" v-if="item.uid !== '1001'">
<div class="info-time">
<img :src="item.headImg" alt="" />
<span>{{ item.name }}</span>
</div>
<div class="chat-text" v-if="item.chatType == 0"> <div class="chat-text" v-if="item.chatType == 0">
{{ item.msg }} {{ item.msg }}
</div> </div>
@ -59,13 +60,13 @@
></FileCard> ></FileCard>
</div> </div>
</div> </div>
</div>
<div class="chat-me" v-else>
<div class="info-time"> <div class="info-time">
<img :src="item.headImg" alt="" />
<span>{{ item.name }}</span> <span>{{ item.name }}</span>
<span>{{ item.time }}</span> <img :src="item.headImg" alt="" />
</div> </div>
</div>
<div class="chat-me" v-else>
<div class="chat-text" v-if="item.chatType == 0"> <div class="chat-text" v-if="item.chatType == 0">
{{ item.msg }} {{ item.msg }}
</div> </div>
@ -92,11 +93,7 @@
></FileCard> ></FileCard>
</div> </div>
</div> </div>
<div class="info-time">
<span>{{ item.name }}</span>
<span>{{ item.time }}</span>
<img :src="item.headImg" alt="" />
</div>
</div> </div>
</div> </div>
</div> </div>
@ -113,7 +110,10 @@
</div> </div>
<input class="inputs" v-model="inputMsg" @keyup.enter="sendText" /> <input class="inputs" v-model="inputMsg" @keyup.enter="sendText" />
<div class="send boxinput" @click="sendText"> <div class="send boxinput" @click="sendText">
<img src="@/assets/img/emoji/rocket.png" alt="" /> <!-- <img src="@/assets/img/emoji/rocket.png" alt="" /> -->
<div class="text">发送</div>
</div> </div>
</div> </div>
</div> </div>
@ -169,8 +169,6 @@ export default {
this.srcImgList.push(item.msg); this.srcImgList.push(item.msg);
} }
}); });
this.scrollBottom();
}); });
}, },
// //
@ -225,6 +223,7 @@ export default {
}; };
this.sendMsg(chatMsg); this.sendMsg(chatMsg);
this.clickEmoji(); this.clickEmoji();
}, },
// //
sendImg(e) { sendImg(e) {
@ -311,15 +310,20 @@ export default {
}; };
</script> </script>
<!-- 左上角色的信息样式 -->
<style lang="scss" scoped> <style lang="scss" scoped>
.chat-window { .chat-window {
width: 100%; width: 100%;
height: 100%; height: 100%;
margin-left: 20px; margin-left: 0px;
position: relative; position: relative;
.top { .top {
margin-bottom: 50px; display: flex;
align-items: center;
width: 100%;
border-bottom: 0.5px solid rgba(128, 128, 128, 0.436);
height: 73px;
&::after { &::after {
content: ""; content: "";
display: block; display: block;
@ -327,26 +331,30 @@ export default {
} }
.head-pic { .head-pic {
float: left; float: left;
margin-left: 15px;
} }
.info-detail { .info-detail {
width:60px;
float: left; float: left;
margin: 5px 20px 0; margin-left: 5px;
text-align: center;
.name { .name {
font-size: 20px; font-size: 20px;
font-weight: 600; font-weight: 600;
color: #fff; color: #070707;
} }
.detail { .detail {
color: #9e9e9e; color: #46658b;
font-size: 12px; font-size: 12px;
margin-top: 2px; margin-top: 2px;
} }
} }
.other-fun { .other-fun {
float: right; float: right;
margin-top: 20px; margin-left: 940px;
span { span {
margin-left: 30px; margin-left: 30px;
margin-right: 30px;
cursor: pointer; cursor: pointer;
} }
// .icon-tupian { // .icon-tupian {
@ -359,15 +367,14 @@ export default {
} }
.botoom { .botoom {
width: 100%; width: 100%;
height: 70vh; height: 80vh;
background-color: rgb(50, 54, 68); background-color: rgb(255, 255, 255);
border-radius: 20px; border-radius: 20px;
padding: 20px;
box-sizing: border-box; box-sizing: border-box;
position: relative; position: relative;
.chat-content { .chat-content {
width: 100%; width: 100%;
height: 85%; height: 90%;
overflow-y: scroll; overflow-y: scroll;
padding: 20px; padding: 20px;
box-sizing: border-box; box-sizing: border-box;
@ -390,12 +397,9 @@ export default {
.chat-text { .chat-text {
max-width: 90%; max-width: 90%;
padding: 20px; padding: 20px;
border-radius: 20px 20px 20px 5px; border-radius: 20px 20px 20px 20px;
background-color: rgb(56, 60, 75); background-color: whitesmoke;
color: #fff; color: #0c0c0c;
&:hover {
background-color: rgb(39, 42, 55);
}
} }
.chat-img { .chat-img {
img { img {
@ -405,7 +409,7 @@ export default {
} }
.info-time { .info-time {
margin: 10px 0; margin: 10px 0;
color: #fff; color: #090909;
font-size: 14px; font-size: 14px;
img { img {
width: 30px; width: 30px;
@ -415,7 +419,7 @@ export default {
margin-right: 10px; margin-right: 10px;
} }
span:last-child { span:last-child {
color: rgb(101, 104, 115); color: rgb(10, 10, 10);
margin-left: 10px; margin-left: 10px;
vertical-align: middle; vertical-align: middle;
} }
@ -434,12 +438,9 @@ export default {
float: right; float: right;
max-width: 90%; max-width: 90%;
padding: 20px; padding: 20px;
border-radius: 20px 20px 5px 20px; border-radius: 20px 20px 20px 20px;
background-color: rgb(29, 144, 245); background-color: rgb(10, 154, 238);
color: #fff; color: #070707;
&:hover {
background-color: rgb(26, 129, 219);
}
} }
.chat-img { .chat-img {
img { img {
@ -450,7 +451,7 @@ export default {
} }
.info-time { .info-time {
margin: 10px 0; margin: 10px 0;
color: #fff; color: #050505;
font-size: 14px; font-size: 14px;
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;
@ -466,7 +467,7 @@ export default {
line-height: 30px; line-height: 30px;
} }
span:first-child { span:first-child {
color: rgb(101, 104, 115); color: rgb(7, 7, 7);
margin-right: 10px; margin-right: 10px;
vertical-align: middle; vertical-align: middle;
} }
@ -475,15 +476,14 @@ export default {
} }
} }
.chatInputs { .chatInputs {
width: 90%; width: 100%;
position: absolute; position: absolute;
bottom: 0;
margin: 3%;
display: flex; display: flex;
margin-top: 22px;
.boxinput { .boxinput {
width: 50px; width: 50px;
height: 50px; height: 50px;
background-color: rgb(66, 70, 86); background-color: rgb(255, 255, 255);
border-radius: 15px; border-radius: 15px;
border: 1px solid rgb(80, 85, 103); border: 1px solid rgb(80, 85, 103);
position: relative; position: relative;
@ -499,34 +499,42 @@ export default {
} }
.emoji { .emoji {
transition: 0.3s; transition: 0.3s;
margin-left: 10px;
border: none;
&:hover { &:hover {
background-color: rgb(46, 49, 61); background-color: rgba(128, 128, 128, 0.299);
border: 1px solid rgb(71, 73, 82);
} }
} }
.inputs { .inputs {
width: 90%; width: 1030px;
height: 50px; height: 50px;
background-color: rgb(66, 70, 86); background-color: rgb(255, 255, 255);
border-radius: 15px; border-radius: 10px;
border: 2px solid rgb(34, 135, 225); border: 2px solid rgb(15, 15, 15);
padding: 10px; padding: 10px;
box-sizing: border-box; box-sizing: border-box;
transition: 0.2s; transition: 0.2s;
font-size: 20px; font-size: 20px;
color: #fff; color: #0f0f0f;
font-weight: 100; font-weight: 100;
margin: 0 20px; margin-top: 0px;
margin-left: 20px;
margin-right: 20px;
&:focus { &:focus {
outline: none; outline: none;
} }
} }
.send { .send {
background-color: rgb(29, 144, 245); display: flex;
width: 100px;
background-color: rgb(255, 255, 255);
border: 0; border: 0;
transition: 0.3s; transition: 0.3s;
box-shadow: 0px 0px 5px 0px rgba(0, 136, 255); text-align: center;
align-items: center;
justify-content: center;
box-shadow: 0px 0px 5px 0px rgb(125, 124, 124);
&:hover { &:hover {
box-shadow: 0px 0px 10px 0px rgba(0, 136, 255); box-shadow: 0px 0px 10px 0px rgba(0, 136, 255);
} }

@ -1,46 +1,52 @@
<template> <template>
<div class="chatHome"> <div class="chatHome">
<div class="chatLeft"> <div class="chatLeft">
<div class="title"> <div class="online-person">
<h1>大猫聊天室</h1> <div class="osearch">
</div> <input
<div class="online-person"> class="search"
<span class="onlin-text">聊天列表</span> type="text"
<div class="person-cards-wrapper"> v-model="searchQuery"
<div placeholder="搜索"
class="personList" @input="handleSearch"
v-for="personInfo in personList" />
:key="personInfo.id" </div>
@click="clickPerson(personInfo)" <div class="person-cards-wrapper">
> <div
<PersonCard class="personList"
:personInfo="personInfo" v-for="personInfo in filteredItems"
:pcCurrent="pcCurrent" :key="personInfo.id"
></PersonCard> @click="clickPerson(personInfo)"
>
<PersonCard
:personInfo="personInfo"
:pcCurrent="pcCurrent"
></PersonCard>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> <div class="chatRight">
<div class="chatRight"> <!-- <router-view></router-view> -->
<!-- <router-view></router-view> --> <div v-if="showChatWindow">
<div v-if="showChatWindow"> <ChatWindow
<ChatWindow :frinedInfo="chatWindowInfo"
:frinedInfo="chatWindowInfo" @personCardSort="personCardSort"
@personCardSort="personCardSort" ></ChatWindow>
></ChatWindow> </div>
</div> <div class="showIcon" v-else>
<div class="showIcon" v-else> <span class="iconfont icon-snapchat"></span>
<span class="iconfont icon-snapchat"></span> <!-- <img src="@/assets/img/snapchat.png" alt="" /> -->
<!-- <img src="@/assets/img/snapchat.png" alt="" /> --> </div>
</div> </div>
<!-- <el-col :span="4"><div class="grid-content bg-purple"></div></el-col> -->
</div> </div>
<!-- <el-col :span="4"><div class="grid-content bg-purple"></div></el-col> -->
</div>
</template> </template>
<script> <script>
import PersonCard from "@/components/PersonCard.vue"; import PersonCard from "@/components/PersonCard.vue";
import ChatWindow from "./chatwindow.vue"; import ChatWindow from "./chatwindow.vue";
import Navi from "../../../components/Navi.vue";
import { getFriend } from "@/api/getData"; import { getFriend } from "@/api/getData";
export default { export default {
@ -48,9 +54,12 @@ export default {
components: { components: {
PersonCard, PersonCard,
ChatWindow, ChatWindow,
Navi,
}, },
data() { data() {
return { return {
filteredItems: [],
searchQuery: '',
pcCurrent: "", pcCurrent: "",
personList: [], personList: [],
showChatWindow: false, showChatWindow: false,
@ -61,9 +70,17 @@ export default {
getFriend().then((res) => { getFriend().then((res) => {
console.log(res); console.log(res);
this.personList = res; this.personList = res;
this.filteredItems = res;
}); });
}, },
methods: { methods: {
handleSearch() {
const query = this.searchQuery.toLowerCase();
this.filteredItems = this.personList.filter(item =>
item.name.toLowerCase().includes(query)
);
console.log(this.filteredItems);
},
clickPerson(info) { clickPerson(info) {
this.showChatWindow = true; this.showChatWindow = true;
this.chatWindowInfo = info; this.chatWindowInfo = info;
@ -90,24 +107,51 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.chatHome { .chatHome {
// margin-top: 20px;
display: flex; display: flex;
.chatLeft { .chatLeft {
width: 280px; width: 280px;
height: 93.2vh;
border-right: 0.5px solid rgba(128, 128, 128, 0.436);
.title { .title {
color: #fff; width: 200px;
height: 50px;
border: #090909;
color: #090909;
padding-left: 10px; padding-left: 10px;
.h1 {
display: flex;
justify-content: center;
}
} }
.online-person { .online-person {
margin-top: 100px; display: flex;
flex-direction: column;
align-items: center;
.osearch {
height: 73px;
width: 100%;
display: flex;
margin-top: 0%;
justify-content: center;
align-items: center;
border-bottom: 0.5px solid rgba(128, 128, 128, 0.436);
.search {
background-color: rgba(128, 128, 128, 0.119);
font-size: 20px;
border: 1px solid gray;
border-radius: 3px;
width: 80%;
height: 30px;
text-align: center;
}
}
.onlin-text { .onlin-text {
padding-left: 10px; padding-left: 10px;
color: rgb(176, 178, 189); color: rgb(6, 6, 6);
} }
.person-cards-wrapper { .person-cards-wrapper {
padding-left: 10px; padding-left: 0px;
height: 65vh; height: 65vh;
margin-top: 20px;
overflow: hidden; overflow: hidden;
overflow-y: scroll; overflow-y: scroll;
box-sizing: border-box; box-sizing: border-box;
@ -122,7 +166,6 @@ export default {
.chatRight { .chatRight {
flex: 1; flex: 1;
padding-right: 30px;
.showIcon { .showIcon {
position: absolute; position: absolute;
top: calc(50% - 150px); /*垂直居中 */ top: calc(50% - 150px); /*垂直居中 */

Loading…
Cancel
Save