吉安感知网项目-前端
chenyao
2026-01-09 ebd0ec4f51288042b6fc5bf714b1febbb63cfacc
uniapps/work-app/src/pages/voiceCall/index.vue
@@ -1,14 +1,235 @@
<template>
   <view class="eventTickets">
      语音通话
   </view>
  <div class="voiceCallContainer" :style="{ paddingTop: topMargin + 'px' }">
    <!-- 顶部搜索栏 -->
    <div class="searchBar">
      <up-search placeholder="请输入关键字搜索" v-model="defaultParam.searchKeyword"  :animation="true"   :show-action="false"></up-search>
    </div>
    <!-- 联系人列表 -->
    <div class="contactList" @scrolltolower="onScrollToLower">
      <div
        class="contactItem"
        v-for="(contact, index) in contacts"
        :key="index"
      >
        <div class="itemBox">
          <!-- 头像 -->
          <div class="contactAvatar">
            <image :src="contact.avatar || defaultAvatar"  />
          </div>
          <!-- 联系人信息 -->
          <div class="contactInfo">
            <div class="contactName">{{ contact.friendNickName  || '未知联系人' }}</div>
            <div class="contactDept">{{ contact.deptName || '未知部门' }}</div>
          </div>
          <!-- 电话按钮 -->
          <div class="callButton" @click="makeCall(contact)">
            <image src="@/static/images/voiceVal/phoneVal.svg"  />
          </div>
        </div>
      </div>
      <!-- 加载提示 -->
      <div class="loadingMore">
        <text v-if="loading">加载中...</text>
        <text v-else-if="!hasMore && contacts.length > 0">没有更多数据了</text>
      </div>
    </div>
  </div>
</template>
<script setup></script>
<script setup>
import { getStatusBarHeight } from '@/utils/common';
const topMargin = getStatusBarHeight()
import { getPhoneBookListApi } from '@/api/voiceCall/index.js'
import { onShow } from '@dcloudio/uni-app'
import defaultAvatar  from '/static/images/defaultAvatar.svg'
// 联系人数据
const contacts = ref([])
const defaultParam =ref( {
  current: 1,
  size: 10,
  searchKeyword:''
})
// 加载状态
const loading = ref(false)
const hasMore = ref(true)
// 获取通讯录
const getPhoneBookList = () => {
  if (loading.value || !hasMore.value) return
  loading.value = true
  // 添加分页参数
  const params = {
    current: defaultParam.value.current,
    size: defaultParam.value.size,
    searchKeyword: defaultParam.value.searchKeyword
  }
  getPhoneBookListApi(params).then(res => {
    const response = res.data.data
    console.log('通讯录',  response)
    if (defaultParam.value.current === 1) {
      contacts.value = response.records
    } else {
      contacts.value = [...contacts.value, ...response.records]
    }
    // 判断是否还有更多数据
    if (response.records.length < defaultParam.value.size || response.current >= response.pages) {
      hasMore.value = false
    } else {
      hasMore.value = true
    }
  }).catch(err => {
    console.error('获取通讯录失败:', err)
    const errorMsg = err.msg || err.message || '获取通讯录失败'
    uni.showToast({
      title: errorMsg,
      icon: 'none',
      duration: 3000
    })
  }).finally(() => {
    loading.value = false
  })
}
// 加载更多
const loadMore = () => {
  if (loading.value || !hasMore.value) return
  defaultParam.value.current++
  getPhoneBookList()
}
// 拨打电话方法
const makeCall = (contact) => {
  const contactName = contact.friendNickName || '未知联系人'
  console.log('拨打电话给', contactName)
  // 这里可以添加实际的拨打电话逻辑
  uni.showToast({
    title: `正在拨打${contactName}的电话`,
    icon: 'none'
  })
}
onShow(() => {
  // 重置分页参数
  defaultParam.value.current = 1
  hasMore.value = true
  getPhoneBookList()
});
// 监听滚动到底部
const onScrollToLower = () => {
  loadMore()
}
</script>
<style scoped lang="scss">
.eventTickets {
   width: 100%;
   height: 100%;
.voiceCallContainer {
  width: 100%;
  height: 100%;
  display: flex;
  flex-direction: column;
  box-sizing: border-box;
}
.searchBar {
  padding: 20rpx;
  display: flex;
  align-items: center;
  height: 108rpx;
}
.contactList {
  margin: 0 24rpx;
  background: #fff;
  border-radius: 12rpx;
  overflow-y: auto;
  height: 0;
  flex-grow: 1;
  align-content: flex-start;
}
.contactItem {
  display: flex;
  align-items: center;
  padding: 0 24rpx;
}
.itemBox {
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: 100%;
  height: 98rpx;
  border-bottom: 1rpx solid #EBEBEB;
}
.contactAvatar {
  width: 80rpx;
  height: 80rpx;
  margin-right: 26rpx;
  display: flex;
  justify-content: center;
  align-items: center;
}
.contactAvatar image {
  width: 60rpx;
  height: 60rpx;
}
.contactInfo {
  flex: 1;
  display: flex;
  justify-content: space-around;
  align-items: center;
}
.contactName {
  font-family: Source Han Sans CN, Source Han Sans CN;
  font-weight: 500;
  font-size: 30rpx;
  color: #222324;
  margin-bottom: 8rpx;
}
.contactDept {
  font-family: Source Han Sans CN, Source Han Sans CN;
  font-weight: 400;
  font-size: 30rpx;
  color: #222324;
}
.callButton {
  width: 80rpx;
  height: 80rpx;
  display: flex;
  justify-content: center;
  align-items: center;
}
.callButton image {
  width: 60rpx;
  height: 60rpx;
}
  .loadingMore {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 80rpx;
    font-size: 28rpx;
    color: #999;
  }
</style>