金币系统前端

626 lines
16 KiB

12 months ago
  1. <script setup>
  2. import { ref, onMounted, computed, reactive } from "vue";
  3. import { ElMessageBox } from "element-plus";
  4. import axios from "axios";
  5. import { createApp } from "vue";
  6. import moment from "moment";
  7. const regeAdd = ref(false);
  8. const regeEdit = ref(false);
  9. //汇率表格数据
  10. const tableData = ref([]);
  11. //搜索对象
  12. const getObj = ref({
  13. pageNum: 1,
  14. pageSize: 5,
  15. });
  16. const total = ref(0);
  17. //分页总条目
  18. const get = async function (val) {
  19. try {
  20. // 搜索参数页码赋值
  21. if (typeof val === "number") {
  22. getObj.value.pageNum = val;
  23. }
  24. console.log("搜索参数", getObj.value);
  25. // 发送POST请求
  26. const result = await axios.post("http://192.168.8.174:10010/rates/search", {
  27. ...getObj.value,
  28. rate: { ...value1.value },
  29. });
  30. // 将响应结果存储到响应式数据中
  31. console.log("请求成功", result);
  32. // 存储表格数据
  33. tableData.value = result.data.data.list;
  34. console.log("tableData", tableData.value);
  35. // 在这里可以根据需求进一步处理成功后的逻辑,比如更新UI显示成功消息等
  36. // 存储分页总条目
  37. total.value = result.data.data.total;
  38. console.log("total", total.value);
  39. } catch (error) {
  40. console.log("请求失败", error);
  41. // 在这里可以处理错误逻辑,比如显示错误提示等
  42. }
  43. };
  44. // 添加方法
  45. const rateAdd = ref({
  46. adminId: "1",
  47. });
  48. const addRate = async function () {
  49. try {
  50. console.log("搜索参数", getObj.value);
  51. // 发送POST请求
  52. const result = await axios.post(
  53. "http://192.168.8.174:10010/rates/add",
  54. rateAdd.value
  55. );
  56. // 将响应结果存储到响应式数据中
  57. console.log("请求成功", result);
  58. get();
  59. } catch (error) {
  60. console.log("请求失败", error);
  61. // 在这里可以处理错误逻辑,比如显示错误提示等
  62. }
  63. };
  64. const add = () => {
  65. Ref.value.validate(async (valid) => {
  66. if (valid) {
  67. ElMessageBox.confirm("确认添加?")
  68. .then(() => {
  69. addRate();
  70. rateAdd.value = {};
  71. value1.value = {
  72. startTime: "",
  73. endTime: "",
  74. };
  75. regeAdd.value = false;
  76. })
  77. .catch(() => {
  78. regeAdd.value = false;
  79. });
  80. } else {
  81. //提示
  82. ElMessage({
  83. type: "error",
  84. message: "请检查输入内容",
  85. });
  86. }
  87. });
  88. };
  89. // 编辑方法
  90. const rateEdit = ref({});
  91. //查询已有的数据
  92. const getEditData = async function (row) {
  93. try {
  94. console.log("搜索参数", getObj.value);
  95. // 发送POST请求
  96. const result = await axios.post("http://192.168.8.174:10010/rates/search", {
  97. rate: { rateId: row.rateId },
  98. });
  99. // 将响应结果存储到响应式数据中
  100. console.log("请求成功", result);
  101. // 存储表格数据
  102. rateEdit.value = result.data.data[0];
  103. } catch (error) {
  104. console.log("请求失败", error);
  105. // 在这里可以处理错误逻辑,比如显示错误提示等
  106. }
  107. };
  108. const editRate = async function () {
  109. try {
  110. console.log("搜索参数", rateEdit.value);
  111. // 发送POST请求
  112. const result = await axios.post(
  113. "http://192.168.8.174:10010/rates/update",
  114. rateEdit.value
  115. );
  116. // 将响应结果存储到响应式数据中
  117. console.log("请求成功", result);
  118. get();
  119. } catch (error) {
  120. console.log("请求失败", error);
  121. // 在这里可以处理错误逻辑,比如显示错误提示等
  122. }
  123. };
  124. const edit = () => {
  125. ElMessageBox.confirm("确认修改?")
  126. .then(() => {
  127. editRate();
  128. regeEdit.value = false;
  129. })
  130. .catch(() => {
  131. regeEdit.value = false;
  132. });
  133. };
  134. // 删除方法
  135. const deleteRate = async function (row) {
  136. try {
  137. // 发送POST请求
  138. const result = await axios.post(
  139. "http://192.168.8.174:10010/rates/delete/ " + row.rateId
  140. );
  141. // 将响应结果存储到响应式数据中
  142. console.log("请求成功", result);
  143. get();
  144. } catch (error) {
  145. console.log("请求失败", error);
  146. // 在这里可以处理错误逻辑,比如显示错误提示等
  147. }
  148. };
  149. // 挂载
  150. onMounted(async function () {
  151. get();
  152. });
  153. //分页
  154. function handlePageChange(currentPage, pageSize) {
  155. get();
  156. }
  157. //货币条目
  158. const options = [
  159. {
  160. value: "USD",
  161. label: "USD",
  162. },
  163. {
  164. value: "EUR",
  165. label: "EUR",
  166. },
  167. {
  168. value: "JPY",
  169. label: "JPY",
  170. },
  171. {
  172. value: "GBP",
  173. label: "GBP",
  174. },
  175. {
  176. value: "AUD",
  177. label: "AUD",
  178. },
  179. ];
  180. //时间选择器
  181. const value1 = ref({
  182. startTime: "",
  183. endTime: "",
  184. }); // 时间数组
  185. function handleDateChange(value) {
  186. if (value && value.length === 2) {
  187. value1.value.startTime = value[0]; // 开始日期
  188. value1.value.endTime = value[1]; // 结束日期
  189. }
  190. console.log(value1);
  191. }
  192. function formatDate(value) {
  193. if (!value) return "";
  194. const date = new Date(value);
  195. const year = date.getFullYear();
  196. const month = (date.getMonth() + 1).toString().padStart(2, "0");
  197. const day = date.getDate().toString().padStart(2, "0");
  198. const hours = date.getHours().toString().padStart(2, "0");
  199. const minutes = date.getMinutes().toString().padStart(2, "0");
  200. const seconds = date.getSeconds().toString().padStart(2, "0");
  201. return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
  202. }
  203. //表格高度
  204. const tableHeight = computed(function () {
  205. return (getObj.value.pageSize + 1) * 50 + "px";
  206. });
  207. // 新增数据规则
  208. // 表单验证ref
  209. const Ref = ref(null);
  210. const handleStartTimeChange = () => {
  211. Ref.value.validateField("endTime");
  212. };
  213. const checkStartTime = function (rule, value, callback) {
  214. if (value <= new Date()) {
  215. callback(new Error("开始时间不能小于当前时间"));
  216. } else {
  217. callback();
  218. }
  219. };
  220. const checkEndTime = function (rule, value, callback) {
  221. if (value <= new Date()) {
  222. callback(new Error("结束时间不能小于当前时间"));
  223. } else if (value <= addObj.value.startTime) {
  224. callback(new Error("结束时间不能小于开始时间"));
  225. } else {
  226. callback();
  227. }
  228. };
  229. const rules = reactive({
  230. currency: [{ required: true, message: "请选择货币名称", trigger: "blur" }],
  231. exchangeRate: [{ required: true, message: "请输入汇率", trigger: "blur" }],
  232. updateName: [{ required: true, message: "请输入添加人", trigger: "blur" }],
  233. startTime: [
  234. { required: true, message: "请选择开始时间", trigger: "blur" },
  235. { validator: checkStartTime, trigger: "blur" },
  236. ],
  237. endTime: [
  238. { required: true, message: "请选择结束时间", trigger: "blur" },
  239. { validator: checkEndTime, trigger: "blur" },
  240. ],
  241. });
  242. // 验证跳转输入框的数字是否合法
  243. const checkNumber = function () {
  244. if (typeof parseInt(getObj.value.pageNum) === "number") {
  245. console.log(
  246. "总共有多少页" + Math.ceil(total.value / getObj.value.pageSize)
  247. );
  248. if (
  249. getObj.value.pageNum > 0 &&
  250. getObj.value.pageNum <= Math.ceil(total.value / getObj.value.pageSize)
  251. ) {
  252. console.log("输入的数字合法");
  253. get();
  254. } else {
  255. //提示
  256. ElMessage({
  257. type: "error",
  258. message: "请检查输入内容",
  259. });
  260. }
  261. } else {
  262. //提示
  263. ElMessage({
  264. type: "error",
  265. message: "请检查输入内容",
  266. });
  267. }
  268. };
  269. </script>
  270. <template>
  271. <!-- 这是主页面 -->
  272. <el-row>
  273. <el-col>
  274. <el-card>
  275. <!-- 这是时间 -->
  276. <div class="demo-range">
  277. 时间
  278. <el-date-picker
  279. v-model="value1"
  280. type="daterange"
  281. range-separator="至"
  282. start-placeholder="开始时间"
  283. end-placeholder="结束时间"
  284. @change="handleDateChange"
  285. :size="size"
  286. value-format="YYYY-MM-DD"
  287. />
  288. <!-- 按钮 -->
  289. <el-button
  290. class="button-item"
  291. type="primary"
  292. style="float: right"
  293. @click="get"
  294. >查询</el-button
  295. >
  296. <el-button
  297. class="button-item"
  298. style="float: right"
  299. @click="handledelete"
  300. >重置</el-button
  301. >
  302. </div>
  303. </el-card>
  304. </el-col>
  305. </el-row>
  306. <el-row>
  307. <el-col>
  308. <el-card class="box-card" style="max-width: 100%">
  309. <!-- 添加 -->
  310. <div class="add-item">
  311. <el-button
  312. style="color: #048efb; border: 1px solid #048efb"
  313. @click="regeAdd = true"
  314. >新增汇率</el-button
  315. >
  316. </div>
  317. <!-- 表格 -->
  318. <div>
  319. <el-table
  320. :data="tableData"
  321. v-if="(tableData.flag = 1)"
  322. :height="tableHeight"
  323. style="width: 100%"
  324. >
  325. <el-table-column prop="currency" label="货币名称" :span="3" />
  326. <el-table-column prop="exchangeRate" label="汇率" :span="3">
  327. <template #default="scope">
  328. <p>{{ scope.row.exchangeRate }} 1新币</p>
  329. </template>
  330. </el-table-column>
  331. <el-table-column prop="createTime" label="添加时间" :span="5">
  332. <template #default="scope">
  333. <span>{{ formatDate(scope.row.createTime) }}</span>
  334. </template>
  335. </el-table-column>
  336. <el-table-column prop="updateTime" label="更新时间" :span="5">
  337. <template #default="scope">
  338. <span>{{ formatDate(scope.row.updateTime) }}</span>
  339. </template>
  340. </el-table-column>
  341. <el-table-column prop="updateName" label="更新人" :span="4" />
  342. <el-table-column label="操作" :span="4">
  343. <template #default="scope">
  344. <el-button
  345. type="text"
  346. @click="
  347. regeEdit = true;
  348. getEditData(scope.row);
  349. "
  350. >编辑</el-button
  351. >
  352. <el-button type="text" @click="deleteRate(scope.row)"
  353. >删除</el-button
  354. >
  355. </template>
  356. </el-table-column>
  357. </el-table>
  358. </div>
  359. <!-- 分页 -->
  360. <div class="pagination">
  361. <el-pagination
  362. background
  363. :page-size="getObj.pageSize"
  364. layout="slot"
  365. :total="total"
  366. >
  367. <div>{{ total }},每页</div>
  368. <el-select
  369. v-model="getObj.pageSize"
  370. class="page-size"
  371. @change="get()"
  372. style="width: 80px"
  373. >
  374. <el-option
  375. v-for="item in [5, 6, 7, 8, 9, 10]"
  376. :key="item"
  377. :label="item"
  378. :value="item"
  379. ></el-option>
  380. </el-select>
  381. <div></div>
  382. </el-pagination>
  383. <el-pagination
  384. background
  385. layout="prev, pager, next, slot"
  386. :page-size="getObj.pageSize"
  387. :total="total"
  388. :current-page="getObj.pageNum"
  389. @current-change="get"
  390. >
  391. <div>跳至</div>
  392. <el-input
  393. v-model="getObj.pageNum"
  394. style="width: 40px"
  395. @change="checkNumber"
  396. />
  397. <div></div>
  398. </el-pagination>
  399. </div>
  400. </el-card>
  401. </el-col>
  402. </el-row>
  403. <!-- 这是添加弹窗 -->
  404. <el-dialog v-model="regeAdd" title="新增汇率" width="500">
  405. <template #footer>
  406. <el-form
  407. ref="Ref"
  408. style="max-width: 600px"
  409. :model="rateAdd"
  410. :rules="rules"
  411. label-width="auto"
  412. class="demo-ruleForm"
  413. :size="formSize"
  414. status-icon
  415. >
  416. <el-form-item prop="currency" label="货币名称:">
  417. <el-select
  418. v-model.number="rateAdd.currency"
  419. placeholder="请选择"
  420. style="width: 240px"
  421. >
  422. <el-option
  423. v-for="item in options"
  424. :key="item.value"
  425. :label="item.label"
  426. :value="item.value"
  427. />
  428. </el-select>
  429. </el-form-item>
  430. <el-form-item prop="exchangeRate" label="汇率:">
  431. <el-input v-model="rateAdd.exchangeRate" style="width: 120px" />
  432. <p class="unit">:1</p>
  433. <p>(提示当前规则每 5 元人民币可兑换 1 新币)</p>
  434. </el-form-item>
  435. <el-form-item prop="updateName" label="提交人:">
  436. <el-input v-model="rateAdd.updateName" style="width: 240px" />
  437. </el-form-item>
  438. <el-form-item prop="startTime" label="开始时间:">
  439. <el-date-picker
  440. v-model="rateAdd.startTime"
  441. type="date"
  442. placeholder="请选择时间"
  443. :default-value="new Date()"
  444. @change="handleStartTimeChange"
  445. value-format="YYYY-MM-DD"
  446. />
  447. </el-form-item>
  448. <el-form-item prop="endTime" label="结束时间:">
  449. <el-date-picker
  450. v-model="rateAdd.endTime"
  451. type="date"
  452. placeholder="请选择时间"
  453. :default-value="new Date()"
  454. value-format="YYYY-MM-DD"
  455. />
  456. </el-form-item>
  457. <el-form-item>
  458. <div class="dialog-footer">
  459. <el-button type="primary" @click="add">添加</el-button>
  460. <el-button @click="regeAdd = false">取消</el-button>
  461. </div>
  462. </el-form-item>
  463. </el-form>
  464. </template>
  465. </el-dialog>
  466. <!-- 这是编辑弹窗 -->
  467. <el-dialog v-model="regeEdit" title="修改汇率" width="500">
  468. <template #footer>
  469. <el-form
  470. ref="ruleFormRef"
  471. style="max-width: 600px"
  472. :model="rateEdit"
  473. :rules="rules"
  474. label-width="auto"
  475. class="demo-ruleForm"
  476. :size="formSize"
  477. status-icon
  478. >
  479. <el-form-item label="货币名称:">
  480. <el-select
  481. v-model="rateEdit.currency"
  482. placeholder="请选择"
  483. style="width: 240px"
  484. >
  485. <el-option
  486. v-for="item in options"
  487. :key="item.value"
  488. :label="item.label"
  489. :value="item.value"
  490. />
  491. </el-select>
  492. </el-form-item>
  493. <el-form-item label="汇率:">
  494. <el-input v-model="rateEdit.exchangeRate" style="width: 120px" />
  495. <p class="unit">:1</p>
  496. <p>(提示当前规则每 5 元人民币可兑换 1 新币)</p>
  497. </el-form-item>
  498. <el-form-item label="提交人:">
  499. <el-input v-model="rateEdit.updateName" style="width: 240px" />
  500. </el-form-item>
  501. <el-form-item>
  502. <div class="dialog-footer">
  503. <el-button type="primary" @click="edit">修改</el-button>
  504. <el-button @click="regeEdit = false">取消</el-button>
  505. </div>
  506. </el-form-item>
  507. </el-form>
  508. </template>
  509. </el-dialog>
  510. <!-- 这是编辑弹窗 -->
  511. <el-dialog v-model="regeEdit" title="修改汇率" width="500">
  512. <template #footer>
  513. <el-form
  514. ref="ruleFormRef"
  515. style="max-width: 600px"
  516. :model="rateEdit"
  517. :rules="rules"
  518. label-width="auto"
  519. class="demo-ruleForm"
  520. :size="formSize"
  521. status-icon
  522. >
  523. <el-form-item label="货币名称:">
  524. <el-select
  525. v-model="rateEdit.currency"
  526. placeholder="请选择"
  527. style="width: 240px"
  528. >
  529. <el-option
  530. v-for="item in options"
  531. :key="item.value"
  532. :label="item.label"
  533. :value="item.value"
  534. />
  535. </el-select>
  536. </el-form-item>
  537. <el-form-item label="汇率:">
  538. <el-input v-model="rateEdit.exchangeRate" style="width: 120px" />
  539. <p class="unit">:1</p>
  540. <p>(提示当前规则每 5 元人民币可兑换 1 新币)</p>
  541. </el-form-item>
  542. <el-form-item label="提交人:">
  543. <el-input v-model="rateEdit.adminName" style="width: 240px" />
  544. </el-form-item>
  545. <el-form-item>
  546. <div class="dialog-footer">
  547. <el-button type="primary" @click="edit">修改</el-button>
  548. <el-button @click="regeEdit = false">取消</el-button>
  549. </div>
  550. </el-form-item>
  551. </el-form>
  552. </template>
  553. </el-dialog>
  554. </template>
  555. <style scoped>
  556. p {
  557. margin: 0px;
  558. }
  559. .el-form-item {
  560. margin-left: 70px;
  561. }
  562. .ad {
  563. margin-left: 10px;
  564. }
  565. .pagination {
  566. margin-top: 20px;
  567. margin-left: 33%;
  568. }
  569. .box-card {
  570. margin-top: 20px;
  571. }
  572. .button-item {
  573. margin-left: 10px;
  574. }
  575. .add-item {
  576. margin-bottom: 10px;
  577. }
  578. el-table-column {
  579. text-align: center;
  580. }
  581. p {
  582. color: rgb(150, 150, 150);
  583. }
  584. .unit {
  585. margin-left: 10px;
  586. }
  587. .el-card {
  588. padding: 0px;
  589. }
  590. .pagination {
  591. display: flex;
  592. }
  593. </style>