mirror of
				https://gitee.com/hhyykk/ipms-sjy-ui.git
				synced 2025-10-31 18:28:44 +08:00 
			
		
		
		
	| @@ -1,5 +1,11 @@ | ||||
| <template> | ||||
|   <el-dialog title="分配角色" :modelValue="show" width="500px" append-to-body @close="closeDialog"> | ||||
|   <Dialog | ||||
|     title="分配角色" | ||||
|     :modelValue="showDialog" | ||||
|     width="500px" | ||||
|     append-to-body | ||||
|     @close="closeDialog" | ||||
|   > | ||||
|     <el-form :model="formData" label-width="80px" ref="formRef"> | ||||
|       <el-form-item label="用户名称"> | ||||
|         <el-input v-model="formData.username" :disabled="true" /> | ||||
| @@ -24,25 +30,19 @@ | ||||
|         <el-button @click="cancel">取 消</el-button> | ||||
|       </div> | ||||
|     </template> | ||||
|   </el-dialog> | ||||
|   </Dialog> | ||||
| </template> | ||||
| 
 | ||||
| <script setup lang="ts"> | ||||
| // TODO el-dialog 用 Dialog 组件 | ||||
| import { assignUserRoleApi, PermissionAssignUserRoleReqVO } from '@/api/system/permission' | ||||
| import { | ||||
|   assignUserRoleApi, | ||||
|   listUserRolesApi, | ||||
|   PermissionAssignUserRoleReqVO | ||||
| } from '@/api/system/permission' | ||||
| import { UserVO } from '@/api/system/user' | ||||
| import * as RoleApi from '@/api/system/role' | ||||
| 
 | ||||
| interface Props { | ||||
|   show: boolean | ||||
|   roleOptions: any[] | ||||
|   formInitValue?: Recordable & Partial<typeof initParams> | ||||
| } | ||||
| 
 | ||||
| const props = withDefaults(defineProps<Props>(), { | ||||
|   show: false, | ||||
|   roleOptions: () => [], | ||||
|   formInitValue: () => ({}) | ||||
| }) | ||||
| const emits = defineEmits(['update:show', 'success']) | ||||
| const emits = defineEmits(['success']) | ||||
| 
 | ||||
| const { t } = useI18n() // 国际化 | ||||
| const message = useMessage() // 消息弹窗 | ||||
| @@ -55,13 +55,7 @@ const initParams = { | ||||
|   roleIds: [] as number[] | ||||
| } | ||||
| const formData = ref<Recordable>({ ...initParams }) | ||||
| watch( | ||||
|   () => props.formInitValue, | ||||
|   (val) => { | ||||
|     formData.value = { ...val } | ||||
|   }, | ||||
|   { deep: true } | ||||
| ) | ||||
| 
 | ||||
