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.

332 lines
10 KiB

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