金币系统前端
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.

556 lines
15 KiB

  1. <script setup>
  2. import { ref, onMounted, reactive, computed } from "vue";
  3. import ElementPlus from "element-plus";
  4. import { ElMessage, ElMessageBox } from "element-plus";
  5. import { AiFillRead } from "vue-icons-plus/ai";
  6. import axios from "axios";
  7. import moment from "moment";
  8. import API from "../../api/index.js";
  9. // 变量
  10. // 充值明细表格
  11. const tableData = ref([]);
  12. // 搜索======================================
  13. // 搜索rechargeVo
  14. const rechargeVo = ref({});
  15. // 搜索对象
  16. const getObj = ref({
  17. pageNum: 1,
  18. pageSize: 10,
  19. });
  20. //分页总条目
  21. const total = ref(100);
  22. // 搜索对象时间
  23. const getTime = ref([]);
  24. // 搜索活动列表
  25. const activity = ref([]);
  26. // 所有信息
  27. const allData = ref([]);
  28. // 搜索地区列表
  29. const area = ref([]);
  30. //标签页默认高亮选项
  31. const activeName = ref("all");
  32. // 支付方式选项
  33. const payWay = [
  34. {
  35. value: "微信",
  36. label: "微信",
  37. },
  38. {
  39. value: "支付宝",
  40. label: "支付宝",
  41. },
  42. {
  43. value: "银联",
  44. label: "银联",
  45. },
  46. {
  47. value: "信用卡",
  48. label: "信用卡",
  49. },
  50. {
  51. value: "借记卡",
  52. label: "借记卡",
  53. },
  54. {
  55. value: "现金充值",
  56. label: "现金充值",
  57. },
  58. ];
  59. // //表格高度
  60. // const tableHeight = computed(function () {
  61. // return (getObj.value.pageSize + 2) * 60 + "px";
  62. // });
  63. // 方法
  64. // 搜索==============================================================
  65. // 搜索方法
  66. const get = async function (val) {
  67. try {
  68. // 搜索参数页码赋值
  69. if (typeof val === "number") {
  70. getObj.value.pageNum = val;
  71. }
  72. // 搜索参数时间赋值
  73. if (getTime.value != null) {
  74. if (getTime.value.startDate != "" && getTime.value.endDate != "") {
  75. rechargeVo.value.startDate = getTime.value[0];
  76. rechargeVo.value.endDate = getTime.value[1];
  77. }
  78. } else {
  79. rechargeVo.value.startDate = "";
  80. rechargeVo.value.endDate = "";
  81. }
  82. console.log("搜索参数", getObj.value);
  83. // 发送POST请求
  84. const result = await API.post(
  85. "http://54.251.137.151:10702/recharge/recharge",
  86. { ...getObj.value, rechargeVo: { ...rechargeVo.value } }
  87. );
  88. // 将响应结果存储到响应式数据中
  89. console.log("请求成功", result);
  90. // 存储表格数据
  91. tableData.value = result.data.list;
  92. console.log("tableData", tableData.value);
  93. // 存储分页总数
  94. total.value = result.data.total;
  95. console.log("total", total.value);
  96. } catch (error) {
  97. console.log("请求失败", error);
  98. // 在这里可以处理错误逻辑,比如显示错误提示等
  99. }
  100. };
  101. // 搜索
  102. const search = function () {
  103. getObj.value.pageNum = 1;
  104. get();
  105. };
  106. // 重置
  107. const reset = function () {
  108. rechargeVo.value.activityId = "";
  109. rechargeVo.value.payWay = "";
  110. rechargeVo.value.area = "";
  111. rechargeVo.value.startDate = "";
  112. rechargeVo.value.endDate = "";
  113. getTime.value = {};
  114. };
  115. // 今天
  116. const getToday = function () {
  117. const today = new Date();
  118. const startDate = new Date(
  119. today.getFullYear(),
  120. today.getMonth(),
  121. today.getDate()
  122. );
  123. const endDate = new Date(
  124. today.getFullYear(),
  125. today.getMonth(),
  126. today.getDate() + 1
  127. );
  128. getTime.value = [startDate, endDate];
  129. console.log("getTime", getTime.value);
  130. get();
  131. };
  132. // 昨天
  133. const getYesterday = function () {
  134. const yesterday = new Date();
  135. yesterday.setDate(yesterday.getDate() - 1);
  136. const startDate = new Date(
  137. yesterday.getFullYear(),
  138. yesterday.getMonth(),
  139. yesterday.getDate()
  140. );
  141. const endDate = new Date(
  142. yesterday.getFullYear(),
  143. yesterday.getMonth(),
  144. yesterday.getDate() + 1
  145. );
  146. getTime.value = [startDate, endDate];
  147. console.log("getTime", getTime.value);
  148. get();
  149. };
  150. // 近7天
  151. const get7Days = function () {
  152. const today = new Date();
  153. const startDate = new Date(
  154. today.getFullYear(),
  155. today.getMonth(),
  156. today.getDate() - 6
  157. );
  158. const endDate = new Date(
  159. today.getFullYear(),
  160. today.getMonth(),
  161. today.getDate() + 1
  162. );
  163. getTime.value = [startDate, endDate];
  164. console.log("getTime", getTime.value);
  165. get();
  166. };
  167. //全部充值明细
  168. const adminAll = function () {
  169. console.log("adminAll");
  170. rechargeVo.value.status = "";
  171. getObj.value.pageNum = 1;
  172. get();
  173. };
  174. //待审核充值明细
  175. const adminWait = function () {
  176. rechargeVo.value.status = 0;
  177. getObj.value.pageNum = 1;
  178. get();
  179. console.log("adminWait");
  180. };
  181. //已通过充值明细
  182. const adminPass = function () {
  183. rechargeVo.value.status = 1;
  184. getObj.value.pageNum = 1;
  185. get();
  186. console.log("adminPass");
  187. };
  188. //已驳回充值明细
  189. const adminReject = function () {
  190. rechargeVo.value.status = 2;
  191. getObj.value.pageNum = 1;
  192. get();
  193. console.log("adminReject");
  194. };
  195. //点击标签页
  196. const handleClick = function (tab, event) {
  197. if (tab.props.name === "all") {
  198. adminAll();
  199. } else if (tab.props.name === "wait") {
  200. adminWait();
  201. } else if (tab.props.name === "pass") {
  202. adminPass();
  203. } else if (tab.props.name === "reject") {
  204. adminReject();
  205. }
  206. };
  207. // 获取活动名称
  208. const getActivity = async function () {
  209. try {
  210. // 发送POST请求
  211. const result = await API.post(
  212. "http://54.251.137.151:10702/recharge/activity/select",
  213. {}
  214. );
  215. // 将响应结果存储到响应式数据中
  216. console.log("请求成功", result);
  217. // 存储表格数据
  218. activity.value = result.data;
  219. console.log("activity", activity.value);
  220. } catch (error) {
  221. console.log("请求失败", error);
  222. // 在这里可以处理错误逻辑,比如显示错误提示等
  223. }
  224. };
  225. // 获取地区
  226. // 获取地区
  227. const getArea = async function () {
  228. try {
  229. // 发送POST请求
  230. const result = await API.post(
  231. "http://54.251.137.151:10702/recharge/user/search",
  232. {}
  233. );
  234. // 将响应结果存储到响应式数据中
  235. console.log("请求成功", result);
  236. // 存储地区信息
  237. area.value = result.data;
  238. console.log("地区", area.value);
  239. } catch (error) {
  240. console.log("请求失败", error);
  241. // 在这里可以处理错误逻辑,比如显示错误提示等
  242. }
  243. };
  244. // 验证跳转输入框的数字是否合法
  245. const checkNumber = function () {
  246. if (typeof parseInt(getObj.value.pageNum) === "number") {
  247. console.log(
  248. "总共有多少页" + Math.ceil(total.value / getObj.value.pageSize)
  249. );
  250. if (
  251. getObj.value.pageNum > 0 &&
  252. getObj.value.pageNum <= Math.ceil(total.value / getObj.value.pageSize)
  253. ) {
  254. getObj.value.pageNum = parseInt(getObj.value.pageNum);
  255. console.log("输入的数字合法");
  256. get();
  257. } else {
  258. //提示
  259. ElMessage({
  260. type: "error",
  261. message: "请检查输入内容",
  262. });
  263. }
  264. } else {
  265. //提示
  266. ElMessage({
  267. type: "error",
  268. message: "请检查输入内容",
  269. });
  270. }
  271. };
  272. // 挂载
  273. onMounted(async function () {
  274. await get();
  275. getActivity();
  276. await getArea();
  277. });
  278. </script>
  279. <template>
  280. <el-row>
  281. <el-col>
  282. <el-card style="margin-bottom: 20px">
  283. <el-row style="margin-bottom: 10px">
  284. <el-col :span="8">
  285. <div class="head-card-element">
  286. <el-text class="mx-1" size="large">活动名称</el-text>
  287. <el-select
  288. v-model="rechargeVo.activityId"
  289. placeholder="请选择活动名称"
  290. size="large"
  291. style="width: 240px"
  292. clearable
  293. >
  294. <el-option
  295. v-for="item in activity"
  296. :key="item.activityId"
  297. :label="item.activityName"
  298. :value="item.activityId"
  299. />
  300. </el-select>
  301. </div>
  302. </el-col>
  303. <el-col :span="8">
  304. <div class="head-card-element">
  305. <el-text class="mx-1" size="large">支付方式</el-text>
  306. <el-select
  307. v-model="rechargeVo.payWay"
  308. placeholder="请选择支付方式"
  309. size="large"
  310. style="width: 240px"
  311. clearable
  312. >
  313. <el-option
  314. v-for="item in payWay"
  315. :key="item.value"
  316. :label="item.label"
  317. :value="item.value"
  318. />
  319. </el-select>
  320. </div>
  321. </el-col>
  322. <el-col :span="8">
  323. <div class="head-card-element">
  324. <el-text class="mx-1" size="large">所属地区</el-text>
  325. <el-select
  326. v-model="rechargeVo.area"
  327. placeholder="请选择所属地区"
  328. size="large"
  329. style="width: 240px"
  330. clearable
  331. >
  332. <el-option
  333. v-for="item in area"
  334. :key="item"
  335. :label="item"
  336. :value="item"
  337. />
  338. </el-select>
  339. </div>
  340. </el-col>
  341. </el-row>
  342. <el-row>
  343. <el-col :span="21">
  344. <div class="head-card-element">
  345. <el-text class="mx-1" size="large">充值时间</el-text>
  346. <el-date-picker
  347. v-model="getTime"
  348. type="datetimerange"
  349. range-separator="至"
  350. start-placeholder="起始时间"
  351. end-placeholder="结束时间"
  352. />
  353. <el-button style="margin-left: 10px" @click="getToday()"
  354. ></el-button
  355. >
  356. <el-button @click="getYesterday()"></el-button>
  357. <el-button @click="get7Days()">近7天</el-button>
  358. </div>
  359. </el-col>
  360. <el-col :span="3">
  361. <div class="head-card-btn">
  362. <el-button @click="reset()">重置</el-button>
  363. <el-button type="primary" @click="search()">查询</el-button>
  364. </div>
  365. </el-col>
  366. </el-row>
  367. </el-card>
  368. </el-col>
  369. </el-row>
  370. <el-row>
  371. <el-col>
  372. <el-card>
  373. <el-tabs
  374. v-model="activeName"
  375. type="card"
  376. class="demo-tabs"
  377. @tab-click="handleClick"
  378. >
  379. <el-tab-pane label="全部" name="all"></el-tab-pane>
  380. <el-tab-pane label="待审核" name="wait"></el-tab-pane>
  381. <el-tab-pane label="已通过" name="pass"></el-tab-pane>
  382. <el-tab-pane label="已驳回" name="reject"></el-tab-pane>
  383. </el-tabs>
  384. <div>
  385. <el-table :data="tableData" :height="tableHeight" style="width: 100%">
  386. <el-table-column
  387. type="index"
  388. label="序号"
  389. width="100px"
  390. fixed="left"
  391. >
  392. <template #default="scope">
  393. <span>{{
  394. scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
  395. }}</span>
  396. </template>
  397. </el-table-column>
  398. <el-table-column prop="username" label="姓名" width="100px" />
  399. <el-table-column prop="jwcode" label="精网号" width="130px" />
  400. <el-table-column prop="area" label="所属地区" width="100px" />
  401. <el-table-column
  402. prop="activityName"
  403. label="活动名称"
  404. width="150px"
  405. />
  406. <el-table-column
  407. prop="paidGold"
  408. label="充值金额"
  409. width="120px"
  410. sortable
  411. />
  412. <el-table-column
  413. prop="rechargeWay"
  414. label="充值方式"
  415. width="100px"
  416. />
  417. <el-table-column prop="paidGold" label="永久金币" width="100px" />
  418. <el-table-column prop="freeGold" label="免费金币" width="100px" />
  419. <el-table-column
  420. prop="remark"
  421. label="备注"
  422. width="200px"
  423. show-overflow-tooltip
  424. />
  425. <el-table-column prop="payWay" label="支付方式" width="100px" />
  426. <el-table-column
  427. prop="rechargeVoucher"
  428. label="支付凭证"
  429. width="150px"
  430. >
  431. <template #default="scope">
  432. <el-image
  433. :preview-src-list="[scope.row.rechargeVoucher]"
  434. preview-teleported="true"
  435. :src="scope.row.rechargeVoucher"
  436. alt="凭证"
  437. style="width: 50px; height: 50px"
  438. />
  439. </template>
  440. </el-table-column>
  441. <el-table-column prop="name" label="提交人" width="100px" />
  442. <el-table-column prop="status" label="状态" width="100px">
  443. <template #default="scope">
  444. <span v-if="scope.row.status === 1">
  445. <div class="status">
  446. <span class="green-dot"></span>
  447. <span>已通过</span>
  448. </div>
  449. </span>
  450. <span v-if="scope.row.status === 0">
  451. <div class="status">
  452. <span class="grey-dot"></span>
  453. <span>待审核</span>
  454. </div>
  455. </span>
  456. <span v-if="scope.row.status === 2">
  457. <div class="status">
  458. <span class="red-dot"></span>
  459. <span>已驳回</span>
  460. </div>
  461. </span>
  462. </template>
  463. </el-table-column>
  464. <el-table-column
  465. prop="reson"
  466. label="驳回理由"
  467. width="200px"
  468. show-overflow-tooltip
  469. />
  470. <el-table-column prop="rechargeTime" label="交款时间" width="200px">
  471. <template #default="scope">
  472. {{
  473. moment(scope.row.rechargeTime).format("YYYY-MM-DD HH:mm:ss")
  474. }}
  475. </template>
  476. </el-table-column>
  477. <el-table-column prop="createTime" label="提交时间" width="200px" />
  478. </el-table>
  479. </div>
  480. <!-- 分页 -->
  481. <div class="pagination" style="margin-top: 20px">
  482. <el-pagination
  483. background
  484. :page-size="getObj.pageSize"
  485. layout="slot"
  486. :total="total"
  487. >
  488. <div>{{ total }},每页</div>
  489. <el-select
  490. v-model="getObj.pageSize"
  491. class="page-size"
  492. @change="get()"
  493. style="width: 80px"
  494. >
  495. <el-option
  496. v-for="item in [5, 10, 20, 50, 100]"
  497. :key="item"
  498. :label="item"
  499. :value="item"
  500. ></el-option>
  501. </el-select>
  502. <div></div>
  503. </el-pagination>
  504. <el-pagination
  505. background
  506. layout="prev, pager, next,slot"
  507. :page-size="getObj.pageSize"
  508. :total="total"
  509. :current-page="getObj.pageNum"
  510. @current-change="get"
  511. >
  512. <div>跳至</div>
  513. <el-input
  514. v-model="getObj.pageNum"
  515. style="width: 40px"
  516. @change="checkNumber"
  517. />
  518. <div></div>
  519. </el-pagination>
  520. </div>
  521. </el-card>
  522. </el-col>
  523. </el-row>
  524. </template>
  525. <style scoped>
  526. .pagination {
  527. display: flex;
  528. }
  529. .status {
  530. display: flex;
  531. }
  532. .head-card {
  533. display: flex;
  534. }
  535. .head-card-element {
  536. margin-right: 20px;
  537. }
  538. .head-card-btn {
  539. margin-left: auto;
  540. }
  541. </style>