You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

319 lines
9.7 KiB

  1. <template>
  2. <!-- 整个页面容器 -->
  3. <div class="recharge-details-page">
  4. <!-- 整个页面的卡片容器 -->
  5. <el-card class="recharge-card">
  6. <!-- 搜索表单部分使用卡片布局 -->
  7. <el-card class="search-card">
  8. <template #header>
  9. <div class="card-header">
  10. <span>搜索条件</span>
  11. </div>
  12. </template>
  13. <!-- 第一行搜索表单内联布局 -->
  14. <el-form :inline="true" :model="searchForm" class="search-form">
  15. <el-form-item label="精网号">
  16. <!-- 绑定精网号输入值到 searchForm.jwcode -->
  17. <el-input v-model="searchForm.jwcode" placeholder="请输入精网号" />
  18. </el-form-item>
  19. <el-form-item label="地区">
  20. <!-- 使用 el-select 组件支持筛选和创建新选项 -->
  21. <el-select
  22. v-model="searchForm.region"
  23. placeholder="请选择或输入地区"
  24. filterable
  25. allow-create
  26. default-first-option
  27. >
  28. <!-- 动态生成地区选项 -->
  29. <el-option
  30. v-for="region in regionList"
  31. :key="region"
  32. :label="region"
  33. :value="region"
  34. ></el-option>
  35. </el-select>
  36. </el-form-item>
  37. <el-form-item label="订单号">
  38. <!-- 绑定订单号输入值到 searchForm.orderId -->
  39. <el-input v-model="searchForm.orderId" placeholder="请输入订单号" />
  40. </el-form-item>
  41. <el-form-item label="充值方式">
  42. <el-select
  43. v-model="searchForm.paymentMethod"
  44. placeholder="请选择充值方式"
  45. filterable
  46. allow-create
  47. default-first-option
  48. >
  49. <el-option label="微信" value="WECHAT"></el-option>
  50. <el-option label="支付宝" value="ALIPAY"></el-option>
  51. <el-option label="银行" value="BANK"></el-option>
  52. </el-select>
  53. </el-form-item>
  54. </el-form>
  55. <!-- 第二行搜索表单内联布局 -->
  56. <el-form :inline="true" :model="searchForm" class="search-form">
  57. <!-- <el-form-item label="充值时间"> -->
  58. <!-- 绑定充值时间范围选择值到 searchForm.rechargeTime -->
  59. <!-- <el-date-picker
  60. v-model="searchForm.rechargeTime"
  61. type="daterange"
  62. range-separator="至"
  63. start-placeholder="开始日期"
  64. end-placeholder="结束日期"
  65. />
  66. </el-form-item> -->
  67. <!-- 新增一个 div 包裹按钮组 -->
  68. <div class="button-group-wrapper">
  69. <el-form-item>
  70. <el-button type="primary" @click="handleSearch">查询</el-button>
  71. <el-button @click="resetSearch">重置</el-button>
  72. </el-form-item>
  73. </div>
  74. </el-form>
  75. </el-card>
  76. <!-- 搜索表单和明细表之间的分隔线 -->
  77. <el-divider />
  78. <!-- 明细表 -->
  79. <el-card class="detail-card">
  80. <template #header>
  81. <div class="card-header">
  82. <span>充值明细</span>
  83. </div>
  84. </template>
  85. <!-- 表格组件绑定表格数据和加载状态 -->
  86. <el-table
  87. :data="rechargeDetailsList"
  88. style="width: 100%"
  89. :loading="isLoading"
  90. stripe
  91. border
  92. >
  93. <el-table-column prop="序号" label="序号" width="80" />
  94. <el-table-column prop="精网号" label="精网号" width="120" />
  95. <el-table-column prop="姓名" label="姓名" width="120" />
  96. <el-table-column prop="订单号" label="订单号" width="180" />
  97. <el-table-column prop="充值方式" label="充值方式" width="120" />
  98. <el-table-column prop="所属地区" label="所属地区" width="120" />
  99. <el-table-column prop="金币数量" label="金币数量" width="120" />
  100. <el-table-column prop="金额" label="金额" width="120" />
  101. <el-table-column prop="备注" label="备注" min-width="150"/>
  102. <el-table-column prop="充值时间" label="充值时间" width="180" />
  103. </el-table>
  104. <!-- 空状态提示 -->
  105. <template #empty>
  106. <el-empty description="暂无充值明细数据" />
  107. </template>
  108. <!-- 分页组件绑定当前页码每页显示数量和总数据量 -->
  109. <el-pagination
  110. class="pagination"
  111. :current-page="currentPage"
  112. :page-size="pageSize"
  113. :total="total"
  114. layout="prev, pager, next, jumper"
  115. @current-change="handlePageChange"
  116. />
  117. </el-card>
  118. </el-card>
  119. </div>
  120. </template>
  121. <script setup>
  122. import { ref, onMounted } from 'vue'
  123. import axios from 'axios'
  124. import { Search } from '@element-plus/icons-vue'
  125. // 定义充值明细数据,初始为空数组
  126. const rechargeDetailsList = ref([])
  127. // 加载状态
  128. const isLoading = ref(false)
  129. // 当前页码
  130. const currentPage = ref(1)
  131. // 每页显示数量
  132. const pageSize = ref(8)
  133. // 定义总数据量,初始为 0
  134. const total = ref(0)
  135. // 搜索表单数据
  136. const searchForm = ref({
  137. jwcode: '', // 精网号,初始为空字符串
  138. region: '', // 地区,初始为空字符串
  139. orderId: '', // 订单号,初始为空字符串
  140. paymentMethod: '', // 充值方式,初始为空字符串
  141. rechargeTime: [] // 充值时间范围,初始为空数组
  142. })
  143. // 地区列表
  144. const regionList = ref([])
  145. /**
  146. * 获取地区数据的方法
  147. * 向服务器发送请求获取地区数据并更新地区列表
  148. */
  149. const fetchRegionList = async () => {
  150. try {
  151. // 请替换为实际的地区数据接口地址
  152. const response = await axios.post('http://192.168.8.94:5173/users/getRegion', {});
  153. if (response.data && Array.isArray(response.data)) {
  154. regionList.value = response.data;
  155. } else {
  156. throw new Error('后端返回的地区数据格式不正确');
  157. }
  158. } catch (error) {
  159. console.error('获取地区数据失败', error);
  160. }
  161. };
  162. /**
  163. * 获取充值明细数据的方法
  164. * 向服务器发送请求获取充值明细数据并更新页面显示
  165. */
  166. const fetchRechargeDetails = async () => {
  167. isLoading.value = true;
  168. try {
  169. const params = {
  170. page: currentPage.value,
  171. size: pageSize.value,
  172. jwcode: searchForm.value.jwcode,
  173. region: searchForm.value.region, // 修改为 region
  174. orderId: searchForm.value.orderId,
  175. paymentMethod: searchForm.value.paymentMethod,
  176. };
  177. console.log('发送的请求参数:', params);
  178. const response = await axios.post('http://192.168.8.94:5173/recharges/query', params, {
  179. headers: {
  180. 'Content-Type': 'application/json'
  181. }
  182. });
  183. console.log('后端返回的数据:', response.data);
  184. const items = response.data.items || [];
  185. rechargeDetailsList.value = items.map((item, index) => ({
  186. ...item,
  187. 序号: (currentPage.value - 1) * pageSize.value + index + 1
  188. }));
  189. total.value = response.data.total || 0;
  190. } catch (error) {
  191. console.error('获取充值明细数据失败', error);
  192. rechargeDetailsList.value = [];
  193. total.value = 0;
  194. } finally {
  195. isLoading.value = false;
  196. }
  197. };
  198. // 处理搜索
  199. const handleSearch = () => {
  200. // 清除搜索表单中字符串类型字段的所有空格
  201. searchForm.value.jwcode = searchForm.value.jwcode.replace(/\s/g, '');
  202. searchForm.value.region = searchForm.value.region.replace(/\s/g, '');
  203. searchForm.value.orderId = searchForm.value.orderId.replace(/\s/g, '');
  204. console.log('搜索表单数据:', searchForm.value); // 打印搜索表单数据
  205. currentPage.value = 1;
  206. fetchRechargeDetails();
  207. };
  208. // 重置搜索
  209. const resetSearch = () => {
  210. searchForm.value = {
  211. jwcode: '',
  212. region: '',
  213. orderId: '',
  214. paymentMethod: '',
  215. rechargeTime: []
  216. };
  217. currentPage.value = 1;
  218. fetchRechargeDetails();
  219. };
  220. // 处理分页变化
  221. const handlePageChange = (page) => {
  222. currentPage.value = page
  223. fetchRechargeDetails()
  224. }
  225. // 组件挂载完成后,获取充值明细数据和地区数据
  226. onMounted(() => {
  227. fetchRechargeDetails()
  228. fetchRegionList()
  229. })
  230. </script>
  231. <style scoped>
  232. /* 充值明细页面样式 */
  233. .recharge-details-page {
  234. /* 假设导航栏宽度为 180px,根据实际情况修改 */
  235. margin-left: 180px;
  236. /* 调整页面宽度,使用百分比适应剩余空间 */
  237. width: calc(100% - 250px);
  238. min-width: auto;
  239. margin-top: 2px;
  240. padding: 20px;
  241. /* 设置页面完全透明 */
  242. background-color: transparent;
  243. }
  244. .recharge-card {
  245. margin: 1px;
  246. box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
  247. min-height: 890px;
  248. /* 设置卡片半透明背景 */
  249. background-color: rgba(255, 255, 255, 0.4);
  250. }
  251. .search-card,
  252. .detail-card {
  253. margin-bottom: 20px;
  254. box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
  255. /* 设置卡片半透明背景 */
  256. background-color: transparent;
  257. }
  258. .card-header {
  259. display: flex;
  260. align-items: center;
  261. justify-content: space-between;
  262. color: #000; /* 假设背景较暗,设置文字颜色为白色以便查看 */
  263. }
  264. .search-form {
  265. margin-bottom: 20px;
  266. display: flex;
  267. flex-wrap: wrap;
  268. align-items: center;
  269. }
  270. /* 输入框和选择框样式 */
  271. .search-form .el-input__inner,
  272. .search-form .el-select .el-input__inner {
  273. background-color: rgba(255, 255, 255, 0.5);
  274. border: 1px solid #ccc;
  275. color: #000;
  276. }
  277. .button-group-wrapper {
  278. /* 让这个 div 占据剩余空间 */
  279. flex-grow: 1;
  280. display: flex;
  281. justify-content: flex-end;
  282. }
  283. /* 表格样式 */
  284. .el-table {
  285. background-color: rgba(255, 255, 255, 0.5);
  286. }
  287. .el-table th,
  288. .el-table td {
  289. background-color: transparent;
  290. }
  291. .pagination {
  292. margin-top: 20px;
  293. display: flex;
  294. justify-content: flex-end;
  295. }
  296. </style>