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.

391 lines
11 KiB

4 weeks ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
4 weeks ago
  1. <script setup>
  2. // 导航栏在这
  3. import {onMounted, ref} from 'vue'
  4. import {useRouter} from 'vue-router'
  5. import {ElMessage} from 'element-plus'
  6. import API from '@/util/http'
  7. import dmmn from '../assets/link.png'
  8. import moment from 'moment'
  9. import ChangePassword from '@/components/changePassword.vue'
  10. const router = useRouter()
  11. const imgrule1 = dmmn
  12. const messageVisible = ref(false)
  13. // 这是获取用户信息的接口
  14. const adminData = ref({
  15. name: ''
  16. })
  17. const getAdminData = async function () {
  18. try {
  19. const result = await API({ url: '/admin/userinfo', data: {} })
  20. adminData.value = result
  21. console.log('请求成功', result)
  22. console.log('用户信息', adminData.value)
  23. } catch (error) {
  24. console.log('请求失败', error)
  25. }
  26. }
  27. // 获取地区
  28. const areas = ref([])
  29. const currentArea = ref('全部')
  30. const getAreas = async function () {
  31. try {
  32. const result = await API({ url: '/general/market', data: {} })
  33. areas.value = result.data
  34. console.log('请求成功', result)
  35. } catch (error) {
  36. console.log('请求失败', error)
  37. }
  38. }
  39. // 查看个人信息弹出框
  40. const openMessage = function () {
  41. messageVisible.value = true
  42. }
  43. const closeMessage = function () {
  44. messageVisible.value = false
  45. }
  46. const message = function () {
  47. openMessage()
  48. }
  49. // 导出列表数据
  50. const exportList = ref([])
  51. // 导出列表加载状态
  52. const exportListLoading = ref(false)
  53. // 获取导出列表
  54. const getExportList = async () => {
  55. exportListLoading.value = true
  56. try {
  57. const result = await API({ url: '/export/export' })
  58. if (result.code === 200) {
  59. exportList.value = result.data
  60. } else {
  61. ElMessage.error(result.msg || '获取导出列表失败')
  62. }
  63. } catch (error) {
  64. console.error('获取导出列表出错:', error)
  65. ElMessage.error('获取导出列表失败,请稍后重试')
  66. } finally {
  67. exportListLoading.value = false
  68. }
  69. }
  70. //根据状态返回对应的标签类型
  71. const getTagType = (state) => {
  72. switch (state) {
  73. case 0:
  74. return 'info';
  75. case 1:
  76. return 'primary';
  77. case 2:
  78. return'success';
  79. case 3:
  80. return 'danger';
  81. default:
  82. return 'info';
  83. }
  84. }
  85. //根据状态返回对应的标签文案
  86. const getTagText = (state) => {
  87. switch (state) {
  88. case 0:
  89. return '待执行';
  90. case 1:
  91. return '执行中';
  92. case 2:
  93. return'执行完成';
  94. case 3:
  95. return '执行出错';
  96. default:
  97. return '未知状态';
  98. }
  99. }
  100. // 下载导出文件
  101. const downloadExportFile = (item) => {
  102. if (item.state === 2) {
  103. const link = document.createElement('a')
  104. link.href = item.url
  105. link.download = item.fileName
  106. link.click()
  107. } else {
  108. ElMessage.warning('文件还在导出中,请稍后再试')
  109. }
  110. }
  111. function logout() {
  112. const machineId = localStorage.getItem('machineId')
  113. localStorage.removeItem('token')
  114. router.push('/login?machineId=' + machineId)
  115. ElMessage.success('退出成功')
  116. }
  117. // 挂载
  118. onMounted(async function () {
  119. // 获取用户信息
  120. getAdminData()
  121. // 初始化获取导出列表
  122. await getExportList()
  123. })
  124. // 处理地区点击事件,直接在组件内更新当前地区,包老师改的,直接传参
  125. const changeDataByArea = (item) => {
  126. currentArea.value = item
  127. }
  128. // 控制导出列表弹窗显示状态
  129. const exportListVisible = ref(false)
  130. // 显示修改密码弹窗
  131. const showPasswordDialog = ref(false)
  132. // 打开导出列表弹窗
  133. const openExportList = () => {
  134. getExportList()
  135. exportListVisible.value = true
  136. }
  137. //打开修改密码弹窗
  138. const openChangePassword = () => {
  139. showPasswordDialog.value = true
  140. }
  141. </script>
  142. <template>
  143. <div class="common-layout">
  144. <el-container>
  145. <el-aside style="
  146. width: 15%;
  147. min-width: 180px;
  148. position: fixed; /* 固定位置 */
  149. top: 0;
  150. left: 0;
  151. height: 100vh; /* 高度占满视口 */
  152. z-index: 100; /* 确保侧边栏在其他元素之上 */
  153. ">
  154. <div class="logo">
  155. <img src="../assets/新logo.png" alt="logo" style="width: 80px; height: 80px" />
  156. <!-- <div style="font-size: 16px; font-weight: bold; color: black; text-align: center;" ><h1>海外金币管理系统</h1></div> -->
  157. </div>
  158. <el-card style="min-height: 90%;">
  159. <el-menu :router="true" class="el-menu-vertical-demo">
  160. <el-menu-item index="/workspace">
  161. <el-icon>
  162. <Folder />
  163. </el-icon>
  164. <span>工作台</span>
  165. </el-menu-item>
  166. <el-sub-menu index="2">
  167. <template #title>
  168. <el-icon>
  169. <Folder />
  170. </el-icon>
  171. <span>财务审核</span>
  172. </template>
  173. <el-menu-item index="/rechargeAudit">充值审核</el-menu-item>
  174. <el-menu-item index="/refundAudit">退款审核</el-menu-item>
  175. </el-sub-menu>
  176. <el-menu-item index="/rate">
  177. <el-icon>
  178. <Folder />
  179. </el-icon>
  180. <span>汇率管理</span>
  181. </el-menu-item>
  182. <el-sub-menu index="4">
  183. <template #title>
  184. <el-icon>
  185. <Folder />
  186. </el-icon>
  187. <span>充值管理</span>
  188. </template>
  189. <el-menu-item index="/coinRecharge">金币充值</el-menu-item>
  190. <!-- <el-menu-item index="/beanRecharge">金豆充值</el-menu-item> -->
  191. </el-sub-menu>
  192. <el-sub-menu index="6">
  193. <template #title>
  194. <el-icon>
  195. <Folder />
  196. </el-icon>
  197. <span>消耗管理</span>
  198. </template>
  199. <el-menu-item index="/coinConsume">金币消耗</el-menu-item>
  200. <!-- <el-menu-item index="/beanConsume">金豆消耗</el-menu-item> -->
  201. </el-sub-menu>
  202. <el-sub-menu index="8">
  203. <template #title>
  204. <el-icon>
  205. <Folder />
  206. </el-icon>
  207. <span>退款管理</span>
  208. </template>
  209. <el-menu-item index="/coinRefund">金币退款</el-menu-item>
  210. <!-- <el-menu-item index="/beanRefund">金豆退款</el-menu-item> -->
  211. </el-sub-menu>
  212. <el-menu-item index="/usergold">
  213. <el-icon>
  214. <Folder />
  215. </el-icon>
  216. <span>客户账户明细</span>
  217. </el-menu-item>
  218. <el-menu-item index="/permissions">
  219. <el-icon>
  220. <Folder />
  221. </el-icon>
  222. <span>权限管理</span>
  223. </el-menu-item>
  224. </el-menu>
  225. </el-card>
  226. </el-aside>
  227. <el-container style="margin-left: 15%; min-width: 180px">
  228. <!-- 修改 el-header 样式 -->
  229. <el-header style="
  230. position: fixed;
  231. top: 0;
  232. left: 15%;
  233. right: 0;
  234. z-index: 80;
  235. background: white;
  236. ">
  237. <el-menu class="el-menu-demo" mode="horizontal" :ellipsis="false">
  238. <el-badge @click="openExportList" class="item" > <!-- 用的el-badgeBadge 徽章 之后可以加数字 -->
  239. <el-button>查看导出列表</el-button>
  240. </el-badge>
  241. <el-sub-menu index="1" class="admin">
  242. <template #title>
  243. <el-image :src="imgrule1" alt="错误" style="width: 50px; height: 50px" />
  244. <span style="margin-left: 10px">{{ adminData.name }}</span>
  245. </template>
  246. <el-menu-item @click="message()">查看个人信息</el-menu-item>
  247. <el-menu-item @click="openChangePassword">修改密码</el-menu-item>
  248. <el-menu-item @click="logout">退出登录</el-menu-item>
  249. <el-menu-item index="1-3" @click="openExportList">查看下载列表</el-menu-item>
  250. </el-sub-menu>
  251. </el-menu>
  252. </el-header>
  253. <el-main style="margin-top: 60px">
  254. <!-- 60px el-header 的大致高度可根据实际情况调整 -->
  255. <router-view></router-view>
  256. </el-main>
  257. </el-container>
  258. </el-container>
  259. <!-- 查看个人信息 -->
  260. <el-dialog v-model="messageVisible" title="查看个人信息" width="500px">
  261. <el-form :model="adminData">
  262. <el-form-item label="用户姓名" label-width="100px" label-position="left">
  263. <span class="message-font">{{ adminData.adminName }}</span>
  264. </el-form-item>
  265. <el-form-item label="精网号" label-width="100px" label-position="left">
  266. <span class="message-font">{{ adminData.account }}</span>
  267. </el-form-item>
  268. <el-form-item label="地区" label-width="100px" label-position="left">
  269. <span class="message-font">{{ adminData.market }}</span>
  270. </el-form-item>
  271. <el-form-item label="注册时间" label-width="100px" label-position="left">
  272. <span class="message-font">{{ adminData.createTime }}</span>
  273. </el-form-item>
  274. </el-form>
  275. <template #footer>
  276. <div class="dialog-footer">
  277. <el-button text @click="closeMessage()">关闭</el-button>
  278. </div>
  279. </template>
  280. </el-dialog>
  281. <!-- 导出列表弹窗 -->
  282. <el-dialog v-model="exportListVisible" title="导出列表" width="80%">
  283. <el-table :data="exportList" style="width: 100%" :loading="exportListLoading">
  284. <el-table-column prop="fileName" label="文件名" />
  285. <el-table-column prop="state" label="状态">
  286. <template #default="scope">
  287. <el-tag :type="getTagType(scope.row.state)"
  288. :effect="scope.row.state === 3 ? 'light' : 'plain'">
  289. {{ getTagText(scope.row.state) }}
  290. </el-tag>
  291. </template>
  292. </el-table-column>
  293. <el-table-column prop="createTime" label="创建时间">
  294. <template #default="scope">
  295. {{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
  296. </template>
  297. </el-table-column>
  298. <el-table-column label="操作">
  299. <template #default="scope">
  300. <el-button type="primary" size="small" @click="downloadExportFile(scope.row)"
  301. :disabled="scope.row.state !== 2">
  302. 下载
  303. </el-button>
  304. </template>
  305. </el-table-column>
  306. </el-table>
  307. <template #footer>
  308. <div class="dialog-footer">
  309. <el-button text @click="exportListVisible = false">关闭</el-button>
  310. </div>
  311. </template>
  312. </el-dialog>
  313. <!-- 自定义密码修改弹窗组件 -->
  314. <el-dialog
  315. v-model="showPasswordDialog"
  316. :center="true"
  317. width="470px"
  318. >
  319. <ChangePassword v-if="showPasswordDialog" @confirm="showPasswordDialog = false" />
  320. </el-dialog>
  321. </div>
  322. </template>
  323. <style scoped>
  324. .message-font {
  325. font-size: 16px;
  326. font-weight: bold;
  327. }
  328. .item {
  329. margin-top: 20px;
  330. margin-right: 40px;
  331. }
  332. .admin {
  333. margin-left: auto;
  334. }
  335. .el-aside {
  336. min-height: 100vh;
  337. width: 200px;
  338. }
  339. /* background-color: #BFD8D2; */
  340. .logo {
  341. margin: 20px 0px 20px 20px;
  342. display: flex;
  343. }
  344. .el-menu-demo {
  345. border: none;
  346. /* 去除边框 */
  347. padding: 0;
  348. /* 去除内边距 */
  349. float: right;
  350. /* 将菜单向右浮动 */
  351. }
  352. .el-menu-vertical-demo:not(.el-menu--collapse) {
  353. width: 240px;
  354. min-height: 400px;
  355. border: none;
  356. /* 去除边框 */
  357. }
  358. </style>