users.vue 5.8 KB

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