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.

473 lines
11 KiB

3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
7 days ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
  1. <script setup>
  2. import {onMounted, reactive, ref} from 'vue'
  3. import {ElMessage, ElMessageBox} from 'element-plus'
  4. import request from '@/util/http'
  5. /*
  6. ====================工具方法=========================
  7. */
  8. /*
  9. ====================数据===================================
  10. */
  11. // 查询当前登录的信息
  12. const adminData = ref({
  13. id: '',
  14. adminName: ''
  15. })
  16. // 默认 编辑板块是关的
  17. const regeEdit = ref(false)
  18. // 表单引用(根据id获取信息后 将内容存到编辑表单)
  19. const editFormRef = ref(null)
  20. //汇率表格数据
  21. const tableData = ref([])
  22. //搜索对象
  23. const getObj = ref({
  24. pageNum: 1,
  25. pageSize: 10
  26. })
  27. const total = ref(0)
  28. // 编辑方法 表单
  29. const rateEdit = ref({
  30. id: null,
  31. rateName: '',
  32. num: null,
  33. adminId: null,
  34. updateTime: Date.now(),
  35. })
  36. //货币条目
  37. const rateNames = [
  38. {
  39. value: 'USD',
  40. label: 'USD'
  41. },
  42. {
  43. value: 'HKD',
  44. label: 'HKD'
  45. },
  46. {
  47. value: 'THB',
  48. label: 'THB'
  49. },
  50. {
  51. value: 'VND',
  52. label: 'VND'
  53. },
  54. {
  55. value: 'CAD',
  56. label: 'CAD'
  57. },
  58. {
  59. value: 'MYR',
  60. label: 'MYR'
  61. },
  62. {
  63. value: 'KRW',
  64. label: 'KRW'
  65. },
  66. {
  67. value: 'JPY',
  68. label: 'JPY'
  69. },
  70. {
  71. value: 'CNY',
  72. label: 'CNY'
  73. }
  74. ]
  75. // 汇率校验
  76. const checkFreeGoldRadio = function (rule, value, callback) {
  77. if (value == '0' || value == null || value == '') {
  78. callback(new Error('请输入汇率比'))
  79. } else if (value < 0 || isNaN(value)) {
  80. callback(new Error('请输入正确的格式'))
  81. } else {
  82. callback()
  83. }
  84. }
  85. // 定义表单验证规则
  86. const rules = reactive({
  87. rateName: [{required: true, message: '请选择货币名称', trigger: 'blur'}],
  88. num: [{validator: checkFreeGoldRadio, trigger: 'blur'}],
  89. })
  90. // 表单大小
  91. const formSize = ref('default')
  92. /*
  93. ====================方法=========================
  94. */
  95. // 获取当前登录信息
  96. const getAdminData = async function () {
  97. try {
  98. const result = await request({
  99. url: '/admin/userinfo',
  100. data: {}
  101. })
  102. adminData.value = result
  103. rateEdit.value.adminId = adminData.value.id
  104. console.log('请求成功', result)
  105. } catch (error) {
  106. console.log('请求失败', error)
  107. }
  108. }
  109. // 获取所有汇率 列表
  110. const getAllRate = async function (val) {
  111. try {
  112. // 搜索参数页码赋值
  113. if (typeof val === 'number') {
  114. getObj.value.pageNum = val;
  115. }
  116. // 发送POST请求
  117. const result = await request({
  118. url: '/rate/selectAll',
  119. method: 'POST',
  120. data: {
  121. pageNum: getObj.value.pageNum,
  122. pageSize: getObj.value.pageSize,
  123. }
  124. });
  125. // 将响应结果存储到响应式数据中
  126. console.log('这是汇率列表 请求成功', result);
  127. // 存储表格数据
  128. tableData.value = result.data.list;
  129. // 存储分页总条目
  130. total.value = result.data.total;
  131. } catch (error) {
  132. console.log('请求失败', error);
  133. ElMessage.error('请求失败');
  134. }
  135. }
  136. // 获取分页数据
  137. const handlePageSizeChange = function (val) {
  138. getObj.value.pageSize = val
  139. getAllRate()
  140. }
  141. // 获取分页数据
  142. const handleCurrentChange = function (val) {
  143. getObj.value.pageNum = val
  144. getAllRate()
  145. }
  146. //查询已有的数据(根据id)
  147. const getEditData = async function (row) {
  148. try {
  149. console.log('搜索参数', getObj.value)
  150. // 发送POST请求
  151. const result = await request({
  152. url: '/rate/selectById',
  153. data: {id: row.id}
  154. })
  155. // 将响应结果存储到响应式数据中
  156. console.log('根据id查 请求成功', result)
  157. // 存储表格数据
  158. // rateEdit.value = result.data
  159. // 只赋部分的
  160. rateEdit.value.id = row.id
  161. rateEdit.value.rateName = row.rateName
  162. rateEdit.value.num = row.num
  163. console.log('根据id获取的数据', rateEdit.value)
  164. rateEdit.value.adminId = adminData.value.id
  165. } catch (error) {
  166. console.log('请求失败', error)
  167. }
  168. }
  169. // 编辑汇率
  170. const editRate = async function () {
  171. // 提交前验证 汇率是否为数字
  172. rateEdit.value.num = parseFloat(rateEdit.value.num);
  173. try {
  174. console.log('搜索参数', rateEdit.value)
  175. // 发送POST请求
  176. const result = await request({
  177. url: '/rate/update',
  178. data: rateEdit.value
  179. })
  180. // 将响应结果存储到响应式数据中
  181. console.log('请求成功', result)
  182. await getAllRate()
  183. } catch (error) {
  184. console.log('请求失败', error)
  185. }
  186. }
  187. // 编辑确认
  188. const edit = () => {
  189. ElMessageBox.confirm('确认修改?')
  190. .then(() => {
  191. editRate()
  192. regeEdit.value = false
  193. })
  194. .catch(() => {
  195. regeEdit.value = false
  196. })
  197. }
  198. // 关闭编辑弹窗时重置表单
  199. const cancelEdit = () => {
  200. regeEdit.value = false
  201. }
  202. // 关闭编辑弹窗
  203. const handleEditDialogClose = () => {
  204. if (editFormRef.value) {
  205. getAllRate()
  206. }
  207. }
  208. // 日期格式化
  209. function formatDate(value) {
  210. if (!value) return ''
  211. const date = new Date(value)
  212. const year = date.getFullYear()
  213. const month = (date.getMonth() + 1).toString().padStart(2, '0')
  214. const day = date.getDate().toString().padStart(2, '0')
  215. const hours = date.getHours().toString().padStart(2, '0')
  216. const minutes = date.getMinutes().toString().padStart(2, '0')
  217. const seconds = date.getSeconds().toString().padStart(2, '0')
  218. return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
  219. }
  220. // 输入框过滤
  221. function handleInput(value) {
  222. // 检查是否使用了中文句号
  223. if (value.includes('。') || /[^\d.]/g.test(value)) {
  224. ElMessage.warning('请输入正确的符号');
  225. // value = value.replace('。', '.');
  226. }
  227. // 处理多个小数点的情况,保留第一个,移除后续的
  228. const parts = value.split('.');
  229. if (parts.length > 2) {
  230. value = parts[0] + '.' + parts.slice(1).join('');
  231. ElMessage.warning('只能包含一个小数点');
  232. }
  233. // 禁止输入负数
  234. if (value.startsWith('-')) {
  235. ElMessage.warning('不允许输入负数');
  236. value = value.substring(1);
  237. }
  238. // 小数点前没有数字时补0
  239. if (value.startsWith('.')) {
  240. value = '0' + value;
  241. // 需求没有,注释,先不显示
  242. // ElMessage.info('已自动补充前导0');
  243. }
  244. // 更新表单值
  245. rateEdit.value.num = value;
  246. return value;
  247. }
  248. /*
  249. ====================监听=========================
  250. */
  251. /*
  252. ====================挂载=========================
  253. */
  254. // 挂载
  255. onMounted(async function () {
  256. await getAllRate()
  257. await getAdminData()
  258. })
  259. </script>
  260. <template>
  261. <!-- 这是主页面 -->
  262. <el-row>
  263. <el-col>
  264. <el-card class="box-card" style="max-width: 100%">
  265. <!-- 表格 -->
  266. <div>
  267. <el-table
  268. :data="tableData"
  269. v-if="(tableData.flag = 1)"
  270. >
  271. <el-table-column
  272. type="index"
  273. label="序号"
  274. width="100px"
  275. fixed="left"
  276. >
  277. <template #default="scope">
  278. <span>{{
  279. scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
  280. }}</span>
  281. </template>
  282. </el-table-column>
  283. <el-table-column prop="rateName" label="货币名称" :span="2"/>
  284. <el-table-column prop="num" label="汇率" :span="2">
  285. <template #default="scope">
  286. <p>
  287. {{ scope.row.num }} 1
  288. </p>
  289. </template>
  290. </el-table-column>
  291. <el-table-column prop="updateTime" label="添加时间" :span="3">
  292. <template #default="scope">
  293. <span>{{ formatDate(scope.row.updateTime) }}</span>
  294. </template>
  295. </el-table-column>
  296. <el-table-column label="操作" :span="3">
  297. <template #default="scope">
  298. <el-button
  299. type="text"
  300. @click="
  301. () => {
  302. regeEdit = true
  303. getEditData(scope.row)
  304. }
  305. "
  306. >编辑
  307. </el-button
  308. >
  309. </template>
  310. </el-table-column>
  311. </el-table>
  312. </div>
  313. <!-- 分页 -->
  314. <div class="pagination">
  315. <el-pagination
  316. background
  317. :page-size="getObj.pageSize"
  318. :page-sizes="[5, 10, 20, 50, 100]"
  319. layout="total, sizes, prev, pager, next, jumper"
  320. :total="total"
  321. @size-change="handlePageSizeChange"
  322. @current-change="handleCurrentChange"
  323. ></el-pagination>
  324. </div>
  325. </el-card>
  326. </el-col>
  327. </el-row>
  328. <!-- 这是编辑弹窗 -->
  329. <el-dialog
  330. v-model="regeEdit"
  331. title="修改汇率"
  332. width="500"
  333. :close-on-click-modal="false"
  334. @close="handleEditDialogClose"
  335. >
  336. <template #footer>
  337. <el-form
  338. ref="editFormRef"
  339. style="max-width: 600px"
  340. :model="rateEdit"
  341. :rules="rules"
  342. label-width="auto"
  343. class="demo-ruleForm"
  344. :size="formSize"
  345. status-icon
  346. >
  347. <el-form-item prop="rateName" label="货币名称:">
  348. <el-select
  349. v-model="rateEdit.rateName"
  350. placeholder="请选择"
  351. style="width: 240px"
  352. >
  353. <el-option
  354. v-for="item in rateNames"
  355. :key="item.value"
  356. :label="item.label"
  357. :value="item.value"
  358. />
  359. </el-select>
  360. </el-form-item>
  361. <el-form-item prop="num" label="汇率:">
  362. <el-input
  363. v-model="rateEdit.num"
  364. @update:modelValue="handleInput"
  365. style="width: 120px"
  366. />
  367. <p class="unit">:1</p>
  368. <p class="rate-tip">
  369. (提示当前规则每
  370. <span>{{ rateEdit.num }}</span>
  371. <span>{{ rateEdit.rateName }}</span>
  372. 可兑换 1 新币)
  373. </p>
  374. </el-form-item>
  375. <el-form-item label="提交人:">
  376. <el-input disabled :value="adminData.adminName" style="width: 240px"/>
  377. </el-form-item>
  378. <el-form-item>
  379. <div class="dialog-footer">
  380. <el-button type="primary" @click="edit">修改</el-button>
  381. <el-button @click="cancelEdit">取消</el-button>
  382. </div>
  383. </el-form-item>
  384. </el-form>
  385. </template>
  386. </el-dialog>
  387. </template>
  388. <style scoped>
  389. .pagination {
  390. margin-top: 20px;
  391. display: flex;
  392. }
  393. .box-card {
  394. margin-top: 20px;
  395. }
  396. .button-item {
  397. margin-left: 10px;
  398. }
  399. .add-item {
  400. margin-bottom: 10px;
  401. }
  402. .unit {
  403. margin-left: 10px;
  404. }
  405. .el-card {
  406. padding: 0px;
  407. }
  408. .pagination {
  409. display: flex;
  410. }
  411. .status {
  412. display: flex;
  413. }
  414. .rate-tip {
  415. hyphens: auto;
  416. }
  417. </style>