This commit is contained in:
木瓜一块八 2025-08-19 14:45:32 +08:00
parent 54c953d41f
commit 79d1f8ab35
17 changed files with 1218 additions and 354 deletions

View File

@ -144,3 +144,42 @@ export function reqEnterpriseAuditInfoSearch(data){
}) })
} }
//咨询表单 /product/search_user_inquiry.dspy
export function reqSearchUserInquiry(data){
return request({
url: '/product/search_user_inquiry.dspy',
method: 'post',
headers: { 'Content-Type': 'application/json' },
data
})
}
//审核状态查询 /user/enterprise_audit_info_search.dspy
export function reqApproveUserSearch(data){
return request({
url: '/user/enterprise_audit_info_search.dspy',
method: 'post',
headers: { 'Content-Type': 'application/json' },
data
})
}
//政企审核 更新 /user/enterprise_audit_info_update.dspy
export function reqEnterpriseUpdate(data){
return request({
url: '/user/enterprise_audit_info_update.dspy',
method: 'post',
headers: { 'Content-Type': 'application/json' },
data
})
}
//首页类别查询 /product/homepage_product_category.dspy
export function reqHomepageProductCategory(data){
return request({
url: '/product/homepage_product_category.dspy',
method: 'post',
headers: { 'Content-Type': 'application/json' },
data
})
}

View File

