浏览代码

帮助中心

weixin_52219567 1 周之前
父节点
当前提交
6f392ac003

+ 2 - 2
src/permission.ts

@@ -33,7 +33,8 @@ const whiteList = [
   '/indexDiy',
   '/indexMroDiy',
   '/indexFuliDiy',
-  '/indexDataDiy'
+  '/indexDataDiy',
+  '/i/help'
 ];
 
 const isWhiteList = (path: string) => {
@@ -66,7 +67,6 @@ function getDomainHomePath(site: string, station: ReturnType<typeof stationStore
   // 新增:当 userSonType 为 '3' 时,优先跳转到 /indexEnterprise(如果允许)
   const userStore = useUserStore();
   if (userStore.userInfo?.user?.userSonType == '3' && allowedPaths.includes('/indexEnterprise')) {
-    console.log('????????????????????????????????????')
     return '/indexEnterprise';
   }
 

+ 12 - 0
src/router/index.ts

@@ -308,6 +308,18 @@ export const constantRoutes: RouteRecordRaw[] = [
         component: () => import('@/views/i/index.vue'),
         meta: { title: '个人信息', workbench: true }
       },
+      {
+        path: '/i/help',
+        name: 'IHelp',
+        component: () => import('@/views/i/help.vue'),
+        meta: { title: '帮助中心', nav: true }
+      },
+      {
+        path: '/i/helpList',
+        name: 'IHelpList',
+        component: () => import('@/views/i/helpList.vue'),
+        meta: { title: '帮助中心列表', nav: true, breadcrumb: true, breadcrumbColor: '#F4F4F4', navList: [{ title: '帮助中心', url: '/i/help' }] }
+      },
       {
         path: '/easybuv',
         name: 'Easybuv',

+ 2 - 1
src/utils/siteConfig.ts

@@ -100,7 +100,7 @@ export const SITE_ROUTES: Record<any, string[]> = {
     '/analysis/deptPurchase'
   ], //订单列表
 
-  i: ['/i'], //个人信息
+  i: ['/i', '/i/help', '/i/helpList'], //个人信息
   easybuv: ['/easybuv'] //地址管理
 };
 
@@ -148,6 +148,7 @@ import router from '@/router';
  * @param path 跳转路径、相对路径或完整URL (可能包含 openType 参数)
  */
 export function onPath(path: string) {
+  console.log('触发了~');
   if (!path) return;
 
   console.log('[跨站跳转] 原始输入:', path);

+ 5 - 3
src/views/home/index.vue

@@ -5,7 +5,7 @@
 
     <!-- 热门方案 -->
     <indexTitle :datas="hotTitle"></indexTitle>
-    <navigation v-if="hotList.length > 0" :datas="hotList" :row="{ aspectRatio: 170 / 112, imageHeight: 112 }"></navigation>
+    <navigation v-if="hotList.length > 0" :datas="hotList" :row="{ aspectRatio: 170 / 112, imageHeight: 112, number: 5 }"></navigation>
 
     <!-- 场景采购 -->
     <indexTitle :datas="sceneTitle"></indexTitle>
@@ -130,7 +130,8 @@ const getHead = async () => {
     if (datas3.code == 200) {
       datas3.data.forEach((item: any) => {
         headData.value.carouselList.push({
-          imageUrl: item.imageUrl
+          imageUrl: item.imageUrl,
+          url: item.link ? item.link : ''
         });
       });
     }
@@ -182,7 +183,8 @@ getHotSchemeList({}).then((res) => {
       item.subtitle = item.advertBrief;
       item.imageUrl = item.coverImage;
       item.url = item.advertUrl ? item.advertUrl : '';
-      if (index < 4) hotList.value.push(item);
+      hotList.value.push(item);
+      // if (index < 4) hotList.value.push(item);
     });
   }
 });

+ 1 - 1
src/views/home/pccomponents/pages/head.vue

@@ -149,7 +149,7 @@
           >
             <el-carousel :height="componentData.advertNum == 0 ? '540px' : '400px'" arrow="always">
               <template v-if="componentData.carouselList && componentData.carouselList.length > 0">
-                <el-carousel-item v-for="item in componentData.carouselList" :key="item" @ckick="onPath(item.url)">
+                <el-carousel-item v-for="item in componentData.carouselList" :key="item" @click.stop="onPath(item.url)">
                   <el-image
                     style="width: 100%; height: 100%"
                     :src="item.imageUrl ? item.imageUrl : figure"

+ 513 - 0
src/views/i/help.vue

@@ -0,0 +1,513 @@
+<template>
+  <div class="help-center">
+    <!-- 头部区域 -->
+    <div class="help-header">
+      <div class="header-content">
+        <h1 class="main-title">帮助中心</h1>
+        <p class="sub-title">Help Center</p>
+      </div>
+    </div>
+
+    <!-- 帮助分类 -->
+    <div class="section-container">
+      <h2 class="section-title">帮助分类</h2>
+      <div class="category-grid">
+        <div v-for="category in categories" :key="category.id" class="category-item">
+          <div class="category-icon" :style="{ backgroundColor: category.color }">
+            <el-icon :size="32">
+              <component :is="category.icon" />
+            </el-icon>
+          </div>
+          <div class="category-info">
+            <h3 class="category-name">{{ category.name }}</h3>
+            <p class="category-desc">{{ category.desc }}</p>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <!-- 热门问题 -->
+    <div class="section-container">
+      <h2 class="section-title">热门问题</h2>
+      <div class="hot-questions">
+        <div class="questions-list">
+          <a v-for="(question, index) in hotQuestions" :key="index" href="#" class="question-item">
+            <span class="question-dot"></span>
+            {{ question }}
+          </a>
+        </div>
+      </div>
+    </div>
+
+    <!-- 联系客服 -->
+    <div class="section-container">
+      <h2 class="section-title">联系客服</h2>
+      <div class="contact-cards">
+        <div class="contact-card">
+          <div class="contact-icon">
+            <el-icon :size="48"><ChatDotRound /></el-icon>
+          </div>
+          <div class="contact-info">
+            <h3 class="contact-title">7×24在线聊天</h3>
+            <p class="contact-desc">专业客服在线对话,为您解决遇到的问题</p>
+            <el-button type="primary" size="large" class="contact-btn">立即咨询</el-button>
+          </div>
+        </div>
+        <div class="contact-card">
+          <div class="contact-icon">
+            <el-icon :size="48"><Service /></el-icon>
+          </div>
+          <div class="contact-info">
+            <h3 class="contact-title">商城服务热线</h3>
+            <p class="contact-phone">400-111-0027</p>
+            <p class="contact-time">08:30-20:00(仅收市话费)</p>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ChatDotRound, Service, ShoppingCart, Document, Van, Tools, Money } from '@element-plus/icons-vue';
+
+const categories = [
+  {
+    id: 1,
+    name: '采购指南',
+    desc: '描述22',
+    icon: ShoppingCart,
+    color: '#e7000b'
+  },
+  {
+    id: 2,
+    name: '关于结算',
+    desc: '描述',
+    icon: Document,
+    color: '#e7000b'
+  },
+  {
+    id: 3,
+    name: '配送服务',
+    desc: '描述',
+    icon: Van,
+    color: '#e7000b'
+  },
+  {
+    id: 4,
+    name: '售后服务',
+    desc: '描述',
+    icon: Tools,
+    color: '#e7000b'
+  },
+  {
+    id: 5,
+    name: '对账管理',
+    desc: '描述',
+    icon: Money,
+    color: '#16c99d'
+  }
+];
+
+const hotQuestions = [
+  '企业用户注册协议',
+  '新客户注册流程',
+  '信用支付实施方案',
+  '怎么为客户添加多地址?',
+  '怎么样设置在线审批流程?',
+  '密码遗失,怎么样找回密码?',
+  '客户退货退款说明',
+  '线下采购方式',
+  '平台下单流程',
+  '平台主要的支付方式',
+  '怎么为客户添加组织结构,怎么新增采购成员?',
+  '怎么样重置账户密码?',
+  '优易365为客户能提供什么样的发票?',
+  '怎么对订单申请售后'
+];
+</script>
+
+<style scoped lang="scss">
+.help-center {
+  width: 100%;
+}
+
+// 头部区域 - 全屏显示
+.help-header {
+  width: 100%;
+  background:
+    linear-gradient(135deg, rgba(248, 249, 250, 0.7) 0%, rgba(233, 236, 239, 0.7) 50%, rgba(222, 226, 230, 0.7) 100%),
+    url('https://images.unsplash.com/photo-1557804506-669a67965ba0?w=1920&q=80') center/cover no-repeat;
+  padding: 80px 0;
+  text-align: center;
+  margin-bottom: 60px;
+  overflow-x: hidden;
+  position: relative;
+
+  &::before {
+    content: '';
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background-image:
+      radial-gradient(circle at 20% 50%, rgba(231, 0, 11, 0.05) 0%, transparent 50%),
+      radial-gradient(circle at 80% 50%, rgba(231, 0, 11, 0.03) 0%, transparent 50%);
+    pointer-events: none;
+  }
+
+  .header-content {
+    width: clamp(1200px, 100%, 1500px);
+    max-width: 1500px;
+    margin: 0 auto;
+    padding: 0 20px;
+    position: relative;
+    z-index: 1;
+  }
+
+  .main-title {
+    font-size: 48px;
+    font-weight: 600;
+    color: #333;
+    margin: 0 0 16px 0;
+    letter-spacing: 2px;
+  }
+
+  .sub-title {
+    font-size: 24px;
+    font-weight: 400;
+    color: #666;
+    margin: 0;
+    letter-spacing: 1px;
+  }
+}
+
+// 通用区块样式
+.section-container {
+  // margin-bottom: 60px;
+  width: clamp(1200px, 100%, 1500px);
+  margin: 0 auto 60px auto;
+
+  .section-title {
+    font-size: 28px;
+    font-weight: 600;
+    color: #333;
+    margin: 0 0 32px 0;
+    position: relative;
+    padding-left: 16px;
+
+    &::before {
+      content: '';
+      position: absolute;
+      left: 0;
+      top: 50%;
+      transform: translateY(-50%);
+      width: 4px;
+      height: 24px;
+      background-color: #e7000b;
+      border-radius: 2px;
+    }
+  }
+}
+
+// 帮助分类
+.category-grid {
+  display: grid;
+  grid-template-columns: repeat(3, 1fr);
+  gap: 24px;
+
+  .category-item {
+    display: flex;
+    align-items: center;
+    padding: 32px;
+    background: #fff;
+    border-radius: 8px;
+    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
+    transition: all 0.3s ease;
+    cursor: pointer;
+
+    &:hover {
+      transform: translateY(-4px);
+      box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
+    }
+
+    .category-icon {
+      width: 72px;
+      height: 72px;
+      border-radius: 50%;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      margin-right: 20px;
+      flex-shrink: 0;
+      color: #fff;
+    }
+
+    .category-info {
+      flex: 1;
+
+      .category-name {
+        font-size: 20px;
+        font-weight: 600;
+        color: #333;
+        margin: 0 0 10px 0;
+      }
+
+      .category-desc {
+        font-size: 14px;
+        color: #999;
+        margin: 0;
+      }
+    }
+  }
+}
+
+// 热门问题
+.hot-questions {
+  background: #fff;
+  border-radius: 8px;
+  padding: 32px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
+
+  .questions-list {
+    display: grid;
+    grid-template-columns: repeat(2, 1fr);
+    gap: 5px 12px;
+
+    .question-item {
+      display: flex;
+      align-items: center;
+      padding: 14px 16px;
+      color: #666;
+      text-decoration: none;
+      border-radius: 4px;
+      transition: all 0.3s ease;
+      font-size: 15px;
+      line-height: 1.4;
+
+      &:hover {
+        background-color: #f5f5f5;
+        color: #e7000b;
+
+        .question-dot {
+          background-color: #e7000b;
+        }
+      }
+
+      .question-dot {
+        width: 6px;
+        height: 6px;
+        border-radius: 50%;
+        background-color: #ccc;
+        margin-right: 12px;
+        flex-shrink: 0;
+        transition: background-color 0.3s ease;
+      }
+    }
+  }
+}
+
+// 联系客服
+.contact-cards {
+  display: grid;
+  grid-template-columns: repeat(2, 1fr);
+  gap: 24px;
+
+  .contact-card {
+    display: flex;
+    align-items: center;
+    padding: 32px;
+    background: #fff;
+    border-radius: 8px;
+    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
+    transition: all 0.3s ease;
+
+    &:hover {
+      box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
+    }
+
+    .contact-icon {
+      width: 80px;
+      height: 80px;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      color: #e7000b;
+      margin-right: 24px;
+      flex-shrink: 0;
+    }
+
+    .contact-info {
+      flex: 1;
+
+      .contact-title {
+        font-size: 20px;
+        font-weight: 600;
+        color: #333;
+        margin: 0 0 12px 0;
+      }
+
+      .contact-desc {
+        font-size: 14px;
+        color: #999;
+        margin: 0 0 16px 0;
+      }
+
+      .contact-phone {
+        font-size: 24px;
+        font-weight: 600;
+        color: #e7000b;
+        margin: 0 0 8px 0;
+      }
+
+      .contact-time {
+        font-size: 13px;
+      }
+
+      .contact-btn {
+        margin-top: 8px;
+        padding: 12px 32px;
+        font-size: 16px;
+      }
+    }
+  }
+}
+
+// 响应式适配
+@media (max-width: 1400px) {
+  .category-grid {
+    grid-template-columns: repeat(3, 1fr);
+  }
+}
+
+@media (max-width: 1280px) {
+  .help-header {
+    padding: 60px 0;
+
+    .main-title {
+      font-size: 40px;
+    }
+
+    .sub-title {
+      font-size: 20px;
+    }
+  }
+
+  // 保持3列布局,不变成单列
+  .category-grid {
+    grid-template-columns: repeat(3, 1fr);
+    gap: 16px;
+
+    .category-item {
+      padding: 24px;
+
+      .category-icon {
+        width: 64px;
+        height: 64px;
+      }
+
+      .category-info {
+        .category-name {
+          font-size: 18px;
+        }
+      }
+    }
+  }
+
+  // 联系客服也保持2列
+  .contact-cards {
+    grid-template-columns: repeat(2, 1fr);
+    gap: 16px;
+
+    .contact-card {
+      padding: 24px;
+
+      .contact-icon {
+        width: 64px;
+        height: 64px;
+      }
+
+      .contact-info {
+        .contact-title {
+          font-size: 18px;
+        }
+
+        .contact-phone {
+          font-size: 20px;
+        }
+
+        .contact-btn {
+          padding: 10px 24px;
+          font-size: 14px;
+        }
+      }
+    }
+  }
+}
+
+@media (max-width: 1200px) {
+  .help-center {
+    padding: 0 16px;
+  }
+
+  .category-grid {
+    gap: 12px;
+
+    .category-item {
+      padding: 20px;
+
+      .category-icon {
+        width: 56px;
+        height: 56px;
+        margin-right: 16px;
+      }
+
+      .category-info {
+        .category-name {
+          font-size: 16px;
+          margin-bottom: 6px;
+        }
+
+        .category-desc {
+          font-size: 13px;
+        }
+      }
+    }
+  }
+
+  .contact-cards {
+    gap: 12px;
+
+    .contact-card {
+      padding: 20px;
+      flex-direction: column;
+      text-align: center;
+
+      .contact-icon {
+        margin-right: 0;
+        margin-bottom: 16px;
+      }
+
+      .contact-info {
+        .contact-title {
+          font-size: 16px;
+        }
+
+        .contact-phone {
+          font-size: 18px;
+        }
+
+        .contact-time {
+          font-size: 13px;
+        }
+
+        .contact-btn {
+          padding: 8px 20px;
+          font-size: 14px;
+        }
+      }
+    }
+  }
+}
+</style>

