users.vue 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. <template>
  2. <div class="relics-layout">
  3. <div class="relics-header">
  4. <div class="search">
  5. <el-form label-width="100px" inline>
  6. <el-form-item label="用户账号">
  7. <el-input v-model="pageProps.userName" clearable style="width: 250px" placeholder="请输入" />
  8. </el-form-item>
  9. <el-form-item label="所属单位">
  10. <el-input v-model="pageProps.orgName" clearable style="width: 250px" placeholder="请输入" />
  11. </el-form-item>
  12. <el-form-item>
  13. <el-button type="primary" @click="refresh">查询</el-button>
  14. <el-button type="primary" plain @click="pageProps = { ...initProps }">
  15. 重置
  16. </el-button>
  17. <el-button type="primary" @click="addHandler"> 创建用户 </el-button>
  18. </el-form-item>
  19. </el-form>
  20. </div>
  21. </div>
  22. <div class="relics-content">
  23. <el-table :data="relicsArray" border>
  24. <el-table-column label="姓名" prop="nickName"></el-table-column>
  25. <el-table-column label="账号" prop="userName"></el-table-column>
  26. <!-- <el-table-column label="账号" prop="userName" v-slot:default="{ row }: { row: Device }">
  27. {{ DeviceTypeDesc[row.cameraType] }}
  28. </el-table-column> -->
  29. <el-table-column label="所属单位" prop="orgName"> </el-table-column>
  30. <el-table-column label="角色" prop="roleNames"> </el-table-column>
  31. <el-table-column label="创建人" prop="createBy"> </el-table-column>
  32. <el-table-column label="创建时间" prop="createTime" v-slot:default="{ row }">
  33. {{ row.createTime && row.createTime.substr(0, 16) }}
  34. </el-table-column>
  35. <el-table-column align="center" label="状态" prop="status" v-slot:default="{ row }">
  36. <el-switch inline-prompt width="60" v-model="row.status" :before-change="() => beforeChangeStatus(row)"
  37. :active-value='1' :inactive-value='0' active-text="启用" inactive-text="禁用"
  38. style="--el-switch-on-color: #13ce66; " />
  39. </el-table-column>
  40. <el-table-column label="操作" width="100px" fixed="right">
  41. <template #default="{ row }">
  42. <el-button link type="primary" @click="editHandler(row)" size="small">
  43. 编辑
  44. </el-button>
  45. <el-button link type="danger" @click="delHandler(row)" size="small" v-if="isSuper">
  46. 删除
  47. </el-button>
  48. </template>
  49. </el-table-column>
  50. </el-table>
  51. </div>
  52. <div class="pag-layout">
  53. <el-pagination background layout="total, prev, pager, next, sizes, jumper" v-model:page-size="pageProps.pageSize"
  54. :page-sizes="[10, 20, 50, 100]" :total="total" @current-change="(data: number) => pageProps.pageNum = data"
  55. :current-page="pageProps.pageNum" />
  56. </div>
  57. </div>
  58. </template>
  59. <script lang="ts" setup>
  60. import { onActivated, ref, watch, computed } from "vue";
  61. import {
  62. getUserpageFetch,
  63. addUserFetch,
  64. delUserFetch,
  65. updateUserStatusFetch,
  66. editUserFetch,
  67. PageProps,
  68. UserType
  69. } from "@/request";
  70. import { usersAdd, usersEdit } from "./quisk";
  71. import { openLoading, closeLoading } from "@/helper/loading";
  72. import { ElMessageBox } from "element-plus";
  73. import { debounce } from "@/util";
  74. import { user } from "@/store/user";
  75. const isSuper = computed(() => user.value.roles.filter(item => item.roleKey === "super_admin").length > 0)
  76. console.log('isSuper', isSuper)
  77. const initProps: PageProps<Partial<Pick<UserType, "userName" | "orgName">>> = {
  78. pageNum: 1,
  79. pageSize: 10,
  80. userName: '',
  81. orgName: ''
  82. };
  83. const pageProps = ref({ ...initProps });
  84. const total = ref<number>(0);
  85. const relicsArray = ref<UserType[]>([]);
  86. const refresh = debounce(async () => {
  87. const data = await getUserpageFetch(pageProps.value);
  88. total.value = data.total;
  89. relicsArray.value = data.records;
  90. });
  91. const addHandler = async () => {
  92. await usersAdd({ submit: addUserFetch });
  93. await refresh();
  94. }
  95. const editHandler = async (row: UserType) => {
  96. await usersEdit({ user: row, submit: editUserFetch });
  97. await refresh();
  98. }
  99. const delHandler = async (row: UserType) => {
  100. const ok = await ElMessageBox.confirm("确定要删除吗", {
  101. type: "warning",
  102. });
  103. if (ok) {
  104. await delUserFetch({
  105. userId: row.userId
  106. });
  107. await refresh();
  108. }
  109. }
  110. const beforeChangeStatus = (row: UserType): Promise<boolean> => {
  111. openLoading()
  112. return new Promise(async (resolve, reject) => {
  113. try {
  114. const anti = !row.status
  115. console.log('anti', anti)
  116. await updateUserStatusFetch({
  117. userId: row.userId,
  118. status: Number(anti)
  119. });
  120. resolve(true)
  121. } catch (error) {
  122. reject(false)
  123. }
  124. closeLoading();
  125. })
  126. }
  127. watch(pageProps, refresh, { deep: true, immediate: true });
  128. onActivated(refresh);
  129. </script>
  130. <style scoped lang="scss">
  131. .relics-layout {
  132. height: 100%;
  133. overflow-y: auto;
  134. padding: 30px;
  135. }
  136. .pag-layout {
  137. margin-top: 20px;
  138. display: flex;
  139. justify-content: center;
  140. }
  141. .relics-header {
  142. display: flex;
  143. align-items: center;
  144. margin-bottom: 20px;
  145. .search {
  146. flex: 1;
  147. }
  148. .relics-oper {
  149. flex: 0 0 100px;
  150. text-align: right;
  151. }
  152. }
  153. </style>