index.vue 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. <template>
  2. <div class="system-user-container layout-pd">
  3. <el-card shadow="never">
  4. <el-form :model="queryParams" ref="ruleFormRef" :inline="true" v-show="showSearch">
  5. <el-form-item label="手机号" prop="PhoneNo">
  6. <el-input v-model="queryParams.PhoneNo" placeholder="请输入手机号" clearable @keyup.enter="handleQuery" />
  7. </el-form-item>
  8. <el-form-item label="账号" prop="Name">
  9. <el-input v-model="queryParams.Name" placeholder="请输入用户名称" clearable @keyup.enter="handleQuery" />
  10. </el-form-item>
  11. <el-form-item label="昵称" prop="NickName">
  12. <el-input v-model="queryParams.NickName" placeholder="请输入昵称" clearable @keyup.enter="handleQuery" />
  13. </el-form-item>
  14. <el-form-item>
  15. <el-button type="primary" @click="handleQuery" :loading="loading" v-waves>查询</el-button>
  16. <el-button @click="resetQuery(ruleFormRef)" v-waves>重置</el-button>
  17. </el-form-item>
  18. </el-form>
  19. </el-card>
  20. <el-card shadow="never">
  21. <div class="flex-center-between mb20">
  22. <p class="table-title">信息列表</p>
  23. <div v-auth="'100102'">
  24. <el-button type="primary" @click="onOpenAddUser" v-waves>
  25. <SvgIcon name="ele-Plus" class="mr5" />新增用户
  26. </el-button>
  27. </div>
  28. </div>
  29. <!-- 表格 -->
  30. <el-table :data="list" v-loading="loading" row-key="id" ref="multipleTableRef"
  31. @selection-change="handleSelectionChange" id="table">
  32. <!-- <el-table-column type="selection" width="55" :reserve-selection="true"/> -->
  33. <el-table-column prop="name" label="账号" show-overflow-tooltip></el-table-column>
  34. <el-table-column prop="phoneNo" label="手机号码" show-overflow-tooltip></el-table-column>
  35. <el-table-column prop="staffNo" label="工号" show-overflow-tooltip></el-table-column>
  36. <el-table-column prop="defaultTelNo" label="默认分机号" show-overflow-tooltip></el-table-column>
  37. <el-table-column prop="creationTime" label="创建时间" show-overflow-tooltip width="170"></el-table-column>
  38. <el-table-column label="操作" width="250" fixed="right" align="center">
  39. <template #default="scope">
  40. <el-button text type="primary" @click="onOpenEditUser(scope.row)" v-auth="'100103'">修改</el-button>
  41. <el-button text type="success" @click="onSetRole(scope.row)" v-auth="'100105'">设置角色</el-button>
  42. <el-button text type="warning" @click="onRestPwd(scope.row)">重置密码</el-button>
  43. <el-button text type="danger" @click="onRowDel(scope.row)" v-auth="'100104'">删除</el-button>
  44. </template>
  45. </el-table-column>
  46. <template #empty>
  47. <Empty />
  48. </template>
  49. </el-table>
  50. <!-- 分页 -->
  51. <pagination :total="total" v-model:page="queryParams.PageIndex" v-model:limit="queryParams.pageSize"
  52. @pagination="getList" />
  53. </el-card>
  54. <AddUer ref="addUserRef" @updateList="handleQuery" />
  55. <EditUser ref="editUserRef" @updateList="handleQuery" />
  56. <SetRole ref="setRoleRef" @updateList="handleQuery" />
  57. </div>
  58. </template>
  59. <script lang="ts" setup name="systemUser">
  60. import { defineAsyncComponent, ref, reactive, toRefs, onMounted } from 'vue';
  61. import { ElMessageBox, ElMessage } from 'element-plus';
  62. import { throttle } from '/@/utils/tools';
  63. import type { FormInstance } from 'element-plus';
  64. import { formatDate } from '/@/utils/formatTime';
  65. import { delUser, getUserListPaged, restPwd } from '/@/api/system/user';
  66. // import FileSaver from 'file-saver';
  67. // import * as XLSX from 'xlsx'//这是vue3导入XLSX的方法
  68. interface queryState {
  69. queryParams: {
  70. PageIndex: number,
  71. pageSize: number,
  72. PhoneNo?: string,
  73. Name?: string,
  74. NickName?: string
  75. }
  76. }
  77. const data = reactive<queryState>({
  78. queryParams: {
  79. PageIndex: 1,
  80. pageSize: 10,
  81. PhoneNo: '',
  82. Name: '',
  83. NickName: '',
  84. },
  85. });
  86. const AddUer = defineAsyncComponent(() => import('/@/views/system/institutionalUsers/user/component/addUser.vue'))
  87. const EditUser = defineAsyncComponent(() => import('/@/views/system/institutionalUsers/user/component/editUser.vue'))
  88. const SetRole = defineAsyncComponent(() => import('/@/views/system/institutionalUsers/user/component/setRole.vue'))
  89. const loading = ref(false);
  90. const total = ref(0);
  91. const list = ref<any>([]);
  92. const showSearch = ref(true);
  93. const ruleFormRef = ref<FormInstance>();
  94. const addUserRef = ref();
  95. const editUserRef = ref();
  96. const setRoleRef = ref();
  97. /** 搜索按钮操作 节流操作 */
  98. const handleQuery = throttle(() => {
  99. data.queryParams.PageIndex = 1;
  100. getList();
  101. }, 1000);
  102. /** 获取用户列表 */
  103. const getList = () => {
  104. loading.value = true;
  105. getUserListPaged(data.queryParams).then((response: any) => {
  106. list.value = response?.result.items ?? [];
  107. for (let i of list.value) {
  108. i.creationTime = formatDate(new Date(i.creationTime), 'YYYY-mm-dd HH:MM:SS');
  109. }
  110. total.value = response?.result.total;
  111. setTimeout(() => {
  112. loading.value = false;
  113. }, 300);
  114. }).catch(() => {
  115. loading.value = false;
  116. });
  117. };
  118. // 打开新增用户弹窗
  119. const onOpenAddUser = () => {
  120. addUserRef.value.openDialog();
  121. };
  122. // 打开设置用户角色弹窗
  123. const onSetRole = (row: any) => {
  124. setRoleRef.value.openDialog(row);
  125. };
  126. const multipleSelection = ref<any>([]) //多选
  127. const handleSelectionChange = (val: any) => {
  128. multipleSelection.value = val;
  129. }
  130. /** 重置按钮操作 */
  131. const resetQuery = throttle((formEl: FormInstance | undefined) => {
  132. if (!formEl) return;
  133. formEl.resetFields();
  134. handleQuery();
  135. }, 1000);
  136. // 打开修改用户弹窗
  137. const onOpenEditUser = (row: any) => {
  138. editUserRef.value.openDialog(row);
  139. };
  140. // 重置密码
  141. const onRestPwd = (row: any) => {
  142. ElMessageBox.confirm(`此操作将:“${row.name}的密码重置为 Fwkj@789 ”,是否继续?`, '提示', {
  143. confirmButtonText: '确认',
  144. cancelButtonText: '取消',
  145. type: 'warning',
  146. }).then(() => {
  147. restPwd(row.id).then(() => {
  148. ElMessage.success('操作成功');
  149. handleQuery();
  150. });
  151. }).catch(() => { });
  152. }
  153. // 删除用户
  154. const onRowDel = (row: any) => {
  155. ElMessageBox.confirm(`此操作将永久删除账户名称:“${row.name}”,是否继续?`, '提示', {
  156. confirmButtonText: '确认',
  157. cancelButtonText: '取消',
  158. type: 'warning',
  159. }).then(() => {
  160. delUser(row.id).then(() => {
  161. ElMessage.success('删除成功');
  162. handleQuery();
  163. });
  164. }).catch(() => { });
  165. };
  166. const { queryParams } = toRefs(data);
  167. onMounted(() => {
  168. getList();
  169. });
  170. // // 全部導出
  171. // const allExport = async (name:string, id:string) => {
  172. // ElMessageBox.confirm('確定導出所有會計報表?', '導出提示', {
  173. // confirmButtonText: '確定',
  174. // cancelButtonText: '取消',
  175. // type: 'warning'
  176. // }).then(() => {
  177. // var wb = XLSX.utils.table_to_book(document.querySelector('#' + id),{ raw: true })
  178. // var wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: true, type: 'array' })
  179. // try {
  180. // FileSaver.saveAs(new Blob([wbout], { type: 'application/octet-stream' }), name + '.xlsx')
  181. // } catch (e) { if (typeof console !== 'undefined') console.log(e, wbout) }
  182. // return wbout
  183. // })
  184. // .catch(() => {})
  185. // }
  186. </script>