UserView.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <template>
  2. <PagingTable url="/admin/users" :where="where" ref="table">
  3. <template #filter>
  4. <EnumSelect :enum="UserRole" v-model="where.roles"></EnumSelect>
  5. <ElButton :icon="Plus" @click="onEdit()">添加</ElButton>
  6. </template>
  7. <ElTableColumn prop="id" label="#" width="80" />
  8. <ElTableColumn prop="username" label="用户名" min-width="120" />
  9. <ElTableColumn prop="name" label="昵称" min-width="120" />
  10. <ElTableColumn prop="phone" label="手机" min-width="120" />
  11. <ElTableColumn prop="createdAt" label="注册时间" :formatter="timeFormatter" width="150" />
  12. <ElTableColumn prop="invitor" label="上级" />
  13. <ElTableColumn label="操作" align="center" width="160">
  14. <template #default="{ row }">
  15. <ElButton @click="getToken(row)">Token</ElButton>
  16. <ElButton @click="onEdit(row)">编辑</ElButton>
  17. </template>
  18. </ElTableColumn>
  19. </PagingTable>
  20. <EditDialog v-model="showEditDialog" :model="model" :rules="rules" :on-submit="submit" @success="table.refresh()">
  21. <ElFormItem prop="username" label="用户名">
  22. <ElInput v-model="model.username" placeholder="请输入用户名" />
  23. </ElFormItem>
  24. <ElFormItem prop="name" label="昵称">
  25. <ElInput v-model="model.name" placeholder="请输入昵称" />
  26. </ElFormItem>
  27. <ElFormItem prop="phone" label="手机">
  28. <ElInput v-model="model.phone" placeholder="请输入手机" />
  29. </ElFormItem>
  30. <ElFormItem prop="password" label="密码" v-if="!model.id">
  31. <ElInput v-model="model.password" placeholder="请输入密码" />
  32. </ElFormItem>
  33. <ElFormItem prop="roles" label="角色">
  34. <EnumSelect v-model="model.roles" :enum="UserRole" multiple />
  35. </ElFormItem>
  36. <ElFormItem prop="orgId" label="企业ID" v-if="model.roles && model.roles[0] === 'org'">
  37. <ElInputNumber :controls="false" v-model="model.orgId" placeholder="请输入企业ID" />
  38. </ElFormItem>
  39. </EditDialog>
  40. </template>
  41. <script setup>
  42. import { ref } from 'vue'
  43. import PagingTable from '@/components/PagingTable.vue'
  44. import { useTimeFormatter } from '@/utils/formatter'
  45. import { Plus } from '@vicons/tabler'
  46. import EditDialog from '@/components/EditDialog.vue'
  47. import { setupEditDialog } from '@/utils/editDialog'
  48. import EnumSelect from '@/components/EnumSelect.vue'
  49. import { UserRole } from '@/enums'
  50. import { http } from '@/plugins/http'
  51. import { ElMessage } from 'element-plus'
  52. import { useClipboard } from '@vueuse/core'
  53. const where = ref({ roles: 'user' })
  54. const timeFormatter = useTimeFormatter()
  55. const table = ref(null)
  56. const model = ref({})
  57. const rules = {
  58. username: [{ required: true, message: '请输入用户名', trigger: 'blur' }],
  59. name: [{ required: true, message: '请输入昵称', trigger: 'blur' }],
  60. phone: [{ required: true, message: '请输入手机', trigger: 'blur' }],
  61. password: [{ required: true, message: '请输入密码', trigger: 'blur' }],
  62. roles: [{ required: true, message: '请选择角色', trigger: 'blur' }],
  63. orgId: [{ required: true, message: '请输入企业ID', trigger: 'blur' }]
  64. }
  65. const { showEditDialog, onEdit } = setupEditDialog(model)
  66. async function submit() {
  67. if (model.value.roles[0] !== 'org') {
  68. model.value.orgId = null
  69. }
  70. await http.put(model.value.id ? `/admin/users/${model.value.id}` : '/admin/users', model.value)
  71. ElMessage.success('保存成功')
  72. }
  73. function getToken(row) {
  74. http.get(`/auth/admin/user/${row.id}/token`).then((res) => {
  75. const { copy } = useClipboard({ legacy: true })
  76. copy(res.access_token)
  77. ElMessage.success('复制成功')
  78. })
  79. }
  80. </script>