Vue仿企业微信 实现动态生成文件夹联系人

378 阅读1分钟

最近用uniapp给公司做一个内部MI聊天app,联系人是直接从组织架构获取的,后台提供接口即可,类似于树形结构菜单 参考企业微信通讯录。

效果图

首页

image.png

企业联系人页面

image.png

首页代码

//html
<div class="frimTitle">我的企业</div>
		<div v-for="(item,index) in menuList" :key='index'>
			<div class='frimTitle_btn frimTitle' @click="item.children.length>0?goFirmContacts(item):'' ">
				<img :src="src" alt="">
				<!-- <p :style="{'color': (checkIndex3==m.txt ? '#3d8cff':'#BBBBBB')}">{{m.txt}}</p> -->
				<div :style="{ 'color':(item.children.length>0?'' :'#aaaaaa') }">{{item.title}}</div>
			</div>
</div>
//js
data() {
			return {
				src: '../../static/file_msg.png',
				menuList: [
					
				]

			}
		},
                methods: {
                // 获取企业联系人
			async getContact() {
				uni.request({
					url: 接口地址",
					success: (res) => {
						this.menuList = res.data.data
					},
					fail(err) {
						console.log(err);
					}
				});
			},
			
			// 跳转企业联系人
			goFirmContacts(val){
				uni.navigateTo({
					url: "/pages/mailList/firmContacts?val="+encodeURIComponent(JSON.stringify(val))
				})
			},
		}
                

企业联系人页面

//html
<template>
	<view class="">
		<uni-nav-bar left-icon="back" title="企业联系人" @clickLeft="goBack"></uni-nav-bar>
		<scroll-view scroll-y class="scroll-box">
			<!-- 部门文件夹 -->
			
			<div v-for="(item,index) in menuList.children" :key='index'>
				<div class='frimTitle_btn frimTitle' @click="item.children?goFirmContacts(item):'' ">
					<img :src="src" alt="">
					<div :style="{ 'color':(item.children?'' :'#aaaaaa') }">{{item.title}}</div>
				</div>
			</div>
			
			<!-- 个人用户 -->
			<view v-for="item in Linkman" :key="item.userNo" class="notice-item" @click='bindClick(item)'>
				<u-avatar src="../../static/user.png"/>
				<view class="info-area">
					<text class="nick">{{item.fullName}}</text>
				</view>
			</view>
			
			<view class="noData" v-if=' (menuList.children.length<1 && Linkman.length<1)'>
				<img src="../../static/noData.png" alt="">
				暂无数据
			</view>	
			
			
		</scroll-view>
	</view>
</template>
//js
data() {
			return {
				menuList: [],//组织架构
				menuListKey:'',
				src: '../../static/file_msg.png',
				Linkman:[
					
				]
			}
		},
                
                methods: {
			// 返回
			goBack() {
				uni.navigateBack()
			},
			// 跳转企业联系人
			goFirmContacts(val){
				uni.navigateTo({
					url: "/pages/mailList/firmContacts?val="+encodeURIComponent(JSON.stringify(val))
				})
			},
			//获取企业联系人
			getUsersByOrgId(){
				uni.request({
					url: 接口地址",
					data: {
						orgId:this.menuListKey
					},
					success: (res) => {
						this.Linkman = res.data.data
					},
					fail(err) {
						console.log(err);
					}
				});
			},
			
			
			// 企业联系人 点击事件
			bindClick(item) {
				// 构造参数
				let newItem = item
				newItem.userID = newItem.userNo
				newItem.conversationID = 'single_' + newItem.userNo
				this.$u.vuex('vuex_conversation', newItem)
				this.$u.vuex('vuex_conversation_user', newItem.userNo)
				// 跳转到消息页面
				uni.navigateTo({
					url: "/pages/conversation/chatWin",
				});
			},
			
		},
		onLoad: function(option) { //option为object类型,会序列化上个页面传递的参数
			this.menuList = JSON.parse(decodeURIComponent(option.val));
			this.menuListKey = this.menuList.key  //获取企业联系人所需要的key
			
			this.getUsersByOrgId()
			
		}
                

ps:后台接口数据格式大概长这样

image.png