index.vue 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. <template>
  2. <div class="view-entrance">
  3. <div class="view-entrance-top">
  4. <div></div>
  5. <div class="view-entrance-top-right">
  6. <!--角色权限管理-->
  7. <div
  8. v-show="showRolePermission"
  9. class="view-entrance-top-trigger view-entrance-trigger-min"
  10. @click="showRoleModal = true"
  11. >
  12. <n-tooltip placement="bottom-end">
  13. <template #trigger>
  14. <n-icon size="25" style="font-weight: bold">
  15. <SafetyCertificateOutlined />
  16. </n-icon>
  17. </template>
  18. <span>角色权限管理</span>
  19. </n-tooltip>
  20. </div>
  21. <!--用户管理-->
  22. <div
  23. v-show="showRolePermission"
  24. class="view-entrance-top-trigger view-entrance-trigger-min"
  25. @click="showUserModal = true"
  26. >
  27. <n-tooltip placement="bottom-end">
  28. <template #trigger>
  29. <n-icon size="25" style="font-weight: bold">
  30. <PeopleSettings20Regular />
  31. </n-icon>
  32. </template>
  33. <span>用户管理</span>
  34. </n-tooltip>
  35. </div>
  36. <!-- 个人中心 -->
  37. <div class="view-entrance-top-trigger view-entrance-trigger-min">
  38. <n-dropdown trigger="hover" @select="avatarSelect" :options="avatarOptions">
  39. <div class="avatar">
  40. <n-avatar round>
  41. {{ user_name }}
  42. <template #icon>
  43. <UserOutlined />
  44. </template>
  45. </n-avatar>
  46. </div>
  47. </n-dropdown>
  48. </div>
  49. </div>
  50. </div>
  51. <div class="view-entrance-content">
  52. <n-grid cols="1 s:2 m:3 l:6 xl:6 2xl:6" responsive="screen" :x-gap="12" :y-gap="8">
  53. <n-grid-item v-for="(server, index) in servers" :key="index">
  54. <n-card @click="openNewPage(server.path, server.id)" hoverable :title="server.name">
  55. <template #cover>
  56. <img src="" />
  57. </template>
  58. </n-card>
  59. </n-grid-item>
  60. </n-grid>
  61. </div>
  62. </div>
  63. <n-modal class="view-dialog" v-model:show="showRoleModal">
  64. <Role />
  65. </n-modal>
  66. <n-modal class="view-dialog" v-model:show="showUserModal">
  67. <User />
  68. </n-modal>
  69. </template>
  70. <script lang="ts">
  71. import { UserOutlined } from '@vicons/antd';
  72. import { PeopleSettings20Regular } from '@vicons/fluent';
  73. import { useUserStore } from '@/store/modules/user';
  74. import { useRouter } from 'vue-router';
  75. import { useDialog, useMessage } from 'naive-ui';
  76. import { ACCESS_TOKEN, TABS_ROUTES } from '@/store/mutation-types';
  77. import { storage } from '@/utils/Storage';
  78. import { GetServiceList, SelectSystem } from '@/api/service/service';
  79. import { ref } from 'vue';
  80. import Role from '../permission/role/role.vue';
  81. import User from '../permission/user/user.vue';
  82. import { CheckRolePermission } from '@/api/system/role';
  83. import { SafetyCertificateOutlined } from '@vicons/antd';
  84. import { getBaseLoginUrl } from '@/utils/env';
  85. interface server {
  86. id: number;
  87. name: string;
  88. path: string;
  89. }
  90. export default {
  91. components: {
  92. UserOutlined,
  93. PeopleSettings20Regular,
  94. SafetyCertificateOutlined,
  95. Role,
  96. User,
  97. },
  98. setup() {
  99. const userStore = useUserStore();
  100. const router = useRouter();
  101. const dialog = useDialog();
  102. const message = useMessage();
  103. // 退出登录
  104. const doLogout = () => {
  105. dialog.info({
  106. title: '提示',
  107. content: '您确定要退出登录吗',
  108. positiveText: '确定',
  109. negativeText: '取消',
  110. onPositiveClick: () => {
  111. userStore.logout().then(() => {
  112. message.success('成功退出登录');
  113. // 移除标签页
  114. localStorage.removeItem(TABS_ROUTES);
  115. window.open(getBaseLoginUrl(), '_self');
  116. // router
  117. // .replace({
  118. // name: 'Login',
  119. // query: {
  120. // redirect: route.fullPath,
  121. // },
  122. // })
  123. // .finally(() => location.reload());
  124. });
  125. },
  126. onNegativeClick: () => {},
  127. });
  128. };
  129. //头像下拉菜单
  130. const avatarSelect = (key) => {
  131. switch (key) {
  132. case 1:
  133. router.push({ name: 'Setting' });
  134. break;
  135. case 2:
  136. doLogout();
  137. break;
  138. }
  139. };
  140. const avatarOptions = [
  141. // {
  142. // label: '个人设置',
  143. // key: 1,
  144. // },
  145. {
  146. label: '退出登录',
  147. key: 2,
  148. },
  149. ];
  150. return {
  151. user_name:
  152. userStore.getUserInfo.user_name == undefined ? 'user' : userStore.getUserInfo.user_name,
  153. avatarSelect,
  154. avatarOptions,
  155. message,
  156. router,
  157. showRoleModal: ref(false),
  158. showUserModal: ref(false),
  159. };
  160. },
  161. data() {
  162. return {
  163. servers: ref<server[]>([]),
  164. showRolePermission: false,
  165. };
  166. },
  167. mounted() {
  168. this.getSystemList();
  169. this.getAdminRole();
  170. },
  171. methods: {
  172. async getAdminRole() {
  173. this.showRolePermission = await CheckRolePermission();
  174. console.log('this.showRolePermission:' + this.showRolePermission);
  175. },
  176. async getSystemList() {
  177. this.servers = await GetServiceList();
  178. },
  179. openNewPage(url: string) {
  180. // await SelectSystem({
  181. // ...{ system_id: system_id },
  182. // })
  183. // .then((res) => {
  184. // console.log('_res:' + JSON.stringify(res));
  185. // const ex = 7 * 24 * 60 * 60 * 1000;
  186. // storage.set(ACCESS_TOKEN, res.token, ex);
  187. const path = url.replace('{access-token}', storage.get(ACCESS_TOKEN));
  188. window.open(path, '_self');
  189. // })
  190. // .catch((e: Error) => {
  191. // this.message.error(e.message ?? '操作失败');
  192. // });
  193. },
  194. // openSetting() {
  195. // this.showModal = true;
  196. // // this.router.push('/roleList');
  197. // },
  198. },
  199. };
  200. </script>
  201. <style scoped lang="less">
  202. .view-entrance {
  203. display: flex;
  204. flex-direction: column;
  205. height: 100vh;
  206. &-top {
  207. display: flex;
  208. justify-content: space-between;
  209. align-items: center;
  210. padding: 0;
  211. height: @header-height;
  212. box-shadow: 0 1px 4px rgb(0 21 41 / 8%);
  213. transition: all 0.2s ease-in-out;
  214. width: 100%;
  215. z-index: 11;
  216. &-right {
  217. display: flex;
  218. align-items: center;
  219. margin-right: 20px;
  220. > * {
  221. cursor: pointer;
  222. }
  223. }
  224. &-trigger {
  225. width: auto;
  226. padding: 0 12px;
  227. }
  228. }
  229. &-content {
  230. display: flex;
  231. padding: 0;
  232. transition: all 0.2s ease-in-out;
  233. align-items: center;
  234. width: 100%;
  235. .n-card {
  236. margin: 20px;
  237. width: 100%;
  238. height: 100%;
  239. cursor: pointer;
  240. }
  241. }
  242. }
  243. .view-dialog {
  244. width: 90%;
  245. background: #ffffff;
  246. }
  247. @media (min-width: 768px) {
  248. .view-entrance {
  249. background-image: url('../../assets/images/login.svg');
  250. background-repeat: no-repeat;
  251. background-position: 50%;
  252. background-size: 100%;
  253. }
  254. }
  255. </style>