index.vue 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. <template>
  2. <div class="device-manager-box">
  3. <!--引用表格-->
  4. <BasicTable @register="registerTable" :rowSelection="rowSelection">
  5. <!--插槽:table标题-->
  6. <template #tableTitle>
  7. <a-button type="primary" preIcon="ant-design:plus-outlined" @click="handleCreate"> 新增</a-button>
  8. <a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
  9. <j-upload-button type="primary" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
  10. <a-button type="primary" @click="handleSyncUser" preIcon="ant-design:sync-outlined"> 同步流程</a-button>
  11. <a-button type="primary" @click="openModal(true, {})" preIcon="ant-design:hdd-outlined"> 回收站</a-button>
  12. <JThirdAppButton biz-type="user" :selected-row-keys="selectedRowKeys" syncToApp syncToLocal @sync-finally="onSyncFinally" />
  13. <a-dropdown v-if="selectedRowKeys.length > 0">
  14. <template #overlay>
  15. <a-menu>
  16. <a-menu-item key="1" @click="batchHandleDelete">
  17. <Icon icon="ant-design:delete-outlined" />
  18. 删除
  19. </a-menu-item>
  20. <a-menu-item key="2" @click="batchFrozen(2)">
  21. <Icon icon="ant-design:lock-outlined" />
  22. 冻结
  23. </a-menu-item>
  24. <a-menu-item key="3" @click="batchFrozen(1)">
  25. <Icon icon="ant-design:unlock-outlined" />
  26. 解冻
  27. </a-menu-item>
  28. </a-menu>
  29. </template>
  30. <a-button
  31. >批量操作
  32. <Icon icon="mdi:chevron-down" />
  33. </a-button>
  34. </a-dropdown>
  35. </template>
  36. <!--操作栏-->
  37. <template #action="{ record }">
  38. <TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)" />
  39. </template>
  40. </BasicTable>
  41. <!--用户抽屉-->
  42. <UserDrawer @register="registerDrawer" @success="handleSuccess" />
  43. <!--修改密码-->
  44. <PasswordModal @register="registerPasswordModal" @success="reload" />
  45. <!--用户代理-->
  46. <UserAgentModal @register="registerAgentModal" @success="reload" />
  47. <!--回收站-->
  48. <UserRecycleBinModal @register="registerModal" @success="reload" />
  49. </div>
  50. </template>
  51. <script lang="ts" name="system-user" setup>
  52. //ts语法
  53. import { ref, computed, unref } from 'vue';
  54. import { BasicTable, TableAction, ActionItem } from '/@/components/Table';
  55. import UserDrawer from './UserDrawer.vue';
  56. import UserRecycleBinModal from './UserRecycleBinModal.vue';
  57. import PasswordModal from './PasswordModal.vue';
  58. import UserAgentModal from './UserAgentModal.vue';
  59. import JThirdAppButton from '/@/components/jeecg/thirdApp/JThirdAppButton.vue';
  60. import { useDrawer } from '/@/components/Drawer';
  61. import { useListPage } from '/@/hooks/system/useListPage';
  62. import { useModal } from '/@/components/Modal';
  63. import { useMessage } from '/@/hooks/web/useMessage';
  64. import { columns, searchFormSchema } from './user.data';
  65. import { list, deleteUser, batchDeleteUser, getImportUrl, getExportUrl, frozenBatch, syncUser } from './user.api';
  66. // import { usePermission } from '/@/hooks/web/usePermission'
  67. // const { hasPermission } = usePermission();
  68. const { createMessage, createConfirm } = useMessage();
  69. //注册drawer
  70. const [registerDrawer, { openDrawer }] = useDrawer();
  71. //回收站model
  72. const [registerModal, { openModal }] = useModal();
  73. //密码model
  74. const [registerPasswordModal, { openModal: openPasswordModal }] = useModal();
  75. //代理人model
  76. const [registerAgentModal, { openModal: openAgentModal }] = useModal();
  77. // 列表页面公共参数、方法
  78. const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
  79. designScope: 'user-list',
  80. tableProps: {
  81. title: '用户列表',
  82. api: list,
  83. columns: columns,
  84. size: 'small',
  85. formConfig: {
  86. // labelWidth: 200,
  87. schemas: searchFormSchema,
  88. },
  89. actionColumn: {
  90. width: 120,
  91. },
  92. beforeFetch: (params) => {
  93. return Object.assign({ column: 'createTime', order: 'desc' }, params);
  94. },
  95. },
  96. exportConfig: {
  97. name: '用户列表',
  98. url: getExportUrl,
  99. },
  100. importConfig: {
  101. url: getImportUrl,
  102. },
  103. });
  104. //注册table数据
  105. const [registerTable, { reload, updateTableDataRecord }, { rowSelection, selectedRows, selectedRowKeys }] = tableContext;
  106. /**
  107. * 新增事件
  108. */
  109. function handleCreate() {
  110. openDrawer(true, {
  111. isUpdate: false,
  112. showFooter: true,
  113. });
  114. }
  115. /**
  116. * 编辑事件
  117. */
  118. async function handleEdit(record: Recordable) {
  119. openDrawer(true, {
  120. record,
  121. isUpdate: true,
  122. showFooter: true,
  123. });
  124. }
  125. /**
  126. * 详情
  127. */
  128. async function handleDetail(record: Recordable) {
  129. openDrawer(true, {
  130. record,
  131. isUpdate: true,
  132. showFooter: false,
  133. });
  134. }
  135. /**
  136. * 删除事件
  137. */
  138. async function handleDelete(record) {
  139. if ('admin' == record.username) {
  140. createMessage.warning('管理员账号不允许此操作!');
  141. return;
  142. }
  143. await deleteUser({ id: record.id }, reload);
  144. }
  145. /**
  146. * 批量删除事件
  147. */
  148. async function batchHandleDelete() {
  149. let hasAdmin = unref(selectedRows).filter((item) => item.username == 'admin');
  150. if (unref(hasAdmin).length > 0) {
  151. createMessage.warning('管理员账号不允许此操作!');
  152. return;
  153. }
  154. await batchDeleteUser({ ids: selectedRowKeys.value }, () => {
  155. selectedRowKeys.value = [];
  156. reload();
  157. });
  158. }
  159. /**
  160. * 成功回调
  161. */
  162. function handleSuccess() {
  163. reload();
  164. }
  165. /**
  166. * 打开修改密码弹窗
  167. */
  168. function handleChangePassword(username) {
  169. openPasswordModal(true, { username });
  170. }
  171. /**
  172. * 打开代理人弹窗
  173. */
  174. function handleAgentSettings(userName) {
  175. openAgentModal(true, { userName });
  176. }
  177. /**
  178. * 冻结解冻
  179. */
  180. async function handleFrozen(record, status) {
  181. if ('admin' == record.username) {
  182. createMessage.warning('管理员账号不允许此操作!');
  183. return;
  184. }
  185. await frozenBatch({ ids: record.id, status: status }, reload);
  186. }
  187. /**
  188. * 批量冻结解冻
  189. */
  190. function batchFrozen(status) {
  191. let hasAdmin = selectedRows.value.filter((item) => item.username == 'admin');
  192. if (unref(hasAdmin).length > 0) {
  193. createMessage.warning('管理员账号不允许此操作!');
  194. return;
  195. }
  196. createConfirm({
  197. iconType: 'warning',
  198. title: '确认操作',
  199. content: '是否' + (status == 1 ? '解冻' : '冻结') + '选中账号?',
  200. onOk: async () => {
  201. await frozenBatch({ ids: unref(selectedRowKeys).join(','), status: status }, reload);
  202. },
  203. });
  204. }
  205. /**
  206. *同步流程
  207. */
  208. function handleSyncUser() {
  209. syncUser();
  210. }
  211. /**
  212. *同步钉钉和微信回调
  213. */
  214. function onSyncFinally({ isToLocal }) {
  215. // 同步到本地时刷新下数据
  216. if (isToLocal) {
  217. reload();
  218. }
  219. }
  220. /**
  221. * 操作栏
  222. */
  223. function getTableAction(record): ActionItem[] {
  224. return [
  225. {
  226. label: '编辑',
  227. onClick: handleEdit.bind(null, record),
  228. // ifShow: () => hasPermission('system:user:edit'),
  229. },
  230. ];
  231. }
  232. /**
  233. * 下拉操作栏
  234. */
  235. function getDropDownAction(record): ActionItem[] {
  236. return [
  237. {
  238. label: '详情',
  239. onClick: handleDetail.bind(null, record),
  240. },
  241. {
  242. label: '密码',
  243. onClick: handleChangePassword.bind(null, record.username),
  244. },
  245. {
  246. label: '删除',
  247. popConfirm: {
  248. title: '是否确认删除',
  249. confirm: handleDelete.bind(null, record),
  250. },
  251. },
  252. {
  253. label: '冻结',
  254. ifShow: record.status == 1,
  255. popConfirm: {
  256. title: '确定冻结吗?',
  257. confirm: handleFrozen.bind(null, record, 2),
  258. },
  259. },
  260. {
  261. label: '解冻',
  262. ifShow: record.status == 2,
  263. popConfirm: {
  264. title: '确定解冻吗?',
  265. confirm: handleFrozen.bind(null, record, 1),
  266. },
  267. },
  268. {
  269. label: '代理人',
  270. onClick: handleAgentSettings.bind(null, record.username),
  271. },
  272. ];
  273. }
  274. </script>
  275. <style scoped></style>