index.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837
  1. <template>
  2. <div class="question-container">
  3. <!-- 顶部横幅 -->
  4. <div class="question-banner">
  5. <h1>常见问题</h1>
  6. <p>我们将在这里为您解答所有疑问</p>
  7. <!-- 搜索框 -->
  8. <div class="question__search-box">
  9. <input
  10. type="text"
  11. v-model="searchQuery"
  12. placeholder="请输入您的问题关键词..."
  13. @keyup.enter="searchQuestions"
  14. />
  15. <button @click="searchQuestions">
  16. <svg
  17. xmlns="http://www.w3.org/2000/svg"
  18. width="16"
  19. height="16"
  20. fill="currentColor"
  21. viewBox="0 0 16 16"
  22. >
  23. <path
  24. d="M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z"
  25. />
  26. </svg>
  27. 搜索
  28. </button>
  29. </div>
  30. </div>
  31. <!-- 主要内容区 -->
  32. <div class="question-main__container width-1200">
  33. <!-- 左侧导航 -->
  34. <div class="question-sidebar">
  35. <div
  36. v-for="category in categories"
  37. :key="category.id"
  38. class="category-item"
  39. :class="{ active: activeCategory === category.id }"
  40. @click="changeCategory(category.id)"
  41. >
  42. {{ category.name }}
  43. <span class="count">{{ category.count }}个问题</span>
  44. </div>
  45. </div>
  46. <!-- 右侧内容 -->
  47. <div class="question-content">
  48. <template v-if="!currentQuestion">
  49. <!-- 搜索结果提示 -->
  50. <div v-if="searchResults.length > 0" class="search-results">
  51. <h3>搜索结果 ({{ searchResults.length }}条)</h3>
  52. <div
  53. v-for="item in searchResults"
  54. :key="item.id"
  55. class="question-item"
  56. @click="showQuestionDetail(item)"
  57. >
  58. {{ item.title }}
  59. </div>
  60. </div>
  61. <!-- 问题列表 -->
  62. <div v-else class="question-list">
  63. <h2>{{ getCategoryName(activeCategory) }}</h2>
  64. <div
  65. v-for="question in filteredQuestions"
  66. :key="question.id"
  67. class="question-item"
  68. @click="showQuestionDetail(question)"
  69. >
  70. <div class="question-title">
  71. {{ question.title }}
  72. <div v-if="question.isHot" class="question-tag hot-tag">热门</div>
  73. <div v-if="question.isNew" class="question-tag new-tag">新</div>
  74. </div>
  75. <div class="question-preview">{{ question.preview }}</div>
  76. </div>
  77. </div>
  78. </template>
  79. <!-- 问题详情 -->
  80. <div v-else class="question-detail">
  81. <div class="detail-header">
  82. <h2>{{ currentQuestion.title }}</h2>
  83. <div class="meta">
  84. <span>更新于 {{ formatDate(currentQuestion.updateTime) }}</span>
  85. <span>阅读 {{ currentQuestion.views }} 次</span>
  86. </div>
  87. </div>
  88. <div class="detail-content" v-html="currentQuestion.content"></div>
  89. <div class="detail-footer">
  90. <button class="back-btn" @click="backToList">
  91. <svg
  92. xmlns="http://www.w3.org/2000/svg"
  93. width="16"
  94. height="16"
  95. fill="currentColor"
  96. viewBox="0 0 16 16"
  97. >
  98. <path
  99. fill-rule="evenodd"
  100. d="M15 8a.5.5 0 0 0-.5-.5H2.707l3.147-3.146a.5.5 0 1 0-.708-.708l-4 4a.5.5 0 0 0 0 .708l4 4a.5.5 0 0 0 .708-.708L2.707 8.5H14.5A.5.5 0 0 0 15 8z"
  101. />
  102. </svg>
  103. 返回列表
  104. </button>
  105. <!-- <div class="feedback">
  106. <span>这篇回答对您有帮助吗?</span>
  107. <button class="feedback-btn yes">有帮助</button>
  108. <button class="feedback-btn no">没帮助</button>
  109. </div> -->
  110. </div>
  111. </div>
  112. </div>
  113. </div>
  114. <!-- 联系客服 -->
  115. <div class="contact-section width-1200">
  116. <h3>没有找到您需要的答案?</h3>
  117. <p>我们的客服团队随时为您服务</p>
  118. <div class="contact-methods">
  119. <div class="contact-method">
  120. <svg
  121. xmlns="http://www.w3.org/2000/svg"
  122. width="24"
  123. height="24"
  124. fill="currentColor"
  125. viewBox="0 0 16 16"
  126. >
  127. <path
  128. d="M3.654 1.328a.678.678 0 0 0-1.015-.063L1.605 2.3c-.483.484-.661 1.169-.45 1.77a17.568 17.568 0 0 0 4.168 6.608 17.569 17.569 0 0 0 6.608 4.168c.601.211 1.286.033 1.77-.45l1.034-1.034a.678.678 0 0 0-.063-1.015l-2.307-1.794a.678.678 0 0 0-.58-.122l-2.19.547a1.745 1.745 0 0 1-1.657-.459L5.482 8.062a1.745 1.745 0 0 1-.46-1.657l.548-2.19a.678.678 0 0 0-.122-.58L3.654 1.328zM1.884.511a1.745 1.745 0 0 1 2.612.163L6.29 2.98c.329.423.445.974.315 1.494l-.547 2.19a.678.678 0 0 0 .178.643l2.457 2.457a.678.678 0 0 0 .644.178l2.189-.547a1.745 1.745 0 0 1 1.494.315l2.306 1.794c.829.645.905 1.87.163 2.611l-1.034 1.034c-.74.74-1.846 1.065-2.877.702a18.634 18.634 0 0 1-7.01-4.42 18.634 18.634 0 0 1-4.42-7.009c-.362-1.03-.037-2.137.703-2.877L1.885.511z"
  129. />
  130. </svg>
  131. <div>
  132. <strong>电话支持</strong>
  133. <p>400-888-9999</p>
  134. <p>周一至周日 9:00-18:00</p>
  135. </div>
  136. </div>
  137. <div class="contact-method">
  138. <svg
  139. xmlns="http://www.w3.org/2000/svg"
  140. width="24"
  141. height="24"
  142. fill="currentColor"
  143. viewBox="0 0 16 16"
  144. >
  145. <path
  146. d="M.05 3.555A2 2 0 0 1 2 2h12a2 2 0 0 1 1.95 1.555L8 8.414.05 3.555ZM0 4.697v7.104l5.803-3.558L0 4.697ZM6.761 8.83l-6.57 4.027A2 2 0 0 0 2 14h12a2 2 0 0 0 1.808-1.144l-6.57-4.027L8 9.586l-1.239-.757Zm3.436-.586L16 11.801V4.697l-5.803 3.546Z"
  147. />
  148. </svg>
  149. <div>
  150. <strong>电子邮件</strong>
  151. <p>support@example.com</p>
  152. <p>我们会在24小时内回复</p>
  153. </div>
  154. </div>
  155. <div class="contact-method">
  156. <svg
  157. xmlns="http://www.w3.org/2000/svg"
  158. width="24"
  159. height="24"
  160. fill="currentColor"
  161. viewBox="0 0 16 16"
  162. >
  163. <path
  164. d="M8 1a2 2 0 0 1 2 2v4H6V3a2 2 0 0 1 2-2zm3 6V3a3 3 0 0 0-6 0v4a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2z"
  165. />
  166. </svg>
  167. <div>
  168. <strong>在线客服</strong>
  169. <p>点击右下角"在线咨询"</p>
  170. <p>工作时间实时沟通</p>
  171. </div>
  172. </div>
  173. </div>
  174. </div>
  175. </div>
  176. </template>
  177. <script setup>
  178. import { ref, computed } from 'vue'
  179. // 问题分类
  180. const categories = ref([
  181. { id: 1, name: '账号问题', count: 12 },
  182. { id: 2, name: '支付问题', count: 8 },
  183. { id: 3, name: '订单问题', count: 15 },
  184. { id: 4, name: '产品使用', count: 23 },
  185. { id: 5, name: '售后服务', count: 7 },
  186. { id: 6, name: '其他问题', count: 5 },
  187. ])
  188. // 模拟问题数据
  189. const questions = ref([
  190. {
  191. id: 101,
  192. categoryId: 1,
  193. title: '如何注册账号?',
  194. preview: '详细说明注册账号的步骤和注意事项...',
  195. content: `
  196. <h3>注册账号步骤</h3>
  197. <ol>
  198. <li>点击网站右上角的"注册"按钮</li>
  199. <li>填写您的手机号码或电子邮箱</li>
  200. <li>设置登录密码(6-20位字符,包含字母和数字)</li>
  201. <li>输入收到的验证码</li>
  202. <li>阅读并同意用户协议</li>
  203. <li>点击"立即注册"完成注册</li>
  204. </ol>
  205. <p><strong>注意事项:</strong></p>
  206. <ul>
  207. <li>请使用常用手机号或邮箱,以便接收重要通知</li>
  208. <li>密码请勿设置过于简单</li>
  209. <li>如未收到验证码,请检查垃圾邮件或60秒后重新获取</li>
  210. </ul>
  211. `,
  212. updateTime: '2023-05-15',
  213. views: 1245,
  214. isHot: true,
  215. isNew: false,
  216. },
  217. {
  218. id: 102,
  219. categoryId: 1,
  220. title: '忘记密码怎么办?',
  221. preview: '密码找回的几种方法和步骤说明...',
  222. content: `
  223. <h3>找回密码方法</h3>
  224. <p>如果您忘记了密码,可以通过以下方式找回:</p>
  225. <h4>方法一:通过手机找回</h4>
  226. <ol>
  227. <li>在登录页面点击"忘记密码"</li>
  228. <li>选择"通过手机找回"</li>
  229. <li>输入注册时使用的手机号码</li>
  230. <li>获取并输入短信验证码</li>
  231. <li>设置新密码并确认</li>
  232. </ol>
  233. <h4>方法二:通过邮箱找回</h4>
  234. <ol>
  235. <li>在登录页面点击"忘记密码"</li>
  236. <li>选择"通过邮箱找回"</li>
  237. <li>输入注册时使用的邮箱地址</li>
  238. <li>登录邮箱查收重置密码邮件</li>
  239. <li>点击邮件中的链接设置新密码</li>
  240. </ol>
  241. <p>如果以上方法都无法解决您的问题,请联系客服人员。</p>
  242. `,
  243. updateTime: '2023-06-02',
  244. views: 876,
  245. isHot: true,
  246. isNew: false,
  247. },
  248. {
  249. id: 201,
  250. categoryId: 2,
  251. title: '支持哪些支付方式?',
  252. preview: '介绍平台目前支持的支付渠道...',
  253. content: `
  254. <h3>支持的支付方式</h3>
  255. <p>我们目前支持以下支付方式:</p>
  256. <div class="payment-method">
  257. <h4>1. 在线支付</h4>
  258. <ul>
  259. <li>微信支付</li>
  260. <li>支付宝</li>
  261. <li>银联在线支付</li>
  262. <li>Apple Pay</li>
  263. </ul>
  264. </div>
  265. <div class="payment-method">
  266. <h4>2. 银行卡支付</h4>
  267. <p>支持以下银行的储蓄卡和信用卡:</p>
  268. <ul>
  269. <li>中国工商银行</li>
  270. <li>中国建设银行</li>
  271. <li>中国银行</li>
  272. <li>招商银行</li>
  273. <li>交通银行等主流银行</li>
  274. </ul>
  275. </div>
  276. <p><strong>注意:</strong>部分银行可能有支付限额,请以银行规定为准。</p>
  277. `,
  278. updateTime: '2023-04-28',
  279. views: 1532,
  280. isHot: false,
  281. isNew: false,
  282. },
  283. {
  284. id: 301,
  285. categoryId: 3,
  286. title: '如何查询订单状态?',
  287. preview: '订单状态查询的几种途径和方法...',
  288. content: `
  289. <h3>查询订单状态</h3>
  290. <p>您可以通过以下方式查询订单状态:</p>
  291. <h4>方法一:网站查询</h4>
  292. <ol>
  293. <li>登录您的账号</li>
  294. <li>点击右上角"我的订单"</li>
  295. <li>在订单列表中找到相应订单</li>
  296. <li>点击"查看详情"查看订单状态</li>
  297. </ol>
  298. <h4>方法二:手机APP查询</h4>
  299. <ol>
  300. <li>打开APP并登录</li>
  301. <li>点击底部导航栏"我的"</li>
  302. <li>选择"我的订单"</li>
  303. <li>查看相应订单状态</li>
  304. </ol>
  305. <h4>方法三:联系客服查询</h4>
  306. <p>如果您无法通过以上方式查询,可以联系客服提供订单号查询。</p>
  307. <p><strong>常见订单状态说明:</strong></p>
  308. <ul>
  309. <li><span class="status waiting">待付款</span> - 订单已生成,等待支付</li>
  310. <li><span class="status paid">已支付</span> - 付款成功,等待处理</li>
  311. <li><span class="status shipped">已发货</span> - 商品已发出</li>
  312. <li><span class="status completed">已完成</span> - 订单交易完成</li>
  313. <li><span class="status cancelled">已取消</span> - 订单已取消</li>
  314. </ul>
  315. `,
  316. updateTime: '2023-05-20',
  317. views: 2104,
  318. isHot: true,
  319. isNew: true,
  320. },
  321. ])
  322. // 当前选中的分类ID
  323. const activeCategory = ref(1)
  324. // 当前查看的问题详情
  325. const currentQuestion = ref(null)
  326. // 搜索查询词
  327. const searchQuery = ref('')
  328. // 搜索结果
  329. const searchResults = ref([])
  330. // 获取当前分类下的问题
  331. const filteredQuestions = computed(() => {
  332. return questions.value.filter((q) => q.categoryId === activeCategory.value)
  333. })
  334. // 获取分类名称
  335. const getCategoryName = (id) => {
  336. const category = categories.value.find((c) => c.id === id)
  337. return category ? category.name : '所有问题'
  338. }
  339. // 切换分类
  340. const changeCategory = (categoryId) => {
  341. activeCategory.value = categoryId
  342. currentQuestion.value = null
  343. searchResults.value = []
  344. }
  345. // 显示问题详情
  346. const showQuestionDetail = (question) => {
  347. currentQuestion.value = question
  348. }
  349. // 返回问题列表
  350. const backToList = () => {
  351. currentQuestion.value = null
  352. }
  353. // 搜索问题
  354. const searchQuestions = () => {
  355. if (!searchQuery.value.trim()) {
  356. searchResults.value = []
  357. return
  358. }
  359. const query = searchQuery.value.toLowerCase()
  360. searchResults.value = questions.value.filter((q) => {
  361. return q.title.toLowerCase().includes(query) || q.preview.toLowerCase().includes(query)
  362. })
  363. currentQuestion.value = null
  364. }
  365. // 格式化日期
  366. const formatDate = (dateString) => {
  367. const options = { year: 'numeric', month: 'long', day: 'numeric' }
  368. return new Date(dateString).toLocaleDateString('zh-CN', options)
  369. }
  370. </script>
  371. <style scoped lang="less">
  372. .question-container {
  373. display: flex;
  374. flex-direction: column;
  375. align-items: center;
  376. font-family: 'Helvetica Neue', Arial, sans-serif;
  377. color: #333;
  378. margin: 0 auto 50px;
  379. margin: 0 auto 3.125rem;
  380. }
  381. .width-1200 {
  382. padding: 0 15px 60px;
  383. padding: 0 0.9375rem 3.75rem;
  384. }
  385. .question-banner {
  386. width: 100%;
  387. background: linear-gradient(135deg, #1976d2, var(--color-active));
  388. background: var(--color-active);
  389. background: rgba(0, 0, 0, 1);
  390. color: white;
  391. padding: 40px 15px;
  392. padding: 2.5rem 0.9375rem;
  393. text-align: center;
  394. margin-bottom: 30px;
  395. margin-bottom: 1.875rem;
  396. h1 {
  397. font-size: 40px;
  398. font-size: 2.5rem;
  399. margin-bottom: 10px;
  400. margin-bottom: 0.625rem;
  401. }
  402. p {
  403. font-size: 1.125rem;
  404. margin-bottom: 25px;
  405. margin-bottom: 1.5625rem;
  406. opacity: 0.9;
  407. }
  408. }
  409. .question__search-box {
  410. width: 100%;
  411. max-width: 600px;
  412. max-width: 37.5rem;
  413. margin: 0 auto;
  414. display: flex;
  415. input {
  416. flex: 1;
  417. padding: 12px 15px;
  418. padding: 0.75rem 0.9375rem;
  419. border: none;
  420. border-radius: 4px 0 0 4px;
  421. border-radius: 0.25rem 0 0 0.25rem;
  422. font-size: 1rem;
  423. color: #333;
  424. }
  425. button {
  426. padding: 0 20px;
  427. padding: 0 1.25rem;
  428. background: var(--color-active);
  429. color: white;
  430. border: none;
  431. border-radius: 0 4px 4px 0;
  432. border-radius: 0 0.25rem 0.25rem 0;
  433. cursor: pointer;
  434. display: flex;
  435. align-items: center;
  436. gap: 8px;
  437. gap: 0.5rem;
  438. font-weight: 500;
  439. letter-spacing: 2px;
  440. }
  441. }
  442. .question-main__container {
  443. display: flex;
  444. gap: 30px;
  445. gap: 1.875rem;
  446. .question-sidebar {
  447. width: 250px;
  448. width: 15.625rem;
  449. width: 250px;
  450. width: 15.625rem;
  451. flex-shrink: 0;
  452. .category-item {
  453. padding: 12px 15px;
  454. padding: 0.75rem 0.9375rem;
  455. border-left: 4px solid transparent;
  456. border-left: 0.25rem solid transparent;
  457. cursor: pointer;
  458. display: flex;
  459. justify-content: space-between;
  460. margin-bottom: 5px;
  461. margin-bottom: 0.3125rem;
  462. border-radius: 4px;
  463. border-radius: 0.25rem;
  464. }
  465. .category-item:hover {
  466. background: #f5f5f5;
  467. }
  468. .category-item.active {
  469. border-left-color: var(--color-active);
  470. background: #e3f2fd;
  471. font-weight: bold;
  472. }
  473. .count {
  474. color: #757575;
  475. font-size: 0.9rem;
  476. }
  477. .category-item.active .count {
  478. color: var(--color-active);
  479. }
  480. }
  481. .question-content {
  482. flex: 1;
  483. background: white;
  484. border-radius: 8px;
  485. border-radius: 0.5rem;
  486. padding: 18px;
  487. padding: 1.125rem;
  488. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  489. }
  490. .search-results {
  491. h3 {
  492. font-size: 20px;
  493. font-size: 1.25rem;
  494. margin-bottom: 15px;
  495. margin-bottom: 0.9375rem;
  496. color: #1976d2;
  497. }
  498. }
  499. .question-list {
  500. h2 {
  501. font-size: 24px;
  502. font-size: 1.5rem;
  503. margin-bottom: 20px;
  504. margin-bottom: 1.25rem;
  505. padding-bottom: 10px;
  506. padding-bottom: 0.625rem;
  507. border-bottom: 1px solid #eee;
  508. }
  509. }
  510. .question-item {
  511. padding: 15px;
  512. padding: 0.9375rem;
  513. border-bottom: 1px solid #f0f0f0;
  514. cursor: pointer;
  515. }
  516. .question-item:hover {
  517. background: #f9f9f9;
  518. }
  519. .question-title {
  520. font-weight: bold;
  521. margin-bottom: 8px;
  522. margin-bottom: 0.5rem;
  523. display: flex;
  524. align-items: center;
  525. gap: 10px;
  526. gap: 0.625rem;
  527. }
  528. .question-preview {
  529. color: #666;
  530. font-size: 0.9375rem;
  531. }
  532. .question-tag {
  533. height: 20px;
  534. padding: 0 10px;
  535. line-height: 20px;
  536. color: white;
  537. font-size: 0.75rem;
  538. border-radius: 12px;
  539. border-radius: 0.75rem;
  540. }
  541. .hot-tag {
  542. background: #ff5722;
  543. }
  544. .new-tag {
  545. background: #4caf50;
  546. }
  547. .question-detail {
  548. .detail-header {
  549. margin-bottom: 24px;
  550. margin-bottom: 1.5rem;
  551. padding-bottom: 15px;
  552. padding-bottom: 0.9375rem;
  553. border-bottom: 1px solid #eee;
  554. h2 {
  555. font-size: 24px;
  556. font-size: 1.8rem;
  557. margin-bottom: 10px;
  558. margin-bottom: 0.625rem;
  559. }
  560. .meta {
  561. display: flex;
  562. gap: 15px;
  563. gap: 0.9375rem;
  564. color: #757575;
  565. font-size: 15px;
  566. font-size: 0.9375rem;
  567. }
  568. }
  569. .detail-footer {
  570. margin-top: 36px;
  571. margin-top: 2.25rem;
  572. display: flex;
  573. justify-content: space-between;
  574. align-items: center;
  575. padding-top: 20px;
  576. padding-top: 1.25rem;
  577. border-top: 1px solid #eee;
  578. .back-btn {
  579. background: #f5f5f5;
  580. border: none;
  581. padding: 8px 15px;
  582. padding: 0.5rem 0.9375rem;
  583. border-radius: 4px;
  584. border-radius: 0.25rem;
  585. cursor: pointer;
  586. display: flex;
  587. align-items: center;
  588. gap: 5px;
  589. gap: 0.3125rem;
  590. }
  591. .back-btn:hover {
  592. background: #eee;
  593. }
  594. /* .feedback {
  595. display: flex;
  596. align-items: center;
  597. gap: 10px;
  598. }
  599. .feedback span {
  600. color: #757575;
  601. }
  602. .feedback-btn {
  603. padding: 5px 12px;
  604. border-radius: 4px;
  605. border: 1px solid #ddd;
  606. cursor: pointer;
  607. }
  608. .feedback-btn.yes {
  609. background: #e8f5e9;
  610. color: #2e7d32;
  611. }
  612. .feedback-btn.no {
  613. background: #ffebee;
  614. color: #c62828;
  615. } */
  616. }
  617. }
  618. }
  619. .contact-section {
  620. margin-top: 32px;
  621. margin-top: 2rem;
  622. text-align: center;
  623. padding: 30px;
  624. padding: 1.875rem;
  625. background: #f9f9f9;
  626. // border-radius: 8px;
  627. // border-radius: 0.5rem;
  628. h3 {
  629. font-size: 24px;
  630. font-size: 1.5rem;
  631. margin-bottom: 10px;
  632. margin-bottom: 0.625rem;
  633. }
  634. p {
  635. color: #666;
  636. margin-bottom: 25px;
  637. margin-bottom: 1.5625rem;
  638. }
  639. .contact-methods {
  640. display: flex;
  641. justify-content: center;
  642. gap: 30px;
  643. gap: 1.875rem;
  644. flex-wrap: wrap;
  645. }
  646. .contact-method {
  647. display: flex;
  648. align-items: flex-start;
  649. gap: 15px;
  650. gap: 0.9375rem;
  651. text-align: left;
  652. max-width: 300px;
  653. max-width: 18.75rem;
  654. padding: 15px;
  655. padding: 0.9375rem;
  656. background: white;
  657. border-radius: 8px;
  658. border-radius: 0.5rem;
  659. box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
  660. svg {
  661. color: #1976d2;
  662. margin-top: 3px;
  663. }
  664. strong {
  665. display: block;
  666. margin-bottom: 5px;
  667. }
  668. p {
  669. margin: 3px 0;
  670. font-size: 0.9375rem;
  671. color: #666;
  672. }
  673. }
  674. }
  675. </style>
  676. <style>
  677. /* 富文本内容样式 */
  678. .detail-content h3,
  679. .detail-content h4 {
  680. margin: 25px 0 15px;
  681. margin: 1.5625rem 0 0.9375rem;
  682. color: #333;
  683. }
  684. .detail-content h3 {
  685. font-size: 1.5rem;
  686. }
  687. .detail-content h4 {
  688. font-size: 1.25rem;
  689. }
  690. .detail-content p {
  691. margin: 15px 0;
  692. margin: 0.9375rem 0;
  693. line-height: 1.6;
  694. }
  695. .detail-content ol,
  696. .detail-content ul {
  697. margin: 15px 0;
  698. margin: 0.9375rem 0;
  699. padding-left: 30px;
  700. padding-left: 1.875rem;
  701. }
  702. .detail-content li {
  703. margin: 0.5rem 0;
  704. }
  705. .payment-method {
  706. margin: 20px 0;
  707. margin: 1.25rem 0;
  708. }
  709. .status {
  710. display: inline-block;
  711. padding: 2px 6px;
  712. padding: 2px 0.375rem;
  713. border-radius: 3px;
  714. font-size: 0.875rem;
  715. }
  716. .status.waiting {
  717. background: #fff3e0;
  718. color: #e65100;
  719. }
  720. .status.paid {
  721. background: #e3f2fd;
  722. color: #1565c0;
  723. }
  724. .status.shipped {
  725. background: #e8f5e9;
  726. color: #2e7d32;
  727. }
  728. .status.completed {
  729. background: #f1f8e9;
  730. color: #558b2f;
  731. }
  732. .status.cancelled {
  733. background: #ffebee;
  734. color: #c62828;
  735. }
  736. </style>
  737. <style lang="less" scoped>
  738. @import url('./css/styles@1200.less');
  739. @import url('./css/styles@1024.less');
  740. @import url('./css/styles@768.less');
  741. </style>