| /* 弹框按钮操作 */ | ||||
| // 点击取消 | ||||
| const cancel = () => { | ||||
| @@ -69,7 +63,7 @@ const cancel = () => { | ||||
| } | ||||
| // 关闭弹窗 | ||||
| const closeDialog = () => { | ||||
|   emits('update:show', false) | ||||
|   showDialog.value = false | ||||
| } | ||||
| // 提交 | ||||
| const submit = async () => { | ||||
| @@ -86,4 +80,29 @@ const submit = async () => { | ||||
|     console.error(error) | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| const roleOptions = ref() | ||||
| const userRole = reactive(initParams) | ||||
| const showDialog = ref(false) | ||||
| const formRef = ref() | ||||
| const openForm = async (row: UserVO) => { | ||||
|   formRef.value?.resetFields() | ||||
|   userRole.id = row.id | ||||
|   userRole.username = row.username | ||||
|   userRole.nickname = row.nickname | ||||
| 
 | ||||
|   // 获得角色列表 | ||||
|   const roleOpt = await RoleApi.getSimpleRoleList() | ||||
|   roleOptions.value = [...roleOpt] | ||||
| 
 | ||||
|   // 获得角色拥有的菜单集合 | ||||
|   const roles = await listUserRolesApi(row.id) | ||||
|   userRole.roleIds = roles | ||||
|   formData.value = { ...userRole } | ||||
| 
 | ||||
|   showDialog.value = true | ||||
| } | ||||
| defineExpose({ | ||||
|   openForm | ||||
| }) | ||||
| </script> | ||||
							
								
								
									
										51
									
								
								src/views/system/user/components/UserDeptTree.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								src/views/system/user/components/UserDeptTree.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| <template> | ||||
|   <div class="head-container"> | ||||
|     <el-input v-model="deptName" placeholder="请输入部门名称" clearable style="margin-bottom: 20px"> | ||||
|       <template #prefix> | ||||
|         <Icon icon="ep:search" /> | ||||
|       </template> | ||||
|     </el-input> | ||||
|   </div> | ||||
|   <div class="head-container"> | ||||
|     <el-tree | ||||
|       :data="deptOptions" | ||||
|       :props="defaultProps" | ||||
|       :expand-on-click-node="false" | ||||
|       :filter-node-method="filterNode" | ||||
|       ref="treeRef" | ||||
|       node-key="id" | ||||
|       default-expand-all | ||||
|       highlight-current | ||||
|       @node-click="handleDeptNodeClick" | ||||
|     /> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script setup lang="ts" name="UserDeptTree"> | ||||
| import { ElTree } from 'element-plus' | ||||
| import * as DeptApi from '@/api/system/dept' | ||||
| import { defaultProps, handleTree } from '@/utils/tree' | ||||
|  | ||||
| const emits = defineEmits(['node-click']) | ||||
| const deptName = ref('') | ||||
| const deptOptions = ref<Tree[]>([]) // 树形结构 | ||||
| const treeRef = ref<InstanceType<typeof ElTree>>() | ||||
| const getTree = async () => { | ||||
|   const res = await DeptApi.getSimpleDeptList() | ||||
|   deptOptions.value = [] | ||||
|   deptOptions.value.push(...handleTree(res)) | ||||
| } | ||||
|  | ||||
| const filterNode = (value: string, data: Tree) => { | ||||
|   if (!value) return true | ||||
|   return data.name.includes(value) | ||||
| } | ||||
|  | ||||
| const handleDeptNodeClick = async (row: { [key: string]: any }) => { | ||||
|   emits('node-click', row) | ||||
| } | ||||
|  | ||||
| onMounted(async () => { | ||||
|   await getTree() | ||||
| }) | ||||
| </script> | ||||
| @@ -1,12 +1,6 @@ | ||||
| <template> | ||||
|   <!-- 添加或修改参数配置对话框 --> | ||||
|   <el-dialog | ||||
|     :title="title" | ||||
|     :modelValue="modelValue" | ||||
|     width="600px" | ||||
|     append-to-body | ||||
|     @close="closeDialog" | ||||
|   > | ||||
|   <Dialog :title="title" :modelValue="showDialog" width="600px" append-to-body @close="closeDialog"> | ||||
|     <el-form ref="formRef" :model="formData" :rules="rules" label-width="80px"> | ||||
|       <el-row> | ||||
|         <el-col :span="12"> | ||||
| @@ -61,10 +55,10 @@ | ||||
|           <el-form-item label="用户性别"> | ||||
|             <el-select v-model="formData.sex" placeholder="请选择"> | ||||
|               <el-option | ||||
|                 v-for="dict in sexDictDatas" | ||||
|                 :key="parseInt(dict.value)" | ||||
|                 v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_USER_SEX)" | ||||
|                 :key="dict.value as number" | ||||
|                 :label="dict.label" | ||||
|                 :value="parseInt(dict.value)" | ||||
|                 :value="dict.value" | ||||
|               /> | ||||
|             </el-select> | ||||
|           </el-form-item> | ||||
| @@ -76,7 +70,7 @@ | ||||
|                 v-for="item in postOptions" | ||||
|                 :key="item.id" | ||||
|                 :label="item.name" | ||||
|                 :value="item.id" | ||||
|                 :value="item.id as number" | ||||
|               /> | ||||
|             </el-select> | ||||
|           </el-form-item> | ||||
| @@ -96,41 +90,45 @@ | ||||
|         <el-button @click="cancel">取 消</el-button> | ||||
|       </div> | ||||
|     </template> | ||||
|   </el-dialog> | ||||
|   </Dialog> | ||||
| </template> | ||||
| <script lang="ts" setup> | ||||
| import { PostVO } from '@/api/system/post' | ||||
| import { createUserApi, updateUserApi } from '@/api/system/user' | ||||
| import { DICT_TYPE, getDictOptions } from '@/utils/dict' | ||||
| import { defaultProps } from '@/utils/tree' | ||||
| import * as PostApi from '@/api/system/post' | ||||
| import { createUserApi, getUserApi, updateUserApi } from '@/api/system/user' | ||||
| import * as DeptApi from '@/api/system/dept' | ||||
| 
 | ||||
| import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' | ||||
| import { defaultProps, handleTree } from '@/utils/tree' | ||||
| import { ElForm, FormItemRule } from 'element-plus' | ||||
| import { Arrayable } from 'element-plus/es/utils' | ||||
| import { UserVO } from '@/api/login/types' | ||||
| 
 | ||||
| type Form = InstanceType<typeof ElForm> | ||||
| interface Props { | ||||
|   deptOptions?: Tree[] | ||||
|   postOptions?: PostVO[] //岗位列表 | ||||
|   modelValue: boolean | ||||
|   formInitValue?: Recordable & Partial<typeof initParams> | ||||
| } | ||||
| 
 | ||||
| const props = withDefaults(defineProps<Props>(), { | ||||
|   deptOptions: () => [], | ||||
|   postOptions: () => [], | ||||
|   modelValue: false, | ||||
|   formInitValue: () => ({}) | ||||
| }) | ||||
| const emits = defineEmits(['update:modelValue', 'success']) | ||||
| const emits = defineEmits(['success']) | ||||
| 
 | ||||
| const { t } = useI18n() // 国际化 | ||||
| const message = useMessage() // 消息弹窗 | ||||
| 
 | ||||
| const showDialog = ref(false) | ||||
| // 弹出层标题 | ||||
| const title = computed(() => { | ||||
|   return formData.value?.id ? '修改用户' : '添加用户' | ||||
| }) | ||||
| 
 | ||||
| // 性别字典 | ||||
| const sexDictDatas = getDictOptions(DICT_TYPE.SYSTEM_USER_SEX) | ||||
| const deptOptions = ref<Tree[]>([]) // 树形结构 | ||||
| const getTree = async () => { | ||||
|   const res = await DeptApi.getSimpleDeptList() | ||||
|   deptOptions.value = [] | ||||
|   deptOptions.value.push(...handleTree(res)) | ||||
| } | ||||
| // 获取岗位列表 | ||||
| const postOptions = ref<PostVO[]>([]) //岗位列表 | ||||
| const getPostOptions = async () => { | ||||
|   const res = (await PostApi.getSimplePostList()) as PostVO[] | ||||
|   postOptions.value.push(...res) | ||||
| } | ||||
| 
 | ||||
| // 表单初始化参数 | ||||
| const initParams = { | ||||
| @@ -156,7 +154,7 @@ const rules = { | ||||
|   email: [ | ||||
|     { | ||||
|       type: 'email', | ||||
|       message: "'请输入正确的邮箱地址", | ||||
|       message: '请输入正确的邮箱地址', | ||||
|       trigger: ['blur', 'change'] | ||||
|     } | ||||
|   ], | ||||
| @@ -170,13 +168,6 @@ const rules = { | ||||
| } as Partial<Record<string, Arrayable<FormItemRule>>> | ||||
| const formRef = ref<Form | null>() | ||||
| const formData = ref<Recordable>({ ...initParams }) | ||||
| watch( | ||||
|   () => props.formInitValue, | ||||
|   (val) => { | ||||
|     formData.value = { ...val } | ||||
|   }, | ||||
|   { deep: true } | ||||
| ) | ||||
| 
 | ||||
| const resetForm = () => { | ||||
|   let form = formRef?.value | ||||
| @@ -185,7 +176,7 @@ const resetForm = () => { | ||||
|   form && (form as Form).resetFields() | ||||
| } | ||||
| const closeDialog = () => { | ||||
|   emits('update:modelValue', false) | ||||
|   showDialog.value = false | ||||
| } | ||||
| // 操作成功 | ||||
| const operateOk = () => { | ||||
| @@ -213,11 +204,34 @@ const submitForm = () => { | ||||
|     } | ||||
|   }) | ||||
| } | ||||
| /* 取消 */ | ||||
| const cancel = () => { | ||||
|   closeDialog() | ||||
| } | ||||
| 
 | ||||
| /* 打开弹框 */ | ||||
| const openForm = (row: undefined | UserVO) => { | ||||
|   resetForm() | ||||
|   getTree() // 部门树 | ||||
|   if (row && row.id) { | ||||
|     const id = row.id | ||||
|     getUserApi(id).then((response) => { | ||||
|       formData.value = response | ||||
|     }) | ||||
|   } else { | ||||
|     formData.value = { ...initParams } | ||||
|   } | ||||
| 
 | ||||
|   showDialog.value = true | ||||
| } | ||||
| 
 | ||||
| // ========== 初始化 ========== | ||||
| onMounted(async () => { | ||||
|   await getPostOptions() | ||||
| }) | ||||
| 
 | ||||
| defineExpose({ | ||||
|   resetForm | ||||
|   resetForm, | ||||
|   openForm | ||||
| }) | ||||
| </script> | ||||
| @@ -1,7 +1,7 @@ | ||||
| <template> | ||||
|   <el-dialog | ||||
|   <Dialog | ||||
|     :title="upload.title" | ||||
|     :modelValue="modelValue" | ||||
|     :modelValue="showDialog" | ||||
|     width="400px" | ||||
|     append-to-body | ||||
|     @close="closeDialog" | ||||
| @@ -45,7 +45,7 @@ | ||||
|         <el-button @click="cancel">取 消</el-button> | ||||
|       </div> | ||||
|     </template> | ||||
|   </el-dialog> | ||||
|   </Dialog> | ||||
| </template> | ||||
| 
 | ||||
| <script lang="ts" setup> | ||||
| @@ -53,19 +53,11 @@ import { importUserTemplateApi } from '@/api/system/user' | ||||
| import { getAccessToken, getTenantId } from '@/utils/auth' | ||||
| import download from '@/utils/download' | ||||
| 
 | ||||
| interface Props { | ||||
|   modelValue: boolean | ||||
| } | ||||
| 
 | ||||
| // const props = | ||||
| withDefaults(defineProps<Props>(), { | ||||
|   modelValue: false | ||||
| }) | ||||
| 
 | ||||
| const emits = defineEmits(['update:modelValue', 'success']) | ||||
| const emits = defineEmits(['success']) | ||||
| 
 | ||||
| const message = useMessage() // 消息弹窗 | ||||
| 
 | ||||
| const showDialog = ref(false) | ||||
| const uploadRef = ref() | ||||
| 
 | ||||
| // 用户导入参数 | ||||
| @@ -123,7 +115,8 @@ const handleExceed = (): void => { | ||||
|   message.error('最多只能上传一个文件!') | ||||
| } | ||||
| // 上传错误提示 | ||||
| const excelUploadError = (): void => { | ||||
| const excelUploadError = (e): void => { | ||||
|   console.log(e) | ||||
|   message.error('导入数据失败,请您重新上传!') | ||||
| } | ||||
| 
 | ||||
| @@ -144,10 +137,18 @@ const cancel = () => { | ||||
| } | ||||
| // 关闭弹窗 | ||||
| const closeDialog = () => { | ||||
|   emits('update:modelValue', false) | ||||
|   showDialog.value = false | ||||
| } | ||||
| // 提交上传文件 | ||||
| const submitFileForm = () => { | ||||
|   uploadRef.value?.submit() | ||||
| } | ||||
| 
 | ||||
| const openForm = () => { | ||||
|   uploadRef.value?.clearFiles() | ||||
|   showDialog.value = true | ||||
| } | ||||
| defineExpose({ | ||||
|   openForm | ||||
| }) | ||||
| </script> | ||||
| @@ -5,31 +5,7 @@ | ||||
|       <el-row :gutter="20"> | ||||
|         <!--部门数据--> | ||||
|         <el-col :span="4" :xs="24"> | ||||
|           <div class="head-container"> | ||||
|             <el-input | ||||
|               v-model="deptName" | ||||
|               placeholder="请输入部门名称" | ||||
|               clearable | ||||
|               style="margin-bottom: 20px" | ||||
|             > | ||||
|               <template #prefix> | ||||
|                 <Icon icon="ep:search" /> | ||||
|               </template> | ||||
|             </el-input> | ||||
|           </div> | ||||
|           <div class="head-container"> | ||||
|             <el-tree | ||||
|               :data="deptOptions" | ||||
|               :props="defaultProps" | ||||
|               :expand-on-click-node="false" | ||||
|               :filter-node-method="filterNode" | ||||
|               ref="treeRef" | ||||
|               node-key="id" | ||||
|               default-expand-all | ||||
|               highlight-current | ||||
|               @node-click="handleDeptNodeClick" | ||||
|             /> | ||||
|           </div> | ||||
|           <UserDeptTree @node-click="handleDeptNodeClick" /> | ||||
|         </el-col> | ||||
|         <!--用户数据--> | ||||
|         <el-col :span="20" :xs="24"> | ||||
| @@ -66,10 +42,10 @@ | ||||
|                 style="width: 240px" | ||||
|               > | ||||
|                 <el-option | ||||
|                   v-for="dict in statusDictDatas" | ||||
|                   :key="parseInt(dict.value)" | ||||
|                   v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)" | ||||
|                   :key="dict.value as number" | ||||
|                   :label="dict.label" | ||||
|                   :value="parseInt(dict.value)" | ||||
|                   :value="dict.value as number" | ||||
|                 /> | ||||
|               </el-select> | ||||
|             </el-form-item> | ||||
| @@ -244,51 +220,34 @@ | ||||
|       </el-row> | ||||
|     </content-wrap> | ||||
|     <!-- 添加或修改用户对话框 --> | ||||
|     <AddForm | ||||
|       ref="addEditFormRef" | ||||
|       v-model="showAddDialog" | ||||
|       :dept-options="deptOptions" | ||||
|       :post-options="postOptions" | ||||
|       :form-init-value="addFormInitValue" | ||||
|       @success="getList" | ||||
|     /> | ||||
|     <UserForm ref="userFormRef" @success="getList" /> | ||||
|     <!-- 用户导入对话框 --> | ||||
|     <ImportForm v-model="importDialogVisible" @success="getList" /> | ||||
|     <UserImportForm ref="userImportFormRef" @success="getList" /> | ||||
|     <!-- 分配角色 --> | ||||
|     <RoleForm | ||||
|       ref="roleFormRef" | ||||
|       v-model:show="roleDialogVisible" | ||||
|       :role-options="roleOptions" | ||||
|       :form-init-value="userRole" | ||||
|       @success="getList" | ||||
|     /> | ||||
|     <UserAssignRoleForm ref="userAssignRoleFormRef" @success="getList" /> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script setup lang="ts" name="User"> | ||||
| import type { ElTree } from 'element-plus' | ||||
| import { handleTree, defaultProps } from '@/utils/tree' | ||||
| // 原vue3版本api方法都是Api结尾觉得见名知义,个人觉得这个可以形成规范 | ||||
| // TODO 使用 DeptApi 这种形式哈 | ||||
| import { getSimpleDeptList as getSimpleDeptListApi } from '@/api/system/dept' | ||||
| import { getSimplePostList as getSimplePostListApi, PostVO } from '@/api/system/post' | ||||
| import { DICT_TYPE, getDictOptions } from '@/utils/dict' | ||||
| import download from '@/utils/download' | ||||
| import { parseTime } from '@/utils/formatTime' | ||||
| import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' | ||||
| import { CommonStatusEnum } from '@/utils/constants' | ||||
|  | ||||
| import { | ||||
|   deleteUserApi, | ||||
|   exportUserApi, | ||||
|   resetUserPwdApi, | ||||
|   updateUserStatusApi, | ||||
|   getUserPageApi, | ||||
|   UserVO | ||||
| } from '@/api/system/user' | ||||
| import { parseTime } from './utils' // TODO 可以使用 formatTime 里的方法 | ||||
| import AddForm from './AddForm.vue' // TODO 改成 UserForm | ||||
| import ImportForm from './ImportForm.vue' // TODO 改成 UserImportForm | ||||
| import RoleForm from './RoleForm.vue' // TODO 改成 UserAssignRoleForm | ||||
| import { getUserApi, getUserPageApi } from '@/api/system/user' | ||||
| import { getSimpleRoleList as getSimpleRoleListApi } from '@/api/system/role' | ||||
| import { listUserRolesApi } from '@/api/system/permission' | ||||
| import { CommonStatusEnum } from '@/utils/constants' | ||||
| import download from '@/utils/download' | ||||
|  | ||||
| import UserForm from './components/UserForm.vue' | ||||
| import UserImportForm from './components/UserImportForm.vue' | ||||
| import UserAssignRoleForm from './components/UserAssignRoleForm.vue' | ||||
| import UserDeptTree from './components/UserDeptTree.vue' | ||||
|  | ||||
| const message = useMessage() // 消息弹窗 | ||||
| const { t } = useI18n() // 国际化 | ||||
|  | ||||
| @@ -302,42 +261,12 @@ const queryParams = reactive({ | ||||
|   createTime: [] | ||||
| }) | ||||
| const showSearch = ref(true) | ||||
| const showAddDialog = ref(false) | ||||
|  | ||||
| // 数据字典- // TODO 可以直接 vue 那 getIntDictOptions,这样一方面少个变量,也可以 getIntDictOptions | ||||
| const statusDictDatas = getDictOptions(DICT_TYPE.COMMON_STATUS) | ||||
|  | ||||
| // ========== 创建部门树结构 ========== | ||||
| // TODO 要不把部门树拆成一个左侧的组件,然后点击后触发 handleDeptNodeClick | ||||
| const deptName = ref('') | ||||
| watch( | ||||
|   () => deptName.value, | ||||
|   (val) => { | ||||
|     treeRef.value?.filter(val) | ||||
|   } | ||||
| ) | ||||
| const deptOptions = ref<Tree[]>([]) // 树形结构 | ||||
| const treeRef = ref<InstanceType<typeof ElTree>>() | ||||
| const getTree = async () => { | ||||
|   const res = await getSimpleDeptListApi() | ||||
|   deptOptions.value = [] | ||||
|   deptOptions.value.push(...handleTree(res)) | ||||
| } | ||||
| const filterNode = (value: string, data: Tree) => { | ||||
|   if (!value) return true | ||||
|   return data.name.includes(value) | ||||
| } | ||||
| const handleDeptNodeClick = async (row: { [key: string]: any }) => { | ||||
|   queryParams.deptId = row.id | ||||
|   getList() | ||||
| } | ||||
|  | ||||
| // 获取岗位列表 | ||||
| const postOptions = ref<PostVO[]>([]) //岗位列表 | ||||
| const getPostOptions = async () => { | ||||
|   const res = await getSimplePostListApi() | ||||
|   postOptions.value.push(...res) | ||||
| } | ||||
| // 用户列表 | ||||
| const userList = ref<UserVO[]>([]) | ||||
| const loading = ref(false) | ||||
| @@ -374,37 +303,30 @@ const resetQuery = () => { | ||||
| } | ||||
|  | ||||
| // 添加或编辑 | ||||
| const addEditFormRef = ref() | ||||
| const userFormRef = ref() | ||||
| // 添加用户 | ||||
| // TODO 可以参考别的模块哈,openForm;然后 tree 和 position 可以里面在加载下,让组件自己维护自己哈。 | ||||
| const handleAdd = () => { | ||||
|   addEditFormRef?.value.resetForm() | ||||
|   // 获得下拉数据 | ||||
|   getTree() | ||||
|   // 打开表单,并设置初始化 | ||||
|   showAddDialog.value = true | ||||
|   userFormRef.value?.openForm() | ||||
| } | ||||
|  | ||||
| // 用户导入 | ||||
| const userImportFormRef = ref() | ||||
| const handleImport = () => { | ||||
|   importDialogVisible.value = true | ||||
|   userImportFormRef.value?.openForm() | ||||
| } | ||||
|  | ||||
| // 用户导出 | ||||
| // TODO 改成 await 的风格; | ||||
| const exportLoading = ref(false) | ||||
| const handleExport = () => { | ||||
|   message | ||||
|     .confirm('是否确认导出所有用户数据项?') | ||||
|     .then(() => { | ||||
|     .then(async () => { | ||||
|       // 处理查询参数 | ||||
|       let params = { ...queryParams } | ||||
|       params.pageNo = 1 | ||||
|       params.pageSize = 99999 | ||||
|       exportLoading.value = true | ||||
|       return exportUserApi(params) | ||||
|     }) | ||||
|     .then((response) => { | ||||
|       const response = await exportUserApi(params) | ||||
|       download.excel(response, '用户数据.xls') | ||||
|     }) | ||||
|     .catch(() => {}) | ||||
| @@ -435,17 +357,14 @@ const handleCommand = (command: string, index: number, row: UserVO) => { | ||||
| } | ||||
|  | ||||
| // 用户状态修改 | ||||
| // TODO 改成 await 的风格; | ||||
| const handleStatusChange = (row: UserVO) => { | ||||
|   let text = row.status === CommonStatusEnum.ENABLE ? '启用' : '停用' | ||||
|   message | ||||
|     .confirm('确认要"' + text + '""' + row.username + '"用户吗?', t('common.reminder')) | ||||
|     .then(function () { | ||||
|     .then(async () => { | ||||
|       row.status = | ||||
|         row.status === CommonStatusEnum.ENABLE ? CommonStatusEnum.ENABLE : CommonStatusEnum.DISABLE | ||||
|       return updateUserStatusApi(row.id, row.status) | ||||
|     }) | ||||
|     .then(() => { | ||||
|       await updateUserStatusApi(row.id, row.status) | ||||
|       message.success(text + '成功') | ||||
|       // 刷新列表 | ||||
|       getList() | ||||
| @@ -457,81 +376,47 @@ const handleStatusChange = (row: UserVO) => { | ||||
| } | ||||
|  | ||||
| // 具体数据单行操作 | ||||
| const addFormInitValue = ref<Recordable>({}) | ||||
| /** 修改按钮操作 */ | ||||
| const handleUpdate = (row: UserVO) => { | ||||
|   addEditFormRef.value?.resetForm() | ||||
|   getTree() | ||||
|   const id = row.id | ||||
|   getUserApi(id).then((response) => { | ||||
|     addFormInitValue.value = response | ||||
|     showAddDialog.value = true | ||||
|   }) | ||||
|   userFormRef.value?.openForm(row) | ||||
| } | ||||
|  | ||||
| // 删除用户 | ||||
| // TODO 改成 await 的风格; | ||||
| const handleDelete = (row: UserVO) => { | ||||
|   const ids = row.id | ||||
|   message | ||||
|     .confirm('是否确认删除用户编号为"' + ids + '"的数据项?') | ||||
|     .then(() => { | ||||
|       return deleteUserApi(ids) | ||||
|     }) | ||||
|     .then(() => { | ||||
|       getList() | ||||
|     .then(async () => { | ||||
|       await deleteUserApi(ids) | ||||
|       message.success('删除成功') | ||||
|       getList() | ||||
|     }) | ||||
|     .catch((e) => { | ||||
|       console.error(e) | ||||
|     }) | ||||
|     .catch(() => {}) | ||||
| } | ||||
|  | ||||
| // 重置密码 | ||||
| // TODO 改成 await 的风格; | ||||
| const handleResetPwd = (row: UserVO) => { | ||||
|   message.prompt('请输入"' + row.username + '"的新密码', t('common.reminder')).then(({ value }) => { | ||||
|     resetUserPwdApi(row.id, value) | ||||
|       .then(() => { | ||||
|   message | ||||
|     .prompt('请输入"' + row.username + '"的新密码', t('common.reminder')) | ||||
|     .then(async ({ value }) => { | ||||
|       await resetUserPwdApi(row.id, value) | ||||
|       message.success('修改成功,新密码是:' + value) | ||||
|     }) | ||||
|     .catch((e) => { | ||||
|       console.error(e) | ||||
|     }) | ||||
|   }) | ||||
| } | ||||
|  | ||||
| // 分配角色 | ||||
| const roleDialogVisible = ref(false) | ||||
| const roleOptions = ref() | ||||
| const userRole = reactive({ | ||||
|   id: 0, | ||||
|   username: '', | ||||
|   nickname: '', | ||||
|   roleIds: [] | ||||
| }) | ||||
| const handleRole = async (row: UserVO) => { | ||||
|   addEditFormRef.value?.resetForm() | ||||
|   userRole.id = row.id | ||||
|   userRole.username = row.username | ||||
|   userRole.nickname = row.nickname | ||||
|  | ||||
|   // 获得角色列表 | ||||
|   const roleOpt = await getSimpleRoleListApi() | ||||
|   roleOptions.value = [...roleOpt] | ||||
|  | ||||
|   // 获得角色拥有的菜单集合 | ||||
|   const roles = await listUserRolesApi(row.id) | ||||
|   userRole.roleIds = roles | ||||
|  | ||||
|   roleDialogVisible.value = true | ||||
| const userAssignRoleFormRef = ref() | ||||
| const handleRole = (row: UserVO) => { | ||||
|   userAssignRoleFormRef.value?.openForm(row) | ||||
| } | ||||
|  | ||||
| /* 用户导入 */ | ||||
| const importDialogVisible = ref(false) | ||||
|  | ||||
| // ========== 初始化 ========== | ||||
| onMounted(async () => { | ||||
|   getList() | ||||
|   await getPostOptions() | ||||
|   await getTree() | ||||
| }) | ||||
| </script> | ||||
|   | ||||
| @@ -1,44 +0,0 @@ | ||||
| export const parseTime = (time) => { | ||||
|   if (!time) { | ||||
|     return null | ||||
|   } | ||||
|   const format = '{y}-{m}-{d} {h}:{i}:{s}' | ||||
|   let date | ||||
|   if (typeof time === 'object') { | ||||
|     date = time | ||||
|   } else { | ||||
|     if (typeof time === 'string' && /^[0-9]+$/.test(time)) { | ||||
|       time = parseInt(time) | ||||
|     } else if (typeof time === 'string') { | ||||
|       time = time | ||||
|         .replace(new RegExp(/-/gm), '/') | ||||
|         .replace('T', ' ') | ||||
|         .replace(new RegExp(/\.[\d]{3}/gm), '') | ||||
|     } | ||||
|     if (typeof time === 'number' && time.toString().length === 10) { | ||||
|       time = time * 1000 | ||||
|     } | ||||
|     date = new Date(time) | ||||
|   } | ||||
|   const formatObj = { | ||||
|     y: date.getFullYear(), | ||||
|     m: date.getMonth() + 1, | ||||
|     d: date.getDate(), | ||||
|     h: date.getHours(), | ||||
|     i: date.getMinutes(), | ||||
|     s: date.getSeconds(), | ||||
|     a: date.getDay() | ||||
|   } | ||||
|   const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => { | ||||
|     let value = formatObj[key] | ||||
|     // Note: getDay() returns 0 on Sunday | ||||
|     if (key === 'a') { | ||||
|       return ['日', '一', '二', '三', '四', '五', '六'][value] | ||||
|     } | ||||
|     if (result.length > 0 && value < 10) { | ||||
|       value = '0' + value | ||||
|     } | ||||
|     return value || 0 | ||||
|   }) | ||||
|   return time_str | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 芋道源码
					芋道源码