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.

337 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. // 挂载
  85. onMounted(async function () {
  86. // 获取用户信息
  87. getAdminData()
  88. // 初始化获取导出列表
  89. await getExportList()
  90. })
  91. // 处理地区点击事件,直接在组件内更新当前地区,包老师改的,直接传参
  92. const changeDataByArea = (item) => {
  93. currentArea.value = item
  94. }
  95. // 官网折叠
  96. const isCollapse = ref(false)
  97. const handleOpen = (key, keyPath) => {
  98. console.log(key, keyPath)
  99. }
  100. const handleClose = (key, keyPath) => {
  101. console.log(key, keyPath)
  102. }
  103. // 控制导出列表弹窗显示状态
  104. const exportListVisible = ref(false)
  105. // 打开导出列表弹窗
  106. const openExportList = () => {
  107. getExportList()
  108. exportListVisible.value = true
  109. }
  110. </script>
  111. <template>
  112. <div class="common-layout">
  113. <el-container>
  114. <el-aside style="
  115. width: 15%;
  116. min-width: 180px;
  117. position: fixed; /* 固定位置 */
  118. top: 0;
  119. left: 0;
  120. height: 100vh; /* 高度占满视口 */
  121. z-index: 100; /* 确保侧边栏在其他元素之上 */
  122. ">
  123. <div class="logo">
  124. <img src="../assets/新logo.png" alt="logo" style="width: 80px; height: 80px" />
  125. <!-- <div style="font-size: 16px; font-weight: bold; color: black; text-align: center;" ><h1>海外金币管理系统</h1></div> -->
  126. </div>
  127. <el-card style="min-height: 90%;">
  128. <el-radio-group v-model="isCollapse" style="margin-bottom: 20px">
  129. <el-radio-button :value="false">扩展</el-radio-button>
  130. <el-radio-button :value="true">收缩</el-radio-button>
  131. </el-radio-group>
  132. <el-menu :router="true" class="el-menu-vertical-demo" :collapse="isCollapse" @open="handleOpen"
  133. @close="handleClose">
  134. <el-menu-item index="/workspace">
  135. <el-icon>
  136. <Folder />
  137. </el-icon>
  138. <span>工作台</span>
  139. </el-menu-item>
  140. <el-sub-menu index="2">
  141. <template #title>
  142. <el-icon>
  143. <Folder />
  144. </el-icon>
  145. <span>财务审核</span>
  146. </template>
  147. <el-menu-item index="/rechargeAudit">充值审核</el-menu-item>
  148. <el-menu-item index="/refundAudit">退款审核</el-menu-item>
  149. </el-sub-menu>
  150. <el-menu-item index="/rate">
  151. <el-icon>
  152. <Folder />
  153. </el-icon>
  154. <span>汇率管理</span>
  155. </el-menu-item>
  156. <el-sub-menu index="4">
  157. <template #title>
  158. <el-icon>
  159. <Folder />
  160. </el-icon>
  161. <span>充值管理</span>
  162. </template>
  163. <el-menu-item index="/coinRecharge">金币充值</el-menu-item>
  164. <el-menu-item index="/beanRecharge">金豆充值</el-menu-item>
  165. </el-sub-menu>
  166. <el-sub-menu index="6">
  167. <template #title>
  168. <el-icon>
  169. <Folder />
  170. </el-icon>
  171. <span>消耗管理</span>
  172. </template>
  173. <el-menu-item index="/coinConsume">金币消耗</el-menu-item>
  174. <el-menu-item index="/beanConsume">金豆消耗</el-menu-item>
  175. </el-sub-menu>
  176. <el-sub-menu index="8">
  177. <template #title>
  178. <el-icon>
  179. <Folder />
  180. </el-icon>
  181. <span>退款管理</span>
  182. </template>
  183. <el-menu-item index="/coinRefund">金币退款</el-menu-item>
  184. <el-menu-item index="/beanRefund">金豆退款</el-menu-item>
  185. </el-sub-menu>
  186. <el-menu-item index="/usergold">
  187. <el-icon>
  188. <Folder />
  189. </el-icon>
  190. <span>客户账户明细</span>
  191. </el-menu-item>
  192. <el-menu-item index="/permissions">
  193. <el-icon>
  194. <Folder />
  195. </el-icon>
  196. <span>权限管理</span>
  197. </el-menu-item>
  198. </el-menu>
  199. </el-card>
  200. </el-aside>
  201. <el-container style="margin-left: 15%; min-width: 180px">
  202. <!-- 修改 el-header 样式 -->
  203. <el-header style="
  204. position: fixed;
  205. top: 0;
  206. left: 15%;
  207. right: 0;
  208. z-index: 80;
  209. background: white;
  210. ">
  211. <el-menu class="el-menu-demo" mode="horizontal" :ellipsis="false">
  212. <el-sub-menu index="1" class="admin">
  213. <template #title>
  214. <el-image :src="imgrule1" alt="错误" style="width: 50px; height: 50px" />
  215. <span style="margin-left: 10px">{{ adminData.name }}</span>
  216. </template>
  217. <el-menu-item @click="message()">查看个人信息</el-menu-item>
  218. <el-menu-item index="1-2">退出登录</el-menu-item>
  219. <el-menu-item index="1-3" @click="openExportList">查看下载列表</el-menu-item>
  220. </el-sub-menu>
  221. </el-menu>
  222. </el-header>
  223. <el-main style="margin-top: 60px">
  224. <!-- 60px el-header 的大致高度可根据实际情况调整 -->
  225. <router-view></router-view>
  226. </el-main>
  227. </el-container>
  228. </el-container>
  229. <!-- 查看个人信息 -->
  230. <el-dialog v-model="messageVisible" title="查看个人信息" width="500px">
  231. <el-form :model="adminData">
  232. <el-form-item label="用户姓名" label-width="100px" label-position="left">
  233. <span class="message-font">{{ adminData.adminName }}</span>
  234. </el-form-item>
  235. <el-form-item label="精网号" label-width="100px" label-position="left">
  236. <span class="message-font">{{ adminData.account }}</span>
  237. </el-form-item>
  238. <el-form-item label="地区" label-width="100px" label-position="left">
  239. <span class="message-font">{{ adminData.market }}</span>
  240. </el-form-item>
  241. <el-form-item label="注册时间" label-width="100px" label-position="left">
  242. <span class="message-font">{{ adminData.createTime }}</span>
  243. </el-form-item>
  244. </el-form>
  245. <template #footer>
  246. <div class="dialog-footer">
  247. <el-button text @click="closeMessage()">关闭</el-button>
  248. </div>
  249. </template>
  250. </el-dialog>
  251. <!-- 导出列表弹窗 -->
  252. <el-dialog v-model="exportListVisible" title="导出列表" width="80%">
  253. <el-table :data="exportList" style="width: 100%" :loading="exportListLoading">
  254. <el-table-column prop="fileName" label="文件名" />
  255. <el-table-column prop="state" label="状态">
  256. <template #default="scope">
  257. <el-tag :type="scope.row.state === 2 ? 'success' : 'warning'">
  258. {{ scope.row.state === 2 ? '已完成' : '处理中' }}
  259. </el-tag>
  260. </template>
  261. </el-table-column>
  262. <el-table-column prop="createTime" label="创建时间">
  263. <template #default="scope">
  264. {{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
  265. </template>
  266. </el-table-column>
  267. <el-table-column label="操作">
  268. <template #default="scope">
  269. <el-button type="primary" size="small" @click="downloadExportFile(scope.row)"
  270. :disabled="scope.row.state !== 2">
  271. 下载
  272. </el-button>
  273. </template>
  274. </el-table-column>
  275. </el-table>
  276. <template #footer>
  277. <div class="dialog-footer">
  278. <el-button text @click="exportListVisible = false">关闭</el-button>
  279. </div>
  280. </template>
  281. </el-dialog>
  282. </div>
  283. </template>
  284. <style scoped>
  285. .message-font {
  286. font-size: 16px;
  287. font-weight: bold;
  288. }
  289. .admin {
  290. margin-left: auto;
  291. }
  292. .el-aside {
  293. min-height: 100vh;
  294. width: 200px;
  295. }
  296. /* background-color: #BFD8D2; */
  297. .logo {
  298. margin: 20px 0px 20px 20px;
  299. display: flex;
  300. }
  301. .el-menu-demo {
  302. border: none;
  303. /* 去除边框 */
  304. padding: 0;
  305. /* 去除内边距 */
  306. float: right;
  307. /* 将菜单向右浮动 */
  308. }
  309. .el-menu-vertical-demo:not(.el-menu--collapse) {
  310. width: 240px;
  311. min-height: 400px;
  312. border: none;
  313. /* 去除边框 */
  314. }
  315. </style>