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

471 lines
14 KiB

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