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

677 lines
19 KiB

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