info.vue 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. <template>
  2. <div>
  3. <n-card :bordered="false" class="proCard mt-4" size="small" :segmented="{ content: true }">
  4. <n-space vertical :size="14">
  5. <n-alert type="info" :show-icon="false">
  6. 正在查询玩家信息,用户ID:{{ userId }} 刷新时间:{{ refreshDate }} &nbsp;
  7. <n-button :loading="show" @click="getUserInfo" size="small" secondary strong>
  8. <template #icon>
  9. <n-icon>
  10. <Refresh />
  11. </n-icon>
  12. </template>
  13. </n-button>
  14. </n-alert>
  15. </n-space>
  16. </n-card>
  17. <n-spin :show="show" description="正在从服务器查询玩家信息...">
  18. <n-card>
  19. <n-tabs
  20. type="card"
  21. class="card-tabs"
  22. default-value="baseInfo"
  23. size="small"
  24. animated
  25. tab-style="min-width: 80px;"
  26. style="margin: 0 -4px"
  27. pane-style="padding-left: 4px; padding-right: 4px; box-sizing: border-box;"
  28. :on-update:value="updateTabs"
  29. >
  30. <n-tab-pane name="baseInfo" tab="玩家基本信息">
  31. <BaseInfo :userId="userId" :userInfo="userInfo" />
  32. </n-tab-pane>
  33. <!-- <n-tab-pane name="talent" tab="玩家天赋">
  34. <Talent :userId="userId" :userInfo="userInfo" />
  35. </n-tab-pane>
  36. <n-tab-pane name="character" tab="玩家角色">
  37. <Role ref="RoleRef" :userId="userId" :userInfo="userInfo" />
  38. </n-tab-pane> -->
  39. <n-tab-pane name="chapter" tab="关卡进度">
  40. <Chapter :userId="userId" />
  41. </n-tab-pane>
  42. <!-- <n-tab-pane name="guide" tab="引导任务">
  43. <Guide :userId="userId" :userInfo="userInfo" />
  44. </n-tab-pane>
  45. <n-tab-pane name="equipment" tab="玩家装备">
  46. <Equipment ref="EquipmentRef" :userId="userId" :userInfo="userInfo" />
  47. </n-tab-pane>
  48. <n-tab-pane name="gem" tab="部位锻造">
  49. <Gem ref="GemRef" :userId="userId" :userInfo="userInfo" />
  50. </n-tab-pane> -->
  51. <n-tab-pane name="material" tab="玩家道具">
  52. <Material ref="MaterialRef" :userId="userId" :userInfo="userInfo" />
  53. </n-tab-pane>
  54. <n-tab-pane name="rune" tab="玩家符文">
  55. <Rune ref="RuneRef" :userId="userId" :userInfo="userInfo" />
  56. </n-tab-pane>
  57. <n-tab-pane name="legend" tab="玩家铭文">
  58. <Legend ref="LegendRef" :userId="userId" :userInfo="userInfo" />
  59. </n-tab-pane>
  60. <!-- <n-tab-pane name="recharge" tab="充值记录">
  61. <RechargeList :userId="userId" :userInfo="userInfo" />
  62. </n-tab-pane>
  63. <n-tab-pane name="funding" tab="消费变动记录">
  64. <Consumption :userId="userId" :userInfo="userInfo" />
  65. </n-tab-pane>
  66. <n-tab-pane name="levelProgress" tab="关卡进度详情">
  67. <LevelProgress :userId="userId" :userInfo="userInfo" />
  68. </n-tab-pane>
  69. <n-tab-pane name="fighting" tab="战斗数据">
  70. <Fighting :userId="userId" :userInfo="userInfo" />
  71. </n-tab-pane>
  72. <n-tab-pane name="advLog" tab="广告统计">
  73. <AdvLog :userId="userId" :userInfo="userInfo" />
  74. </n-tab-pane>
  75. <n-tab-pane name="loginLog" tab="登录记录">
  76. <LoginLog :userId="userId" :userInfo="userInfo" />
  77. </n-tab-pane>
  78. <n-tab-pane name="alarmData" tab="异常数据">
  79. <AlarmData :userId="userId" :userInfo="userInfo" />
  80. </n-tab-pane>-->
  81. </n-tabs>
  82. </n-card>
  83. </n-spin>
  84. </div>
  85. </template>
  86. <style scoped>
  87. .card-tabs .n-tabs-nav--bar-type {
  88. padding-left: 4px;
  89. }
  90. </style>
  91. <script lang="ts" setup>
  92. import { onMounted, inject, ref } from 'vue';
  93. import { useRouter } from 'vue-router';
  94. import { useMessage } from 'naive-ui';
  95. import { SocketEnum } from '@/enums/socketEnum';
  96. import { getSocket, addOnMessage } from '@/utils/websocket';
  97. import { userInfoObj } from '@/views/account/accountList/userInfo';
  98. import { timestampToTime } from '@/utils/dateUtil';
  99. import { Refresh } from '@vicons/ionicons5';
  100. import BaseInfo from './components/BaseInfo.vue';
  101. import Material from './components/Material.vue';
  102. import Rune from './components/Rune.vue';
  103. import Legend from './components/Legend.vue';
  104. import Chapter from './components/Chapter.vue';
  105. interface Props {
  106. userId?: number | string;
  107. }
  108. const props = withDefaults(defineProps<Props>(), { userId: 0 });
  109. const router = useRouter();
  110. const userId = Number(router.currentRoute.value.params.id ?? props.userId);
  111. const userInfo = ref(userInfoObj);
  112. const show = ref(false);
  113. const refreshDate = ref('');
  114. const message = useMessage();
  115. const onMessageList = inject('onMessageList');
  116. const queryUserMessage = (res) => {
  117. console.log('queryUserMessage', res);
  118. const data = JSON.parse(res.data);
  119. if (data.type !== SocketEnum.TypeQueryUser) {
  120. return;
  121. }
  122. show.value = false;
  123. if (data.code == SocketEnum.CodeErr) {
  124. message.success('没有查询到该用户的档案');
  125. router.push({ name: 'account-list' });
  126. return;
  127. }
  128. userInfo.value = JSON.parse(data.msg);
  129. refreshDate.value = timestampToTime(userInfo.value.serverts);
  130. triggerRefresh();
  131. };
  132. addOnMessage(onMessageList, queryUserMessage);
  133. onMounted(() => {
  134. if ((userId === undefined || userId < 1) && props.userId < 1) {
  135. message.error('用户ID不正确,请检查!');
  136. return;
  137. }
  138. getUserInfo();
  139. });
  140. function getUserInfo() {
  141. show.value = true;
  142. if (getSocket() === undefined) {
  143. message.error('socket连接异常,请重试!');
  144. router.push({ name: 'account-list' });
  145. return;
  146. }
  147. try {
  148. getSocket().send(
  149. JSON.stringify({
  150. type: SocketEnum.TypeQueryUser,
  151. data: userId + '',
  152. })
  153. );
  154. } catch (err) {
  155. console.log('错误信息:' + err.message);
  156. setTimeout(function () {
  157. message.error('socket连接被断开,正在尝试恢复....');
  158. getSocket().send(
  159. JSON.stringify({
  160. type: SocketEnum.TypeQueryUser,
  161. data: userId + '',
  162. })
  163. );
  164. message.success('socket已恢复');
  165. }, 1000);
  166. }
  167. }
  168. function updateTabs(value: string | number) {
  169. console.log('value:' + value);
  170. }
  171. const RoleRef = ref();
  172. const EquipmentRef = ref();
  173. const MaterialRef = ref();
  174. const RuneRef = ref();
  175. const LegendRef = ref();
  176. const GemRef = ref();
  177. function triggerRefresh() {
  178. if (RoleRef.value !== undefined && RoleRef.value !== null) {
  179. RoleRef.value.fatherRefresh();
  180. }
  181. if (EquipmentRef.value !== undefined && EquipmentRef.value !== null) {
  182. EquipmentRef.value.fatherRefresh();
  183. }
  184. if (MaterialRef.value !== undefined && MaterialRef.value !== null) {
  185. MaterialRef.value.fatherRefresh();
  186. }
  187. if (RuneRef.value !== undefined && RuneRef.value !== null) {
  188. RuneRef.value.fatherRefresh();
  189. }
  190. if (LegendRef.value !== undefined && LegendRef.value !== null) {
  191. LegendRef.value.fatherRefresh();
  192. }
  193. if (GemRef.value !== undefined && GemRef.value !== null) {
  194. GemRef.value.fatherRefresh();
  195. }
  196. }
  197. </script>