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

449 lines
12 KiB

2 months ago
2 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 axios from "axios";
  6. import moment from "moment";
  7. import { ta } from "element-plus/es/locales.mjs";
  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. "http://54.251.137.151:10702/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. const tableAllData = ref([]);
  29. // 各金币总数 合计数
  30. const rechargeCoin = ref(0);
  31. const freeCoin = ref(0);
  32. const taskCoin = ref(0);
  33. // 搜索===========================================
  34. //分页总条目
  35. const total = ref(100);
  36. // 搜索对象时间
  37. const getTime = ref([]);
  38. // 搜索detailY
  39. const detailY = ref({});
  40. // 不分页的搜索对象
  41. const getAllObj = ref({});
  42. // 搜索对象
  43. const getObj = ref({
  44. pageNum: 1,
  45. pageSize: 50,
  46. });
  47. // 新增排序字段和排序方式
  48. const sortField = ref("");
  49. const sortOrder = ref("");
  50. // 支付方式选项
  51. const updateType = [
  52. {
  53. value: "0",
  54. label: "充值",
  55. },
  56. {
  57. value: "1",
  58. label: "消费",
  59. },
  60. {
  61. value: "2",
  62. label: "退款",
  63. },
  64. ];
  65. // //表格高度
  66. // const tableHeight = computed(function () {
  67. // return (getObj.value.pageSize + 2) * 38 + "px";
  68. // });
  69. // 方法
  70. // 搜索===========================================================================
  71. // 搜索方法
  72. const get = async function (val) {
  73. try {
  74. // 地区赋值
  75. // 地区赋值
  76. if (adminData.value.area === "泰国") {
  77. detailY.value.areas = ["泰国", "越南"];
  78. } else if (adminData.value.area !== "总部") {
  79. detailY.value.area = adminData.value.area;
  80. }
  81. // 搜索参数页码赋值
  82. if (typeof val === "number") {
  83. getObj.value.pageNum = val;
  84. }
  85. // 搜索参数时间赋值
  86. if (getTime.value != null) {
  87. if (getTime.value.startDate != "" && getTime.value.endDate != "") {
  88. detailY.value.startDate = getTime.value[0];
  89. detailY.value.endDate = getTime.value[1];
  90. }
  91. } else {
  92. detailY.value.startDate = "";
  93. detailY.value.endDate = "";
  94. }
  95. // 添加排序字段和排序方式到请求参数
  96. detailY.value.sortField = sortField.value;
  97. detailY.value.sortOrder = sortOrder.value;
  98. console.log("搜索参数", getObj.value);
  99. // 发送POST请求
  100. const result = await API.post(
  101. "http://54.251.137.151:10702/detailY/select",
  102. {
  103. ...getObj.value,
  104. detailYgold: { ...detailY.value },
  105. }
  106. );
  107. // 获取合计数
  108. const result2 = await API.post("http://54.251.137.151:10702/detailY", {
  109. ...getAllObj.value,
  110. detailY: { ...detailY.value },
  111. });
  112. // 将响应结果存储到响应式数据中
  113. console.log("请求成功", result);
  114. // console.log("请求成功2", result2);
  115. // 存储表格数据
  116. tableData.value = result.data.list;
  117. console.log("tableData", tableData.value);
  118. tableAllData.value = result2.data;
  119. // 下列各数除以100
  120. // 修改为保留两位小数
  121. rechargeCoin.value = parseFloat((tableAllData.value.sumR / 100).toFixed(2));
  122. freeCoin.value = parseFloat((tableAllData.value.sumF / 100).toFixed(2));
  123. taskCoin.value = parseFloat((tableAllData.value.sumT / 100).toFixed(2));
  124. // console.log("tableAllData", tableAllData.value);
  125. // 存储分页总数
  126. total.value = result.data.total;
  127. console.log("total", total.value);
  128. } catch (error) {
  129. console.log("请求失败", error);
  130. // 在这里可以处理错误逻辑,比如显示错误提示等
  131. }
  132. };
  133. // 搜索
  134. const search = function () {
  135. getObj.value.pageNum = 1;
  136. get();
  137. };
  138. // 重置
  139. const reset = function () {
  140. detailY.value = {};
  141. sortField.value = "";
  142. sortOrder.value = "";
  143. get();
  144. };
  145. // 验证跳转输入框的数字是否合法
  146. const checkNumber = function () {
  147. if (typeof parseInt(getObj.value.pageNum) === "number") {
  148. console.log(
  149. "总共有多少页" + Math.ceil(total.value / getObj.value.pageSize)
  150. );
  151. if (
  152. getObj.value.pageNum > 0 &&
  153. getObj.value.pageNum <= Math.ceil(total.value / getObj.value.pageSize)
  154. ) {
  155. getObj.value.pageNum = parseInt(getObj.value.pageNum);
  156. console.log("输入的数字合法");
  157. get();
  158. } else {
  159. //提示
  160. ElMessage({
  161. type: "error",
  162. message: "请检查输入内容",
  163. });
  164. }
  165. } else {
  166. //提示
  167. ElMessage({
  168. type: "error",
  169. message: "请检查输入内容",
  170. });
  171. }
  172. };
  173. // 处理排序事件
  174. const handleSortChange = (column) => {
  175. console.log("排序字段:", column.prop);
  176. console.log("排序方式:", column.order);
  177. if (column.prop === "buyJb") {
  178. sortField.value = "buy_jb";
  179. } else if (column.prop === "taskJb") {
  180. sortField.value = "core_jb";
  181. } else if (column.prop === "free6") {
  182. sortField.value = "free_6";
  183. } else if (column.prop === "free12") {
  184. sortField.value = "free_12";
  185. }
  186. sortOrder.value = column.order === "ascending" ? "ASC" : "DESC";
  187. get();
  188. };
  189. //选地区
  190. const area = [
  191. {
  192. value: "马来西亚",
  193. label: "马来西亚",
  194. },
  195. {
  196. value: "新加坡",
  197. label: "新加坡",
  198. },
  199. {
  200. value: "香港",
  201. label: "香港",
  202. },
  203. {
  204. value: "泰国",
  205. label: "泰国",
  206. },
  207. {
  208. value: "加拿大",
  209. label: "加拿大",
  210. },
  211. {
  212. value: "越南HCM",
  213. label: "越南HCM",
  214. },
  215. ];
  216. // 挂载
  217. onMounted(async function () {
  218. await getAdminData();
  219. await get();
  220. });
  221. </script>
  222. <template>
  223. <el-row>
  224. <el-col>
  225. <el-card style="margin-bottom: 20px">
  226. <div class="head-card">
  227. <div class="head-card-element">
  228. <el-text class="mx-1" size="large">精网号</el-text>
  229. <el-input
  230. v-model="detailY.jwcode"
  231. style="width: 240px"
  232. placeholder="请输入精网号"
  233. clearable
  234. />
  235. </div>
  236. <div
  237. class="head-card-element"
  238. style="margin-left: 50px"
  239. v-if="adminData.area == '总部'"
  240. >
  241. <el-text class="mx-1" size="large">所属地区</el-text>
  242. <el-select
  243. v-model="detailY.area"
  244. placeholder="请选择所属地区"
  245. style="width: 240px"
  246. clearable
  247. >
  248. <el-option
  249. v-for="item in area"
  250. :key="item.value"
  251. :label="item.label"
  252. :value="item.value"
  253. />
  254. </el-select>
  255. </div>
  256. <div class="head-card-btn">
  257. <el-button @click="reset()">重置</el-button>
  258. <el-button type="primary" @click="search()">查询</el-button>
  259. </div>
  260. </div>
  261. </el-card>
  262. </el-col>
  263. </el-row>
  264. <el-row>
  265. <el-col>
  266. <el-card>
  267. <!-- <div>
  268. 现有金币永久金币{{ Math.abs(rechargeCoin) }}免费金币{{
  269. Math.abs(freeCoin)
  270. }}任务金币{{ Math.abs(taskCoin) }}
  271. </div> -->
  272. <!-- 设置表格容器的高度和滚动样式 -->
  273. <div style="height: 626px; overflow-y: auto">
  274. <el-table
  275. :data="tableData"
  276. style="width: 100%"
  277. height="715px"
  278. @sort-change="handleSortChange"
  279. >
  280. <el-table-column
  281. type="index"
  282. label="序号"
  283. width="100px"
  284. fixed="left"
  285. >
  286. <template #default="scope">
  287. <span>{{
  288. scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
  289. }}</span>
  290. </template>
  291. </el-table-column>
  292. <el-table-column prop="name" label="姓名" width="200" />
  293. <el-table-column prop="jwcode" label="精网号" width="120" />
  294. <el-table-column prop="area" label="所属地区" width="120" />
  295. <el-table-column
  296. prop="allJb"
  297. label="总金币"
  298. width="120"
  299. aligh="center"
  300. >
  301. <template #default="scope">
  302. <span>{{
  303. (scope.row.free12 +
  304. scope.row.free6 +
  305. scope.row.coreJb +
  306. scope.row.buyJb) /
  307. 100
  308. }}</span>
  309. </template>
  310. </el-table-column>
  311. <el-table-column
  312. prop="buyJb"
  313. label="永久金币"
  314. sortable="“custom”"
  315. width="110"
  316. >
  317. <template #default="scope">
  318. <span>{{ Math.abs(scope.row.buyJb) / 100 }}</span>
  319. </template>
  320. </el-table-column>
  321. <el-table-column prop="freeJb" label="免费金币" width="110">
  322. <template #default="scope">
  323. <span>{{
  324. Math.abs(scope.row.free6 + scope.row.free12) / 100
  325. }}</span>
  326. </template>
  327. </el-table-column>
  328. <el-table-column
  329. prop="free6"
  330. label=" 6月份到期免费金币"
  331. sortable="“custom”"
  332. width="110"
  333. >
  334. <template #default="scope">
  335. <span>{{ scope.row.free6 / 100 }}</span>
  336. </template>
  337. </el-table-column>
  338. <el-table-column
  339. prop="free12"
  340. label="12月份到期免费金币"
  341. sortable="“custom”"
  342. width="110"
  343. >
  344. <template #default="scope">
  345. <span>{{ scope.row.free12 / 100 }}</span>
  346. </template>
  347. </el-table-column>
  348. <el-table-column
  349. prop="coreJb"
  350. label="任务金币"
  351. sortable="“custom”"
  352. width="130"
  353. >
  354. <template #default="scope">
  355. <span>{{ Math.abs(scope.row.coreJb) / 100 }}</span>
  356. </template>
  357. </el-table-column>
  358. <el-table-column prop="rcoin" label="历史充值" width="150">
  359. <template #default="scope">
  360. <span>{{ scope.row.rcoin / 100 }}</span>
  361. </template>
  362. </el-table-column>
  363. <el-table-column prop="scoin" label="历史消费" width="150">
  364. <template #default="scope">
  365. <span>{{ Math.abs(scope.row.scoin) / 100 }}</span>
  366. </template>
  367. </el-table-column>
  368. </el-table>
  369. </div>
  370. <!-- 分页 -->
  371. <!-- 分页 -->
  372. <div class="pagination" style="margin-top: 20px">
  373. <el-pagination
  374. background
  375. :page-size="getObj.pageSize"
  376. layout="slot"
  377. :total="total"
  378. >
  379. <div>{{ total }},每页</div>
  380. <el-select
  381. v-model="getObj.pageSize"
  382. class="page-size"
  383. @change="get()"
  384. style="width: 80px"
  385. >
  386. <el-option
  387. v-for="item in [5, 10, 20, 50, 100]"
  388. :key="item"
  389. :label="item"
  390. :value="item"
  391. ></el-option>
  392. </el-select>
  393. <div></div>
  394. </el-pagination>
  395. <el-pagination
  396. background
  397. layout="prev, pager, next,slot"
  398. :page-size="getObj.pageSize"
  399. :total="total"
  400. :current-page="getObj.pageNum"
  401. @current-change="get"
  402. >
  403. <div>跳至</div>
  404. <el-input
  405. v-model="getObj.pageNum"
  406. style="width: 40px"
  407. @change="checkNumber"
  408. />
  409. <div></div>
  410. </el-pagination>
  411. </div>
  412. </el-card>
  413. </el-col>
  414. </el-row>
  415. </template>
  416. <style scoped>
  417. .pagination {
  418. display: flex;
  419. }
  420. .status {
  421. display: flex;
  422. }
  423. .head-card {
  424. display: flex;
  425. }
  426. .head-card-element {
  427. margin-right: 20px;
  428. }
  429. .head-card-btn {
  430. margin-left: auto;
  431. }
  432. </style>