@ -345,6 +345,20 @@ export const asyncRoutes = [
}] }]
}, },
{
path: "/consultingMangement",
name: 'ConsultingMangement',
component: Layout,
meta: { title: "咨询表单", fullPath: "/consultingMangement", noCache: true,icon: "el-icon-s-platform" },
children: [
{
path: "index",
component: () => import('@/views/operation/consultingMangement/index.vue'),
name: 'ConsultingMangement',
meta: { title: "咨询表单", fullPath: "/consultingMangement/index", noCache: true,icon: "el-icon-s-platform" },
}
]
},
{ {
path: "/product", path: "/product",
name: 'product', name: 'product',
@ -855,13 +869,34 @@ export const asyncRoutes = [
meta: { title: "产品最新页", fullPath: "/product/productHome/productIndex", noCache: true }, meta: { title: "产品最新页", fullPath: "/product/productHome/productIndex", noCache: true },
},], },],
}, },
{
path: "/qualificationReview",
component:Layout,
name: "qualificationReview",
redirect: "/qualificationReview/index",
meta: { fullPath: "/qualificationReview", title: "资质审核", noCache: true, icon: 'el-icon-s-home' },
children: [
{
path: "noApproveInfo",
component: () => import("@/views/customer/qualificationReview/noApproveInfo/index.vue"),
name: "noApproveInfo",
meta: { title: "待审清单", fullPath: "/qualificationReview/index" },
},
{
path: "rejectInfo",
component: () => import("@/views/customer/qualificationReview/apprvedInfo/index.vue"),
name: "rejectInfo",
meta: { title: "已审清单", fullPath: "/qualificationReview/approvedInfo" },
},
]
},
{ {
path: "/approveMangement", path: "/approveMangement",
component:Layout, component:Layout,
name: "approveMangement", name: "approveMangement",
redirect: "/approveMangement/index", redirect: "/approveMangement/index",
meta: { fullPath: "/approveMangement", title: "审核管理", noCache: true, icon: 'el-icon-s-home' }, meta: { fullPath: "/approveMangement", title: "供需审核", noCache: true, icon: 'el-icon-s-home' },
children: [ children: [
{ {
path: "pendingPro", path: "pendingPro",

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1755568430743" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1525" xmlns:xlink="http://www.w3.org/1999/xlink" width="14" height="14"><path d="M782.848 728.576m-185.856 0a185.856 185.856 0 1 0 371.712 0 185.856 185.856 0 1 0-371.712 0Z" fill="#FFE200" p-id="1526"></path><path d="M194.56 166.4H128c-16.896 0-30.72-13.824-30.72-30.72s13.824-30.72 30.72-30.72h66.56c16.896 0 30.72 13.824 30.72 30.72s-13.824 30.72-30.72 30.72z" fill="#FFE200" p-id="1527"></path><path d="M525.824 337.92l-45.568 12.288c3.584 8.192 7.68 17.92 11.264 27.136H354.816v69.12h43.52v-27.136h224.768v27.136h46.08V377.344h-124.928c-4.096-10.752-11.776-27.136-18.432-39.424z m8.704 90.624h-45.568v30.72h-112.64v183.296h42.496v-16.896h70.144V686.08h45.568v-59.904h69.12v15.36h44.544V459.776h-113.664v-31.232z m0 95.744v-27.136h69.12v27.136h-69.12z m-115.712 0v-27.136h70.144v27.136H418.816z m115.712 63.488v-27.136h69.12v27.136h-69.12z m-115.712 0v-27.136h70.144v27.136H418.816zM301.056 856.576c-5.632 0-11.264-1.536-16.896-5.12-10.752-7.168-21.504-14.336-31.232-22.528-16.384-12.8-31.744-27.136-46.08-42.496-11.776-12.288-10.752-31.744 1.536-43.52s31.744-10.752 43.52 1.536c12.288 12.8 25.088 25.088 39.424 35.84 8.704 6.656 17.408 13.312 26.624 18.944 14.336 9.216 18.432 28.16 9.216 42.496-6.144 9.728-15.872 14.848-26.112 14.848zM507.904 917.504c-30.72 0-61.44-3.584-91.648-10.24-15.36-3.584-30.72-7.68-45.056-13.312-15.872-5.632-24.576-23.04-18.944-39.424 5.632-15.872 23.04-24.576 39.424-18.944 12.8 4.608 25.6 8.192 38.4 11.264 25.6 5.632 51.712 8.704 77.824 8.704 16.896 0 30.72 13.824 30.72 30.72s-13.824 31.232-30.72 31.232zM596.992 907.264c-13.824 0-26.624-9.728-29.696-23.552-4.096-16.384 6.144-33.28 22.528-36.864 20.48-4.608 39.936-11.776 59.392-19.968 45.568-19.968 87.04-50.176 120.32-87.552 57.344-64 88.576-146.944 88.576-232.96 0-51.2-10.752-100.864-32.256-146.944-7.168-15.36-0.512-33.792 14.848-40.96 15.36-7.168 33.792-0.512 40.96 14.848 25.088 54.272 37.888 112.64 37.888 173.056 0 101.376-36.864 198.656-104.448 273.92-38.912 43.52-88.064 79.36-141.312 102.912-22.528 9.728-46.08 17.92-69.632 23.552-2.56 0-4.608 0.512-7.168 0.512z" fill="#4E63DD" p-id="1528"></path><path d="M164.352 700.928c-11.264 0-22.528-6.656-27.648-17.408-26.624-55.808-39.936-115.2-39.936-177.152 0-67.072 16.384-133.632 47.616-192 43.008-81.408 113.152-146.944 197.632-184.32C394.24 107.008 450.56 95.232 508.416 95.232c79.872 0 156.672 23.04 223.232 66.048 32.256 20.992 61.44 46.08 87.04 75.264 11.264 12.8 9.728 32.256-3.072 43.52s-32.256 9.728-43.52-3.072c-21.504-24.576-46.592-46.592-74.24-64-56.832-36.864-122.368-55.808-189.952-55.808-49.152 0-96.768 10.24-141.312 29.696-71.68 31.744-131.584 87.552-168.448 156.672-26.624 50.176-40.448 106.496-40.448 163.328 0 52.736 11.264 103.424 33.792 150.528 7.168 15.36 1.024 33.792-14.336 40.96-4.096 1.536-8.192 2.56-12.8 2.56z" fill="#4E63DD" p-id="1529"></path></svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.7 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.4 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="nc-approve-container"> <div v-loading="loading" element-loading-text="信息加载中..." class="nc-approve-container">
<el-card class="approve-card"> <el-card v-if="showType === 'add'" class="approve-card">
<div slot="header" class="card-header"> <div slot="header" class="card-header">
<span class="header-title"> <span class="header-title">
<i class="el-icon-document"></i> <i class="el-icon-document"></i>
@ -47,15 +47,7 @@
</el-input> </el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- <el-col :span="12">
<el-form-item label="审核状态" prop="audit_status">
<el-tag
:type="getStatusType(approveForm.audit_status)"
size="medium">
{{ getStatusText(approveForm.audit_status) }}
</el-tag>
</el-form-item>
</el-col> -->
</el-row> </el-row>
<el-row :gutter="20"> <el-row :gutter="20">
@ -120,15 +112,9 @@
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="营业执照正本" prop="license_original_img"> <el-form-item label="营业执照正本" prop="license_original_img">
<el-upload <el-upload class="license-uploader" action="#" :http-request="handleLicenseUpload"
class="license-uploader" :show-file-list="false" :before-upload="beforeLicenseUpload" accept="image/*">
action="#" <img v-if="approveForm.license_original_img" :src="approveForm.license_original_img"
:http-request="handleLicenseUpload"
:show-file-list="false"
:before-upload="beforeLicenseUpload"
accept="image/*">
<img v-if="approveForm.license_original_img"
:src="approveForm.license_original_img"
class="license-image"> class="license-image">
<i v-else class="el-icon-plus license-uploader-icon"></i> <i v-else class="el-icon-plus license-uploader-icon"></i>
</el-upload> </el-upload>
@ -138,17 +124,11 @@
</div> </div>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <!-- <el-col :span="12">
<el-form-item label="营业执照副本" prop="license_copy_img"> <el-form-item label="营业执照副本" prop="license_copy_img">
<el-upload <el-upload class="license-uploader" action="#" :http-request="handleLicenseCopyUpload"
class="license-uploader" :show-file-list="false" :before-upload="beforeLicenseUpload" accept="image/*">
action="#" <img v-if="approveForm.license_copy_img" :src="approveForm.license_copy_img"
:http-request="handleLicenseCopyUpload"
:show-file-list="false"
:before-upload="beforeLicenseUpload"
accept="image/*">
<img v-if="approveForm.license_copy_img"
:src="approveForm.license_copy_img"
class="license-image"> class="license-image">
<i v-else class="el-icon-plus license-uploader-icon"></i> <i v-else class="el-icon-plus license-uploader-icon"></i>
</el-upload> </el-upload>
@ -157,7 +137,7 @@
支持 JPGPNGGIF 格式文件大小不超过 5MB 支持 JPGPNGGIF 格式文件大小不超过 5MB
</div> </div>
</el-form-item> </el-form-item>
</el-col> </el-col> -->
</el-row> </el-row>
<!-- 操作按钮 --> <!-- 操作按钮 -->
@ -178,9 +158,40 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<el-card v-if="showType === 'pending'" class="approve-card myStyle">
<div class="myStyle-content colStyle">
<span class="appTitle"> <img style="width: 50px;height: 50px;margin-right: 10px;" src="./img/apping.svg"
alt=""> 信息审核中</span>
<span class="tip">提交时间{{ currentInfo.create_at }}</span>
</div>
</el-card>
<el-card v-if="showType === 'rejected'" class="approve-card myStyle">
<div class="myStyle-content colStyle">
<span class="appTitle noapp"> <img style="width: 50px;height: 50px;margin-right: 10px;"
src="./img/noapp.svg" alt=""> 信息不通过</span>
<span class="noTip">驳回原因{{ currentInfo.reject_reason }} <span class="reapp"
@click="reApprove">重新提交</span></span>
</div>
</el-card>
<el-card v-if="showType === 'approved'" class="approve-card myStyle">
<div class="myStyle-content colStyle appredStyle">
<div class="appredStyle-content">
<span class="smallTitle"> 大陆资源审核通过</span>
<img src="./img/app.png" alt="">
</div>
<div class="appredStyle-content">
<span class="tip" style="color: #67c23a;">审核状态已通过</span>
<span class="tip">审核时间{{ currentInfo.update_time }}</span>
</div>
</div>
</el-card>
<!-- 预览对话框 --> <!-- 预览对话框 -->
<el-dialog title="审批信息预览" :visible.sync="previewVisible" top="3vh" width="60%" :before-close="handlePreviewClose"> <el-dialog title="审批信息预览" :visible.sync="previewVisible" top="3vh" width="60%"
:before-close="handlePreviewClose">
<div class="preview-content"> <div class="preview-content">
<el-descriptions :column="2" border> <el-descriptions :column="2" border>
<el-descriptions-item label="账号类型"> <el-descriptions-item label="账号类型">
@ -192,11 +203,6 @@
<el-descriptions-item label="执照号码"> <el-descriptions-item label="执照号码">
{{ approveForm.license_number }} {{ approveForm.license_number }}
</el-descriptions-item> </el-descriptions-item>
<!-- <el-descriptions-item label="审核状态1">
<el-tag :type="getStatusType(approveForm.audit_status)">
{{ getStatusText(approveForm.audit_status) }}
</el-tag>
</el-descriptions-item> -->
<el-descriptions-item label="办公地址"> <el-descriptions-item label="办公地址">
{{ approveForm.office_address }} {{ approveForm.office_address }}
</el-descriptions-item> </el-descriptions-item>
@ -219,10 +225,10 @@
<h4>营业执照正本</h4> <h4>营业执照正本</h4>
<img :src="approveForm.license_original_img" alt="营业执照正本" class="preview-license-img"> <img :src="approveForm.license_original_img" alt="营业执照正本" class="preview-license-img">
</div> </div>
<div class="preview-image" v-if="approveForm.license_copy_img"> <!-- <div class="preview-image" v-if="approveForm.license_copy_img">
<h4>营业执照副本</h4> <h4>营业执照副本</h4>
<img :src="approveForm.license_copy_img" alt="营业执照副本" class="preview-license-img"> <img :src="approveForm.license_copy_img" alt="营业执照副本" class="preview-license-img">
</div> </div> -->
</div> </div>
</div> </div>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
@ -233,11 +239,14 @@
</div> </div>
</template> </template>
<script> <script>
import {reqApproveUser } from '@/api/ncmatch/index' import { reqApproveUser, reqApproveUserSearch } from '@/api/ncmatch/index'
export default { export default {
name: "ncApprove", name: "ncApprove",
data() { data() {
return { return {
loading: true,
showType: '',//add pending rejected approved
currentInfo: {},
approveForm: { approveForm: {
account_type: "", // account_type: "", //
company_name: '', // company_name: '', //
@ -289,19 +298,6 @@ export default {
trigger: 'change' trigger: 'change'
} }
], ],
license_copy_img: [
{
required: true,
validator: (rule, value, callback) => {
if (!this.approveForm.license_copy_file) {
callback(new Error('请上传营业执照副本'));
} else {
callback();
}
},
trigger: 'change'
}
]
}, },
submitLoading: false, submitLoading: false,
previewVisible: false previewVisible: false
@ -315,11 +311,41 @@ export default {
this.approveForm.contact_name && this.approveForm.contact_name &&
this.approveForm.mobile_phone && this.approveForm.mobile_phone &&
this.approveForm.email && this.approveForm.email &&
this.approveForm.license_original_file && this.approveForm.license_original_file;
this.approveForm.license_copy_file;
} }
}, },
created() {
this.getApproveInfo()
},
methods: { methods: {
reApprove(){
this.showType = 'add'
this.approveForm = this.currentInfo
},
getApproveInfo() {
reqApproveUserSearch({ url_link: window.location.href }).then(res => {
this.loading = false
if(res.data.data.length===0){
this.showType='add'
}else if(res.data.data[0].audit_status==='pending'){
this.currentInfo=res.data.data[0]
this.showType='pending'
}else if(res.data.data[0].audit_status==='rejected'){
this.currentInfo=res.data.data[0]
this.showType='rejected'
}else if(res.data.data[0].audit_status==='approved'){
this.currentInfo=res.data.data[0]
this.showType='approved'
}
}).catch(error => {
this.loading = false
console.error('获取审批信息失败:', error)
this.$message.error('获取审批信息失败,请刷新页面重试')
//
this.showType = 'add'
})
},
// //
getAccountTypeText(type) { getAccountTypeText(type) {
const typeMap = { const typeMap = {
@ -424,15 +450,12 @@ export default {
formData.append('license_original_img', this.approveForm.license_original_file); formData.append('license_original_img', this.approveForm.license_original_file);
} }
if (this.approveForm.license_copy_file) {
formData.append('license_copy_img', this.approveForm.license_copy_file);
}
reqApproveUser(formData).then(res => { reqApproveUser(formData).then(res => {
this.submitLoading = false; this.submitLoading = false;
if (res.status) { if (res.status) {
this.$message.success('审批信息提交成功!'); this.$message.success('审批信息提交成功!');
this.approveForm.audit_status = 'processing'; this.approveForm.audit_status = 'pending';
this.getApproveInfo()
} else { } else {
this.$message.error(res.message || '提交失败,请重试'); this.$message.error(res.message || '提交失败,请重试');
} }
@ -451,9 +474,7 @@ export default {
handleReset() { handleReset() {
this.$refs.approveForm.resetFields(); this.$refs.approveForm.resetFields();
this.approveForm.license_original_img = ''; this.approveForm.license_original_img = '';
this.approveForm.license_copy_img = '';
this.approveForm.license_original_file = null; this.approveForm.license_original_file = null;
this.approveForm.license_copy_file = null;
this.approveForm.audit_status = 'pending'; this.approveForm.audit_status = 'pending';
this.$message.info('表单已重置'); this.$message.info('表单已重置');
}, },
@ -487,9 +508,30 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.appredStyle{
border: 1px solid #f2f2fb;
width: 500px;
height: 220px;
display: flex;
flex-direction: row!important;
align-items: center;
justify-content: space-around!important;
.appredStyle-content{
// border: 5px solid red;
display: flex;
flex-direction: column;
align-items: flex-start!important;
justify-content:center;
}
}
.nc-approve-container { .nc-approve-container {
min-height: 100vh; box-sizing: border-box;
height: calc(100vh - 60px);
position: relative; position: relative;
display: flex;
width: 100%;
justify-content: center;
align-items: flex-start;
&::before { &::before {
content: ''; content: '';
@ -504,7 +546,7 @@ export default {
} }
.approve-card { .approve-card {
width: 100%;
// max-width: 1200px; // max-width: 1200px;
margin: 0 45px; margin: 0 45px;
background: rgba(255, 255, 255, 0.95); background: rgba(255, 255, 255, 0.95);
@ -942,4 +984,63 @@ export default {
background: linear-gradient(135deg, #5a6fd8, #6a4190); background: linear-gradient(135deg, #5a6fd8, #6a4190);
} }
} }
.myStyle {
box-sizing: border-box;
width: 100%;
height: calc(100vh - 100px);
display: flex;
justify-content: center;
align-items: center;
font-size: 20px;
font-weight: bold;
color: #667eea;
}
.colStyle {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.appTitle {
display: flex;
align-items: center;
justify-content: center;
}
.tip {
font-size: 12px;
font-weight: 400;
color: #667eea;
margin-top: 10px;
}
.noTip {
font-size: 12px;
font-weight: 400;
color: #f56c6c;
margin-top: 10px;
}
.noapp {
color: #f56c6c;
}
.reapp {
font-size: 12px;
font-weight: 400;
color: #667eea;
margin-top: 10px;
cursor: pointer !important;
}
.smallTitle{
font-size: 14px;
font-weight: 600;
color: #83858a;
margin-bottom: 10px;
}
</style> </style>

View File

@ -32,9 +32,9 @@
<i class="el-icon-plus"></i> 添加{{ searchData.radioType === '1' || searchData.radioType === '3' ? <i class="el-icon-plus"></i> 添加{{ searchData.radioType === '1' || searchData.radioType === '3' ?
'需求' : '商品' }} '需求' : '商品' }}
</el-button> --> </el-button> -->
<!-- <el-button style="margin-left: 10px;" size="mini" @click="exportAllData"> <el-button style="margin-left: 10px;" size="mini" @click="getTableData('1')">
<i class="el-icon-upload2"></i> 全部导出 <i class="el-icon-upload2"></i> 全部导出
</el-button> --> </el-button>
</div> </div>
<el-table size="mini" border height="calc(100vh - 210px)" v-loading="loading" :data="tableData" <el-table size="mini" border height="calc(100vh - 210px)" v-loading="loading" :data="tableData"
style="width: 100%;border:1px solid #ccc;" element-loading-text="加载中..." style="width: 100%;border:1px solid #ccc;" element-loading-text="加载中..."
@ -336,8 +336,8 @@ export default {
}, },
exportData(row) { exportData(row) {
let ploay = { let ploay = {
// ids: [row.id] ids: [row.id]
ids:["fYHuG9eXwLi7949Rg9mRg", "vTv8KuqfDhT1efC8prs9y"] // ids:["fYHuG9eXwLi7949Rg9mRg", "vTv8KuqfDhT1efC8prs9y"]
} }
reqExportProduct(ploay).then(res => { reqExportProduct(ploay).then(res => {
console.log(res); console.log(res);
@ -388,7 +388,7 @@ export default {
this.closeEditDialog(); this.closeEditDialog();
this.getTableData(); // this.getTableData(); //
}, },
getTableData() { getTableData(to_excel) {
// //
if (this.searchDate && this.searchDate.length === 2) { if (this.searchDate && this.searchDate.length === 2) {
this.searchData.start_date = this.searchDate[0]; this.searchData.start_date = this.searchDate[0];
@ -401,6 +401,25 @@ export default {
console.log("searchData", this.searchData); console.log("searchData", this.searchData);
this.loading = true; this.loading = true;
if(to_excel==='1'){
this.searchData.to_excel=to_excel
reqSearchByMangement({url_link:window.location.href,to_excel:to_excel,publish_type:this.searchData.publish_type}).then(res => {
console.log(res);
if (res.status) {
// Workbook
const wb = XLSX.utils.book_new();
// sheet
const ws1 = XLSX.utils.json_to_sheet(res.data);
XLSX.utils.book_append_sheet(wb, ws1, 'sheet1');
// Excel
XLSX.writeFile(wb, '产品列表.xlsx');
}
}).catch(error => {
console.error('获取数据失败:', error);
}).finally(() => {
this.loading = false;
})
}else{
reqSearchByMangement(this.searchData).then(res => { reqSearchByMangement(this.searchData).then(res => {
console.log(res); console.log(res);
if (res.status) { if (res.status) {
@ -412,6 +431,8 @@ export default {
}).finally(() => { }).finally(() => {
this.loading = false; this.loading = false;
}) })
}
}, },
// //
handleSizeChange(val) { handleSizeChange(val) {

View File

@ -0,0 +1,28 @@
<template>
<div>
<qualificationBox :approveInfo="approveInfo"></qualificationBox>
</div>
</template>
<script>
import qualificationBox from '../qualificationBox/index.vue';
export default {
name: 'apprvedInfo',
components: {
qualificationBox
},
data() {
return {
approveInfo:{
audit_status:"approved,rejected",
}
}
},
created(){
this.initData()
},
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,13 @@
<template>
<div>
<router-view></router-view>
</div>
</template>
<script>
export default {
name: 'qualificationReview',
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,28 @@
<template>
<div>
<qualificationBox :approveInfo="approveInfo"></qualificationBox>
</div>
</template>
<script>
import qualificationBox from '../qualificationBox/index.vue';
export default {
name: 'noApproveInfo',
components: {
qualificationBox
},
data() {
return {
approveInfo:{
audit_status:"pending",
}
}
},
created() {
},
}
</script>

View File

@ -0,0 +1,379 @@
<template>
<div>
<el-table
:data="tableData"
style="width: 100%">
<el-table-column
prop="date"
label="图片"
width="180">
<template slot-scope="scope">
<el-image v-if="scope.row.license_original_img" :src="scope.row.license_original_img "
style="width: 80px; height: 60px;border: 1px solid #ccc;border-radius: 6px;"
:preview-src-list="[scope.row.license_original_img]"
fit="cover" :initial-index="0" preview-teleported :z-index="3000">
</el-image>
<span v-else>/</span>
</template>
</el-table-column>
<el-table-column
prop="contact_name"
label="联系人"
min-width="180">
</el-table-column>
<el-table-column
prop="mobile_phone"
label="联系电话"
min-width="180">
</el-table-column>
<el-table-column
prop="email"
label="邮箱"
min-width="180">
</el-table-column>
<el-table-column
prop="telephone"
label="公共电话"
min-width="180">
</el-table-column>
<el-table-column
prop="audit_status"
label="审核状态"
min-width="180">
<template slot-scope="scope">
<el-tag :type="getStatusType(scope.row.audit_status)">
{{ getStatusText(scope.row.audit_status) }}
</el-tag>
</template>
</el-table-column>
<el-table-column
prop="address"
label="操作"
fixed="right"
width="180">
<template slot-scope="scope">
<el-button type="text" @click="handleAudit(scope.row)" size="small">审核</el-button>
</template>
</el-table-column>
</el-table>
<!-- 预览对话框 -->
<el-dialog title="审批信息预览" :visible.sync="previewVisible" top="3vh" width="60%"
:before-close="handlePreviewClose">
<div class="preview-content">
<el-descriptions :column="2" border>
<el-descriptions-item label="账号类型">
{{ getAccountTypeText(approveForm.account_type) }}
</el-descriptions-item>
<el-descriptions-item label="公司名称">
{{ approveForm.company_name }}
</el-descriptions-item>
<el-descriptions-item label="执照号码">
{{ approveForm.license_number }}
</el-descriptions-item>
<!-- <el-descriptions-item label="审核状态1">
<el-tag :type="getStatusType(approveForm.audit_status)">
{{ getStatusText(approveForm.audit_status) }}
</el-tag>
</el-descriptions-item> -->
<el-descriptions-item label="办公地址">
{{ approveForm.office_address }}
</el-descriptions-item>
<el-descriptions-item label="注册地址">
{{ approveForm.registered_address }}
</el-descriptions-item>
<el-descriptions-item label="联系人">
{{ approveForm.contact_name }}
</el-descriptions-item>
<el-descriptions-item label="联系电话">
{{ approveForm.mobile_phone }}
</el-descriptions-item>
<el-descriptions-item label="邮箱地址">
{{ approveForm.email }}
</el-descriptions-item>
</el-descriptions>
<div class="preview-images">
<div class="preview-image" >
<h4>营业执照正本</h4>
<el-image :src="approveForm.license_original_img "
class="preview-license-img"
:preview-src-list="[approveForm.license_original_img]"
fit="cover" :initial-index="0" preview-teleported :z-index="3000">
</el-image>
</div>
</div>
</div>
<span slot="footer" class="dialog-footer">
<el-button size="mini" @click="previewVisible = false"> </el-button>
<el-button size="mini" type="danger" @click="handleReject">审核不通过</el-button>
<el-button size="mini" type="success" @click="handleApprove">审核通过</el-button>
</span>
</el-dialog>
<!-- 驳回理由输入弹窗 -->
<el-dialog title="审核退回" :visible.sync="rejectDialogVisible" width="40%" @close="handleRejectDialogClose">
<el-form :model="rejectForm" :rules="rejectRules" ref="rejectForm">
<el-form-item label="驳回原因" prop="reject_reason" :label-width="formLabelWidth">
<el-input
v-model="rejectForm.reject_reason"
type="textarea"
:rows="4"
placeholder="请输入驳回原因"
maxlength="500"
show-word-limit>
</el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="rejectDialogVisible = false"> </el-button>
<el-button type="primary" @click="confirmReject" :loading="rejectLoading"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { reqEnterpriseUpdate,reqApproveUserSearch } from '@/api/ncmatch';
export default {
name: 'qualificationBox',
data() {
return {
current_page:1,
page_size:10,
total:0,
approveForm:{},
previewVisible: false,
rejectDialogVisible: false,
rejectLoading: false,
formLabelWidth: '120px',
rejectForm: {
reject_reason: ''
},
rejectRules: {
reject_reason: [
{ required: true, message: '请输入驳回原因', trigger: 'blur' },
{ min: 5, max: 500, message: '驳回原因长度在 5 到 500 个字符', trigger: 'blur' }
]
},
tableData: []
}
},
props:{
approveInfo:{
type:Object,
default:()=>{}
}
},
created(){
this.initData()
},
methods: {
initData(){
let ploay = {
current_page:this.current_page,
page_size:this.page_size,
audit_status:this.approveInfo.audit_status,
url_link:window.location.href,
}
reqApproveUserSearch(ploay).then(res=>{
if(res.status){
this.tableData = res.data
this.total = res.data.total_count
this.tableData = res.data.data
}else{
this.$message.error(res.msg || '加载失败,请重试');
}
})
},
handleAudit(row) {
console.log(row)
this.previewVisible = true
this.approveForm = row
},
//
handleApprove() {
this.$confirm('确认审核通过该资格申请吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.approveQualification();
}).catch(() => {
this.$message.info('已取消操作');
});
},
//
handleReject() {
this.rejectDialogVisible = true;
//
this.rejectForm.reject_reason = this.approveForm.reject_reason || '';
//
this.$nextTick(() => {
if (this.$refs.rejectForm) {
this.$refs.rejectForm.clearValidate();
}
});
},
//
confirmReject() {
this.$refs.rejectForm.validate((valid) => {
if (valid) {
this.rejectQualification();
}
});
},
//
approveQualification() {
// API
const params = {
id: this.approveForm.id,
audit_status: 'approved'
};
console.log("审核通过",params)
reqEnterpriseUpdate(params).then(res=>{
if(res.status){
this.$message.success('审核通过成功');
this.initData()
this.previewVisible = false;
this.refreshTable();
this.initData();
}else{
this.$message.error(res.msg || '审核失败,请重试');
}
}).catch(err=>{
this.$message.error('审核失败,请重试');
})
// API使API
// API
// this.$api.qualification.approve(params).then(res => {
// if (res.status) {
// this.$message.success('');
// this.previewVisible = false;
// this.refreshTable();
// } else {
// this.$message.error(res.msg || '');
// }
// }).catch(err => {
// this.$message.error('');
// });
},
//
rejectQualification() {
this.rejectLoading = true;
const params = {
id: this.approveForm.id,
audit_status: 'rejected',
reject_reason: this.rejectForm.reject_reason
};
console.log("审核驳回",params)
reqEnterpriseUpdate(params).then(res=>{
if(res.status){
this.rejectLoading = false;
this.$message.success('审核驳回成功');
this.rejectDialogVisible = false;
this.previewVisible = false;
this.initData();
}else{
this.$message.error(res.msg || '审核失败,请重试');
}
}).catch(err=>{
this.$message.error('审核失败,请重试');
})
// API
// this.$api.qualification.reject(params).then(res => {
// this.rejectLoading = false;
// if (res.status) {
// this.$message.success('');
// this.rejectDialogVisible = false;
// this.previewVisible = false;
// this.refreshTable();
// } else {
// this.$message.error(res.msg || '');
// }
// }).catch(err => {
// this.rejectLoading = false;
// this.$message.error('');
// });
},
//
refreshTable() {
//
console.log('刷新表格数据');
},
//
handleRejectDialogClose() {
this.rejectDialogVisible = false;
this.rejectForm.reject_reason = '';
//
this.$nextTick(() => {
if (this.$refs.rejectForm) {
this.$refs.rejectForm.clearValidate();
}
});
},
//
handlePreviewClose() {
this.previewVisible = false;
},
//
getAccountTypeText(type) {
const typeMap = {
'enterprise': '企业账号',
'personal': '个人账号',
'government': '政府机构'
};
return typeMap[type] || '未知';
},
//
getStatusType(status) {
const statusMap = {
'pending': 'warning',
'approved': 'success',
'rejected': 'danger',
'processing': 'info'
};
return statusMap[status] || 'info';
},
//
getStatusText(status) {
const statusMap = {
'pending': '待审核',
'approved': '已通过',
'rejected': '已拒绝',
'processing': '审核中'
};
return statusMap[status] || '未知';
},
}
}
</script>
<style scoped lang="less">
.preview-license-img{
width: 300px;
height: 200px;
border-radius: 16px;
border: 1px solid #ccc;
transition: transform 0.3s ease;
&:hover{
box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1);
transform: translateY(-3px);
transition: transform 0.3s ease;
}
}
</style>

View File

@ -1,7 +1,8 @@
<template> <template>
<div class="top-nav"> <div class="top-nav">
<div id="topContainer" class="container"> <div id="topContainer" class="container" :class="{ 'ncmatch-layout': homePath === '/ncmatchHome/index' }">
<div class="logo"> <!-- 当homePath不等于/ncmatchHome/index时显示logo和导航 -->
<div class="logo" v-if="homePath !== '/ncmatchHome/index'">
<img v-if="JSON.stringify(logoInfoNew)!=='{}'" @click="$router.push(homePath)" <img v-if="JSON.stringify(logoInfoNew)!=='{}'" @click="$router.push(homePath)"
style="cursor:pointer;margin-right: 71px" class="logoImg" style="cursor:pointer;margin-right: 71px" class="logoImg"
:src=" logoInfoNew.home.logoImg || '' " :src=" logoInfoNew.home.logoImg || '' "
@ -29,6 +30,78 @@
</nav> </nav>
</div> </div>
<!-- 当homePath等于/ncmatchHome/index时的布局 -->
<div class="logo" v-else>
<!-- 登录状态用户头像在最左侧 -->
<el-dropdown v-if="loginState" @visible-change="handleShow"
class="avatar-container left-menu-item hover-effect nick-name-style"
style="margin-right: 0"
trigger="click">
<div class="avatar-wrapper">
<i
style="font-size: 18px; color: #262626;font-weight: 400;cursor: pointer;display: flex;justify-content: flex-start;align-items: center">
<div class="imgUser">{{ nick_name.charAt(0) }}</div>
{{ nick_name }}
<i id="resverIcon" class="el-icon-arrow-up el-icon--right resverIcon"></i>
</i>
</div>
<el-dropdown-menu slot="dropdown" style="width: 230px;font-size: 16px;" divided>
<div
style="display: flex;flex-direction: column;padding:15px 15px;background-color: #f0f2f5">
<span style="font-weight: bold;font-size: 20px;margin-bottom: 5px;color: #333333">{{ nick_name }}</span>
<span
style="font-size: 12px;color:#666;display: flex;justify-content:flex-start;align-items: center"> ID: <span
ref="contentToCopy">
{{
userId
}}
</span>
<svg
@click="copyBtn"
class="copy-btn"
viewBox="0 0 1024 1024"
xmlns="http://www.w3.org/2000/svg"
width="12"
height="12"
style="fill: #1019ab;"
>
<path
d="M394.666667 106.666667h448a74.666667 74.666667 0 0 1 74.666666 74.666666v448a74.666667 74.666667 0 0 1-74.666666 74.666667H394.666667a74.666667 74.666667 0 0 1-74.666667-74.666667V181.333333a74.666667 74.666667 0 0 1 74.666667-74.666666z m0 64a10.666667 10.666667 0 0 0-10.666667 10.666666v448a10.666667 10.666667 0 0 0 10.666667 10.666667h448a10.666667 10.666667 0 0 0 10.666666-10.666667V181.333333a10.666667 10.666667 0 0 0-10.666666-10.666666H394.666667z m245.333333 597.333333a32 32 0 0 1 64 0v74.666667a74.666667 74.666667 0 0 1-74.666667 74.666666H181.333333a74.666667 74.666667 0 0 1-74.666666-74.666666V394.666667a74.666667 74.666667 0 0 1 74.666666-74.666667h74.666667a32 32 0 0 1 0 64h-74.666667a10.666667 10.666667 0 0 0-10.666666 10.666667v448a10.666667 10.666667 0 0 0 10.666666 10.666666h448a10.666667 10.666667 0 0 0 10.666667-10.666666v-74.666667z"
p-id="1521"></path>
</svg>
</span>
</div>
<el-divider style="margin: 0!important;"></el-divider>
<div
v-if="role.includes('客户')"
style="padding: 0 18px; width: 100%;height: 60px;display: flex;justify-content: space-between;align-items: center">
<span style="color:#666;display: block;font-size: 14px;"
class="moneyNow"><span style="display: block;margin-bottom: 5px">余额</span>{{
mybalance ? mybalance : initMybalance()
}} </span>
<el-button v-if="!isShowKbossCharge" type="primary" @click="$router.push('/kbossCharge')" plain
style="padding: 8px; ">
充值
</el-button>
</div>
<el-dropdown-item v-if="role.includes('客户')"
@click.native="$router.push('/customer/customerInformation')">
<span style="display: block">个人中心</span>
</el-dropdown-item>
<el-dropdown-item @click.native="logout">
<span style="display: block">退出登录</span>
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<!-- 公司名称在中间 -->
<div class="company-name" @click="$router.push(homePath)" style="cursor:pointer;font-size: 24px;font-weight: bold;color: #222F60;margin: 0 auto;">
{{ (logoInfoNew.home && logoInfoNew.home.orgName) || '' }}
</div>
</div>
<div class="user-area"> <div class="user-area">
<a @click="goB" v-if="loginState" class="login-btn">控制台</a> <a @click="goB" v-if="loginState" class="login-btn">控制台</a>
@ -46,7 +119,7 @@
<!-- <span style="text-decoration: underline; text-decoration-color: #1b5bff" v-if="!showRegisterButton">{{--> <!-- <span style="text-decoration: underline; text-decoration-color: #1b5bff" v-if="!showRegisterButton">{{-->
<!-- username--> <!-- username-->
<!-- }}</span>--> <!-- }}</span>-->
<el-dropdown v-if="loginState " @visible-change="handleShow" <el-dropdown v-if="loginState && homePath !== '/ncmatchHome/index'" @visible-change="handleShow"
class="avatar-container right-menu-item hover-effect nick-name-style" class="avatar-container right-menu-item hover-effect nick-name-style"
style="margin-right: 0" style="margin-right: 0"
trigger="click"> trigger="click">
@ -202,7 +275,6 @@ import {mapGetters, mapState} from "vuex";
import {getLogoAPI, getUserInfoAPI} from "@/api/login"; import {getLogoAPI, getUserInfoAPI} from "@/api/login";
import {reqApplyChannel} from "@/api/customer/channel"; import {reqApplyChannel} from "@/api/customer/channel";
import store from "@/store"; import store from "@/store";
import { windows } from 'codemirror/src/util/browser';
import { getHomePath } from '@/views/setting/tools' import { getHomePath } from '@/views/setting/tools'
export default Vue.extend({ export default Vue.extend({
name: "TopBox", name: "TopBox",
@ -226,6 +298,7 @@ export default Vue.extend({
} }
}, },
created() { created() {
this.homePath = getHomePath()
if (sessionStorage.getItem('userId')) { if (sessionStorage.getItem('userId')) {
this.$store.commit('setLoginState', true); // Vuex this.$store.commit('setLoginState', true); // Vuex
} }
@ -986,4 +1059,41 @@ export default Vue.extend({
background: #081020; background: #081020;
color: white; color: white;
} }
.company-name {
font-size: 24px;
font-weight: bold;
color: #222F60;
cursor: pointer;
transition: color 0.3s ease;
&:hover {
color: #1E6FFF;
}
}
/* 当homePath等于/ncmatchHome/index时的特殊样式 */
.top-nav .container {
&.ncmatch-layout {
.logo {
flex: 1;
justify-content: space-between;
align-items: center;
}
.user-area {
justify-content: flex-end;
flex-shrink: 0;
}
}
}
/* 左侧用户头像样式 */
.left-menu-item {
.avatar-wrapper {
i {
justify-content: flex-start !important;
}
}
}
</style> </style>

View File

@ -1,6 +1,6 @@
<script> <script>
import Vue from 'vue' import Vue from 'vue'
import { reqPublishProductSearchFirstPage, reqEnterpriseAuditInfoSearch } from '@/api/ncmatch' import { reqPublishProductSearchFirstPage, reqEnterpriseAuditInfoSearch, reqHomepageProductCategory, reqGetSupplyAndDemandSquareList } from '@/api/ncmatch'
import { mapGetters, mapState } from "vuex"; import { mapGetters, mapState } from "vuex";
export default Vue.extend({ export default Vue.extend({
name: "mainPage", name: "mainPage",
@ -11,10 +11,13 @@ export default Vue.extend({
menuAside: () => import('./menuAside/index.vue') menuAside: () => import('./menuAside/index.vue')
}, },
created() { created() {
this.init_product_list() this.getHomepageProductCategory()
}, },
data() { data() {
return { return {
boxLoading:false,
selectedCategory: "",
showTip: false, showTip: false,
total: 0, total: 0,
publish_type: null, publish_type: null,
@ -144,6 +147,20 @@ export default Vue.extend({
}, },
methods: { methods: {
getHomepageProductCategory() {
reqHomepageProductCategory({
url_link: window.location.href,
publish_type: "1"
}).then(res => {
if (res.status) {
this.categories = res.data
this.product = res.data
this.currentHotMenu = res.data[0].id
this.selectedCategory = res.data[0].id
this.initData()
}
})
},
goInfo() { goInfo() {
this.showTip = false this.showTip = false
this.$router.push('/customer/approve') this.$router.push('/customer/approve')
@ -151,7 +168,8 @@ export default Vue.extend({
}, },
handleCurrentChange(val) { handleCurrentChange(val) {
this.current_page = val this.current_page = val
this.init_product_list() this.initData()
// this.init_product_list()
}, },
sendInfo(type) { sendInfo(type) {
if (this.loginState) { if (this.loginState) {
@ -171,6 +189,31 @@ export default Vue.extend({
this.$router.push('/login') this.$router.push('/login')
} }
}, },
initData() {
this.boxLoading = true
let ploay = {
product_category: this.selectedCategory,
to_page: "first_page",
url_link: window.location.href,
page_size: this.page_size,
current_page: this.current_page,
publish_type: "1"
}
reqGetSupplyAndDemandSquareList(ploay).then(res => {
this.boxLoading = false
if (res.status) {
if (res.data.length === 0) {
this.hotProductList = []
this.total = 0
} else {
this.hotProductList = res.data[0].product_list
this.total = res.data[0].total_count
}
}
})
},
init_product_list() { init_product_list() {
reqPublishProductSearchFirstPage({ publish_type: "1", url_link: window.location.href, to_page: 'first_page', page_size: this.page_size, current_page: this.current_page, product_type: this.currentHotMenu }).then(res => { reqPublishProductSearchFirstPage({ publish_type: "1", url_link: window.location.href, to_page: 'first_page', page_size: this.page_size, current_page: this.current_page, product_type: this.currentHotMenu }).then(res => {
if (res.status) { if (res.status) {
@ -191,7 +234,9 @@ export default Vue.extend({
clickNetMenu(menu) { clickNetMenu(menu) {
this.current_page = 1 this.current_page = 1
this.currentHotMenu = menu.id; this.currentHotMenu = menu.id;
this.hotProductList = menu.product_list || []; this.selectedCategory = menu.id
this.initData()
// this.hotProductList = menu.product_list || [];
}, },
handleSearch() { handleSearch() {
console.log('搜索:1', this.searchKeyword) console.log('搜索:1', this.searchKeyword)
@ -253,12 +298,12 @@ export default Vue.extend({
<li v-for="menu in product" :class="currentHotMenu === menu.id ? 'activeMenu' : ''" @click="clickNetMenu(menu)" <li v-for="menu in product" :class="currentHotMenu === menu.id ? 'activeMenu' : ''" @click="clickNetMenu(menu)"
:key="menu.name"> :key="menu.name">
<!-- <img :src="currentHotMenu === menu.id ? menu.activeIcon : menu.icon" alt="" /> --> <!-- <img :src="currentHotMenu === menu.id ? menu.activeIcon : menu.icon" alt="" /> -->
<span class="tab-text">{{ menu.name }}</span> <span class="tab-text">{{ menu.product_category }}</span>
</li> </li>
</ul> </ul>
<productCard :productList="hotProductList"></productCard> <productCard v-loading="boxLoading" :productList="hotProductList"></productCard>
<el-pagination style="background-color: white;" @current-change="handleCurrentChange" :page-size="page_size" <el-pagination style="background-color: white;" @current-change="handleCurrentChange" :page-size="page_size"
layout="total, prev, pager, next" :total="total"> layout="total, prev, pager, next" :total="total">
</el-pagination> </el-pagination>
@ -271,7 +316,8 @@ export default Vue.extend({
<span>您还没有完善企业信息完善企业信息审核通过后您可以发布需求与商品</span> <span>您还没有完善企业信息完善企业信息审核通过后您可以发布需求与商品</span>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<span> <span style="margin-right: 10px;"> 跳转到</span> <el-button size="small" type="primary" @click="goInfo">信息完善</el-button></span> <span> <span style="margin-right: 10px;"> 跳转到</span> <el-button size="small" type="primary"
@click="goInfo">信息完善</el-button></span>
</span> </span>
</el-dialog> </el-dialog>
</div> </div>

View File

@ -19,7 +19,7 @@
<span class="mylabel"> <span v-if="productDetailInfo.publish_type === '1' ">商品价格</span> <span <span class="mylabel"> <span v-if="productDetailInfo.publish_type === '1' ">商品价格</span> <span
v-else>预期价格</span></span> v-else>预期价格</span></span>
<span class="value">{{ productDetailInfo.discount_price }}</span> --> <span class="value">{{ productDetailInfo.discount_price }}</span> -->
</li> <!-- </li> -->
<li class="info-item" style="margin:5px 0;"> <li class="info-item" style="margin:5px 0;">
<span class="mylabel">所属类别</span> <span class="mylabel">所属类别</span>
<span class="value">{{ productDetailInfo.product_category }}</span> <span class="value">{{ productDetailInfo.product_category }}</span>

View File

@ -0,0 +1,60 @@
<template>
<div>
<el-button size="small" style="margin-bottom: 5px;" type="primary" @click="getTableData('1')">
<i class="el-icon-upload2"> </i>
全部导出</el-button>
<el-table border :data="tableData" style="width: 100%">
<el-table-column prop="name" label="姓名" min-width="180">
</el-table-column>
<el-table-column prop="phone" label="手机号" min-width="180">
</el-table-column>
<el-table-column prop="email" label="邮箱" min-width="180">
</el-table-column>
<el-table-column prop="content" label="内容" min-width="180">
</el-table-column>
<el-table-column prop="create_time" label="创建时间" min-width="180">
</el-table-column>
<el-table-column prop="update_time" label="更新时间" min-width="180">
</el-table-column>
</el-table>
</div>
</template>
<script>
import { reqSearchUserInquiry } from '@/api/ncmatch'
import XLSX from 'xlsx'
export default {
name: 'ConsultingMangement',
data() {
return {
tableData: []
}
},
created() {
this.getTableData('0')
},
methods: {
getTableData(to_excel) {
reqSearchUserInquiry({ url_link: window.location.href, to_excel: to_excel }).then(res => {
console.log(res)
if (res.status) {
if (to_excel === '0') {
this.tableData = res.data
} else if (to_excel === '1') {
// Workbook
const wb = XLSX.utils.book_new();
// sheet
const ws1 = XLSX.utils.json_to_sheet(res.data);
XLSX.utils.book_append_sheet(wb, ws1, 'sheet1');
// Excel
XLSX.writeFile(wb, '咨询列表.xlsx');
this.$message.success('导出成功')
}
}
})
}
}
}
</script>
<style scoped></style>