2025-05-29 17:13:58 +08:00

475 lines
12 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<el-dialog v-model="dialogVisible" :close-on-click-modal="false" custom-class="custom-inquiry-dialog" width="450px">
<div class="info-section">
<div class="info-item">
<span class="label">首选商家:</span>
<span class="value">{{ diodescription }}</span>
</div>
<div class="info-item">
<span class="label">选择服务:</span>
<span class="value">{{ diotext }}</span>
</div>
</div>
<el-form ref="formRef" :model="form" label-position="top">
<el-form-item label="需求量:" prop="quantity" :rules="[{ required: true, message: '请输入重量' }]">
<el-input v-model="form.quantity" placeholder="请输入重量kg">
<template #suffix>kg</template>
</el-input>
</el-form-item>
<el-form-item label="您的称呼:" prop="name" :rules="[{ required: true, message: '请输入您的称呼' }]">
<el-input v-model="form.name" placeholder="请输入您的称呼" />
</el-form-item>
<el-form-item
label="您的电话:"
prop="phone"
:rules="[
{ required: true, message: '请输入电话' },
{ pattern: /^1[3-9]\d{9}$/, message: '手机号格式错误' },
]"
>
<el-input v-model="form.phone" placeholder="请输入电话号码" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button class="cancel-btn" @click="dialogVisible = false">取消</el-button>
<el-button class="submit-btn" type="primary" @click="handleSubmit">发送询价</el-button>
</div>
</template>
</el-dialog>
<!-- <page-layout :menus="state.menus"> </page-layout>-->
<section>
<common>
<template #main>
<el-card shadow="none" style="border-radius: 14px; height: 200px">
<div class="tabs">
<div class="tab cursor">
<div class="tab_list">塑料类包装</div>
<div
v-for="(item, index) in tab1"
:key="index"
class="tab_list_li"
:class="{ active: currentTab1 === index }"
@click.stop="currentTab1 = index"
>
{{ item }}
</div>
</div>
<div class="tab cursor">
<div class="tab_list">纸类包装</div>
<div
v-for="(item, index) in tab2"
:key="index"
class="tab_list_li"
:class="{ active: currentTab2 === index }"
@click.stop="currentTab2 = index"
>
{{ item }}
</div>
</div>
<div class="tab cursor">
<div class="tab_list">金属类包装</div>
<div
v-for="(item, index) in tab3"
:key="index"
class="tab_list_li"
:class="{ active: currentTab3 === index }"
@click.stop="currentTab3 = index"
>
{{ item }}
</div>
</div>
</div>
</el-card>
<el-row :gutter="20" style="margin-top: 10px">
<el-col v-for="(item, index) in state.data" :key="index" :span="12">
<el-card class="storage-card" shadow="hover">
<div class="storage-content">
<div class="storage-content-top" @click="toLink(item)">
<img :src="getAssetsFile(`${item.imageUrl}`)" fit="cover" class="storage-image" />
<div class="storage-info">
<h3 class="storage-title">{{ item.title }}</h3>
<div class="storage-desc">
<span>{{ item.description }}</span>
<img :src="getAssetsFile('images/warehouseLogistics/认证.png')" alt="" style="width: 20px" />
<img :src="getAssetsFile('images/warehouseLogistics/优先级.png')" alt="" style="width: 20px" />
</div>
<div class="storage-tags">
<el-tag effect="plain" round style="background-color: rgba(37, 191, 130, 0.2); color: #25bf82">高品质</el-tag>
<el-tag effect="plain" round style="background-color: rgba(37, 191, 130, 0.2); color: #25bf82">食品级</el-tag>
<el-tag effect="plain" round style="background-color: rgba(37, 191, 130, 0.2); color: #25bf82">塑料</el-tag>
</div>
<div class="storage-location">
<el-icon><Location /></el-icon>
{{ item.location }}
</div>
</div>
</div>
<div class="storage-price">
<div class="storage-price-left">
<span class="price-label">报价</span>
<span class="price-amount">¥{{ item.price }}/m</span>
</div>
<el-button type="success" class="contact-btn" @click="goDei(item)">
<img :src="getAssetsFile('images/warehouseLogistics/messageBox.png')" alt="" style="height: 30px; margin-right: 5px" />
<span>联系卖家</span>
</el-button>
</div>
<div v-if="item.rank" class="rank-badge">
<!-- {{ item.rank }}-->
<img :src="getAssetsFile('images/warehouseLogistics/top' + item.rank + '.png')" alt="" style="width: 80px" />
</div>
</div>
</el-card>
</el-col>
</el-row>
<page-pagination :total="6" @current-change="currentChange" />
</template>
</common>
</section>
</template>
<script setup name="page-menu">
import { ref, reactive, watch } from 'vue';
import { getAssetsFile } from '@/utils';
import { useRoute, useRouter } from 'vue-router';
import warehouseLogisticsRoutes from '@/router/modules/warehouseLogistics';
import Common from './components/common.vue';
const route = useRoute();
const router = useRouter();
const tab1 = reactive(['塑料类薄膜袋', '塑料瓶/壶', '塑料桶', '塑料盒', '塑料箱', '其他塑料包装制品']);
const tab2 = reactive(['纸盒', '纸箱', '纸袋', '其他纸类包装容器']);
const tab3 = reactive(['金属罐', '金属桶', '金属盒', '其他金属类包装容器']);
const state = reactive({
menus: warehouseLogisticsRoutes[0].children,
query: {
current: 1,
},
data: [
{
imageUrl: 'images/film.png',
title: '薄膜包装服务',
description: '薄膜包装有限公司 ',
location: '临沧市-耿马县',
price: '3',
rank: '1',
},
{
imageUrl: 'images/plastics.png',
title: '塑料袋包装服务',
description: '塑料包装有限公司',
location: '临沧市-耿马县',
price: '150',
rank: '2',
},
{
imageUrl: 'images/carton.png',
title: '纸盒包装服务',
description: '保和纸盒包装厂',
location: '临沧市-耿马县',
price: '5',
rank: '3',
},
{
imageUrl: 'images/metal.png',
title: '金属罐包装服务',
description: '金属罐头厂',
location: '临沧市-耿马县',
price: '8',
rank: '',
},
],
});
const currentTab1 = ref(0);
const currentTab2 = ref(0);
const currentTab3 = ref(0);
const dialogVisible = ref(false);
const formRef = ref(null);
const form = reactive({
quantity: '',
title: '',
phone: '',
name: '',
});
const diotext = ref('');
const diodescription = ref('');
const goDei = (data) => {
diodescription.value = data.description;
diotext.value = data.title;
dialogVisible.value = true;
};
const handleSubmit = () => {
formRef.value.validate((valid) => {
if (valid) {
console.log('提交数据:', form);
dialogVisible.value = false;
}
});
};
const currentChange = (current) => {
state.query.current = current;
};
const toLink = (row) => {
// router.push({
// path: '/sub-operation-service/warehouse-detail',
// query: { id: row?.id ?? '100' },
// });
};
</script>
<style lang="scss" scoped>
// 基础颜色配置
$primary-color: #25bf82; // 主色调
$text-dark: #25bf82; // 深色文字
$text-regular: #606266; // 常规文字
$border-color: #dcdfe6; // 边框颜色
// 弹窗整体样式
:deep(.custom-inquiry-dialog) {
border-radius: 8px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
.el-dialog__header {
padding: 20px;
border-bottom: 1px solid #f2f6fc;
.el-dialog__title {
font-size: 18px;
color: $text-dark;
font-weight: 600;
}
}
.el-dialog__body {
padding: 20px 28px;
}
.el-form-item__label {
color: $text-regular;
font-size: 14px;
padding-bottom: 6px;
}
}
.info-section {
padding: 0px 50px;
margin-bottom: 24px;
.info-item {
margin-bottom: 12px;
.label {
color: $text-regular;
margin-right: 8px;
font-size: 20px;
}
.value {
color: $text-dark;
font-weight: 500;
font-size: 20px;
}
}
}
// 输入框样式覆盖
:deep(.el-input) {
.el-input__inner {
height: 40px;
line-height: 40px;
border-radius: 4px;
&:focus {
border-color: $primary-color;
}
}
.el-input__suffix {
color: $text-regular;
right: 12px;
}
}
// 下拉菜单样式
:deep(.custom-select-dropdown) {
.el-select-dropdown__item {
color: $text-regular;
&.selected {
color: $primary-color;
}
}
}
// 按钮组样式
.dialog-footer {
text-align: right;
.el-button {
padding: 10px 24px;
border-radius: 4px;
font-size: 14px;
}
.cancel-btn {
color: $text-regular;
&:hover {
color: $primary-color;
border-color: $primary-color;
}
}
.submit-btn {
color: #fff;
background: $primary-color;
&:hover {
background: mix($primary-color, #fff, 85%);
}
}
}
.tabs {
height: 160px;
line-height: 50px;
display: flex;
flex-direction: column;
font-size: 18px;
align-items: flex-start;
justify-content: space-between;
padding: 0 20px;
}
.tab {
height: 100px;
width: 850px;
display: flex;
align-items: center;
justify-content: flex-start;
overflow-x: auto;
overflow: auto; /* 启用滚动 */
white-space: nowrap; /* 强制单行显示 */
-ms-overflow-style: none; /* IE/Edge 兼容 */
scrollbar-width: none; /* 隐藏滚动条 */
.tab_list {
color: #999999;
font-size: 20px;
font-weight: 400;
}
.tab_list_li {
margin-left: 40px;
color: #000000;
font-size: 20px;
font-weight: 400;
}
.tab_list_li.active {
color: rgba(37, 191, 130, 1);
}
}
.cursor {
cursor: pointer;
}
.active {
color: rgba(37, 191, 130, 1);
}
.storage-card {
position: relative;
overflow: hidden;
margin-bottom: 20px;
border: 0;
border-radius: 24px;
}
.storage-content {
@include flex-column;
gap: 16px;
&-top {
@include flex-row;
align-items: center;
}
}
.storage-image {
margin-right: 16px;
width: 120px;
height: 120px;
border-radius: 8px;
object-fit: cover;
}
.storage-info {
padding-right: 50px;
flex: 1;
cursor: pointer;
}
.storage-title,
.storage-desc,
.storage-tags,
.storage-location {
overflow: hidden;
margin: 10px 0;
width: 100%;
text-align: left;
}
.storage-title {
font-size: 20px;
font-weight: 700;
color: #000000;
@include ellipsis;
}
.storage-desc {
font-size: 16px;
color: #999999;
@include ellipsis;
i {
display: inline-block;
width: 20px;
height: 20px;
}
}
.storage-tags {
span {
margin-right: 10px;
}
}
.storage-location {
display: flex;
align-items: center;
font-size: 16px;
font-weight: 400;
color: #000000;
}
.storage-price {
display: flex;
justify-content: space-between;
align-items: center;
&-left {
color: #25bf82;
}
}
.price-label {
margin-right: 10px;
font-size: 16px;
color: #999999;
}
.price-amount {
font-size: 20px;
font-weight: 700;
color: #25bf82;
}
.contact-btn {
width: 152px;
height: 48px;
font-size: 20px;
border-radius: 8px;
background: #25bf82 !important;
:deep(.el-icon) {
margin-right: 10px;
}
}
.rank-badge {
position: absolute;
top: 0;
right: 20px;
width: 80px;
height: 80px;
}
</style>