+ 609 - 0
src/views/i/helpList.vue

@@ -0,0 +1,609 @@
+<template>
+  <div class="help-list-page">
+    <!-- 左侧导航 -->
+    <aside class="help-sidebar">
+      <div class="sidebar-header">
+        <h2>帮助中心</h2>
+      </div>
+      <nav class="sidebar-nav">
+        <div v-for="category in categories" :key="category.id" class="nav-category">
+          <div class="category-title" :class="{ active: currentCategory === category.id }" @click="toggleCategory(category.id)">
+            <span>{{ category.name }}</span>
+            <el-icon v-if="category.children && category.children.length > 0">
+              <ArrowRight v-if="expandedCategory !== category.id" />
+              <ArrowDown v-else />
+            </el-icon>
+          </div>
+          <transition name="slide-fade">
+            <div v-if="expandedCategory === category.id && category.children" class="category-children">
+              <a
+                v-for="child in category.children"
+                :key="child.id"
+                href="#"
+                class="child-item"
+                :class="{ active: currentChild === child.id }"
+                @click.prevent="selectChild(category.id, child.id)"
+              >
+                {{ child.name }}
+              </a>
+            </div>
+          </transition>
+        </div>
+      </nav>
+    </aside>
+
+    <!-- 右侧内容区 -->
+    <main class="help-content">
+      <!-- 面包屑导航 -->
+      <div class="breadcrumb">
+        <span class="breadcrumb-item">帮助分类</span>
+        <el-icon><ArrowRight /></el-icon>
+        <span class="breadcrumb-item">{{ currentCategoryName }}</span>
+        <el-icon v-if="currentChildName"><ArrowRight /></el-icon>
+        <span v-if="currentChildName" class="breadcrumb-item">{{ currentChildName }}</span>
+        <el-icon v-if="currentDetailTitle"><ArrowRight /></el-icon>
+        <span v-if="currentDetailTitle" class="breadcrumb-item active">{{ currentDetailTitle }}</span>
+      </div>
+
+      <!-- 内容区域 -->
+      <div class="content-area">
+        <!-- 列表视图 -->
+        <div v-if="!currentDetailContent" class="list-view">
+          <h3 class="content-title">{{ currentChildName || '请选择具体问题' }}</h3>
+          <div v-if="currentContent" class="content-body">
+            <ul class="question-list">
+              <li v-for="(item, index) in currentContent" :key="index" class="question-item">
+                <span class="question-dot"></span>
+                <a href="#" class="question-link" @click.prevent="selectDetail(item)">{{ item }}</a>
+              </li>
+            </ul>
+          </div>
+          <div v-else class="empty-state">
+            <el-icon :size="64"><Document /></el-icon>
+            <p>请从左侧选择具体的帮助主题</p>
+          </div>
+        </div>
+
+        <!-- 详情视图 -->
+        <div v-else class="detail-view">
+          <div class="detail-header">
+            <el-button class="back-btn" @click="backToList">
+              <el-icon><ArrowLeft /></el-icon>
+              返回列表
+            </el-button>
+            <h3 class="detail-title">{{ currentDetailTitle }}</h3>
+          </div>
+          <div class="detail-content">
+            <p>{{ currentDetailContent }}</p>
+          </div>
+        </div>
+      </div>
+    </main>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref, computed } from 'vue';
+import { ArrowRight, ArrowDown, Document, ArrowLeft } from '@element-plus/icons-vue';
+
+const expandedCategory = ref<number | null>(null);
+const currentCategory = ref<number>(2);
+const currentChild = ref<number>(1);
+const currentDetailContent = ref<string>('');
+const currentDetailTitle = ref<string>('');
+
+const categories = [
+  {
+    id: 1,
+    name: '采购指南',
+    children: [
+      { id: 1, name: '注册流程' },
+      { id: 2, name: '实名认证' },
+      { id: 3, name: '资质审核' }
+    ]
+  },
+  {
+    id: 2,
+    name: '关于结算',
+    children: [
+      { id: 1, name: '支付方式' },
+      { id: 2, name: '发票管理' },
+      { id: 3, name: '信用管理' },
+      { id: 4, name: '退款管理' }
+    ]
+  },
+  {
+    id: 3,
+    name: '配送服务',
+    children: [
+      { id: 1, name: '配送政策' },
+      { id: 2, name: '配送时效' },
+      { id: 3, name: '服务标准' },
+      { id: 4, name: '签收管理' }
+    ]
+  },
+  {
+    id: 4,
+    name: '售后服务',
+    children: [
+      { id: 1, name: '退换货政策' },
+      { id: 2, name: '维修服务' },
+      { id: 3, name: '投诉建议' }
+    ]
+  },
+  {
+    id: 5,
+    name: '对账管理',
+    children: [
+      { id: 1, name: '账单查询' },
+      { id: 2, name: '对账流程' }
+    ]
+  }
+];
+
+const contentData: Record<string, string[]> = {
+  '2-1': ['平台主要的支付方式', '信用支付实施方案', '在线支付操作指南'],
+  '2-2': ['发票申请流程', '发票类型说明', '电子发票下载'],
+  '2-3': ['信用额度申请', '信用支付条件', '信用记录查询'],
+  '2-4': ['退款申请条件', '退款流程说明', '退款进度查询'],
+  '3-1': ['配送范围说明', '运费计算规则', '特殊地区配送'],
+  '3-2': ['标准配送时效', '加急配送服务', '配送时间查询'],
+  '3-3': ['服务质量标准', '验货流程', '异常处理'],
+  '3-4': ['签收注意事项', '代签收规定', '拒收处理'],
+  '4-1': ['退换货条件', '退换货流程', '运费承担规则'],
+  '4-2': ['维修申请流程', '维修周期说明', '保修政策'],
+  '4-3': ['投诉渠道', '建议反馈', '处理时效']
+};
+
+const detailData: Record<string, string> = {
+  '平台主要的支付方式':
+    '本平台支持多种支付方式,包括在线支付、信用支付、线下转账等。在线支付支持支付宝、微信支付、银联卡等多种渠道,方便快捷。信用支付适用于已通过信用审核的企业用户,可享受先使用后付款的便利。',
+  '信用支付实施方案':
+    '信用支付需要企业完成实名认证和资质审核,审核通过后可获得相应的信用额度。信用额度根据企业资质、交易记录等因素综合评定,最高可达100万元。使用信用支付时,系统会自动冻结相应额度,确认收货后扣除。',
+  '在线支付操作指南':
+    '1. 选择商品并加入购物车\n2. 进入结算页面,选择"在线支付"\n3. 选择支付方式(支付宝/微信/银联)\n4. 点击"立即支付"按钮\n5. 扫码或输入账号密码完成支付\n6. 支付成功后可在订单详情中查看状态',
+  '发票申请流程':
+    '1. 登录账户,进入"我的订单"\n2. 找到需要开票的订单\n3. 点击"申请发票"按钮\n4. 填写发票信息(抬头、税号、地址等)\n5. 选择发票类型(增值税专用发票/普通发票)\n6. 提交申请,等待审核\n7. 审核通过后,电子发票将发送至指定邮箱',
+  '发票类型说明':
+    '本平台提供两种发票类型:增值税专用发票和普通发票。增值税专用发票适用于一般纳税人企业,可用于抵扣进项税额;普通发票适用于小规模纳税人和个人用户。申请时需准确填写相关信息,确保发票能够正常使用。',
+  '电子发票下载':
+    '电子发票申请审核通过后,系统会发送至您预留的邮箱。您也可以登录账户,在"发票管理"页面查看和下载已开具的电子发票。电子发票与纸质发票具有同等法律效力,可直接用于报销和记账。',
+  '信用额度申请':
+    '申请信用额度需要准备以下材料:营业执照、税务登记证、开户许可证、法人身份证等。登录账户后进入"信用管理"页面,上传相关材料并提交申请。审核周期一般为3-5个工作日,审核结果会通过站内信和短信通知。',
+  '信用支付条件':
+    '使用信用支付需满足以下条件:1. 已完成企业认证;2. 信用额度审核通过;3. 当前可用额度充足;4. 无逾期未还订单。系统会在结算时自动判断是否符合信用支付条件,符合条件时会显示信用支付选项。',
+  '信用记录查询':
+    '您可以在"信用管理"页面查看完整的信用记录,包括:历史信用额度、使用情况、还款记录、逾期情况等。良好的信用记录有助于提升信用额度,建议按时还款,保持良好的信用状况。',
+  '退款申请条件':
+    '申请退款需满足以下条件:1. 订单未确认收货或未超过售后期限;2. 商品存在质量问题或与描述不符;3. 未使用优惠券或积分兑换的商品;4. 定制类商品不支持无理由退款。申请时需提供相关证明材料,如照片、视频等。',
+  '退款流程说明':
+    '1. 进入"我的订单",找到需要退款的订单\n2. 点击"申请退款"按钮\n3. 选择退款原因,填写详细说明\n4. 上传相关凭证(照片/视频)\n5. 提交申请,等待商家审核\n6. 审核通过后,退款将在1-3个工作日内原路返回',
+  '退款进度查询':
+    '您可以在"我的订单"或"退款管理"页面查看退款进度。退款状态包括:待审核、审核中、审核通过、退款中、已完成。如有疑问,可联系客服咨询具体进度和处理情况。'
+};
+
+const currentCategoryName = computed(() => {
+  const category = categories.find((c) => c.id === currentCategory.value);
+  return category ? category.name : '';
+});
+
+const currentChildName = computed(() => {
+  const category = categories.find((c) => c.id === currentCategory.value);
+  if (!category || !category.children) return '';
+  const child = category.children.find((ch) => ch.id === currentChild.value);
+  return child ? child.name : '';
+});
+
+const currentContent = computed(() => {
+  const key = `${currentCategory.value}-${currentChild.value}`;
+  return contentData[key] || null;
+});
+
+const toggleCategory = (categoryId: number) => {
+  const category = categories.find((c) => c.id === categoryId);
+  if (category && category.children && category.children.length > 0) {
+    expandedCategory.value = expandedCategory.value === categoryId ? null : categoryId;
+    currentCategory.value = categoryId;
+    // 重置详情状态
+    currentDetailContent.value = '';
+    currentDetailTitle.value = '';
+  } else {
+    currentCategory.value = categoryId;
+    currentChild.value = 0;
+    // 重置详情状态
+    currentDetailContent.value = '';
+    currentDetailTitle.value = '';
+  }
+};
+
+const selectChild = (categoryId: number, childId: number) => {
+  currentCategory.value = categoryId;
+  currentChild.value = childId;
+  expandedCategory.value = categoryId;
+  // 重置详情状态
+  currentDetailContent.value = '';
+  currentDetailTitle.value = '';
+};
+
+const selectDetail = (item: string) => {
+  currentDetailTitle.value = item;
+  currentDetailContent.value = detailData[item] || '暂无详细内容';
+};
+
+const backToList = () => {
+  currentDetailContent.value = '';
+  currentDetailTitle.value = '';
+};
+
+// 默认展开第一个有子项的分类
+if (categories[0].children && categories[0].children.length > 0) {
+  expandedCategory.value = categories[0].id;
+}
+</script>
+
+<style scoped lang="scss">
+.help-list-page {
+  width: clamp(1200px, 100%, 1500px);
+  margin: 0 auto;
+  display: flex;
+  gap: 24px;
+  min-height: calc(100vh - 300px);
+  padding-bottom: 20px;
+}
+
+// 左侧导航
+.help-sidebar {
+  width: 280px;
+  flex-shrink: 0;
+  background: #fff;
+  border-radius: 8px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
+  overflow: hidden;
+
+  .sidebar-header {
+    padding: 14px 24px;
+    background: linear-gradient(135deg, #e7000b 0%, #c9000a 100%);
+    color: #fff;
+
+    h2 {
+      font-size: 20px;
+      font-weight: 600;
+      margin: 0;
+      text-align: center;
+    }
+  }
+
+  .sidebar-nav {
+    padding: 16px 0;
+
+    .nav-category {
+      .category-title {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        padding: 14px 24px;
+        cursor: pointer;
+        transition: all 0.3s ease;
+        font-size: 15px;
+        color: #333;
+        border-left: 3px solid transparent;
+
+        &:hover {
+          background-color: #f5f5f5;
+          color: #e7000b;
+        }
+
+        &.active {
+          background-color: #fff5f5;
+          color: #e7000b;
+          border-left-color: #e7000b;
+          font-weight: 600;
+        }
+
+        .el-icon {
+          color: #999;
+          transition: transform 0.3s ease;
+        }
+      }
+
+      .category-children {
+        background-color: #fafafa;
+        padding: 8px 0;
+
+        .child-item {
+          display: block;
+          padding: 10px 24px 10px 48px;
+          color: #666;
+          text-decoration: none;
+          font-size: 14px;
+          transition: all 0.3s ease;
+          position: relative;
+
+          &::before {
+            content: '';
+            position: absolute;
+            left: 32px;
+            top: 50%;
+            transform: translateY(-50%);
+            width: 4px;
+            height: 4px;
+            border-radius: 50%;
+            background-color: #ccc;
+            transition: background-color 0.3s ease;
+          }
+
+          &:hover {
+            background-color: #f0f0f0;
+            color: #e7000b;
+
+            &::before {
+              background-color: #e7000b;
+            }
+          }
+
+          &.active {
+            background-color: #fff5f5;
+            color: #e7000b;
+            font-weight: 500;
+
+            &::before {
+              background-color: #e7000b;
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+// 右侧内容区
+.help-content {
+  flex: 1;
+  background: #fff;
+  border-radius: 8px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
+  overflow: hidden;
+
+  .breadcrumb {
+    padding: 16px 24px;
+    background-color: #f8f9fa;
+    border-bottom: 1px solid #e9ecef;
+    display: flex;
+    align-items: center;
+    gap: 8px;
+    font-size: 14px;
+
+    .breadcrumb-item {
+      color: #666;
+
+      &.active {
+        color: #e7000b;
+        font-weight: 500;
+      }
+    }
+
+    .el-icon {
+      color: #999;
+      font-size: 12px;
+    }
+  }
+
+  .content-area {
+    padding: 32px;
+
+    // 列表视图样式
+    .list-view {
+      .content-title {
+        font-size: 24px;
+        font-weight: 600;
+        color: #333;
+        margin: 0 0 24px 0;
+        padding-bottom: 16px;
+        border-bottom: 2px solid #e7000b;
+      }
+
+      .content-body {
+        .question-list {
+          list-style: none;
+          padding: 0;
+          margin: 0;
+          display: flex;
+          flex-direction: column;
+          gap: 12px;
+
+          .question-item {
+            display: flex;
+            align-items: center;
+            padding: 12px 16px;
+            background-color: #fafafa;
+            border-radius: 4px;
+            transition: all 0.3s ease;
+
+            &:hover {
+              background-color: #f0f0f0;
+
+              .question-dot {
+                background-color: #e7000b;
+              }
+
+              .question-link {
+                color: #e7000b;
+              }
+            }
+
+            .question-dot {
+              width: 6px;
+              height: 6px;
+              border-radius: 50%;
+              background-color: #ccc;
+              margin-right: 12px;
+              flex-shrink: 0;
+              transition: background-color 0.3s ease;
+            }
+
+            .question-link {
+              color: #666;
+              text-decoration: none;
+              font-size: 14px;
+              line-height: 1.5;
+              transition: color 0.3s ease;
+            }
+          }
+        }
+      }
+    }
+
+    // 详情视图样式
+    .detail-view {
+      .detail-header {
+        display: flex;
+        align-items: center;
+        gap: 16px;
+        margin-bottom: 24px;
+        padding-bottom: 16px;
+        border-bottom: 2px solid #e7000b;
+
+        .back-btn {
+          display: flex;
+          align-items: center;
+          gap: 6px;
+          padding: 8px 16px;
+          font-size: 14px;
+          border-color: #dcdfe6;
+          color: #606266;
+          transition: all 0.3s ease;
+
+          &:hover {
+            color: #e7000b;
+            border-color: #e7000b;
+          }
+        }
+
+        .detail-title {
+          font-size: 24px;
+          font-weight: 600;
+          color: #333;
+          margin: 0;
+          flex: 1;
+        }
+      }
+
+      .detail-content {
+        p {
+          font-size: 15px;
+          line-height: 1.8;
+          color: #666;
+          margin: 0;
+          white-space: pre-line;
+        }
+      }
+    }
+
+    .empty-state {
+      text-align: center;
+      padding: 80px 20px;
+      color: #999;
+
+      .el-icon {
+        color: #ddd;
+        margin-bottom: 16px;
+      }
+
+      p {
+        font-size: 16px;
+        margin: 0;
+      }
+    }
+  }
+}
+
+// 过渡动画
+.slide-fade-enter-active,
+.slide-fade-leave-active {
+  transition: all 0.3s ease;
+}
+
+.slide-fade-enter-from,
+.slide-fade-leave-to {
+  opacity: 0;
+  transform: translateY(-10px);
+}
+
+// 响应式适配
+@media (max-width: 1400px) {
+  .help-sidebar {
+    width: 260px;
+  }
+}
+
+@media (max-width: 1280px) {
+  .help-list-page {
+    padding: 0 16px;
+    gap: 16px;
+  }
+
+  .help-sidebar {
+    width: 240px;
+
+    .sidebar-header {
+      padding: 20px;
+
+      h2 {
+        font-size: 18px;
+      }
+    }
+
+    .sidebar-nav {
+      padding: 12px 0;
+
+      .nav-category {
+        .category-title {
+          padding: 12px 20px;
+          font-size: 14px;
+        }
+
+        .category-children {
+          .child-item {
+            padding: 8px 20px 8px 40px;
+            font-size: 13px;
+
+            &::before {
+              left: 28px;
+            }
+          }
+        }
+      }
+    }
+  }
+
+  .help-content {
+    .breadcrumb {
+      padding: 12px 20px;
+      font-size: 13px;
+    }
+
+    .content-area {
+      padding: 24px;
+
+      .content-title {
+        font-size: 20px;
+        margin-bottom: 20px;
+      }
+
+      .content-body {
+        .question-list {
+          gap: 10px;
+
+          .question-item {
+            padding: 10px 14px;
+
+            .question-link {
+              font-size: 13px;
+            }
+          }
+        }
+      }
+    }
+  }
+}
+</style>

+ 14 - 102
src/views/search/brand.vue

@@ -35,7 +35,7 @@
         <div class="head-box head-box1">
           <el-input clearable v-model="httpObj.name" style="width: 240px" placeholder="请输入品牌名称">
             <template #append>
-              <el-button @click="getBrand" :icon="Search" />
+              <el-button @click="onName" :icon="Search" />
             </template>
           </el-input>
         </div>
@@ -48,20 +48,10 @@
         <div class="itemName ellipsis">{{ item.brandName || '' }}</div>
       </div>
     </div>
-    <div v-if="hasMoreBrand" style="text-align: center; margin: 20px 0;">
-      <el-button type="primary" plain @click="getBrandAll">更多</el-button>
+    <div class="flex-row-center w100%" v-if="dataList.length === 0">
+      <el-empty description="暂无数据" />
     </div>
     <TablePagination v-model:page="httpObj.pageNum" v-model:page-size="httpObj.pageSize" :total="total" @change="getList" />
-    <!-- 游标分页控制 -->
-    <pagination
-      v-show="dataList.length > 0"
-      v-model:page="httpObj.pageNum"
-      v-model:limit="httpObj.pageSize"
-      v-model:way="way"
-      :cursor-mode="true"
-      :has-more="hasMore"
-      @pagination="getList"
-    />
   </div>
 </template>
 
@@ -69,23 +59,16 @@
 import { getBrandByCategoryList, getBrandPage } from '@/api/search/index';
 import { getProductCategoryTree } from '@/api/home/index';
 import { onPath } from '@/utils/siteConfig';
-import Pagination from '@/components/Pagination/index.vue';
 import { Search } from '@element-plus/icons-vue';
 const total = ref(0);
-const route = useRoute();
-const type = ref<any>(1);
 const dataList = ref<any>([]);
-const checkList = ref<any>([]);
 const classifyList = ref<any>([]);
-const brandList = ref<any>([]);
-const categoryName = ref<any>('');
-const hasMore = ref(true); // 是否还有更多数据
-const way = ref<any>(1);
+
 const httpObj = ref<any>({
   categoryId: '',
   initial: '',
   name: '',
-  pageSize: 30,
+  pageSize: 100,
   pageNum: 1
 });
 const initialList = ref<any>([
@@ -117,104 +100,30 @@ const initialList = ref<any>([
   { label: 'Y', id: 'Y' },
   { label: 'Z', id: 'Z' }
 ]);
-const sortField1 = ref<any>('');
-const sortField2 = ref<any>('');
-const sortField3 = ref<any>('');
 
 const getList = () => {
-  hasMoreBrand.value = false;
-  getBrandByCategoryList({
-    ...httpObj.value,
-    pageSize: 100,
-    pageNum: 1
-  }).then((res) => {
-    if (res.code == 200) {
-      dataList.value = res.rows;
-      total.value = res.total;
-      brandTotal.value = res.total;
-      hasMoreBrand.value = res.total > 100;
-    }
-  });
-};
-
-const brandTotal = ref(0);
-const hasMoreBrand = ref(false);
-
-// 点击更多,查询全部品牌
-const getBrandAll = () => {
-  getBrandByCategoryList({
-    ...httpObj.value,
-    pageSize: brandTotal.value,
-    pageNum: 1
-  }).then((res) => {
+  getBrandByCategoryList(httpObj.value).then((res) => {
     if (res.code == 200) {
       dataList.value = res.rows;
       total.value = res.total;
-      hasMoreBrand.value = false;
     }
   });
 };
 
 //头部分类
-
 const onHead = (item: any, type: string) => {
   httpObj.value[type] = item.id;
-  getBrand();
-};
-
-//查询品牌
-const getBrand = () => {
-  getBrandByCategoryList({
-    initial: httpObj.value.initial,
-    categoryId: httpObj.value.categoryId,
-    name: httpObj.value.name,
-    pageSize: 100,
-    pageNum: 1
-  }).then((res) => {
-    if (res.code == 200) {
-      brandList.value = res.rows;
-    }
-  });
-};
-
-//筛选品牌
-const remoteMethod = (res: any) => {
-  if (res) {
-    categoryName.value = res;
-  } else {
-    categoryName.value = '';
-  }
-  getBrand();
+  httpObj.value.pageNum = 1;
+  getList();
 };
 
-// 筛选条件
-const onSort = (type: number) => {
-  if (type == 1) {
-    if (sortField1.value == '' || sortField1.value == 'Desc') {
-      sortField1.value = 'Asc';
-    } else if (sortField1.value == 'Asc') {
-      sortField1.value = 'Desc';
-    }
-  }
-  if (type == 2) {
-    if (sortField2.value == '' || sortField2.value == 'Desc') {
-      sortField2.value = 'Asc';
-    } else if (sortField2.value == 'Asc') {
-      sortField2.value = 'Desc';
-    }
-  }
-  if (type == 3) {
-    if (sortField3.value == '' || sortField3.value == 'Desc') {
-      sortField3.value = 'Asc';
-    } else if (sortField3.value == 'Asc') {
-      sortField3.value = 'Desc';
-    }
-  }
+const onName = () => {
+  httpObj.value.pageNum = 1;
   getList();
 };
 
 onMounted(() => {
-  getProductCategoryTree({}).then((res) => {
+  getProductCategoryTree({ platform: 0 }).then((res) => {
     if (res.code == 200) {
       res.data.unshift({
         label: '全部',
@@ -234,6 +143,7 @@ onMounted(() => {
   min-width: 1200px;
   width: 100%;
   margin: 15px auto 0 auto;
+  padding-bottom: 20px;
 
   // 筛选
   .search-head {
@@ -264,6 +174,7 @@ onMounted(() => {
         gap: 10px 15px;
         border-bottom: 1px solid #e5e7eb;
         padding: 15px 0;
+
         &.head-box1 {
           border-bottom: 0px solid #e5e7eb;
         }
@@ -301,6 +212,7 @@ onMounted(() => {
       &:hover {
         transform: translateY(-2px);
         box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
+
         .itemName {
           color: #e7000b !important;
         }