You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

223 lines
6.0 KiB

3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
  1. <script lang="ts" setup>
  2. import type { FormInstance } from 'element-plus'
  3. import { addUser, delUser, updateUser, userList } from '@/apis/user'
  4. import { ElMessage, ElMessageBox } from 'element-plus'
  5. import { onMounted, ref } from 'vue'
  6. onMounted(() => {
  7. queryUserList()
  8. })
  9. const userDataList = ref<User.User[]>([])
  10. const visible = ref(false)
  11. const userForm = ref<Record<string, string | number | boolean>>({})
  12. const userFormRef = ref()
  13. const queryUserList = () => {
  14. const params = {
  15. pageSize: 10,
  16. pageNum: 1,
  17. }
  18. userList(params).then((res) => {
  19. userDataList.value = res.list
  20. })
  21. }
  22. const createUser = () => {
  23. userForm.value = {}
  24. visible.value = true
  25. }
  26. const editUser = () => {
  27. if (!selectedList.value || !selectedList.value.length) {
  28. ElMessage.warning('请选择一条数据进行编辑')
  29. return
  30. }
  31. const userItem = selectedList.value[0]
  32. userForm.value = {
  33. username: userItem.username,
  34. nickname: userItem.nickname,
  35. deleted: userItem.deleted,
  36. id: userItem.id,
  37. isAdmin: userItem.role === 'ADMIN',
  38. role: userItem.role,
  39. }
  40. visible.value = true
  41. // updateUser()
  42. }
  43. const onDelUser = () => {
  44. if (!selectedList.value.length) {
  45. ElMessage.warning('请选择要删除的数据')
  46. return
  47. }
  48. ElMessageBox.confirm(
  49. '确认删除选中的数据吗?',
  50. '确认提示',
  51. {
  52. confirmButtonText: '确认',
  53. cancelButtonText: '取消',
  54. type: 'warning',
  55. },
  56. ).then(() => {
  57. const ids = selectedList.value.map(item => item.id)
  58. delUser(ids.join(',')).then(() => {
  59. ElMessage.success('删除成功')
  60. queryUserList()
  61. })
  62. })
  63. }
  64. const selectedList = ref<User.User[]>([])
  65. const onSelectionChange = (rows: User.User[]) => {
  66. selectedList.value = rows
  67. }
  68. const closeDialog = () => {
  69. visible.value = false
  70. }
  71. const onConfirm = (formRef: FormInstance | undefined) => {
  72. if (!formRef) {
  73. return
  74. }
  75. formRef.validate((valid) => {
  76. if (valid) {
  77. if (userForm.value.id) {
  78. doEdit()
  79. }
  80. else {
  81. doSave()
  82. }
  83. }
  84. else {
  85. console.log('error submit!')
  86. }
  87. })
  88. }
  89. const doEdit = () => {
  90. const { username, nickname, isAdmin, id } = userForm.value
  91. const params = {
  92. username: username as string,
  93. nickname: nickname as string,
  94. role: isAdmin ? 'ADMIN' : 'USER',
  95. deleted: 'ENABLE',
  96. id: id as number,
  97. }
  98. updateUser(params).then(() => {
  99. ElMessage.success('保存成功')
  100. queryUserList()
  101. closeDialog()
  102. })
  103. }
  104. const doSave = () => {
  105. const { username, nickname, password, confirmPassword, isAdmin } = userForm.value
  106. if (password !== confirmPassword) {
  107. ElMessage.error('两次输入的密码不一致')
  108. return
  109. }
  110. const params: User.AddUser = {
  111. username: username as string,
  112. nickname: nickname as string,
  113. password: password as string,
  114. role: isAdmin ? 'ADMIN' : 'USER',
  115. deleted: 'ENABLE',
  116. }
  117. addUser(params).then(() => {
  118. ElMessage.success('保存成功')
  119. queryUserList()
  120. closeDialog()
  121. })
  122. }
  123. </script>
  124. <template>
  125. <div>
  126. <div>
  127. <FtButton type="primary" @click="createUser">
  128. 添加用户
  129. </FtButton>
  130. <FtButton type="primary" @click="editUser">
  131. 编辑用户
  132. </FtButton>
  133. <FtButton @click="onDelUser">
  134. 删除用户
  135. </FtButton>
  136. </div>
  137. <div>
  138. <el-table :data="userDataList" stripe style="width: 100%" @selection-change="onSelectionChange">
  139. <el-table-column type="selection" width="55" />
  140. <el-table-column type="index" width="50" />
  141. <el-table-column prop="username" label="登录名" />
  142. <el-table-column prop="nickname" label="用户名" />
  143. <el-table-column prop="fixedUser" label="状态">
  144. <template #default="scoped">
  145. <span v-if="scoped.row.deleted === 'ENABLE'">正常</span>
  146. <span v-else>停用</span>
  147. </template>
  148. </el-table-column>
  149. <el-table-column prop="createTime" label="创建时间" />
  150. <el-table-column prop="updateTime" label="更新时间" />
  151. </el-table>
  152. </div>
  153. <FtDialog v-model="visible" title="添加用户" width="30%" :ok-handle="() => { onConfirm(userFormRef) }" @cancel="closeDialog">
  154. <div>
  155. <el-form ref="userFormRef" :model="userForm" label-width="auto" style="max-width: 600px">
  156. <el-form-item
  157. label="登录名:"
  158. prop="username"
  159. :rules="[{
  160. required: true,
  161. message: '输入登录名',
  162. trigger: ['blur', 'change'],
  163. }]"
  164. >
  165. <el-input v-model="userForm.username" placeholder="登录名" />
  166. </el-form-item>
  167. <el-form-item
  168. label="用户名:"
  169. prop="nickname"
  170. :rules="{
  171. required: true,
  172. message: '输入用户名',
  173. trigger: 'blur',
  174. }"
  175. >
  176. <el-input v-model="userForm.nickname" placeholder="用户名" />
  177. </el-form-item>
  178. <div v-if="!userForm.id">
  179. <el-form-item
  180. label="密码:"
  181. prop="password"
  182. :rules="{
  183. required: true,
  184. message: '输入密码',
  185. trigger: 'blur',
  186. }"
  187. >
  188. <el-input v-model="userForm.password" type="password" placeholder="密码" />
  189. </el-form-item>
  190. <el-form-item
  191. label="确认密码:"
  192. prop="confirmPassword"
  193. :rules="{
  194. required: true,
  195. message: '输入密码',
  196. trigger: 'blur',
  197. }"
  198. >
  199. <el-input v-model="userForm.confirmPassword" type="password" placeholder="确认密码" />
  200. </el-form-item>
  201. </div>
  202. <el-form-item
  203. label="是否管理员:"
  204. >
  205. <el-checkbox v-model="userForm.isAdmin" size="small" />
  206. </el-form-item>
  207. </el-form>
  208. </div>
  209. </FtDialog>
  210. </div>
  211. </template>
  212. <style lang="css" scoped>
  213. .footer{
  214. display: flex;
  215. justify-content: center;
  216. width: 35vw;
  217. }
  218. </style>