From 089bf5d2378b3c4a61d795b2a92bede2c193b771 Mon Sep 17 00:00:00 2001
From: admin <344137771@qq.com>
Date: Tue, 06 Jan 2026 11:22:58 +0800
Subject: [PATCH] 1

---
 src/components/user/user-card/UserCardDetail.vue |  482 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 482 insertions(+), 0 deletions(-)

diff --git a/src/components/user/user-card/UserCardDetail.vue b/src/components/user/user-card/UserCardDetail.vue
new file mode 100644
index 0000000..4b229ef
--- /dev/null
+++ b/src/components/user/user-card/UserCardDetail.vue
@@ -0,0 +1,482 @@
+<template>
+  <div class="lum-dialog-mask animated fadeIn">
+    <el-container class="container">
+      <el-header class="no-padding header" height="180px">
+        <i class="close el-icon-error pointer" @click="close" />
+        <div class="img-banner">
+          <img :src="detail.bag" class="img-banner" />
+        </div>
+        <div class="user-header">
+          <div class="avatar">
+            <div class="avatar-box">
+              <img :src="detail.avatar" :onerror="$store.state.detaultAvatar" />
+            </div>
+          </div>
+          <div class="nickname">
+            <i class="iconfont icon-qianming" />
+            <span>{{ detail.nickname || '未设置昵称' }}</span>
+            <div class="share no-select">
+              <i class="iconfont icon-fenxiang3" /> <span>分享</span>
+            </div>
+          </div>
+        </div>
+      </el-header>
+      <el-main class="no-padding main">
+        <div class="user-sign">
+          <div class="sign-arrow"></div>
+          <i class="iconfont icon-bianji" />
+          <span>编辑个签,展示我的独特态度。 </span>
+        </div>
+
+        <div class="card-rows no-select">
+          <div class="card-row">
+            <label>手机</label>
+            <span>{{ detail.mobile | mobile }}</span>
+          </div>
+          <div class="card-row">
+            <label>昵称</label>
+            <span>{{ detail.nickname || '未设置昵称' }}</span>
+          </div>
+          <div class="card-row">
+            <label>性别</label>
+            <span>{{ detail.gender | gender }}</span>
+          </div>
+          <div v-show="detail.friend_status == 2" class="card-row">
+            <label>备注</label>
+            <span v-if="editRemark.isShow == false">{{
+              detail.nickname_remark ? detail.nickname_remark : '暂无备注'
+            }}</span>
+            <span v-else>
+              <input
+                v-model="editRemark.text"
+                v-focus
+                class="friend-remark"
+                type="text"
+                @keyup.enter="editRemarkSubmit"
+              />
+            </span>
+            <i
+              v-show="!editRemark.isShow"
+              class="el-icon-edit-outline"
+              @click="clickEditRemark"
+            />
+          </div>
+          <div class="card-row">
+            <label>邮箱</label>
+            <span>未设置</span>
+          </div>
+        </div>
+      </el-main>
+      <el-footer
+        v-show="detail.friend_status !== 0"
+        class="no-padding footer"
+        height="50px"
+      >
+        <el-button
+          v-if="detail.friend_status == 1 && detail.friend_apply == 0"
+          type="primary"
+          size="small"
+          icon="el-icon-circle-plus-outline"
+          @click="apply.isShow = true"
+          >添加好友
+        </el-button>
+        <el-button
+          v-else-if="detail.friend_apply == 1"
+          type="primary"
+          size="small"
+          >已发送好友申请,请耐心等待...
+        </el-button>
+        <el-button
+          v-else-if="detail.friend_status == 2"
+          type="primary"
+          size="small"
+          icon="el-icon-s-promotion"
+          @click="sendMessage(detail)"
+          >发消息
+        </el-button>
+      </el-footer>
+
+      <!-- 添加好友申请表单 -->
+      <div
+        class="friend-from"
+        :class="{ 'friend-from-show': apply.isShow }"
+      >
+        <p>
+          <span>请填写好友申请备注:</span>
+          <span @click="closeApply">取消</span>
+        </p>
+        <div>
+          <input
+            v-model="apply.text"
+            type="text"
+            placeholder="(必填项)"
+            @keyup.enter="sendApply"
+          />
+          <el-button type="primary" size="small" @click="sendApply">
+            立即提交
+          </el-button>
+        </div>
+      </div>
+    </el-container>
+  </div>
+</template>
+<script>
+import { ServeSearchUser } from '@/api/contacts'
+import { ServeCreateContact, ServeEditContactRemark } from '@/api/contacts'
+import { toTalk } from '@/utils/talk'
+
+export default {
+  name: 'UserCardDetail',
+  props: {
+    user_id: {
+      type: [Number,String],
+      default: 0,
+    },
+  },
+  filters: {
+    gender(value) {
+      let arr = ['未知', '男', '女']
+      return arr[value] || '未知'
+    },
+    // 手机号格式化
+    mobile(value) {
+      return (
+        value.substr(0, 3) + ' ' + value.substr(3, 4) + ' ' + value.substr(7, 4)
+      )
+    },
+  },
+  data() {
+    return {
+      detail: {
+        mobile: '',
+        nickname: '',
+        avatar: '',
+        motto: '',
+        friend_status: 0,
+        friend_apply: 0,
+        nickname_remark: '',
+        bag: require('@/assets/image/default-user-banner.png'),
+        gender: 0,
+      },
+
+      // 好友备注表单
+      editRemark: {
+        isShow: false,
+        text: '',
+      },
+
+      // 好友申请表单
+      apply: {
+        isShow: false,
+        text: '',
+      },
+
+      contacts: false,
+    }
+  },
+  created() {
+    this.loadUserDetail()
+  },
+  methods: {
+    close() {
+      if (this.contacts) return false
+
+      this.$emit('close')
+    },
+
+    // 点击编辑备注信息
+    clickEditRemark() {
+      this.editRemark.isShow = true
+      this.editRemark.text = this.detail.nickname_remark
+    },
+
+    // 获取用户信息
+    loadUserDetail() {
+      ServeSearchUser({
+        user_id: this.user_id,
+      }).then(res => {
+        if (res.code == 200) {
+          this.detail.user_id = res.data.id
+          Object.assign(this.detail, res.data)
+        }
+      })
+    },
+
+    // 发送添加好友申请
+    sendApply() {
+      if (this.apply.text == '') return
+      ServeCreateContact({
+        friend_id: this.detail.user_id,
+        remark: this.apply.text,
+      }).then(res => {
+        if (res.code == 200) {
+          this.apply.isShow = false
+          this.apply.text = ''
+          this.detail.friend_apply = 1
+        } else {
+          alert('发送好友申请失败,请稍后再试...')
+        }
+      })
+    },
+
+    // 编辑好友备注信息
+    editRemarkSubmit() {
+      let data = {
+        friend_id: this.detail.user_id,
+        remarks: this.editRemark.text,
+      }
+
+      if (data.remarks == this.detail.nickname_remark) {
+        this.editRemark.isShow = false
+        return
+      }
+
+      ServeEditContactRemark(data).then(res => {
+        if (res.code == 200) {
+          this.editRemark.isShow = false
+          this.detail.nickname_remark = data.remarks
+          this.$emit('changeRemark', data)
+        }
+      })
+    },
+
+    // 隐藏申请表单
+    closeApply() {
+      this.apply.isShow = false
+    },
+
+    // 发送好友消息
+    sendMessage() {
+      this.close()
+      toTalk(1, this.user_id)
+    },
+  },
+}
+</script>
+<style lang="less" scoped>
+.container {
+  position: absolute;
+  left: 50%;
+  top: 50%;
+  transform: translate(-50%, -50%);
+  background-color: white;
+  width: 350px;
+  height: 600px;
+  overflow: hidden;
+  border-radius: 3px;
+
+  .header {
+    position: relative;
+
+    .close {
+      position: absolute;
+      right: 10px;
+      top: 10px;
+      color: white;
+      transition: all 1s;
+      z-index: 1;
+      font-size: 20px;
+    }
+
+    .img-banner {
+      width: 100%;
+      height: 100%;
+      background-image: url(~@/assets/image/default-user-banner.png);
+      background-size: 100%;
+      transition: all 0.2s linear;
+      cursor: pointer;
+      overflow: hidden;
+
+      img:hover {
+        -webkit-transform: scale(1.1);
+        transform: scale(1.1);
+        -webkit-filter: contrast(130%);
+        filter: contrast(130%);
+      }
+    }
+  }
+
+  .main {
+    background-color: white;
+    padding: 45px 16px 0;
+  }
+
+  .footer {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    border-top: 1px solid #f5eeee;
+
+    button {
+      width: 90%;
+    }
+  }
+}
+
+.user-header {
+  width: 100%;
+  height: 80px;
+  position: absolute;
+  bottom: -40px;
+  display: flex;
+  flex-direction: row;
+
+  .avatar {
+    width: 100px;
+    flex-shrink: 0;
+    display: flex;
+    justify-content: center;
+
+    .avatar-box {
+      width: 80px;
+      height: 80px;
+      background-color: white;
+      border-radius: 50%;
+      display: flex;
+      justify-content: center;
+      align-items: center;
+
+      img {
+        height: 70px;
+        width: 70px;
+        border-radius: 50%;
+      }
+    }
+  }
+
+  .nickname {
+    flex: auto;
+    padding-top: 50px;
+    font-size: 16px;
+    font-weight: 400;
+
+    span {
+      margin-left: 5px;
+    }
+
+    .share {
+      display: inline-flex;
+      width: 50px;
+      height: 22px;
+      background: #ff5722;
+      color: white;
+      align-items: center;
+      justify-content: center;
+      padding: 3px 8px;
+      border-radius: 20px;
+      transform: scale(0.7);
+      cursor: pointer;
+      i {
+        margin-top: 2px;
+      }
+      span {
+        font-size: 14px;
+        margin-left: 4px;
+      }
+    }
+  }
+}
+
+.user-sign {
+  min-height: 26px;
+  border-radius: 5px;
+  padding: 5px;
+  line-height: 25px;
+  background: #f3f5f7;
+  color: #7d7d7d;
+  font-size: 12px;
+  margin-bottom: 20px;
+  position: relative;
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+  -webkit-line-clamp: 3;
+  position: relative;
+
+  .sign-arrow {
+    position: absolute;
+    width: 0;
+    height: 0;
+    font-size: 0;
+    border: 5px solid hsla(0, 0%, 96.9%, 0);
+    border-bottom-color: #f3f5f7;
+    left: 28px;
+    top: -9px;
+  }
+}
+
+.card-rows {
+  .card-row {
+    height: 35px;
+    line-height: 35px;
+    font-size: 14px;
+    position: relative;
+    cursor: pointer;
+    color: #736f6f;
+
+    label {
+      margin-right: 25px;
+      color: #cbc5c5;
+    }
+
+    .friend-remark {
+      border-bottom: 1px dashed #bec3d0;
+      padding-bottom: 2px;
+      color: #736f6f;
+      width: 60%;
+      padding-right: 5px;
+    }
+
+    .el-icon-edit-outline {
+      margin-left: 3px !important;
+    }
+  }
+}
+
+/* 好友申请表单 */
+.friend-from {
+  position: absolute;
+  background: #fbf6f6;
+  height: 80px;
+  z-index: 2;
+  width: 100%;
+  bottom: -80px;
+  left: 0;
+  transition: all 0.5s ease-in-out;
+
+  p {
+    height: 20px;
+    line-height: 20px;
+    padding: 7px 5px 5px 15px;
+    font-size: 13px;
+
+    span {
+      &:nth-child(2) {
+        float: right;
+        margin-right: 13px;
+        color: #32caff;
+        cursor: pointer;
+      }
+    }
+  }
+
+  div {
+    height: 31px;
+    line-height: 20px;
+    padding: 7px 5px 5px 15px;
+    font-size: 13px;
+  }
+
+  input {
+    height: 30px;
+    line-height: 30px;
+    width: 220px;
+    border-radius: 3px;
+    padding: 0 5px;
+    margin-right: 5px;
+  }
+}
+
+.friend-from-show {
+  bottom: 0;
+}
+</style>

--
Gitblit v1.9.3