From 121b714d710cf3c865f4a1b5efe81abec11056d1 Mon Sep 17 00:00:00 2001
From: quanwei <419654421@qq.com>
Date: Sat, 01 Nov 2025 14:36:36 +0800
Subject: [PATCH] 修复名片模板生成失败问题 修复后台名片查看不显示头像和logo问题
---
shop_vue/src/views/plus/business/business/index.vue | 1093 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 1,092 insertions(+), 1 deletions(-)
diff --git a/shop_vue/src/views/plus/business/business/index.vue b/shop_vue/src/views/plus/business/business/index.vue
index cee12a5..03e859c 100644
--- a/shop_vue/src/views/plus/business/business/index.vue
+++ b/shop_vue/src/views/plus/business/business/index.vue
@@ -1,7 +1,1098 @@
<template>
+ <!--
+ 作者:系统
+ 时间:2025-10-30
+ 描述:名片管理-名片列表
+ -->
+ <div class="common-seach-wrap">
+ <div class="search-left">
+ <el-button type="primary" v-auth="'/plus/business/business/add'" @click="addBusiness">添加名片</el-button>
+ </div>
+ <el-form :inline="true" :model="searchForm" class="demo-form-inline">
+ <el-form-item label="搜索">
+ <el-input v-model="searchForm.search" placeholder="姓名/职务/单位"></el-input>
+ </el-form-item>
+ <el-form-item>
+ <el-button type="primary" @click="search">查询</el-button>
+ <el-button @click="reset">重置</el-button>
+ </el-form-item>
+ </el-form>
+
+ <div class="table-container">
+ <el-table v-loading="loading" :data="listData" border>
+ <el-table-column prop="business_card_id" label="名片ID" width="80" align="center"></el-table-column>
+ <el-table-column label="名片信息" align="center">
+ <template slot-scope="scope">
+ <div class="business-card-info">
+ <div class="avatar">
+ <img v-if="scope.row.file_path" :src="scope.row.file_path" alt="头像" class="avatar-img">
+ <div v-else class="avatar-placeholder">默认头像</div>
+ </div>
+ <div class="info">
+ <div class="name">{{ scope.row.name }}</div>
+ <div class="position">
+ {{ Array.isArray(scope.row.duties) ? scope.row.duties.join(', ') : scope.row.duties }}
+ </div>
+ <div class="company">{{ Array.isArray(scope.row.unit) ? scope.row.unit.join(', ') : scope.row.unit }}
+ </div>
+ </div>
+ </div>
+ </template>
+ </el-table-column>
+ <el-table-column prop="user.nickName" label="所属用户" align="center"></el-table-column>
+ <el-table-column prop="grade.name" label="名片等级" align="center">
+ <template slot-scope="scope">
+ {{ scope.row.grade ? scope.row.grade.name : '默认等级' }}
+ </template>
+ </el-table-column>
+ <el-table-column prop="mobile" label="联系电话" align="center"></el-table-column>
+ <el-table-column prop="create_time" label="创建时间" width="180" align="center"></el-table-column>
+ <el-table-column label="操作" width="180" align="center">
+ <template slot-scope="scope">
+ <el-button type="text" v-auth="'/plus/business/business/view'"
+ @click="viewBusiness(scope.row)">查看</el-button>
+ <el-button type="text" v-auth="'/plus/business/business/edit'"
+ @click="editBusiness(scope.row)">编辑</el-button>
+ <el-button type="text" v-auth="'/plus/business/business/delete'"
+ @click="deleteBusiness(scope.row)"></el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+ </div>
+
+ <!-- 分页 -->
+ <div class="pagination">
+ <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="curPage"
+ :page-sizes="[10, 20, 50, 100]" :page-size="pageSize" layout="total, sizes, prev, pager, next, jumper"
+ :total="totalDataNumber">
+ </el-pagination>
+ </div>
+
+ <!-- 添加/编辑对话框 -->
+ <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="800px" @close="handleClose">
+ <el-form :model="formData" :rules="rules" ref="formData" label-width="100px">
+ <el-tabs v-model="activeTab">
+ <el-tab-pane label="基本信息" name="basic">
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="用户" prop="user_id">
+ <el-button @click="selectUser" icon="el-icon-plus">选择会员</el-button>
+ <div v-if="selectedUser" class="selected-user">
+ <div class="img" style="margin-top: 10px;">
+ <img :src="selectedUser.avatarUrl" width="100" height="100" />
+ </div>
+ <el-tag closable @close="clearSelectedUser"
+ style="margin-top: 10px;">{{ selectedUser.nickName }}</el-tag>
+ </div>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="姓名" prop="name">
+ <el-input v-model="formData.name" placeholder="请输入姓名"></el-input>
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="联系电话" prop="mobile">
+ <el-input v-model="formData.mobile" placeholder="请输入联系电话"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="名片类型">
+ <el-select v-model="formData.ilk" placeholder="请选择名片类型">
+ <el-option label="个人名片" :value="10"></el-option>
+ <el-option label="企业名片" :value="20"></el-option>
+ </el-select>
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="微信">
+ <el-input v-model="formData.wechat" placeholder="请输入微信"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="邮箱">
+ <el-input v-model="formData.mailbox" placeholder="请输入邮箱"></el-input>
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="座机">
+ <el-input v-model="formData.phone" placeholder="请输入座机"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="名片等级">
+ <el-select v-model="formData.grade_id" placeholder="请选择名片等级">
+ <el-option v-for="item in gradeList" :key="item.grade_id" :label="item.name" :value="item.grade_id">
+ </el-option>
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="行业" prop="industry_id">
+ <el-cascader v-model="formData.industry_id" placeholder="请选择行业" :options="industryList"
+ :props="{ label: 'name', value: 'industry_id', children: 'child' }"
+ style="width: 100%;"></el-cascader>
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="是否默认">
+ <el-switch v-model="formData.is_default" :active-value="1" :inactive-value="0">
+ </el-switch>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </el-tab-pane>
+
+ <el-tab-pane label="详细信息" name="detail">
+ <el-form-item label="职务">
+ <el-input v-model="formData.duties" placeholder="请输入职务"></el-input>
+ </el-form-item>
+
+ <el-form-item label="单位">
+ <el-input v-model="formData.unit" placeholder="请输入单位"></el-input>
+ </el-form-item>
+
+ <el-form-item label="地区">
+ <el-select v-model="formData.province_id" placeholder="省" @change="initCity">
+ <el-option :label="item.name" :value="item.id" v-for="(item,index) in areaList"
+ :key='index'></el-option>
+ </el-select>
+ <el-select v-if="formData.province_id" v-model="formData.city_id" placeholder="市" @change="initRegion">
+ <el-option :label="item1.name" :value="item1.id"
+ v-for="(item1,index1) in areaList[formData.province_id]['city']" :key='index1'></el-option>
+ </el-select>
+ <el-select v-if="formData.city_id" v-model="formData.region_id" placeholder="区">
+ <el-option :label="item2.name" :value="item2.id"
+ v-for="(item2,index2) in areaList[formData.province_id]['city'][formData.city_id]['region']"
+ :key='index2'></el-option>
+ </el-select>
+ </el-form-item>
+
+ <el-form-item label="地址">
+ <el-input v-model="formData.address" placeholder="请输入地址"></el-input>
+ </el-form-item>
+
+ <el-form-item label="简介">
+ <el-input type="textarea" v-model="formData.Introduction" placeholder="请输入个人或公司简介" :rows="3">
+ </el-input>
+ </el-form-item>
+ </el-tab-pane>
+
+ <el-tab-pane label="图片设置" name="images">
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="头像">
+ <el-button icon="el-icon-picture" @click="selectAvatar">选择头像</el-button>
+ <div>
+ <div v-if="avatarImage" class="image-preview">
+ <img :src="avatarImage.file_path" class="preview-img">
+ <i class="el-icon-delete delete-icon" @click="clearAvatar"></i>
+ </div>
+ </div>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="Logo">
+ <el-button icon="el-icon-picture" @click="selectLogo">选择Logo</el-button>
+ <div>
+ <div v-if="logoImage" class="image-preview">
+ <img :src="logoImage.file_path" class="preview-img">
+ <i class="el-icon-delete delete-icon" @click="clearLogo"></i>
+ </div>
+ </div>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </el-tab-pane>
+
+ <el-tab-pane label="模板设置" name="template">
+ <el-form-item label="选择模板">
+ <el-select v-model="formData.template_id" placeholder="请选择名片模板" @change="handleTemplateChange">
+ <el-option v-for="item in templateList" :key="item.template_id"
+ :label="item.name || '模板' + item.template_id" :value="item.template_id">
+ <div class="template-option">
+ <img :src="item.image" class="template-thumb" />
+ <span>{{ item.name || '模板' + item.template_id }}</span>
+ </div>
+ </el-option>
+ </el-select>
+ </el-form-item>
+
+ <el-form-item label="模板预览" v-if="selectedTemplate">
+ <div class="template-preview">
+ <img :src="selectedTemplate.image" class="template-image" />
+ </div>
+ </el-form-item>
+ </el-tab-pane>
+ </el-tabs>
+ </el-form>
+
+ <div slot="footer" class="dialog-footer">
+ <el-button @click="dialogVisible = false">取 消</el-button>
+ <el-button type="primary" @click="submitForm">确 定</el-button>
+ </div>
+ </el-dialog>
+
+ <!-- 查看详情对话框 -->
+ <el-dialog title="名片详情" :visible.sync="detailDialogVisible" width="800px">
+ <el-tabs v-model="detailActiveTab">
+ <el-tab-pane label="基本信息" name="basic">
+ <el-form label-width="100px">
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="名片ID">
+ <span>{{ detailData.business_card_id }}</span>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="姓名">
+ <span>{{ detailData.name }}</span>
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="名片类型">
+ <span>{{ detailData.ilk == 10 ? '个人名片' : detailData.ilk == 20 ? '企业名片' : '' }}</span>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="联系电话">
+ <span>{{ detailData.mobile }}</span>
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="微信">
+ <span>{{ detailData.wechat }}</span>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="邮箱">
+ <span>{{ detailData.mailbox }}</span>
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="座机">
+ <span>{{ detailData.phone }}</span>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="名片等级">
+ <span>{{ detailData.grade ? detailData.grade.name : '默认等级' }}</span>
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="是否默认">
+ <span>{{ detailData.is_default === 1 ? '是' : '否' }}</span>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </el-form>
+ </el-tab-pane>
+
+ <el-tab-pane label="详细信息" name="detail">
+ <el-form label-width="100px">
+ <el-form-item label="职务">
+ <span>{{ Array.isArray(detailData.duties) ? detailData.duties.join(', ') : detailData.duties }}</span>
+ </el-form-item>
+
+ <el-form-item label="单位">
+ <span>{{ Array.isArray(detailData.unit) ? detailData.unit.join(', ') : detailData.unit }}</span>
+ </el-form-item>
+ <el-row :gutter="20">
+ <el-col :span="8">
+ <el-form-item label="行业">
+ <span>{{ detailData.industry.name }}</span>
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row :gutter="20">
+ <el-col :span="8">
+ <el-form-item label="省份">
+ <span>{{ detailData.region.province }}</span>
+ </el-form-item>
+ </el-col>
+ <el-col :span="8">
+ <el-form-item label="城市">
+ <span>{{ detailData.region.city}}</span>
+ </el-form-item>
+ </el-col>
+ <el-col :span="8">
+ <el-form-item label="区域">
+ <span>{{ detailData.region.region}}</span>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-form-item label="地址">
+ <span>{{ Array.isArray(detailData.address) ? detailData.address.join(', ') : detailData.address }}</span>
+ </el-form-item>
+ <el-form-item label="简介">
+ <span>{{ detailData.Introduction }}</span>
+ </el-form-item>
+ </el-form>
+ </el-tab-pane>
+
+ <el-tab-pane label="图片信息" name="images">
+ <el-form label-width="100px">
+ <el-form-item label="头像预览">
+ <img v-if="detailData.file_path" :src="detailData.file_path" class="preview-image" />
+ <div v-else class="no-image">暂无头像</div>
+ </el-form-item>
+
+ <el-form-item label="Logo预览">
+ <img v-if="detailData.logoImage && detailData.logoImage.file_path" :src="detailData.logoImage.file_path"
+ class="preview-image" />
+ <div v-else class="no-image">暂无Logo</div>
+ </el-form-item>
+ </el-form>
+ </el-tab-pane>
+
+ <el-tab-pane label="名片预览" name="template">
+ <el-form label-width="100px">
+ <el-form-item label="名片预览" v-if="detailData.mp">
+ <div class="template-preview">
+ <img :src="detailData.mp" class="template-image" />
+ </div>
+ </el-form-item>
+ </el-form>
+ </el-tab-pane>
+ </el-tabs>
+
+ <div slot="footer" class="dialog-footer">
+ <el-button @click="detailDialogVisible = false">关 闭</el-button>
+ </div>
+ </el-dialog>
+
+ <!-- 用户选择组件 -->
+ <GetUser :is_open="showUserSelector" @close="handleUserSelect"></GetUser>
+
+ <!-- 图片选择组件 -->
+ <Upload v-if="showImageSelector" :config="uploadConfig" :isupload="showImageSelector"
+ @returnImgs="handleImageSelect">
+ </Upload>
+ </div>
</template>
-<style scoped>
+<script>
+ import BusinessApi from '@/api/business.js';
+ import StoreApi from '@/api/store.js';
+ import GetUser from '@/components/user/GetUser';
+ import Upload from '@/components/file/Upload';
+ export default {
+ components: {
+ GetUser,
+ Upload
+ },
+ data() {
+ return {
+ loading: false,
+ listData: [],
+ gradeList: [],
+ templateList: [],
+ selectedTemplate: null,
+ searchForm: {
+ search: ''
+ },
+ formData: {
+ business_card_id: '',
+ user_id: '',
+ name: '',
+ sex: 10,
+ mobile: '',
+ mobile_phone: '',
+ wechat: '',
+ mailbox: '',
+ phone: '',
+ duties: '',
+ unit: '',
+ address: '',
+ industry_id: [],
+ province_id: '',
+ city_id: '',
+ region_id: '',
+ ilk: '',
+ grade_id: '',
+ is_default: 0,
+ file_id: '',
+ logo: '',
+ logo_width: '',
+ logo_height: '',
+ template_id: '',
+ Introduction: ''
+ },
+ detailData: {
+ business_card_id: '',
+ user_id: '',
+ name: '',
+ sex: 10,
+ mobile: '',
+ mobile_phone: '',
+ wechat: '',
+ mailbox: '',
+ phone: '',
+ duties: '',
+ unit: '',
+ address: '',
+ industry_id: '',
+ province_id: '',
+ city_id: '',
+ region_id: '',
+ ilk: '',
+ grade: null,
+ is_default: 0,
+ file_id: '',
+ logo: '',
+ logo_width: '',
+ logo_height: '',
+ template_id: '',
+ Introduction: '',
+ create_time: '',
+ update_time: '',
+ industry:{name:[]},
+ region: {province: "", city: "", region: ""}
+
+ },
+ rules: {
+ user_id: [{
+ required: true,
+ message: '请输入用户ID',
+ trigger: 'blur'
+ },
+ {
+ type: 'number',
+ message: '用户ID必须为数字',
+ trigger: 'blur'
+ }
+ ],
+ name: [{
+ required: true,
+ message: '请输入姓名',
+ trigger: 'blur'
+ }],
+ mobile: [{
+ required: false,
+ pattern: /^1[3-9]\d{9}$|^$/,
+ message: '请输入正确的手机号',
+ trigger: 'blur'
+ }],
+ province_id: [{
+ type: 'number',
+ message: '省份ID必须为数字',
+ trigger: 'blur'
+ }],
+ city_id: [{
+ type: 'number',
+ message: '城市ID必须为数字',
+ trigger: 'blur'
+ }],
+ region_id: [{
+ type: 'number',
+ message: '区域ID必须为数字',
+ trigger: 'blur'
+ }],
+ file_id: [{
+ type: 'number',
+ message: '头像ID必须为数字',
+ trigger: 'blur'
+ }],
+ logo: [{
+ type: 'number',
+ message: 'Logo ID必须为数字',
+ trigger: 'blur'
+ }]
+ },
+ dialogVisible: false,
+ detailDialogVisible: false,
+ dialogTitle: '',
+ isEdit: false,
+ activeTab: 'basic',
+ detailActiveTab: 'basic',
+ showUserSelector: false,
+ showImageSelector: false,
+ imageSelectType: '', // 'avatar' or 'logo'
+ uploadConfig: {
+ total: 1,
+ file_type: 'image'
+ },
+ // 分页相关
+ curPage: 1,
+ pageSize: 15,
+ totalDataNumber: 0,
+ industryList: [],
+ areaList: [],
+ selectedUser: null,
+ avatarImage: null,
+ logoImage: null,
+ };
+ },
+ filters: {
+ sexFilter(val) {
+ const sexMap = {
+ 10: '未知',
+ 20: '男',
+ 30: '女'
+ };
+ return sexMap[val] || '未知';
+ }
+ },
+ mounted() {
+ this.loadData();
+ this.loadGradeList();
+ this.loadTemplateList();
+ this.loadIndustryList(); // 加载行业列表
+ this.loadRegionList(); // 加载地区列表
+ },
+ methods: {
+ // 加载数据
+ loadData() {
+ this.loading = true;
+ const params = {
+ page: this.curPage,
+ listRow: this.pageSize,
+ search: this.searchForm.search
+ };
+
+ BusinessApi.businessList(params).then(res => {
+ this.loading = false;
+ if (res.data.list) {
+ // 适配后端实际返回的数据结构
+ this.listData = res.data.list.data || [];
+ this.totalDataNumber = res.data.list.total || 0;
+ } else {
+ this.listData = [];
+ this.totalDataNumber = 0;
+ }
+ }).catch(() => {
+ this.loading = false;
+ this.$message.error('获取数据失败');
+ });
+ },
+
+ // 加载名片等级列表
+ loadGradeList() {
+ BusinessApi.gradeList().then(res => {
+ this.gradeList = res.data.list || [];
+ }).catch(() => {
+ this.$message.error('获取名片等级失败');
+ });
+ },
+
+ // 加载模板列表
+ loadTemplateList() {
+ BusinessApi.businessTemplateList().then(res => {
+ this.templateList = res.data.list.data || [];
+ }).catch(() => {
+ this.$message.error('获取名片模板失败');
+ });
+ },
+
+ // 加载行业列表
+ loadIndustryList() {
+ BusinessApi.industryList().then(res => {
+ // 使用树形结构的数据作为行业列表
+ this.industryList = res.data.list && res.data.list.tree ? res.data.list.tree : [];
+ }).catch(() => {
+ this.$message.error('获取行业列表失败');
+ });
+ },
+
+ // 加载地区列表
+ loadRegionList() {
+ // 参考门店添加页面,调用获取地区数据的API
+ BusinessApi.businessList({}, true).then(res => {
+ if (res.data && res.data.regionData) {
+ this.areaList = res.data.regionData;
+ }
+ }).catch(() => {
+ this.areaList = [];
+ });
+ },
+
+ /*初始化城市id*/
+ initCity() {
+ this.formData.city_id = '';
+ this.formData.region_id = '';
+ },
+
+ /*初始化区id*/
+ initRegion() {
+ this.formData.region_id = '';
+ },
+
+ // 选择用户
+ selectUser() {
+ this.showUserSelector = true;
+ },
+
+ // 用户选择回调
+ handleUserSelect(selectedUsers) {
+ this.showUserSelector = false;
+ if (selectedUsers && selectedUsers.params && selectedUsers.params.length > 0) {
+ const user = selectedUsers.params[0];
+ this.formData.user_id = user.user_id;
+ this.selectedUser = user;
+ // 自动填充姓名和手机号
+ if (user.real_name) {
+ this.formData.name = user.real_name;
+ }
+ if (user.mobile) {
+ this.formData.mobile = user.mobile;
+ }
+ }
+ },
+
+ // 清除选择的用户
+ clearSelectedUser() {
+ this.formData.user_id = '';
+ this.selectedUser = null;
+ },
+
+ // 选择头像
+ selectAvatar() {
+ this.imageSelectType = 'avatar';
+ this.uploadConfig = {
+ total: 1,
+ file_type: 'image'
+ };
+ this.showImageSelector = true;
+ },
+
+ // 选择Logo
+ selectLogo() {
+ this.imageSelectType = 'logo';
+ this.uploadConfig = {
+ total: 1,
+ file_type: 'image'
+ };
+ this.showImageSelector = true;
+ },
+
+ // 图片选择回调
+ handleImageSelect(images) {
+ this.showImageSelector = false;
+ if (images && images.length > 0) {
+ const fileId = images[0].file_id;
+ const fileData = images[0];
+ if (this.imageSelectType === 'avatar') {
+ this.formData.file_id = fileId;
+ this.avatarImage = fileData;
+ } else if (this.imageSelectType === 'logo') {
+ this.formData.logo = fileId;
+ this.logoImage = fileData;
+ }
+ }
+ },
+
+ // 清除头像
+ clearAvatar() {
+ this.formData.file_id = '';
+ this.avatarImage = null;
+ },
+
+ // 清除Logo
+ clearLogo() {
+ this.formData.logo = '';
+ this.logoImage = null;
+ },
+
+ // 搜索
+ search() {
+ this.curPage = 1;
+ this.loadData();
+ },
+
+ // 重置搜索
+ reset() {
+ this.searchForm.search = '';
+ this.curPage = 1;
+ this.loadData();
+ },
+
+ // 添加名片
+ addBusiness() {
+ this.dialogTitle = '添加名片';
+ this.isEdit = false;
+ this.formData = {
+ business_card_id: '',
+ user_id: '',
+ name: '',
+ sex: 10,
+ mobile: '',
+ mobile_phone: '',
+ wechat: '',
+ mailbox: '',
+ phone: '',
+ duties: '',
+ unit: '',
+ address: '',
+ industry_id: '',
+ province_id: '',
+ city_id: '',
+ region_id: '',
+ ilk: '',
+ grade_id: '',
+ is_default: 0,
+ file_id: '',
+ logo: '',
+ logo_width: '',
+ logo_height: '',
+ template_id: '',
+ Introduction: ''
+ };
+ // 清空选择的数据
+ this.selectedUser = null;
+ this.avatarImage = null;
+ this.logoImage = null;
+
+ this.activeTab = 'basic';
+ this.dialogVisible = true;
+ },
+
+ // 编辑名片
+ editBusiness(row) {
+ this.dialogTitle = '编辑名片';
+ this.isEdit = true;
+ this.formData = {
+ business_card_id: row.business_card_id,
+ user_id: row.user_id,
+ name: row.name,
+ sex: row.sex && typeof row.sex === 'object' ?
+ (row.sex === '未知' ? 10 : row.sex === '男' ? 20 : 30) : (row.sex || 10),
+ mobile: row.mobile,
+ mobile_phone: row.mobile_phone,
+ wechat: row.wechat || '',
+ mailbox: row.mailbox || '',
+ phone: row.phone || '',
+ duties: Array.isArray(row.duties) ? row.duties.join(', ') : (row.duties || ''),
+ unit: Array.isArray(row.unit) ? row.unit.join(', ') : (row.unit || ''),
+ address: Array.isArray(row.address) ? row.address.join(', ') : (row.address || ''),
+ industry_id: row.industry_id || '',
+ province_id: row.province_id || '',
+ city_id: row.city_id || '',
+ region_id: row.region_id || '',
+ ilk: row.ilk || '',
+ grade_id: row.grade_id,
+ is_default: row.is_default,
+ file_id: row.file_id || '',
+ logo: row.logo || '',
+ logo_width: row.logo_width || '',
+ logo_height: row.logo_height || '',
+ template_id: row.template_id || '',
+ Introduction: row.Introduction || ''
+ };
+
+ // 设置选中的用户
+ if (row.user) {
+ this.selectedUser = row.user;
+ }
+ console.log(row);
+ // 设置选中的图片
+ if (row.file_id) {
+ this.avatarImage = {
+ file_id: row.file_id,
+ file_path: row.file_path
+ };
+ }
+
+ if (row.logoImage) {
+ this.logoImage = row.logoImage;
+ }
+
+ // 地区信息已经通过formData绑定,无需额外设置
+
+ // 设置选中的模板
+ if (row.template_id) {
+ this.selectedTemplate = this.templateList.find(template => template.template_id == row.template_id) || null;
+ } else {
+ this.selectedTemplate = null;
+ }
+
+ this.activeTab = 'basic';
+ this.dialogVisible = true;
+ },
+
+ // 查看详情
+ viewBusiness(row) {
+ BusinessApi.businessDetail({
+ business_card_id: row.business_card_id
+ }).then(res => {
+ if (res.code === 1) {
+ this.detailData = res.data;
+ this.detailActiveTab = 'basic';
+ this.detailDialogVisible = true;
+ } else {
+ this.$message.error(res.msg || '获取详情失败');
+ }
+ }).catch(() => {
+ this.$message.error('获取详情失败');
+ });
+ },
+
+ // 删除名片
+ deleteBusiness(row) {
+ this.$confirm('确定要删除该名片吗?', '提示', {
+ confirmButtonText: '确定',
+ cancelButtonText: '取消',
+ type: 'warning'
+ }).then(() => {
+ BusinessApi.businessDelete({
+ business_card_id: row.business_card_id
+ }).then(res => {
+ if (res.code === 1) {
+ this.$message.success('删除成功');
+ this.loadData();
+ } else {
+ this.$message.error(res.msg || '删除失败');
+ }
+ }).catch(() => {
+ this.$message.error('删除失败');
+ });
+ }).catch(() => {});
+ },
+
+ // 关闭对话框
+ handleClose() {
+ this.$refs.formData.resetFields();
+ },
+
+ // 提交表单
+ submitForm() {
+ this.$refs.formData.validate((valid) => {
+ if (valid) {
+ // 处理数组字段
+ const paramsData = {
+ ...this.formData
+ };
+ // 处理行业级联值,取最后一级的值并确保为数字类型
+ if (Array.isArray(paramsData.industry_id) && paramsData.industry_id.length > 0) {
+ paramsData.industry_id = Number(paramsData.industry_id[paramsData.industry_id.length - 1]);
+ } else if (paramsData.industry_id !== '') {
+ // 如果不是数组但有值,也转换为数字
+ paramsData.industry_id = Number(paramsData.industry_id);
+ }
+
+ // 处理职务字段
+ if (paramsData.duties && typeof paramsData.duties === 'string') {
+ paramsData.duties = paramsData.duties.split(',').map(item => item.trim()).filter(item => item);
+ }
+
+ // 处理单位字段
+ if (paramsData.unit && typeof paramsData.unit === 'string') {
+ paramsData.unit = paramsData.unit.split(',').map(item => item.trim()).filter(item => item);
+ }
+
+ // 处理地址字段
+ if (paramsData.address && typeof paramsData.address === 'string') {
+ paramsData.address = paramsData.address.split(',').map(item => item.trim()).filter(item => item);
+ }
+
+ const params = {
+ business: paramsData
+ };
+
+ if (this.isEdit) {
+ // 编辑
+ BusinessApi.businessEdit(params).then(res => {
+ if (res.code === 1) {
+ this.$message.success('编辑成功');
+ this.dialogVisible = false;
+ this.loadData();
+ } else {
+ this.$message.error(res.msg || '编辑失败');
+ }
+ }).catch(() => {
+ this.$message.error('编辑失败');
+ });
+ } else {
+ // 添加
+ BusinessApi.businessAdd(params).then(res => {
+ if (res.code === 1) {
+ this.$message.success('添加成功');
+ this.dialogVisible = false;
+ this.loadData();
+ } else {
+ this.$message.error(res.msg || '添加失败');
+ }
+ }).catch(() => {
+ this.$message.error('添加失败');
+ });
+ }
+ }
+ });
+ },
+
+ // 模板选择变更
+ handleTemplateChange(templateId) {
+ this.selectedTemplate = this.templateList.find(template => template.template_id == templateId) || null;
+ },
+
+ // 分页相关方法
+ handleSizeChange(val) {
+ this.pageSize = val;
+ this.curPage = 1;
+ this.loadData();
+ },
+
+ handleCurrentChange(val) {
+ this.curPage = val;
+ this.loadData();
+ }
+ }
+ };
+</script>
+
+<style scoped>
+ .common-seach-wrap {
+ padding: 20px;
+ background-color: #fff;
+ min-height: calc(100vh - 60px);
+ }
+
+ .search-left {
+ margin-bottom: 20px;
+ }
+
+ .business-card-info {
+ display: flex;
+ align-items: center;
+ text-align: left;
+ }
+
+ .avatar {
+ margin-right: 15px;
+ }
+
+ .avatar-img {
+ width: 50px;
+ height: 50px;
+ border-radius: 50%;
+ object-fit: cover;
+ }
+
+ .avatar-placeholder {
+ width: 50px;
+ height: 50px;
+ border-radius: 50%;
+ background-color: #f0f0f0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: #999;
+ font-size: 12px;
+ }
+
+ .info .name {
+ font-weight: bold;
+ font-size: 16px;
+ margin-bottom: 5px;
+ }
+
+ .info .position,
+ .info .company {
+ font-size: 14px;
+ color: #666;
+ margin-bottom: 3px;
+ }
+
+ .pagination {
+ margin-top: 20px;
+ text-align: right;
+ }
+
+ .dialog-footer {
+ text-align: right;
+ }
+
+ .template-option {
+ display: flex;
+ align-items: center;
+ }
+
+ .template-thumb {
+ width: 40px;
+ height: 40px;
+ margin-right: 10px;
+ object-fit: cover;
+ }
+
+ .template-preview {
+ text-align: center;
+ margin-top: 10px;
+ }
+
+ .template-image {
+ max-width: 100%;
+ max-height: 400px;
+ border: 1px solid #eee;
+ border-radius: 4px;
+ }
+
+ .preview-image {
+ max-width: 200px;
+ max-height: 200px;
+ border: 1px solid #eee;
+ border-radius: 4px;
+ }
+
+ .no-image,
+ .no-template {
+ color: #999;
+ font-style: italic;
+ }
+
+ .selected-user {
+ margin-top: 10px;
+ }
+
+ .img {
+ margin-top: 10px;
+ }
+
+ .image-preview {
+ position: relative;
+ display: inline-block;
+ margin-top: 10px;
+ }
+
+ .preview-img {
+ width: 100px;
+ height: 100px;
+ border-radius: 4px;
+ }
+
+ .delete-icon {
+ position: absolute;
+ top: -8px;
+ right: -8px;
+ background: #fff;
+ border-radius: 50%;
+ cursor: pointer;
+ color: #F56C6C;
+ font-size: 16px;
+ }
</style>
--
Gitblit v1.9.2