user.vue 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. <template>
  2. <hc-card :scrollbar="false" action-size="lg" class="user-page">
  3. <template #header>
  4. <div class="relative w-[300px]">
  5. <hc-search-input v-model="searchForm.account" color="#151921" text="搜索" @search="searchClick" />
  6. </div>
  7. </template>
  8. <template #extra>
  9. <el-button color="#20C98B" type="primary" @click="addClick">
  10. <hc-icon class="text-white" name="add" />
  11. <span class="text-white">新增</span>
  12. </el-button>
  13. <el-button :disabled="tableCheckedKeys.length === 0" color="#FF6C6C" :loading="batchDelLoad" @click="batchDelClick">
  14. <hc-icon class="text-white" name="delete-bin-2" />
  15. <span class="text-white">删除</span>
  16. </el-button>
  17. <el-button v-yes-com:[refreshPassword1] :disabled="tableCheckedKeys.length === 0" type="info" yes-com-text="是否重置密码为 123456">
  18. <hc-icon name="refresh" />
  19. <span>重置密码</span>
  20. </el-button>
  21. <el-button v-yes-com:[exportClick] color="#6CC2FF" yes-com-text="确定导出用户数据?" :loading="downloadLoading">
  22. <hc-icon class="text-white" name="download" />
  23. <span class="text-white">导出</span>
  24. </el-button>
  25. </template>
  26. <hc-table :column="tableColumn" :datas="tableData" class="user-page-table" is-check :loading="tableLoading" @selection-change="tableSelectionChange">
  27. <template #action="{ row }">
  28. <el-link type="success" @click="rowEditClick(row)">
  29. <hc-icon name="edit" />编辑
  30. </el-link>
  31. <el-link type="success" @click="rowDelClick(row)">
  32. <hc-icon name="delete-bin-2" />删除
  33. </el-link>
  34. </template>
  35. </hc-table>
  36. <template #action>
  37. <hc-pages :pages="searchForm" @change="pageChange" />
  38. </template>
  39. <!-- 新增编辑 -->
  40. <hc-dialog v-model="addModal" :title="modalTitle" widths="50rem" :loading="addsaveLoading" @save="modalSave">
  41. <hc-icon class="font-bold" name="user" style="font-size: 18px;" />
  42. <span class="font-bold">基础信息</span>
  43. <el-divider style="margin-top: 10px;" />
  44. <el-form ref="formRef" :inline="true" :model="baseForm" :rules="baseFormRules" label-width="auto">
  45. <div class="hc-form-item">
  46. <el-form-item label="登陆账户:" prop="account">
  47. <el-input v-model="baseForm.account" clearable placeholder="请输入" />
  48. </el-form-item>
  49. <el-form-item label="密码:" prop="passText">
  50. <el-input v-model="baseForm.passText" clearable placeholder="请输入" show-password type="password" />
  51. </el-form-item>
  52. </div>
  53. <div class="hc-form-item">
  54. <el-form-item label="用户名:" prop="realName">
  55. <el-input v-model="baseForm.realName" clearable placeholder="请输入" />
  56. </el-form-item>
  57. <el-form-item label="角色:" prop="roleId">
  58. <!-- <el-option v-for="item in roleOptions" :key="item.value" :label="item.label" :value="item.value" /> -->
  59. <el-tree-select
  60. v-model="roleIdArr"
  61. :props="defaultProps"
  62. :data="roleOptions"
  63. multiple
  64. :render-after-expand="false"
  65. style="width: 240px"
  66. @change="changeRole"
  67. />
  68. </el-form-item>
  69. </div>
  70. </el-form>
  71. </hc-dialog>
  72. </hc-card>
  73. </template>
  74. <script setup>
  75. import { onMounted, ref } from 'vue'
  76. import { HcDelMsg } from 'hc-vue3-ui'
  77. import { arrToId, downloadBlob, formValidate, getArrValue, getObjValue } from 'js-fast-way'
  78. import { add, getExportExcel, getList, getUser, remove, resetPassword, update } from '~api/system/user.js'
  79. import { getRoleTree } from '~api/system/role.js'
  80. onMounted(()=>{
  81. getTableData()
  82. })
  83. const tableColumn = [
  84. { key: 'account', name: '登陆账户', align: 'center' },
  85. { key: 'realName', name: '用户名', align: 'center' },
  86. { key: 'roleName', name: '角色', align: 'center' },
  87. { key: 'action', name: '操作', align: 'center', width: '140' },
  88. ]
  89. const tableData = ref([])
  90. const tableLoading = ref(false)
  91. const addModal = ref(false)
  92. const addClick = () => {
  93. modalTitle.value = '新增'
  94. addModal.value = true
  95. getRoleOptions()
  96. }
  97. const baseForm = ref({ account: '', realName: '', passText: '', roleId: '' })
  98. const baseFormRules = {
  99. account: {
  100. required: true,
  101. trigger: 'blur',
  102. message: '请输入登陆账户',
  103. },
  104. passText: {
  105. required: true,
  106. trigger: 'blur',
  107. message: '请输入密码',
  108. },
  109. realName: {
  110. required: true,
  111. trigger: 'blur',
  112. message: '请输入用户名',
  113. },
  114. roleId: {
  115. required: true,
  116. trigger: 'blur',
  117. message: '请选择角色',
  118. },
  119. }
  120. const tableCheckedKeys = ref([])
  121. //多选事件
  122. const tableSelectionChange = (rows) => {
  123. tableCheckedKeys.value = rows
  124. }
  125. //搜索表单
  126. const searchForm = ref({ account: null, current: 1, size: 20, total: 0 })
  127. const searchClick = () => {
  128. getTableData()
  129. }
  130. const getTableData = async () => {
  131. tableLoading.value = true
  132. const { error, code, data } = await getList({
  133. ...searchForm.value,
  134. })
  135. tableLoading.value = false
  136. if (!error && code === 200) {
  137. tableData.value = getArrValue(data['records'])
  138. } else {
  139. tableData.value = []
  140. }
  141. }
  142. //分页被点击
  143. const pageChange = ({ current, size }) => {
  144. searchForm.value.current = current
  145. searchForm.value.size = size
  146. getTableData()
  147. }
  148. const modalTitle = ref('新增')
  149. const rowEditClick = async (row) => {
  150. modalTitle.value = '编辑'
  151. getRoleOptions().then()
  152. addModal.value = true
  153. roleIdArr.value = row.roleId.split(',')
  154. const { error, code, data } = await getUser( row.id)
  155. if (!error && code === 200) {
  156. baseForm.value = getObjValue(data)
  157. } else {
  158. baseForm.value = {}
  159. }
  160. }
  161. const batchDelClick = ()=>{
  162. let ids = arrToId(tableCheckedKeys.value)
  163. HcDelMsg(async (resolve) => {
  164. await removeUser(ids)
  165. resolve() //关闭弹窗的回调
  166. })
  167. }
  168. const batchDelLoad = ref(false)
  169. const rowDelClick = (row) => {
  170. HcDelMsg(async (resolve) => {
  171. await removeUser(row.id)
  172. resolve() //关闭弹窗的回调
  173. })
  174. }
  175. const removeUser = async (ids) => {
  176. const { error, code, msg } = await remove(
  177. ids,
  178. )
  179. if (!error && code === 200) {
  180. window?.$message?.success('删除成功')
  181. getTableData()
  182. } else {
  183. window.$message.error(msg ?? '操作失败')
  184. }
  185. }
  186. const refreshPassword1 = async (_, resolve) => {
  187. let ids = arrToId(tableCheckedKeys.value)
  188. //这里可以写一些操作
  189. await resetPasswordClick(ids)
  190. resolve() //这个一定要存在,否则不会关闭弹窗
  191. }
  192. const resetPasswordClick = async (id)=>{
  193. const { error, code, msg } = await resetPassword(
  194. id,
  195. )
  196. if (!error && code === 200) {
  197. window?.$message?.success(msg)
  198. getTableData()
  199. } else {
  200. window.$message.error(msg ?? '操作失败')
  201. }
  202. }
  203. const exportClick = async (_, resolve) => {
  204. //这里可以写一些操作
  205. await getExportExcelClick()
  206. resolve() //这个一定要存在,否则不会关闭弹窗
  207. }
  208. const downloadLoading = ref(false)
  209. const getExportExcelClick = async () => {
  210. //批量下载
  211. downloadLoading.value = true
  212. const { error, disposition, res } = await getExportExcel({
  213. })
  214. //处理数据
  215. downloadLoading.value = false
  216. if (!error) {
  217. if (disposition) {
  218. downloadBlob(res, disposition)
  219. } else {
  220. window.$message?.error('数据异常')
  221. }
  222. }
  223. }
  224. const formRef = ref(null)
  225. const roleIdArr = ref([])
  226. const addsaveLoading = ref(false)
  227. const changeRole = (val)=>{
  228. baseForm.value.roleId = roleIdArr.value.join(',')
  229. }
  230. const modalSave = async ()=>{
  231. const isValidate = await formValidate(formRef.value)
  232. if (!isValidate) return false
  233. addsaveLoading.value = true
  234. console.log(baseForm.value, 'baseForm.value')
  235. if (modalTitle.value === '编辑') {
  236. const { error, code, msg } = await update({
  237. ...baseForm.value,
  238. roleId:roleIdArr.value.join(','),
  239. })
  240. //判断状态
  241. addsaveLoading.value = false
  242. if (!error && code === 200) {
  243. window?.$message?.success(msg)
  244. addModal.value = false
  245. getTableData()
  246. } else {
  247. window.$message.error(msg ?? '操作失败')
  248. }
  249. } else {
  250. const { error, code, msg } = await add({
  251. ...baseForm.value,
  252. roleId:roleIdArr.value.join(','),
  253. })
  254. //判断状态
  255. addsaveLoading.value = false
  256. if (!error && code === 200) {
  257. window?.$message?.success(msg)
  258. getTableData()
  259. } else {
  260. window.$message.error(msg ?? '操作失败')
  261. }
  262. }
  263. }
  264. const roleOptions = ref([])
  265. const defaultProps = {
  266. children: 'children',
  267. label: 'title',
  268. }
  269. const getRoleOptions = async () => {
  270. const { error, code, data } = await getRoleTree('000000')
  271. if (!error && code === 200) {
  272. roleOptions.value = getArrValue(data)
  273. console.log(roleOptions.value, 'roleOptions.value')
  274. } else {
  275. roleOptions.value = []
  276. }
  277. }
  278. </script>