OrderSuccess.vue 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. <template>
  2. <div class="order-success-page">
  3. <div class="success-container">
  4. <!-- 订单步骤 -->
  5. <div class="order-steps">
  6. <el-steps :active="3" finish-status="success">
  7. <el-step title="确认订单" />
  8. <el-step title="支付订单" />
  9. <el-step title="完成" />
  10. </el-steps>
  11. </div>
  12. <!-- 成功提示 -->
  13. <div class="success-content">
  14. <div class="success-icon">
  15. <el-icon>
  16. <CircleCheck />
  17. </el-icon>
  18. </div>
  19. <h2>订单支付成功!</h2>
  20. <p class="success-tip">您的订单已成功支付,我们将尽快为您处理</p>
  21. <!-- 订单信息 -->
  22. <div class="order-info">
  23. <div class="info-item">
  24. <span class="label">订单编号:</span>
  25. <span class="value">{{ orderInfo.id }}</span>
  26. </div>
  27. <div class="info-item">
  28. <span class="label">支付金额:</span>
  29. <span class="value price">¥{{ orderInfo.totalAmount?.toFixed(2) || '0.00' }}</span>
  30. </div>
  31. <div class="info-item">
  32. <span class="label">支付时间:</span>
  33. <span class="value">{{ formatTime(orderInfo.payTime) }}</span>
  34. </div>
  35. </div>
  36. <!-- 操作按钮 -->
  37. <div class="action-buttons">
  38. <el-button @click="viewOrder">查看订单</el-button>
  39. <el-button type="primary" @click="goHome">返回首页</el-button>
  40. </div>
  41. <!-- 温馨提示 -->
  42. <div class="tips-section">
  43. <h3>温馨提示</h3>
  44. <ul class="tips-list">
  45. <li>您可以在"我的订单"中查看订单详情</li>
  46. <li>如有任何问题,请联系客服</li>
  47. <li>感谢您的支持,祝您使用愉快!</li>
  48. </ul>
  49. </div>
  50. </div>
  51. </div>
  52. </div>
  53. </template>
  54. <script setup>
  55. import { ref, onMounted } from 'vue'
  56. import { useRoute, useRouter } from 'vue-router'
  57. import { CircleCheck } from '@element-plus/icons-vue'
  58. import { getOrderDetail } from '@/http/api/pages/Order/index'
  59. import { usePersonalCenterStore } from "@/store/index";
  60. const g_personalCenterStore = usePersonalCenterStore();
  61. const route = useRoute()
  62. const g_router = useRouter()
  63. const orderInfo = ref({})
  64. onMounted(async () => {
  65. const orderId = route.query.orderId
  66. if (orderId) {
  67. const response = await getOrderDetail(orderId)
  68. orderInfo.value = response.data
  69. }
  70. })
  71. const formatTime = (time) => {
  72. if (!time) return new Date().toLocaleString()
  73. return new Date(time).toLocaleString()
  74. }
  75. const viewOrder = () => {
  76. g_personalCenterStore.setActiveTabName('myOrder');
  77. g_router.push({ path: "/personalCenter", query: { tab: 'myOrder' } })
  78. }
  79. const goHome = () => {
  80. g_router.push({ name: '首页' });
  81. }
  82. </script>
  83. <style scoped>
  84. .order-success-page {
  85. min-height: calc(100vh - 60px);
  86. background-color: #f5f7fa;
  87. padding: 20px;
  88. }
  89. .success-container {
  90. max-width: 800px;
  91. margin: 0 auto;
  92. background-color: #fff;
  93. border-radius: 8px;
  94. box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
  95. padding: 20px;
  96. }
  97. .order-steps {
  98. margin-bottom: 30px;
  99. padding: 20px;
  100. background-color: #fff;
  101. border-radius: 8px;
  102. }
  103. .success-content {
  104. text-align: center;
  105. padding: 40px 20px;
  106. }
  107. .success-icon {
  108. margin-bottom: 20px;
  109. }
  110. .success-icon .el-icon {
  111. font-size: 64px;
  112. color: #67c23a;
  113. }
  114. .success-content h2 {
  115. font-size: 24px;
  116. color: #303133;
  117. margin-bottom: 10px;
  118. }
  119. .success-tip {
  120. font-size: 16px;
  121. color: #606266;
  122. margin-bottom: 30px;
  123. }
  124. .order-info {
  125. background-color: #f5f7fa;
  126. border-radius: 8px;
  127. padding: 20px;
  128. margin-bottom: 30px;
  129. text-align: left;
  130. }
  131. .info-item {
  132. margin-bottom: 15px;
  133. display: flex;
  134. align-items: center;
  135. }
  136. .info-item:last-child {
  137. margin-bottom: 0;
  138. }
  139. .label {
  140. width: 100px;
  141. color: #606266;
  142. font-size: 14px;
  143. }
  144. .value {
  145. flex: 1;
  146. color: #303133;
  147. font-size: 14px;
  148. }
  149. .value.price {
  150. color: #f56c6c;
  151. font-size: 18px;
  152. font-weight: bold;
  153. }
  154. .action-buttons {
  155. display: flex;
  156. justify-content: center;
  157. gap: 15px;
  158. margin-bottom: 30px;
  159. }
  160. .tips-section {
  161. text-align: left;
  162. padding: 20px;
  163. background-color: #f5f7fa;
  164. border-radius: 8px;
  165. }
  166. .tips-section h3 {
  167. font-size: 16px;
  168. color: #303133;
  169. margin-bottom: 15px;
  170. }
  171. .tips-list {
  172. list-style: none;
  173. padding: 0;
  174. margin: 0;
  175. }
  176. .tips-list li {
  177. color: #606266;
  178. font-size: 14px;
  179. line-height: 1.8;
  180. position: relative;
  181. padding-left: 20px;
  182. }
  183. .tips-list li::before {
  184. content: "•";
  185. position: absolute;
  186. left: 0;
  187. color: #67c23a;
  188. }
  189. /* 响应式布局 */
  190. @media screen and (max-width: 768px) {
  191. .success-container {
  192. padding: 15px;
  193. }
  194. .success-content {
  195. padding: 20px;
  196. }
  197. .info-item {
  198. flex-direction: column;
  199. align-items: flex-start;
  200. gap: 5px;
  201. }
  202. .label {
  203. width: auto;
  204. }
  205. .action-buttons {
  206. flex-direction: column;
  207. }
  208. .action-buttons .el-button {
  209. width: 100%;
  210. }
  211. }
  212. </style>