// import dayjs from "dayjs"; import { message } from "@/utils/message"; import editForm from "../form.vue"; import { addDialog } from "@/components/ReDialog"; import { type FormItemProps } from "../utils/types"; import { getUserList, getDeptList, addUser, updateUser, deleteUser } from "@/api/system"; import { ElMessageBox } from "element-plus"; import { type PaginationProps } from "@pureadmin/table"; import { reactive, ref, computed, h, onMounted } from "vue"; // import { http } from "@/utils/http"; import { string } from "vue-types"; import { cloneDeep } from "@pureadmin/utils"; // 共享列表数据 const dataList = ref([]); // 共享表格页码 const pagination = reactive({ total: 0, pageSize: 10, currentPage: 1, background: true }); export function useUser() { const form = reactive({ /** 角色名称 */ username: "", /** 手机号 */ phone_number: "", /** 状态 */ status: "", /** 部门 */ department_id: "" }); const formRef = ref(); const loading = ref(true); const switchLoadMap = ref({}); const columns: TableColumnList = [ { label: "序号", type: "index", width: 70, fixed: "left" }, // { // label: "用户编号", // prop: "id", // minWidth: 130 // }, { label: "用户名称", prop: "username", minWidth: 130 }, // { // label: "用户昵称", // prop: "nickname", // minWidth: 130 // }, { label: "性别", prop: "gender", minWidth: 90, cellRenderer: ({ row, props }) => ( {row.gender === 1 ? "男" : "女"} ) }, { label: "部门", prop: "department_name", minWidth: 90 // formatter: ({ dept }) => dept.name }, { label: "手机号码", prop: "phone_number", minWidth: 90 }, { label: "状态", prop: "status", minWidth: 90, cellRenderer: scope => ( onChange(scope as any)} /> ) }, { label: "创建时间", minWidth: 90, prop: "date_joined" }, { label: "操作", fixed: "right", width: 180, slot: "operation" } ]; const buttonClass = computed(() => { return [ "!h-[20px]", "reset-margin", "!text-gray-500", "dark:!text-white", "dark:hover:!text-primary" ]; }); function onChange({ row, index }) { ElMessageBox.confirm( `确认要${ row.status === 0 ? "停用" : "启用" }${ row.username }用户吗?`, "系统提示", { confirmButtonText: "确定", cancelButtonText: "取消", type: "warning", dangerouslyUseHTMLString: true, draggable: true } ) .then(() => { const params = { department_id: row.department_id, username: row.username, phone_number: row.phone_number, status: row.status, gender: row.gender, id: row.id }; updateUser(params).then(res => { if (res.success) { setTimeout(() => { switchLoadMap.value[index] = Object.assign( {}, switchLoadMap.value[index], { loading: false } ); message("已成功修改用户状态", { type: "success" }); }, 300); } else { row.status === 0 ? (row.status = 1) : (row.status = 0); message(`${res.msg}`, { type: "warning" }); } }); // switchLoadMap.value[index] = Object.assign( // {}, // switchLoadMap.value[index], // { // loading: true // } // ); }) .catch(() => { row.status === 0 ? (row.status = 1) : (row.status = 0); }); } function handleUpdate(row) { console.log(row); openDialog("编辑", row); } function handleDelete(row) { // const deleteListData = userList.value.list.filter( // item => item.id !== row.id // ); // userList.value.list = deleteListData; deleteUser(row.id).then(res => { if (!res.success) { message(`${res.msg}`, { type: "warning" }); } else { message(`您删除了角色名称为${row.username}的这条数据`, { type: "success" }); onSearch(); } }); } function handleSizeChange() { onSearch(); } function handleCurrentChange() { onSearch(); } function handleSelectionChange(val) { console.log("handleSelectionChange", val); } // function getUserList() { // // http.request("post", "/login") // return userList; // } const deptList = ref([]); async function onSearch() { loading.value = true; const params = { ...form, page: pagination.currentPage || undefined, page_size: pagination.pageSize || undefined }; const data = await getUserList(params); await getDeptList().then(res => { deptList.value = res.data; }); dataList.value = data.results; pagination.total = data.count; setTimeout(() => { loading.value = false; }, 500); } const resetForm = formEl => { if (!formEl) return; formEl.resetFields(); onSearch(); }; function openDialog(title = "新增", row?: FormItemProps) { addDialog({ title: `${title}用户`, props: { formInline: { higherDeptOptions: cloneDeep(deptList.value), department_id: row?.department_id ?? "", username: row?.username ?? "", phone_number: row?.phone_number ?? "", status: row?.status ?? 1, gender: row?.gender ?? null, id: row?.id ?? "" } }, width: "40%", draggable: true, fullscreenIcon: true, closeOnClickModal: false, contentRenderer: () => h(editForm, { ref: formRef }), beforeSure: (done, { options }) => { const FormRef = formRef.value.getRef(); const curData = options.props.formInline as FormItemProps; function chores() { message(`您${title}了用户名称为${curData.username}的这条数据`, { type: "success" }); done(); // 关闭弹框 onSearch(); // 刷新表格数据 } FormRef.validate(valid => { if (valid) { console.log("curData", curData); // 表单规则校验通过 if (title === "新增") { // 实际开发先调用新增接口,再进行下面操作 addUser(curData).then(res => { console.log(res); if (res.success) { chores(); } else { message(`${res.msg}`, { type: "warning" }); } }); } else { const params = { department_id: curData.department_id, username: curData.username, phone_number: curData.phone_number, status: curData.status, gender: curData.gender, id: curData.id }; updateUser(params) .then(res => { console.log(res); if (res.success) { chores(); } else { message(`${res.msg}`, { type: "warning" }); } }) .catch(error => { message(`${error}`, { type: "warning" }); }); // 实际开发先调用编辑接口,再进行下面操作 } } }); } }); } const formData = reactive({ username: string }); const drawerShow = ref(null); const checkAll = ref(false); const allRole = ref([]); const userRole = ref([]); function setRole(row) { Object.assign(formData, row); Object.assign(allRole.value, [ { createTime: "2021-05-31 18:09:18", id: 1, remark: null, roleName: "超级管理员", updateTime: "2023-04-28 11:03:38" }, { createTime: "2021-05-31 18:09:18", id: 1, remark: null, roleName: "普通角色", updateTime: "2023-04-28 11:03:38" } ]); Object.assign(userRole.value, [ { createTime: "2021-05-31 18:09:18", id: 1, remark: null, roleName: "超级管理员", updateTime: "2023-04-28 11:03:38" } ]); console.log(allRole); drawerShow.value = true; } function confirmClick() { drawerShow.value = false; } //控制顶部全选复选框不确定的样式 const isIndeterminate = ref(true); //顶部的全部复选框的change事件 function handleCheckAllChange(val: boolean) { // console.log(val); // console.log(allRole.value); //val:true(全选)|false(没有全选) userRole.value = val ? allRole.value : []; //不确定的样式(确定样式) isIndeterminate.value = false; } //顶部全部的复选框的change事件 function handleCheckedCitiesChange(value: string[]) { console.log(value); //顶部复选框的勾选数据 //代表:勾选上的项目个数与全部的职位个数相等,顶部的复选框勾选上 checkAll.value = value.length === allRole.value.length; //不确定的样式 isIndeterminate.value = value.length !== allRole.value.length; } /** 密码正则(密码格式应为8-18位数字、字母、符号的任意两种组合) */ const REGEXP_PWD = /^(?![0-9]+$)(?![a-z]+$)(?![A-Z]+$)(?!([^(0-9a-zA-Z)]|[()])+$)(?!^.*[\u4E00-\u9FA5].*$)([^(0-9a-zA-Z)]|[()]|[a-z]|[A-Z]|[0-9]){8,18}$/; function resetPassword(row: { username: string; id: any }) { ElMessageBox.prompt( "请输入用户「" + row.username + "」的新密码", "重置密码", { confirmButtonText: "确定", cancelButtonText: "取消", inputValidator: val => { if (val === null) { return true; //初始化的值为null,不做处理的话,刚打开MessageBox就会校验出错,影响用户体验 } return REGEXP_PWD.test(val); }, inputErrorMessage: "密码格式应为8-18位数字、字母、符号的任意两种组合" } ) .then(({ value }) => { if (!value) { message(`请输入新密码`, { type: "warning" }); return false; } else { const params = { id: row.id, password: value }; updateUser(params) .then(res => { console.log(res); if (res.success) { message(`${res.msg}`, { type: "success" }); } else { message(`${res.msg}`, { type: "warning" }); } }) .catch(error => { message(`${error}`, { type: "warning" }); }); } }) .catch(() => {}); } onMounted(() => { onSearch(); }); return { form, loading, columns, dataList, pagination, buttonClass, drawerShow, formData, allRole, userRole, setRole, confirmClick, handleCheckAllChange, handleCheckedCitiesChange, resetPassword, onSearch, openDialog, resetForm, handleUpdate, handleDelete, handleSizeChange, handleCurrentChange, handleSelectionChange }; }