兰宝车间质量管理系统-前端
LiuHao
2023-06-06 dbfe263681d211e06e13d55774424521b9fb0dc4
update 修改代码缩进格式
已修改22个文件
3005 ■■■■ 文件已修改
src/views/login.vue 147 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/register.vue 122 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/dept/index.vue 184 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/dict/data.vue 178 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/dict/index.vue 144 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/menu/index.vue 162 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/notice/index.vue 130 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/oss/config.vue 280 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/oss/index.vue 226 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/post/index.vue 134 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/role/authUser.vue 66 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/role/index.vue 356 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/role/selectUser.vue 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/tenant/index.vue 236 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/tenantPackage/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/user/index.vue 336 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/system/user/profile/index.vue 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tool/gen/basicInfoForm.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tool/gen/editTable.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tool/gen/genInfoForm.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tool/gen/importTable.vue 72 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tool/gen/index.vue 122 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/login.vue
@@ -56,19 +56,19 @@
const router = useRouter();
const loginForm = ref<LoginData>({
    tenantId: "000000",
    username: 'admin',
    password: 'admin123',
    rememberMe: false,
    code: '',
    uuid: ''
  tenantId: "000000",
  username: 'admin',
  password: 'admin123',
  rememberMe: false,
  code: '',
  uuid: ''
});
const loginRules: ElFormRules = {
    tenantId: [{ required: true, trigger: "blur", message: "请输入您的租户编号" }],
    username: [{ required: true, trigger: 'blur', message: '请输入您的账号' }],
    password: [{ required: true, trigger: 'blur', message: '请输入您的密码' }],
    code: [{ required: true, trigger: 'change', message: '请输入验证码' }]
  tenantId: [{ required: true, trigger: "blur", message: "请输入您的租户编号" }],
  username: [{ required: true, trigger: 'blur', message: '请输入您的账号' }],
  password: [{ required: true, trigger: 'blur', message: '请输入您的密码' }],
  code: [{ required: true, trigger: 'change', message: '请输入验证码' }]
};
const codeUrl = ref('');
@@ -87,64 +87,64 @@
const tenantList = ref<TenantVO[]>([]);
const handleLogin = () => {
    loginRef.value.validate(async (valid:boolean, fields: any) => {
        if (valid) {
            loading.value = true;
            // 勾选了需要记住密码设置在 cookie 中设置记住用户名和密码
            if (loginForm.value.rememberMe) {
                Cookies.set("tenantId", loginForm.value.tenantId, { expires: 30 });
                Cookies.set('username', loginForm.value.username, { expires: 30 });
                Cookies.set('password', String(encrypt(loginForm.value.password)), { expires: 30 });
                Cookies.set('rememberMe', String(loginForm.value.rememberMe), { expires: 30 });
            } else {
                // 否则移除
                Cookies.remove("tenantId");
                Cookies.remove('username');
                Cookies.remove('password');
                Cookies.remove('rememberMe');
            }
            // 调用action的登录方法
            // prittier-ignore
            const [err] = await to(userStore.login(loginForm.value));
            if (!err) {
                await router.push({ path: redirect.value || '/' });
            } else {
                loading.value = false;
                // 重新获取验证码
                if (captchaEnabled.value) {
                    await getCode();
                }
            }
        } else {
            console.log('error submit!', fields);
  loginRef.value.validate(async (valid: boolean, fields: any) => {
    if (valid) {
      loading.value = true;
      // 勾选了需要记住密码设置在 cookie 中设置记住用户名和密码
      if (loginForm.value.rememberMe) {
        Cookies.set("tenantId", loginForm.value.tenantId, { expires: 30 });
        Cookies.set('username', loginForm.value.username, { expires: 30 });
        Cookies.set('password', String(encrypt(loginForm.value.password)), { expires: 30 });
        Cookies.set('rememberMe', String(loginForm.value.rememberMe), { expires: 30 });
      } else {
        // 否则移除
        Cookies.remove("tenantId");
        Cookies.remove('username');
        Cookies.remove('password');
        Cookies.remove('rememberMe');
      }
      // 调用action的登录方法
      // prittier-ignore
      const [err] = await to(userStore.login(loginForm.value));
      if (!err) {
        await router.push({ path: redirect.value || '/' });
      } else {
        loading.value = false;
        // 重新获取验证码
        if (captchaEnabled.value) {
          await getCode();
        }
    });
      }
    } else {
      console.log('error submit!', fields);
    }
  });
};
/**
 * 获取验证码
 */
const getCode = async () => {
    const res = await getCodeImg();
    const { data } = res;
    captchaEnabled.value = data.captchaEnabled === undefined ? true : data.captchaEnabled;
    if (captchaEnabled.value) {
        codeUrl.value = 'data:image/gif;base64,' + data.img;
        loginForm.value.uuid = data.uuid;
    }
  const res = await getCodeImg();
  const { data } = res;
  captchaEnabled.value = data.captchaEnabled === undefined ? true : data.captchaEnabled;
  if (captchaEnabled.value) {
    codeUrl.value = 'data:image/gif;base64,' + data.img;
    loginForm.value.uuid = data.uuid;
  }
};
const getCookie = () => {
    const tenantId = Cookies.get("tenantId");
    const username = Cookies.get('username');
    const password = Cookies.get('password');
    const rememberMe = Cookies.get('rememberMe');
    loginForm.value = {
        tenantId: tenantId === undefined ? loginForm.value.tenantId : tenantId,
        username: username === undefined ? loginForm.value.username : username,
        password: password === undefined ? loginForm.value.password : (decrypt(password) as string),
        rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
    };
  const tenantId = Cookies.get("tenantId");
  const username = Cookies.get('username');
  const password = Cookies.get('password');
  const rememberMe = Cookies.get('rememberMe');
  loginForm.value = {
    tenantId: tenantId === undefined ? loginForm.value.tenantId : tenantId,
    username: username === undefined ? loginForm.value.username : username,
    password: password === undefined ? loginForm.value.password : (decrypt(password) as string),
    rememberMe: rememberMe === undefined ? false : Boolean(rememberMe)
  };
}
@@ -152,20 +152,20 @@
 * 获取租户列表
 */
const initTenantList = async () => {
    const { data } = await getTenantList();
    tenantEnabled.value = data.tenantEnabled === undefined ? true : data.tenantEnabled;
    if (tenantEnabled.value) {
        tenantList.value = data.voList;
        if (tenantList.value != null && tenantList.value.length !== 0) {
            loginForm.value.tenantId = tenantList.value[0].tenantId;
        }
  const { data } = await getTenantList();
  tenantEnabled.value = data.tenantEnabled === undefined ? true : data.tenantEnabled;
  if (tenantEnabled.value) {
    tenantList.value = data.voList;
    if (tenantList.value != null && tenantList.value.length !== 0) {
      loginForm.value.tenantId = tenantList.value[0].tenantId;
    }
  }
}
onMounted(() => {
    getCode();
    initTenantList();
    getCookie();
  getCode();
  initTenantList();
  getCookie();
});
</script>
@@ -178,6 +178,7 @@
  background-image: url("../assets/images/login-background.jpg");
  background-size: cover;
}
.title {
  margin: 0px auto 30px auto;
  text-align: center;
@@ -189,32 +190,39 @@
  background: #ffffff;
  width: 400px;
  padding: 25px 25px 5px 25px;
  .el-input {
    height: 40px;
    input {
      height: 40px;
    }
  }
  .input-icon {
    height: 39px;
    width: 14px;
    margin-left: 0px;
  }
}
.login-tip {
  font-size: 13px;
  text-align: center;
  color: #bfbfbf;
}
.login-code {
  width: 33%;
  height: 40px;
  float: right;
  img {
    cursor: pointer;
    vertical-align: middle;
  }
}
.el-login-footer {
  height: 40px;
  line-height: 40px;
@@ -223,10 +231,11 @@
  width: 100%;
  text-align: center;
  color: #fff;
  font-family: Arial,serif;
  font-family: Arial, serif;
  font-size: 12px;
  letter-spacing: 1px;
}
.login-code-img {
  height: 40px;
  padding-left: 12px;
src/views/register.vue
@@ -63,13 +63,13 @@
const router = useRouter();
const registerForm = ref<RegisterForm>({
    tenantId: "",
    username: "",
    password: "",
    confirmPassword: "",
    code: "",
    uuid: "",
    userType: "sys_user"
  tenantId: "",
  username: "",
  password: "",
  confirmPassword: "",
  code: "",
  uuid: "",
  userType: "sys_user"
});
// 租户开关
@@ -77,30 +77,30 @@
const equalToPassword = (rule: any, value: string, callback: any) => {
    if (registerForm.value.password !== value) {
        callback(new Error("两次输入的密码不一致"));
    } else {
        callback();
    }
  if (registerForm.value.password !== value) {
    callback(new Error("两次输入的密码不一致"));
  } else {
    callback();
  }
};
const registerRules: ElFormRules = {
    tenantId: [
        { required: true, trigger: "blur", message: "请输入您的租户编号" }
    ],
    username: [
        { required: true, trigger: "blur", message: "请输入您的账号" },
        { min: 2, max: 20, message: "用户账号长度必须介于 2 和 20 之间", trigger: "blur" }
    ],
    password: [
        { required: true, trigger: "blur", message: "请输入您的密码" },
        { min: 5, max: 20, message: "用户密码长度必须介于 5 和 20 之间", trigger: "blur" }
    ],
    confirmPassword: [
        { required: true, trigger: "blur", message: "请再次输入您的密码" },
        { required: true, validator: equalToPassword, trigger: "blur" }
    ],
    code: [{ required: true, trigger: "change", message: "请输入验证码" }]
  tenantId: [
    { required: true, trigger: "blur", message: "请输入您的租户编号" }
  ],
  username: [
    { required: true, trigger: "blur", message: "请输入您的账号" },
    { min: 2, max: 20, message: "用户账号长度必须介于 2 和 20 之间", trigger: "blur" }
  ],
  password: [
    { required: true, trigger: "blur", message: "请输入您的密码" },
    { min: 5, max: 20, message: "用户密码长度必须介于 5 和 20 之间", trigger: "blur" }
  ],
  confirmPassword: [
    { required: true, trigger: "blur", message: "请再次输入您的密码" },
    { required: true, validator: equalToPassword, trigger: "blur" }
  ],
  code: [{ required: true, trigger: "change", message: "请输入验证码" }]
};
const codeUrl = ref("");
const loading = ref(false);
@@ -110,50 +110,50 @@
const tenantList = ref<TenantVO[]>([]);
const handleRegister = () => {
    registerRef.value.validate(async (valid: boolean) => {
        if (valid) {
            loading.value = true;
            const [err] = await to(register(registerForm.value));
            if (!err) {
                const username = registerForm.value.username;
                await ElMessageBox.alert("<font color='red'>恭喜你,您的账号 " + username + " 注册成功!</font>", "系统提示", {
                    dangerouslyUseHTMLString: true,
                    type: "success",
                });
                await router.push("/login");
            } else {
                loading.value = false;
                if (captchaEnabled) {
                    getCode();
                }
            }
  registerRef.value.validate(async (valid: boolean) => {
    if (valid) {
      loading.value = true;
      const [err] = await to(register(registerForm.value));
      if (!err) {
        const username = registerForm.value.username;
        await ElMessageBox.alert("<font color='red'>恭喜你,您的账号 " + username + " 注册成功!</font>", "系统提示", {
          dangerouslyUseHTMLString: true,
          type: "success",
        });
        await router.push("/login");
      } else {
        loading.value = false;
        if (captchaEnabled) {
          getCode();
        }
    });
      }
    }
  });
}
const getCode = async () => {
    const { data } = await getCodeImg();
    captchaEnabled.value = data.captchaEnabled === undefined ? true : data.captchaEnabled;
    if (captchaEnabled.value) {
        codeUrl.value = "data:image/gif;base64," + data.img;
        registerForm.value.uuid = data.uuid;
    }
  const { data } = await getCodeImg();
  captchaEnabled.value = data.captchaEnabled === undefined ? true : data.captchaEnabled;
  if (captchaEnabled.value) {
    codeUrl.value = "data:image/gif;base64," + data.img;
    registerForm.value.uuid = data.uuid;
  }
}
const initTenantList = async () => {
    const { data } = await getTenantList();
    tenantEnabled.value = data.tenantEnabled === undefined ? true : data.tenantEnabled;
    if (tenantEnabled.value) {
        tenantList.value = data.voList;
        if (tenantList.value != null && tenantList.value.length !== 0) {
            registerForm.value.tenantId = tenantList.value[0].tenantId;
        }
  const { data } = await getTenantList();
  tenantEnabled.value = data.tenantEnabled === undefined ? true : data.tenantEnabled;
  if (tenantEnabled.value) {
    tenantList.value = data.voList;
    if (tenantList.value != null && tenantList.value.length !== 0) {
      registerForm.value.tenantId = tenantList.value[0].tenantId;
    }
  }
}
onMounted(() => {
    getCode();
    initTenantList();
  getCode();
  initTenantList();
})
</script>
src/views/system/dept/index.vue
@@ -135,9 +135,9 @@
import { DeptForm, DeptQuery, DeptVO } from "@/api/system/dept/types";
interface DeptOptionsType {
    deptId: number | string;
    deptName: string;
    children: DeptOptionsType[];
  deptId: number | string;
  deptName: string;
  children: DeptOptionsType[];
}
@@ -152,8 +152,8 @@
const dialog = reactive<DialogOption>({
    visible: false,
    title: ''
  visible: false,
  title: ''
});
const deptTableRef = ref<ElTableInstance>();
@@ -161,137 +161,137 @@
const deptFormRef = ref<ElFormInstance>();
const initFormData: DeptForm = {
    deptId: undefined,
    parentId: undefined,
    deptName: undefined,
    orderNum: 0,
    leader: undefined,
    phone: undefined,
    email: undefined,
    status: "0"
  deptId: undefined,
  parentId: undefined,
  deptName: undefined,
  orderNum: 0,
  leader: undefined,
  phone: undefined,
  email: undefined,
  status: "0"
}
const data = reactive<PageData<DeptForm, DeptQuery>>({
    form: {...initFormData},
    queryParams: {
        pageNum: 1,
        pageSize: 10,
        deptName: undefined,
        status: undefined
    },
    rules: {
        parentId: [{ required: true, message: "上级部门不能为空", trigger: "blur" }],
        deptName: [{ required: true, message: "部门名称不能为空", trigger: "blur" }],
        orderNum: [{ required: true, message: "显示排序不能为空", trigger: "blur" }],
        email: [{ type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"] }],
        phone: [{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur" }]
    },
  form: { ...initFormData },
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    deptName: undefined,
    status: undefined
  },
  rules: {
    parentId: [{ required: true, message: "上级部门不能为空", trigger: "blur" }],
    deptName: [{ required: true, message: "部门名称不能为空", trigger: "blur" }],
    orderNum: [{ required: true, message: "显示排序不能为空", trigger: "blur" }],
    email: [{ type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"] }],
    phone: [{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur" }]
  },
})
const { queryParams, form, rules } = toRefs<PageData<DeptForm, DeptQuery>>(data)
/** 查询菜单列表 */
const getList = async () => {
    loading.value = true;
    const res = await listDept(queryParams.value);
    const data = proxy?.handleTree<DeptVO>(res.data, "deptId")
    if (data) {
        deptList.value = data
    }
    loading.value = false
  loading.value = true;
  const res = await listDept(queryParams.value);
  const data = proxy?.handleTree<DeptVO>(res.data, "deptId")
  if (data) {
    deptList.value = data
  }
  loading.value = false
}
/** 取消按钮 */
const cancel = () => {
    reset()
    dialog.visible = false
  reset()
  dialog.visible = false
}
/** 表单重置 */
const reset = () => {
    form.value = {...initFormData};
    deptFormRef.value?.resetFields();
  form.value = { ...initFormData };
  deptFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
    getList();
  getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
    queryFormRef.value?.resetFields();
    handleQuery()
  queryFormRef.value?.resetFields();
  handleQuery()
}
/** 新增按钮操作 */
const handleAdd = (row?: DeptVO) => {
    listDept().then(res => {
        const data = proxy?.handleTree<DeptOptionsType>(res.data, "deptId");
        if (data) {
            deptOptions.value = data
            dialog.visible = true;
            dialog.title = "添加部门";
            nextTick(() => {
                reset();
                if (row && row.deptId) {
                    form.value.parentId = row?.deptId;
                }
            })
  listDept().then(res => {
    const data = proxy?.handleTree<DeptOptionsType>(res.data, "deptId");
    if (data) {
      deptOptions.value = data
      dialog.visible = true;
      dialog.title = "添加部门";
      nextTick(() => {
        reset();
        if (row && row.deptId) {
          form.value.parentId = row?.deptId;
        }
    })
      })
    }
  })
}
/** 展开/折叠操作 */
const handleToggleExpandAll = () => {
    isExpandAll.value = !isExpandAll.value;
    toggleExpandAll(deptList.value, isExpandAll.value)
  isExpandAll.value = !isExpandAll.value;
  toggleExpandAll(deptList.value, isExpandAll.value)
}
/** 展开/折叠所有 */
const toggleExpandAll = (data: DeptVO[], status: boolean) => {
    data.forEach((item) => {
        deptTableRef.value?.toggleRowExpansion(item, status)
        if(item.children && item.children.length > 0) toggleExpandAll(item.children, status)
    })
  data.forEach((item) => {
    deptTableRef.value?.toggleRowExpansion(item, status)
    if (item.children && item.children.length > 0) toggleExpandAll(item.children, status)
  })
}
/** 修改按钮操作 */
const handleUpdate = async (row: DeptVO) => {
    const res = await getDept(row.deptId);
    dialog.visible = true;
    dialog.title = "修改部门";
    await nextTick(async () => {
      reset();
      form.value = res.data
      const response = await listDeptExcludeChild(row.deptId);
      const data = proxy?.handleTree < DeptOptionsType > (response.data, "deptId")
      if (data) {
        deptOptions.value = data;
        if (data.length === 0) {
          const noResultsOptions: DeptOptionsType = {
            deptId: res.data.parentId,
            deptName: res.data.parentName,
            children: []
          };
          deptOptions.value.push(noResultsOptions);
        }
  const res = await getDept(row.deptId);
  dialog.visible = true;
  dialog.title = "修改部门";
  await nextTick(async () => {
    reset();
    form.value = res.data
    const response = await listDeptExcludeChild(row.deptId);
    const data = proxy?.handleTree<DeptOptionsType>(response.data, "deptId")
    if (data) {
      deptOptions.value = data;
      if (data.length === 0) {
        const noResultsOptions: DeptOptionsType = {
          deptId: res.data.parentId,
          deptName: res.data.parentName,
          children: []
        };
        deptOptions.value.push(noResultsOptions);
      }
    })
    }
  })
}
/** 提交按钮 */
const submitForm = () => {
    deptFormRef.value?.validate(async (valid: boolean) => {
        if (valid) {
            form.value.deptId ? await updateDept(form.value) : await addDept(form.value);
            proxy?.$modal.msgSuccess("操作成功");
            dialog.visible = false;
            await getList();
        }
    })
  deptFormRef.value?.validate(async (valid: boolean) => {
    if (valid) {
      form.value.deptId ? await updateDept(form.value) : await addDept(form.value);
      proxy?.$modal.msgSuccess("操作成功");
      dialog.visible = false;
      await getList();
    }
  })
}
/** 删除按钮操作 */
const handleDelete = async (row: DeptVO) => {
    await proxy?.$modal.confirm('是否确认删除名称为"' + row.deptName + '"的数据项?');
    await delDept(row.deptId);
    await getList();
    proxy?.$modal.msgSuccess("删除成功");
  await proxy?.$modal.confirm('是否确认删除名称为"' + row.deptName + '"的数据项?');
  await delDept(row.deptId);
  await getList();
  proxy?.$modal.msgSuccess("删除成功");
}
onMounted(() => {
    getList();
  getList();
});
</script>
src/views/system/dict/data.vue
@@ -159,154 +159,154 @@
const dialog = reactive<DialogOption>({
    visible: false,
    title: ''
  visible: false,
  title: ''
});
// 数据标签回显样式
const listClassOptions = ref<Array<{ value: string, label: string }>>([
    { value: "default", label: "默认" },
    { value: "primary", label: "主要" },
    { value: "success", label: "成功" },
    { value: "info", label: "信息" },
    { value: "warning", label: "警告" },
    { value: "danger", label: "危险" }
  { value: "default", label: "默认" },
  { value: "primary", label: "主要" },
  { value: "success", label: "成功" },
  { value: "info", label: "信息" },
  { value: "warning", label: "警告" },
  { value: "danger", label: "危险" }
]);
const initFormData: DictDataForm = {
    dictCode: undefined,
    dictLabel: '',
    dictValue: '',
    cssClass: '',
    listClass: "default",
    dictSort: 0,
    status: "0",
    remark: ''
  dictCode: undefined,
  dictLabel: '',
  dictValue: '',
  cssClass: '',
  listClass: "default",
  dictSort: 0,
  status: "0",
  remark: ''
}
const data = reactive<PageData<DictDataForm, DictDataQuery>>({
    form: { ...initFormData },
    queryParams: {
        pageNum: 1,
        pageSize: 10,
        dictName: '',
        dictType: '',
        status: '',
        dictLabel: ''
    },
    rules: {
        dictLabel: [{ required: true, message: "数据标签不能为空", trigger: "blur" }],
        dictValue: [{ required: true, message: "数据键值不能为空", trigger: "blur" }],
        dictSort: [{ required: true, message: "数据顺序不能为空", trigger: "blur" }]
    }
  form: { ...initFormData },
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    dictName: '',
    dictType: '',
    status: '',
    dictLabel: ''
  },
  rules: {
    dictLabel: [{ required: true, message: "数据标签不能为空", trigger: "blur" }],
    dictValue: [{ required: true, message: "数据键值不能为空", trigger: "blur" }],
    dictSort: [{ required: true, message: "数据顺序不能为空", trigger: "blur" }]
  }
});
const { queryParams, form, rules } = toRefs(data);
/** 查询字典类型详细 */
const getTypes = async (dictId: string | number) => {
    const { data } = await getType(dictId);
    queryParams.value.dictType = data.dictType;
    defaultDictType.value = data.dictType;
    getList();
  const { data } = await getType(dictId);
  queryParams.value.dictType = data.dictType;
  defaultDictType.value = data.dictType;
  getList();
}
/** 查询字典类型列表 */
const getTypeList = async () => {
    const res = await getDictOptionselect()
    typeOptions.value = res.data;
  const res = await getDictOptionselect()
  typeOptions.value = res.data;
}
/** 查询字典数据列表 */
const getList = async () => {
    loading.value = true;
    const res = await listData(queryParams.value);
    dataList.value = res.rows;
    total.value = res.total;
    loading.value = false;
  loading.value = true;
  const res = await listData(queryParams.value);
  dataList.value = res.rows;
  total.value = res.total;
  loading.value = false;
}
/** 取消按钮 */
const cancel = () => {
    dialog.visible = false;
    reset();
  dialog.visible = false;
  reset();
}
/** 表单重置 */
const reset = () => {
    form.value = { ...initFormData };
    dataFormRef.value?.resetFields();
  form.value = { ...initFormData };
  dataFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
    queryParams.value.pageNum = 1;
    getList();
  queryParams.value.pageNum = 1;
  getList();
}
/** 返回按钮操作 */
const handleClose = () => {
    const obj = { path: "/system/dict" };
    proxy?.$tab.closeOpenPage(obj);
  const obj = { path: "/system/dict" };
  proxy?.$tab.closeOpenPage(obj);
}
/** 重置按钮操作 */
const resetQuery = () => {
    queryFormRef.value?.resetFields();
    queryParams.value.dictType = defaultDictType.value;
    handleQuery();
  queryFormRef.value?.resetFields();
  queryParams.value.dictType = defaultDictType.value;
  handleQuery();
}
/** 新增按钮操作 */
const handleAdd = () => {
    dialog.visible = true;
    dialog.title = "添加字典数据";
    nextTick(() => {
        reset();
        form.value.dictType = queryParams.value.dictType;
    })
  dialog.visible = true;
  dialog.title = "添加字典数据";
  nextTick(() => {
    reset();
    form.value.dictType = queryParams.value.dictType;
  })
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: DictDataVO[]) => {
    ids.value = selection.map(item => item.dictCode);
    single.value = selection.length != 1;
    multiple.value = !selection.length;
  ids.value = selection.map(item => item.dictCode);
  single.value = selection.length != 1;
  multiple.value = !selection.length;
}
/** 修改按钮操作 */
const handleUpdate = (row?: DictDataVO) => {
    const dictCode = row?.dictCode || ids.value[0];
    dialog.visible = true;
    dialog.title = "修改字典数据";
    nextTick(async () => {
        const res =  await getData(dictCode);
        reset();
        form.value = res.data;
    })
  const dictCode = row?.dictCode || ids.value[0];
  dialog.visible = true;
  dialog.title = "修改字典数据";
  nextTick(async () => {
    const res = await getData(dictCode);
    reset();
    form.value = res.data;
  })
}
/** 提交按钮 */
const submitForm = () => {
    dataFormRef.value?.validate(async (valid: boolean) => {
        if (valid) {
            form.value.dictCode ? await updateData(form.value) : await addData(form.value);
            useDictStore().removeDict(queryParams.value.dictType);
            proxy?.$modal.msgSuccess("操作成功");
            dialog.visible = false;
            await getList();
  dataFormRef.value?.validate(async (valid: boolean) => {
    if (valid) {
      form.value.dictCode ? await updateData(form.value) : await addData(form.value);
      useDictStore().removeDict(queryParams.value.dictType);
      proxy?.$modal.msgSuccess("操作成功");
      dialog.visible = false;
      await getList();
        }
    });
    }
  });
}
/** 删除按钮操作 */
const handleDelete = async (row?: DictDataVO) => {
    const dictCodes = row?.dictCode || ids.value;
    await proxy?.$modal.confirm('是否确认删除字典编码为"' + dictCodes + '"的数据项?');
    await delData(dictCodes);
    await getList();
    proxy?.$modal.msgSuccess("删除成功");
    useDictStore().removeDict(queryParams.value.dictType);
  const dictCodes = row?.dictCode || ids.value;
  await proxy?.$modal.confirm('是否确认删除字典编码为"' + dictCodes + '"的数据项?');
  await delData(dictCodes);
  await getList();
  proxy?.$modal.msgSuccess("删除成功");
  useDictStore().removeDict(queryParams.value.dictType);
}
/** 导出按钮操作 */
const handleExport = () => {
    proxy?.download("system/dict/data/export", {
        ...queryParams.value
    }, `dict_data_${new Date().getTime()}.xlsx`);
  proxy?.download("system/dict/data/export", {
    ...queryParams.value
  }, `dict_data_${new Date().getTime()}.xlsx`);
}
onMounted(() => {
    getTypes(route.params && route.params.dictId as string);
    getTypeList();
  getTypes(route.params && route.params.dictId as string);
  getTypeList();
})
</script>
src/views/system/dict/index.vue
@@ -144,123 +144,123 @@
const dialog = reactive<DialogOption>({
    visible: false,
    title: ''
  visible: false,
  title: ''
});
const initFormData: DictTypeForm = {
    dictId: undefined,
    dictName: '',
    dictType: '',
    status: "0",
    remark: ''
  dictId: undefined,
  dictName: '',
  dictType: '',
  status: "0",
  remark: ''
}
const data = reactive<PageData<DictTypeForm, DictTypeQuery>>({
    form: {...initFormData},
    queryParams: {
        pageNum: 1,
        pageSize: 10,
        dictName: '',
        dictType: '',
        status: ''
    },
    rules: {
        dictName: [{ required: true, message: "字典名称不能为空", trigger: "blur" }],
        dictType: [{ required: true, message: "字典类型不能为空", trigger: "blur" }]
    },
  form: { ...initFormData },
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    dictName: '',
    dictType: '',
    status: ''
  },
  rules: {
    dictName: [{ required: true, message: "字典名称不能为空", trigger: "blur" }],
    dictType: [{ required: true, message: "字典类型不能为空", trigger: "blur" }]
  },
});
const { queryParams, form, rules } = toRefs(data);
/** 查询字典类型列表 */
const getList = () => {
    loading.value = true;
    listType(proxy?.addDateRange(queryParams.value, dateRange.value)).then(res => {
        typeList.value = res.rows;
        total.value = res.total;
        loading.value = false;
    });
  loading.value = true;
  listType(proxy?.addDateRange(queryParams.value, dateRange.value)).then(res => {
    typeList.value = res.rows;
    total.value = res.total;
    loading.value = false;
  });
}
/** 取消按钮 */
const cancel = () => {
    reset();
    dialog.visible = false;
  reset();
  dialog.visible = false;
}
/** 表单重置 */
const reset = () => {
    form.value = {...initFormData};
    dictFormRef.value?.resetFields();
  form.value = { ...initFormData };
  dictFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
    queryParams.value.pageNum = 1;
    getList();
  queryParams.value.pageNum = 1;
  getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
    dateRange.value = ['', ''];
    queryFormRef.value?.resetFields();
    handleQuery();
  dateRange.value = ['', ''];
  queryFormRef.value?.resetFields();
  handleQuery();
}
/** 新增按钮操作 */
const handleAdd = () => {
    dialog.visible = true;
    dialog.title = "添加字典类型";
    nextTick(() => {
        reset();
    })
  dialog.visible = true;
  dialog.title = "添加字典类型";
  nextTick(() => {
    reset();
  })
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: DictTypeVO[]) =>  {
    ids.value = selection.map(item => item.dictId);
    single.value = selection.length != 1;
    multiple.value = !selection.length;
const handleSelectionChange = (selection: DictTypeVO[]) => {
  ids.value = selection.map(item => item.dictId);
  single.value = selection.length != 1;
  multiple.value = !selection.length;
}
/** 修改按钮操作 */
const handleUpdate = (row?: DictTypeVO) => {
    dialog.visible = true;
    dialog.title = "修改字典类型";
    const dictId = row?.dictId || ids.value[0];
    nextTick(async () => {
        reset();
        const res = await getType(dictId);
        form.value = res.data;
    })
  dialog.visible = true;
  dialog.title = "修改字典类型";
  const dictId = row?.dictId || ids.value[0];
  nextTick(async () => {
    reset();
    const res = await getType(dictId);
    form.value = res.data;
  })
}
/** 提交按钮 */
const submitForm = () => {
    dictFormRef.value?.validate(async (valid: boolean) => {
        if (valid) {
            form.value.dictId ? await updateType(form.value) : await addType(form.value);
            proxy?.$modal.msgSuccess("操作成功");
            dialog.visible = false;
            getList();
        }
    });
  dictFormRef.value?.validate(async (valid: boolean) => {
    if (valid) {
      form.value.dictId ? await updateType(form.value) : await addType(form.value);
      proxy?.$modal.msgSuccess("操作成功");
      dialog.visible = false;
      getList();
    }
  });
}
/** 删除按钮操作 */
const handleDelete = async (row?: DictTypeVO) => {
    const dictIds = row?.dictId || ids.value;
    await proxy?.$modal.confirm('是否确认删除字典编号为"' + dictIds + '"的数据项?');
    await delType(dictIds);
    getList();
    proxy?.$modal.msgSuccess("删除成功");
  const dictIds = row?.dictId || ids.value;
  await proxy?.$modal.confirm('是否确认删除字典编号为"' + dictIds + '"的数据项?');
  await delType(dictIds);
  getList();
  proxy?.$modal.msgSuccess("删除成功");
}
/** 导出按钮操作 */
const handleExport = () => {
    proxy?.download("system/dict/type/export", {
        ...queryParams.value
    }, `dict_${new Date().getTime()}.xlsx`);
  proxy?.download("system/dict/type/export", {
    ...queryParams.value
  }, `dict_${new Date().getTime()}.xlsx`);
}
/** 刷新缓存按钮操作 */
const handleRefreshCache = async () => {
    await refreshCache();
    proxy?.$modal.msgSuccess("刷新成功");
    useDictStore().cleanDict();
  await refreshCache();
  proxy?.$modal.msgSuccess("刷新成功");
  useDictStore().cleanDict();
}
onMounted(()=>{
    getList();
onMounted(() => {
  getList();
})
</script>
src/views/system/menu/index.vue
@@ -266,9 +266,9 @@
import { MenuTypeEnum } from '@/enums/MenuTypeEnum';
interface MenuOptionsType {
    menuId: number;
    menuName: string;
    children: MenuOptionsType[] | undefined;
  menuId: number;
  menuName: string;
  children: MenuOptionsType[] | undefined;
}
const { proxy } = getCurrentInstance() as ComponentInternalInstance
@@ -281,36 +281,36 @@
const isExpandAll = ref(false)
const dialog = reactive<DialogOption>({
    visible: false,
    title: ''
  visible: false,
  title: ''
});
const queryFormRef = ref<ElFormInstance>();
const menuFormRef = ref<ElFormInstance>();
const initFormData = {
    path: '',
    menuId: undefined,
    parentId: 0,
    menuName: '',
    icon: '',
    menuType: MenuTypeEnum.M,
    orderNum: 1,
    isFrame: "1",
    isCache: "0",
    visible: "0",
    status: "0"
  path: '',
  menuId: undefined,
  parentId: 0,
  menuName: '',
  icon: '',
  menuType: MenuTypeEnum.M,
  orderNum: 1,
  isFrame: "1",
  isCache: "0",
  visible: "0",
  status: "0"
}
const data = reactive<PageData<MenuForm, MenuQuery>>({
    form: { ...initFormData },
    queryParams: {
        menuName: undefined,
        status: undefined
    },
    rules: {
        menuName: [{ required: true, message: "菜单名称不能为空", trigger: "blur" }],
        orderNum: [{ required: true, message: "菜单顺序不能为空", trigger: "blur" }],
        path: [{ required: true, message: "路由地址不能为空", trigger: "blur" }]
    },
  form: { ...initFormData },
  queryParams: {
    menuName: undefined,
    status: undefined
  },
  rules: {
    menuName: [{ required: true, message: "菜单名称不能为空", trigger: "blur" }],
    orderNum: [{ required: true, message: "菜单顺序不能为空", trigger: "blur" }],
    path: [{ required: true, message: "路由地址不能为空", trigger: "blur" }]
  },
})
const menuTableRef = ref<ElTableInstance>();
@@ -318,99 +318,99 @@
const { queryParams, form, rules } = toRefs<PageData<MenuForm, MenuQuery>>(data)
/** 查询菜单列表 */
const getList = async () => {
    loading.value = true
    const res = await listMenu(queryParams.value);
    const data = proxy?.handleTree<MenuVO>(res.data, "menuId")
    if (data) {
        menuList.value = data
    }
    loading.value = false
  loading.value = true
  const res = await listMenu(queryParams.value);
  const data = proxy?.handleTree<MenuVO>(res.data, "menuId")
  if (data) {
    menuList.value = data
  }
  loading.value = false
}
/** 查询菜单下拉树结构 */
const getTreeselect = async () => {
    menuOptions.value = []
    const response = await listMenu();
    const menu: MenuOptionsType = { menuId: 0, menuName: "主类目", children: [] }
    menu.children = proxy?.handleTree<MenuOptionsType>(response.data, "menuId")
    menuOptions.value.push(menu)
  menuOptions.value = []
  const response = await listMenu();
  const menu: MenuOptionsType = { menuId: 0, menuName: "主类目", children: [] }
  menu.children = proxy?.handleTree<MenuOptionsType>(response.data, "menuId")
  menuOptions.value.push(menu)
}
/** 取消按钮 */
const cancel = () => {
    reset()
    dialog.visible = false
  reset()
  dialog.visible = false
}
/** 表单重置 */
const reset = () => {
    form.value = { ...initFormData };
    menuFormRef.value?.resetFields();
  form.value = { ...initFormData };
  menuFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
    getList();
  getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
    queryFormRef.value?.resetFields();
    handleQuery();
  queryFormRef.value?.resetFields();
  handleQuery();
}
/** 新增按钮操作 */
const handleAdd = (row?: MenuVO) => {
    dialog.visible = true;
    dialog.title = "添加菜单";
    getTreeselect();
    nextTick(() => {
        reset();
        row && row.menuId ? form.value.parentId = row.menuId : form.value.parentId = 0;
    })
  dialog.visible = true;
  dialog.title = "添加菜单";
  getTreeselect();
  nextTick(() => {
    reset();
    row && row.menuId ? form.value.parentId = row.menuId : form.value.parentId = 0;
  })
}
/** 展开/折叠操作 */
const handleToggleExpandAll = () => {
    isExpandAll.value = !isExpandAll.value;
    toggleExpandAll(menuList.value, isExpandAll.value)
  isExpandAll.value = !isExpandAll.value;
  toggleExpandAll(menuList.value, isExpandAll.value)
}
/** 展开/折叠所有 */
const toggleExpandAll = (data: MenuVO[], status: boolean) => {
    data.forEach((item: MenuVO) => {
        menuTableRef.value?.toggleRowExpansion(item, status)
        if (item.children && item.children.length > 0) toggleExpandAll(item.children, status)
    })
  data.forEach((item: MenuVO) => {
    menuTableRef.value?.toggleRowExpansion(item, status)
    if (item.children && item.children.length > 0) toggleExpandAll(item.children, status)
  })
}
/** 修改按钮操作 */
const handleUpdate = async (row: MenuVO) => {
    await getTreeselect();
    dialog.visible = true;
    dialog.title = "修改菜单";
    await nextTick(async () => {
        if (row.menuId) {
            const { data } = await getMenu(row.menuId);
            reset();
            form.value = data;
        }
    })
  await getTreeselect();
  dialog.visible = true;
  dialog.title = "修改菜单";
  await nextTick(async () => {
    if (row.menuId) {
      const { data } = await getMenu(row.menuId);
      reset();
      form.value = data;
    }
  })
}
/** 提交按钮 */
const submitForm = () => {
    menuFormRef.value?.validate(async (valid: boolean) => {
        if (valid) {
            form.value.menuId ? await updateMenu(form.value) : await addMenu(form.value);
            proxy?.$modal.msgSuccess("操作成功");
            dialog.visible = false;
            await getList();
        }
    })
  menuFormRef.value?.validate(async (valid: boolean) => {
    if (valid) {
      form.value.menuId ? await updateMenu(form.value) : await addMenu(form.value);
      proxy?.$modal.msgSuccess("操作成功");
      dialog.visible = false;
      await getList();
    }
  })
}
/** 删除按钮操作 */
const handleDelete = async (row: MenuVO) => {
    await proxy?.$modal.confirm('是否确认删除名称为"' + row.menuName + '"的数据项?');
    await delMenu(row.menuId);
    await getList();
    proxy?.$modal.msgSuccess("删除成功");
  await proxy?.$modal.confirm('是否确认删除名称为"' + row.menuName + '"的数据项?');
  await delMenu(row.menuId);
  await getList();
  proxy?.$modal.msgSuccess("删除成功");
}
onMounted(() => {
    getList();
  getList();
});
</script>
src/views/system/notice/index.vue
@@ -139,111 +139,111 @@
const dialog = reactive<DialogOption>({
    visible: false,
    title: ''
  visible: false,
  title: ''
});
const initFormData: NoticeForm = {
    noticeId: undefined,
    noticeTitle: '',
    noticeType: '',
    noticeContent: '',
    status: "0",
    remark: '',
    createByName: ''
  noticeId: undefined,
  noticeTitle: '',
  noticeType: '',
  noticeContent: '',
  status: "0",
  remark: '',
  createByName: ''
}
const data = reactive<PageData<NoticeForm, NoticeQuery>>({
    form: { ...initFormData },
    queryParams: {
        pageNum: 1,
        pageSize: 10,
        noticeTitle: '',
        createByName: '',
        status: '',
        noticeType: ''
    },
    rules: {
        noticeTitle: [{ required: true, message: "公告标题不能为空", trigger: "blur" }],
        noticeType: [{ required: true, message: "公告类型不能为空", trigger: "change" }]
    },
  form: { ...initFormData },
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    noticeTitle: '',
    createByName: '',
    status: '',
    noticeType: ''
  },
  rules: {
    noticeTitle: [{ required: true, message: "公告标题不能为空", trigger: "blur" }],
    noticeType: [{ required: true, message: "公告类型不能为空", trigger: "change" }]
  },
});
const { queryParams, form, rules } = toRefs(data);
/** 查询公告列表 */
const getList = async () => {
    loading.value = true;
    const res = await listNotice(queryParams.value);
    noticeList.value = res.rows;
    total.value = res.total;
    loading.value = false;
  loading.value = true;
  const res = await listNotice(queryParams.value);
  noticeList.value = res.rows;
  total.value = res.total;
  loading.value = false;
}
/** 取消按钮 */
const cancel = () => {
    reset();
    dialog.visible = false;
  reset();
  dialog.visible = false;
}
/** 表单重置 */
const reset = () => {
    form.value = { ...initFormData };
    noticeFormRef.value?.resetFields();
  form.value = { ...initFormData };
  noticeFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
    queryParams.value.pageNum = 1;
    getList();
  queryParams.value.pageNum = 1;
  getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
    queryFormRef.value?.resetFields();
    handleQuery();
  queryFormRef.value?.resetFields();
  handleQuery();
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: NoticeVO[]) => {
    ids.value = selection.map(item => item.noticeId);
    single.value = selection.length != 1;
    multiple.value = !selection.length;
  ids.value = selection.map(item => item.noticeId);
  single.value = selection.length != 1;
  multiple.value = !selection.length;
}
/** 新增按钮操作 */
const handleAdd = () => {
    dialog.visible = true;
    dialog.title = "添加公告";
    nextTick(() => {
        reset();
    })
  dialog.visible = true;
  dialog.title = "添加公告";
  nextTick(() => {
    reset();
  })
}
/**修改按钮操作 */
const handleUpdate = (row?: NoticeVO) => {
    dialog.visible = true;
    dialog.title = "修改公告";
    nextTick(async () => {
        const noticeId = row?.noticeId || ids.value[0];
        reset();
        const { data } = await getNotice(noticeId);
        form.value = data;
    })
  dialog.visible = true;
  dialog.title = "修改公告";
  nextTick(async () => {
    const noticeId = row?.noticeId || ids.value[0];
    reset();
    const { data } = await getNotice(noticeId);
    form.value = data;
  })
}
/** 提交按钮 */
const submitForm = () => {
    noticeFormRef.value?.validate(async (valid: boolean) => {
        if (valid) {
            form.value.noticeId ? await updateNotice(form.value) : await addNotice(form.value);
            proxy?.$modal.msgSuccess("修改成功");
            dialog.visible = false;
            await getList();
        }
    });
  noticeFormRef.value?.validate(async (valid: boolean) => {
    if (valid) {
      form.value.noticeId ? await updateNotice(form.value) : await addNotice(form.value);
      proxy?.$modal.msgSuccess("修改成功");
      dialog.visible = false;
      await getList();
    }
  });
}
/** 删除按钮操作 */
const handleDelete = async (row?: NoticeVO) => {
    const noticeIds = row?.noticeId || ids.value
    await proxy?.$modal.confirm('是否确认删除公告编号为"' + noticeIds + '"的数据项?');
    await delNotice(noticeIds);
    await getList();
    proxy?.$modal.msgSuccess("删除成功");
  const noticeIds = row?.noticeId || ids.value
  await proxy?.$modal.confirm('是否确认删除公告编号为"' + noticeIds + '"的数据项?');
  await delNotice(noticeIds);
  await getList();
  proxy?.$modal.msgSuccess("删除成功");
}
onMounted(() => {
    getList();
  getList();
})
</script>
src/views/system/oss/config.vue
@@ -133,12 +133,12 @@
<script setup name="OssConfig" lang="ts">
import {
    listOssConfig,
    getOssConfig,
    delOssConfig,
    addOssConfig,
    updateOssConfig,
    changeOssConfigStatus
  listOssConfig,
  getOssConfig,
  delOssConfig,
  addOssConfig,
  updateOssConfig,
  changeOssConfigStatus
} from "@/api/system/ossConfig";
import { OssConfigForm, OssConfigQuery, OssConfigVO } from "@/api/system/ossConfig/types";
@@ -159,189 +159,189 @@
const ossConfigFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
    visible: false,
    title: ''
  visible: false,
  title: ''
});
// 列显隐信息
const columns = ref<FieldOption[]>([
    { key: 0, label: `主建`, visible: true },
    { key: 1, label: `配置key`, visible: false },
    { key: 2, label: `访问站点`, visible: true },
    { key: 3, label: `自定义域名`, visible: true },
    { key: 4, label: `桶名称`, visible: true },
    { key: 5, label: `前缀`, visible: true },
    { key: 6, label: `域`, visible: true },
    { key: 7, label: `桶权限类型`, visible: true },
    { key: 8, label: `状态`, visible: true }
  { key: 0, label: `主建`, visible: true },
  { key: 1, label: `配置key`, visible: false },
  { key: 2, label: `访问站点`, visible: true },
  { key: 3, label: `自定义域名`, visible: true },
  { key: 4, label: `桶名称`, visible: true },
  { key: 5, label: `前缀`, visible: true },
  { key: 6, label: `域`, visible: true },
  { key: 7, label: `桶权限类型`, visible: true },
  { key: 8, label: `状态`, visible: true }
]);
const initFormData: OssConfigForm = {
    ossConfigId: undefined,
    configKey: '',
    accessKey: '',
    secretKey: '',
    bucketName: '',
    prefix: '',
    endpoint: '',
    domain: '',
    isHttps: "N",
    accessPolicy: "1",
    region: '',
    status: "1",
    remark: '',
  ossConfigId: undefined,
  configKey: '',
  accessKey: '',
  secretKey: '',
  bucketName: '',
  prefix: '',
  endpoint: '',
  domain: '',
  isHttps: "N",
  accessPolicy: "1",
  region: '',
  status: "1",
  remark: '',
}
const data = reactive<PageData<OssConfigForm, OssConfigQuery>>({
    form: { ...initFormData },
    // 查询参数
    queryParams: {
        pageNum: 1,
        pageSize: 10,
        configKey: '',
        bucketName: '',
        status: '',
    },
    rules: {
        configKey: [{ required: true, message: "configKey不能为空", trigger: "blur" },],
        accessKey: [
            { required: true, message: "accessKey不能为空", trigger: "blur" },
            {
                min: 2,
                max: 200,
                message: "accessKey长度必须介于 2 和 100 之间",
                trigger: "blur",
            },
        ],
        secretKey: [
            { required: true, message: "secretKey不能为空", trigger: "blur" },
            {
                min: 2,
                max: 100,
                message: "secretKey长度必须介于 2 和 100 之间",
                trigger: "blur",
            },
        ],
        bucketName: [
            { required: true, message: "bucketName不能为空", trigger: "blur" },
            {
                min: 2,
                max: 100,
                message: "bucketName长度必须介于 2 和 100 之间",
                trigger: "blur",
            },
        ],
        endpoint: [
            { required: true, message: "endpoint不能为空", trigger: "blur" },
            {
                min: 2,
                max: 100,
                message: "endpoint名称长度必须介于 2 和 100 之间",
                trigger: "blur",
            },
        ],
        accessPolicy: [{ required: true, message: "accessPolicy不能为空", trigger: "blur" }]
    }
  form: { ...initFormData },
  // 查询参数
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    configKey: '',
    bucketName: '',
    status: '',
  },
  rules: {
    configKey: [{ required: true, message: "configKey不能为空", trigger: "blur" },],
    accessKey: [
      { required: true, message: "accessKey不能为空", trigger: "blur" },
      {
        min: 2,
        max: 200,
        message: "accessKey长度必须介于 2 和 100 之间",
        trigger: "blur",
      },
    ],
    secretKey: [
      { required: true, message: "secretKey不能为空", trigger: "blur" },
      {
        min: 2,
        max: 100,
        message: "secretKey长度必须介于 2 和 100 之间",
        trigger: "blur",
      },
    ],
    bucketName: [
      { required: true, message: "bucketName不能为空", trigger: "blur" },
      {
        min: 2,
        max: 100,
        message: "bucketName长度必须介于 2 和 100 之间",
        trigger: "blur",
      },
    ],
    endpoint: [
      { required: true, message: "endpoint不能为空", trigger: "blur" },
      {
        min: 2,
        max: 100,
        message: "endpoint名称长度必须介于 2 和 100 之间",
        trigger: "blur",
      },
    ],
    accessPolicy: [{ required: true, message: "accessPolicy不能为空", trigger: "blur" }]
  }
});
const { queryParams, form, rules } = toRefs(data);
/** 查询对象存储配置列表 */
const getList = async () => {
    loading.value = true;
    const res = await listOssConfig(queryParams.value);
    ossConfigList.value = res.rows;
    total.value = res.total;
    loading.value = false;
  loading.value = true;
  const res = await listOssConfig(queryParams.value);
  ossConfigList.value = res.rows;
  total.value = res.total;
  loading.value = false;
}
/** 取消按钮 */
const cancel = () => {
    dialog.visible = false;
    reset();
  dialog.visible = false;
  reset();
}
/** 表单重置 */
const reset = () => {
    form.value = { ...initFormData };
    ossConfigFormRef.value?.resetFields();
  form.value = { ...initFormData };
  ossConfigFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
    queryParams.value.pageNum = 1;
    getList();
  queryParams.value.pageNum = 1;
  getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
    queryFormRef.value?.resetFields();
    handleQuery();
  queryFormRef.value?.resetFields();
  handleQuery();
}
/** 选择条数  */
const handleSelectionChange = (selection: OssConfigVO[]) => {
    ids.value = selection.map(item => item.ossConfigId);
    single.value = selection.length != 1;
    multiple.value = !selection.length;
  ids.value = selection.map(item => item.ossConfigId);
  single.value = selection.length != 1;
  multiple.value = !selection.length;
}
/** 新增按钮操作 */
const handleAdd = () => {
    dialog.visible = true;
    dialog.title = "添加对象存储配置";
    nextTick(() => {
        reset();
    })
  dialog.visible = true;
  dialog.title = "添加对象存储配置";
  nextTick(() => {
    reset();
  })
}
/** 修改按钮操作 */
const handleUpdate = (row?: OssConfigVO) => {
    loading.value = true;
    dialog.visible = true;
    dialog.title = "修改对象存储配置";
    const ossConfigId = row?.ossConfigId || ids.value[0];
    nextTick(async () => {
        reset();
        const res = await getOssConfig(ossConfigId);
        loading.value = false;
        form.value = res.data;
    })
  loading.value = true;
  dialog.visible = true;
  dialog.title = "修改对象存储配置";
  const ossConfigId = row?.ossConfigId || ids.value[0];
  nextTick(async () => {
    reset();
    const res = await getOssConfig(ossConfigId);
    loading.value = false;
    form.value = res.data;
  })
}
/** 提交按钮 */
const submitForm = () => {
    ossConfigFormRef.value?.validate(async (valid: boolean) => {
        if (valid) {
            buttonLoading.value = true;
            if (form.value.ossConfigId) {
                await updateOssConfig(form.value).finally(() => buttonLoading.value = false);
            } else {
                await addOssConfig(form.value).finally(() => buttonLoading.value = false);
            }
            proxy?.$modal.msgSuccess("新增成功");
            dialog.visible = false;
            getList();
        }
    });
  ossConfigFormRef.value?.validate(async (valid: boolean) => {
    if (valid) {
      buttonLoading.value = true;
      if (form.value.ossConfigId) {
        await updateOssConfig(form.value).finally(() => buttonLoading.value = false);
      } else {
        await addOssConfig(form.value).finally(() => buttonLoading.value = false);
      }
      proxy?.$modal.msgSuccess("新增成功");
      dialog.visible = false;
      getList();
    }
  });
}
/** 状态修改  */
const  handleStatusChange = async (row: OssConfigVO) => {
    let text = row.status === "0" ? "启用" : "停用";
    try {
        await proxy?.$modal.confirm('确认要"' + text + '""' + row.configKey + '"配置吗?');
        await changeOssConfigStatus(row.ossConfigId, row.status, row.configKey);
        getList()
        proxy?.$modal.msgSuccess(text + "成功");
    } catch { return } finally {
        row.status = row.status === "0" ? "1" : "0";
    }
const handleStatusChange = async (row: OssConfigVO) => {
  let text = row.status === "0" ? "启用" : "停用";
  try {
    await proxy?.$modal.confirm('确认要"' + text + '""' + row.configKey + '"配置吗?');
    await changeOssConfigStatus(row.ossConfigId, row.status, row.configKey);
    getList()
    proxy?.$modal.msgSuccess(text + "成功");
  } catch { return } finally {
    row.status = row.status === "0" ? "1" : "0";
  }
}
/** 删除按钮操作 */
const handleDelete = async (row?: OssConfigVO) => {
    const ossConfigIds = row?.ossConfigId || ids.value;
    await proxy?.$modal.confirm('是否确认删除OSS配置编号为"' + ossConfigIds + '"的数据项?');
    loading.value = true;
    await delOssConfig(ossConfigIds).finally(() => loading.value = false);
    getList();
    proxy?.$modal.msgSuccess("删除成功");
  const ossConfigIds = row?.ossConfigId || ids.value;
  await proxy?.$modal.confirm('是否确认删除OSS配置编号为"' + ossConfigIds + '"的数据项?');
  loading.value = true;
  await delOssConfig(ossConfigIds).finally(() => loading.value = false);
  getList();
  proxy?.$modal.msgSuccess("删除成功");
}
onMounted(() => {
    getList();
  getList();
})
</script>
src/views/system/oss/index.vue
@@ -154,8 +154,8 @@
const daterangeCreateTime = ref<[DateModelType, DateModelType]>(['', '']);
const dialog = reactive<DialogOption>({
    visible: false,
    title: ''
  visible: false,
  title: ''
});
// 默认排序
@@ -165,175 +165,175 @@
const queryFormRef = ref<ElFormInstance>();
const initFormData = {
    file: undefined,
  file: undefined,
}
const data = reactive<PageData<OssForm, OssQuery>>({
    form: { ...initFormData },
    // 查询参数
    queryParams: {
        pageNum: 1,
        pageSize: 10,
        fileName: '',
        originalName: '',
        fileSuffix: '',
        createTime: '',
        service: '',
        orderByColumn: defaultSort.value.prop,
        isAsc: defaultSort.value.order
    },
    rules: {
        file: [
            { required: true, message: "文件不能为空", trigger: "blur" }
        ]
    }
  form: { ...initFormData },
  // 查询参数
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    fileName: '',
    originalName: '',
    fileSuffix: '',
    createTime: '',
    service: '',
    orderByColumn: defaultSort.value.prop,
    isAsc: defaultSort.value.order
  },
  rules: {
    file: [
      { required: true, message: "文件不能为空", trigger: "blur" }
    ]
  }
});
const { queryParams, form, rules } = toRefs(data);
/** 查询OSS对象存储列表 */
const getList = async () => {
    loading.value = true;
    const res = await proxy?.getConfigKey("sys.oss.previewListResource");
    previewListResource.value = res?.msg === undefined ? true : res.msg === 'true';
    const response = await listOss(proxy?.addDateRange(queryParams.value, daterangeCreateTime.value, "CreateTime"));
    ossList.value = response.rows;
    total.value = response.total;
    loading.value = false;
    showTable.value = true;
  loading.value = true;
  const res = await proxy?.getConfigKey("sys.oss.previewListResource");
  previewListResource.value = res?.msg === undefined ? true : res.msg === 'true';
  const response = await listOss(proxy?.addDateRange(queryParams.value, daterangeCreateTime.value, "CreateTime"));
  ossList.value = response.rows;
  total.value = response.total;
  loading.value = false;
  showTable.value = true;
}
function checkFileSuffix(fileSuffix: string[]) {
    let arr = ["png", "jpg", "jpeg"];
    return arr.some(type => {
        return fileSuffix.indexOf(type) > -1;
    });
  let arr = ["png", "jpg", "jpeg"];
  return arr.some(type => {
    return fileSuffix.indexOf(type) > -1;
  });
}
/** 取消按钮 */
function cancel() {
    dialog.visible = false;
    reset();
  dialog.visible = false;
  reset();
}
/** 表单重置 */
function reset() {
    form.value = { ...initFormData };
    ossFormRef.value?.resetFields();
  form.value = { ...initFormData };
  ossFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
function handleQuery() {
    queryParams.value.pageNum = 1;
    getList();
  queryParams.value.pageNum = 1;
  getList();
}
/** 重置按钮操作 */
function resetQuery() {
    showTable.value = false;
    daterangeCreateTime.value = ['', ''];
    queryFormRef.value?.resetFields();
    queryParams.value.orderByColumn = defaultSort.value.prop;
    queryParams.value.isAsc = defaultSort.value.order;
    handleQuery();
  showTable.value = false;
  daterangeCreateTime.value = ['', ''];
  queryFormRef.value?.resetFields();
  queryParams.value.orderByColumn = defaultSort.value.prop;
  queryParams.value.isAsc = defaultSort.value.order;
  handleQuery();
}
/** 选择条数  */
function handleSelectionChange(selection: OssVO[]) {
    ids.value = selection.map(item => item.ossId);
    single.value = selection.length != 1;
    multiple.value = !selection.length;
  ids.value = selection.map(item => item.ossId);
  single.value = selection.length != 1;
  multiple.value = !selection.length;
}
/** 设置列的排序为我们自定义的排序 */
const handleHeaderClass = ({ column }: any): any => {
    column.order = column.multiOrder
  column.order = column.multiOrder
}
/** 点击表头进行排序 */
const handleHeaderCLick = (column: any) => {
    if (column.sortable !== 'custom') {
        return
    }
    switch (column.multiOrder) {
        case 'descending':
            column.multiOrder = 'ascending';
            break;
        case 'ascending':
            column.multiOrder = '';
            break;
        default:
            column.multiOrder = 'descending';
            break;
    }
    handleOrderChange(column.property, column.multiOrder)
  if (column.sortable !== 'custom') {
    return
  }
  switch (column.multiOrder) {
    case 'descending':
      column.multiOrder = 'ascending';
      break;
    case 'ascending':
      column.multiOrder = '';
      break;
    default:
      column.multiOrder = 'descending';
      break;
  }
  handleOrderChange(column.property, column.multiOrder)
}
const handleOrderChange = (prop: string, order: string) => {
    let orderByArr = queryParams.value.orderByColumn ? queryParams.value.orderByColumn.split(",") : [];
    let isAscArr = queryParams.value.isAsc ? queryParams.value.isAsc.split(",") : [];
    let propIndex = orderByArr.indexOf(prop)
    if (propIndex !== -1) {
        if (order) {
            //排序里已存在 只修改排序
            isAscArr[propIndex] = order;
        } else {
            //如果order为null 则删除排序字段和属性
            isAscArr.splice(propIndex, 1);//删除排序
            orderByArr.splice(propIndex, 1);//删除属性
        }
  let orderByArr = queryParams.value.orderByColumn ? queryParams.value.orderByColumn.split(",") : [];
  let isAscArr = queryParams.value.isAsc ? queryParams.value.isAsc.split(",") : [];
  let propIndex = orderByArr.indexOf(prop)
  if (propIndex !== -1) {
    if (order) {
      //排序里已存在 只修改排序
      isAscArr[propIndex] = order;
    } else {
        //排序里不存在则新增排序
        orderByArr.push(prop);
        isAscArr.push(order);
      //如果order为null 则删除排序字段和属性
      isAscArr.splice(propIndex, 1);//删除排序
      orderByArr.splice(propIndex, 1);//删除属性
    }
    //合并排序
    queryParams.value.orderByColumn = orderByArr.join(",");
    queryParams.value.isAsc = isAscArr.join(",");
    getList();
  } else {
    //排序里不存在则新增排序
    orderByArr.push(prop);
    isAscArr.push(order);
  }
  //合并排序
  queryParams.value.orderByColumn = orderByArr.join(",");
  queryParams.value.isAsc = isAscArr.join(",");
  getList();
}
/** 任务日志列表查询 */
const handleOssConfig = () => {
    router.push('/system/oss-config/index')
  router.push('/system/oss-config/index')
}
/** 文件按钮操作 */
const handleFile = () => {
    dialog.visible = true;
    dialog.title = "上传文件";
    nextTick(() => {
        reset();
        type.value = 0;
    })
  dialog.visible = true;
  dialog.title = "上传文件";
  nextTick(() => {
    reset();
    type.value = 0;
  })
}
/** 图片按钮操作 */
const handleImage = () => {
    dialog.visible = true;
    dialog.title = "上传图片";
    nextTick(() => {
        reset();
        type.value = 1;
    })
  dialog.visible = true;
  dialog.title = "上传图片";
  nextTick(() => {
    reset();
    type.value = 1;
  })
}
/** 提交按钮 */
const submitForm = () => {
    dialog.visible = false;
    getList();
  dialog.visible = false;
  getList();
}
/** 下载按钮操作 */
const handleDownload = (row: OssVO) => {
    proxy?.$download.oss(row.ossId)
  proxy?.$download.oss(row.ossId)
}
/** 用户状态修改  */
const handlePreviewListResource = async (preview: boolean) => {
    let text = preview ? "启用" : "停用";
    try {
      await proxy?.$modal.confirm('确认要"' + text + '""预览列表图片"配置吗?');
      await proxy?.updateConfigByKey("sys.oss.previewListResource", preview);
      getList()
      proxy?.$modal.msgSuccess(text + "成功");
    } catch { return }
  let text = preview ? "启用" : "停用";
  try {
    await proxy?.$modal.confirm('确认要"' + text + '""预览列表图片"配置吗?');
    await proxy?.updateConfigByKey("sys.oss.previewListResource", preview);
    getList()
    proxy?.$modal.msgSuccess(text + "成功");
  } catch { return }
}
/** 删除按钮操作 */
const handleDelete = async (row?: OssVO) => {
    const ossIds = row?.ossId || ids.value;
    await proxy?.$modal.confirm('是否确认删除OSS对象存储编号为"' + ossIds + '"的数据项?');
    loading.value = true;
    await delOss(ossIds).finally(() => loading.value = false);
    getList();
    proxy?.$modal.msgSuccess("删除成功");
  const ossIds = row?.ossId || ids.value;
  await proxy?.$modal.confirm('是否确认删除OSS对象存储编号为"' + ossIds + '"的数据项?');
  loading.value = true;
  await delOss(ossIds).finally(() => loading.value = false);
  getList();
  proxy?.$modal.msgSuccess("删除成功");
}
onMounted(() => {
    getList();
  getList();
})
</script>
src/views/system/post/index.vue
@@ -125,117 +125,117 @@
const queryFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
    visible: false,
    title: ''
  visible: false,
  title: ''
});
const initFormData: PostForm = {
    postId: undefined,
    postCode: '',
    postName: '',
    postSort: 0,
    status: "0",
    remark: ''
  postId: undefined,
  postCode: '',
  postName: '',
  postSort: 0,
  status: "0",
  remark: ''
}
const data = reactive<PageData<PostForm, PostQuery>>({
    form: {...initFormData},
    queryParams: {
        pageNum: 1,
        pageSize: 10,
        postCode: '',
        postName: '',
        status: ''
    },
    rules: {
        postName: [{ required: true, message: "岗位名称不能为空", trigger: "blur" }],
        postCode: [{ required: true, message: "岗位编码不能为空", trigger: "blur" }],
        postSort: [{ required: true, message: "岗位顺序不能为空", trigger: "blur" }],
    }
  form: { ...initFormData },
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    postCode: '',
    postName: '',
    status: ''
  },
  rules: {
    postName: [{ required: true, message: "岗位名称不能为空", trigger: "blur" }],
    postCode: [{ required: true, message: "岗位编码不能为空", trigger: "blur" }],
    postSort: [{ required: true, message: "岗位顺序不能为空", trigger: "blur" }],
  }
});
const { queryParams, form, rules } = toRefs<PageData<PostForm, PostQuery>>(data);
/** 查询岗位列表 */
const getList = async () => {
    loading.value = true;
    const res = await listPost(queryParams.value);
    postList.value = res.rows;
    total.value = res.total;
    loading.value = false;
  loading.value = true;
  const res = await listPost(queryParams.value);
  postList.value = res.rows;
  total.value = res.total;
  loading.value = false;
}
/** 取消按钮 */
const cancel = () => {
    reset();
    dialog.visible = false;
  reset();
  dialog.visible = false;
}
/** 表单重置 */
const reset = () => {
    form.value = {...initFormData};
    postFormRef.value?.resetFields();
  form.value = { ...initFormData };
  postFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
    queryParams.value.pageNum = 1;
    getList();
  queryParams.value.pageNum = 1;
  getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
    queryFormRef.value?.resetFields();
    handleQuery();
  queryFormRef.value?.resetFields();
  handleQuery();
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: PostVO[]) => {
    ids.value = selection.map(item => item.postId);
    single.value = selection.length != 1;
    multiple.value = !selection.length;
  ids.value = selection.map(item => item.postId);
  single.value = selection.length != 1;
  multiple.value = !selection.length;
}
/** 新增按钮操作 */
const handleAdd = () => {
    dialog.visible = true;
    dialog.title = "添加岗位";
    nextTick(() => {
        reset();
    })
  dialog.visible = true;
  dialog.title = "添加岗位";
  nextTick(() => {
    reset();
  })
}
/** 修改按钮操作 */
const handleUpdate = (row?: PostVO) => {
    dialog.visible = true;
    dialog.title = "修改岗位";
    nextTick(async () => {
        reset();
        const postId = row?.postId || ids.value[0];
        const res = await getPost(postId);
        form.value = res.data;
    })
  dialog.visible = true;
  dialog.title = "修改岗位";
  nextTick(async () => {
    reset();
    const postId = row?.postId || ids.value[0];
    const res = await getPost(postId);
    form.value = res.data;
  })
}
/** 提交按钮 */
const submitForm = () => {
    postFormRef.value?.validate(async (valid: boolean) => {
        if (valid) {
            form.value.postId ? await updatePost(form.value) : await addPost(form.value);
            proxy?.$modal.msgSuccess("操作成功");
            dialog.visible = false;
            await getList();
        }
    });
  postFormRef.value?.validate(async (valid: boolean) => {
    if (valid) {
      form.value.postId ? await updatePost(form.value) : await addPost(form.value);
      proxy?.$modal.msgSuccess("操作成功");
      dialog.visible = false;
      await getList();
    }
  });
}
/** 删除按钮操作 */
const handleDelete = async (row?: PostVO) => {
    const postIds = row?.postId || ids.value;
    await proxy?.$modal.confirm('是否确认删除岗位编号为"' + postIds + '"的数据项?');
    await delPost(postIds);
    await getList();
    proxy?.$modal.msgSuccess("删除成功");
  const postIds = row?.postId || ids.value;
  await proxy?.$modal.confirm('是否确认删除岗位编号为"' + postIds + '"的数据项?');
  await delPost(postIds);
  await getList();
  proxy?.$modal.msgSuccess("删除成功");
}
/** 导出按钮操作 */
const handleExport = () => {
    proxy?.download("system/post/export", {
        ...queryParams.value
    }, `post_${new Date().getTime()}.xlsx`);
  proxy?.download("system/post/export", {
    ...queryParams.value
  }, `post_${new Date().getTime()}.xlsx`);
}
onMounted(() => {
    getList();
  getList();
});
</script>
src/views/system/role/authUser.vue
@@ -86,64 +86,64 @@
const selectRef = ref<InstanceType<typeof SelectUser>>();
const queryParams = reactive<UserQuery>({
    pageNum: 1,
    pageSize: 10,
    roleId: route.params.roleId as string,
    userName: undefined,
    phonenumber: undefined,
  pageNum: 1,
  pageSize: 10,
  roleId: route.params.roleId as string,
  userName: undefined,
  phonenumber: undefined,
});
/** 查询授权用户列表 */
const getList = async () => {
    loading.value = true;
    const res = await allocatedUserList(queryParams);
    userList.value = res.rows;
    total.value = res.total;
    loading.value = false;
  loading.value = true;
  const res = await allocatedUserList(queryParams);
  userList.value = res.rows;
  total.value = res.total;
  loading.value = false;
}
// 返回按钮
const handleClose = () => {
    const obj = { path: "/system/role" };
    proxy?.$tab.closeOpenPage(obj);
  const obj = { path: "/system/role" };
  proxy?.$tab.closeOpenPage(obj);
}
/** 搜索按钮操作 */
const handleQuery=() => {
    queryParams.pageNum = 1;
    getList();
const handleQuery = () => {
  queryParams.pageNum = 1;
  getList();
}
/** 重置按钮操作 */
const resetQuery=() =>{
    queryFormRef.value?.resetFields();
    handleQuery();
const resetQuery = () => {
  queryFormRef.value?.resetFields();
  handleQuery();
}
// 多选框选中数据
const handleSelectionChange = (selection: UserVO[]) =>{
    userIds.value = selection.map(item => item.userId);
    multiple.value = !selection.length;
const handleSelectionChange = (selection: UserVO[]) => {
  userIds.value = selection.map(item => item.userId);
  multiple.value = !selection.length;
}
/** 打开授权用户表弹窗 */
const openSelectUser = () => {
    selectRef.value.show();
  selectRef.value?.show();
}
/** 取消授权按钮操作 */
const cancelAuthUser = async (row: UserVO) => {
    await proxy?.$modal.confirm('确认要取消该用户"' + row.userName + '"角色吗?');
    await authUserCancel({ userId: row.userId, roleId: queryParams.roleId });
    await getList();
    proxy?.$modal.msgSuccess("取消授权成功");
  await proxy?.$modal.confirm('确认要取消该用户"' + row.userName + '"角色吗?');
  await authUserCancel({ userId: row.userId, roleId: queryParams.roleId });
  await getList();
  proxy?.$modal.msgSuccess("取消授权成功");
}
/** 批量取消授权按钮操作 */
const cancelAuthUserAll = async () => {
    const roleId = queryParams.roleId;
    const uIds = userIds.value.join(",");
    await proxy?.$modal.confirm("是否取消选中用户授权数据项?");
    await authUserCancelAll({ roleId: roleId, userIds: uIds });
    await getList();
    proxy?.$modal.msgSuccess("取消授权成功");
  const roleId = queryParams.roleId;
  const uIds = userIds.value.join(",");
  await proxy?.$modal.confirm("是否取消选中用户授权数据项?");
  await authUserCancelAll({ roleId: roleId, userIds: uIds });
  await getList();
  proxy?.$modal.msgSuccess("取消授权成功");
}
onMounted(() => {
    getList();
  getList();
});
</script>
src/views/system/role/index.vue
@@ -121,7 +121,7 @@
        <el-form-item label="状态">
          <el-radio-group v-model="form.status">
            <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{
                dict.label
              dict.label
            }}</el-radio>
          </el-radio-group>
        </el-form-item>
@@ -221,11 +221,11 @@
/** 数据范围选项*/
const dataScopeOptions = ref([
    { value: "1", label: "全部数据权限" },
    { value: "2", label: "自定数据权限" },
    { value: "3", label: "本部门数据权限" },
    { value: "4", label: "本部门及以下数据权限" },
    { value: "5", label: "仅本人数据权限" }
  { value: "1", label: "全部数据权限" },
  { value: "2", label: "自定数据权限" },
  { value: "3", label: "本部门数据权限" },
  { value: "4", label: "本部门及以下数据权限" },
  { value: "5", label: "仅本人数据权限" }
])
const queryFormRef = ref<ElFormInstance>();
@@ -235,40 +235,40 @@
const deptRef = ref<ElTreeInstance>();
const initForm: RoleForm = {
    roleId: undefined,
    roleSort: 1,
    status: '0',
    roleName: '',
    roleKey: '',
    menuCheckStrictly: true,
    deptCheckStrictly: true,
    remark: '',
    dataScope: '1',
    menuIds: [],
    deptIds: [],
  roleId: undefined,
  roleSort: 1,
  status: '0',
  roleName: '',
  roleKey: '',
  menuCheckStrictly: true,
  deptCheckStrictly: true,
  remark: '',
  dataScope: '1',
  menuIds: [],
  deptIds: [],
}
const data = reactive<PageData<RoleForm, RoleQuery>>({
    form: {...initForm},
    queryParams: {
        pageNum: 1,
        pageSize: 10,
        roleName: '',
        roleKey: '',
        status: '',
    },
    rules: {
        roleName: [{ required: true, message: "角色名称不能为空", trigger: "blur" }],
        roleKey: [{ required: true, message: "权限字符不能为空", trigger: "blur" }],
        roleSort: [{ required: true, message: "角色顺序不能为空", trigger: "blur" }]
    }
  form: { ...initForm },
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    roleName: '',
    roleKey: '',
    status: '',
  },
  rules: {
    roleName: [{ required: true, message: "角色名称不能为空", trigger: "blur" }],
    roleKey: [{ required: true, message: "权限字符不能为空", trigger: "blur" }],
    roleSort: [{ required: true, message: "角色顺序不能为空", trigger: "blur" }]
  }
})
const { form, queryParams, rules } = toRefs(data)
const dialog = reactive<DialogOption>({
    visible: false,
    title: ''
  visible: false,
  title: ''
});
@@ -276,241 +276,241 @@
 * 查询角色列表
 */
const getList = () => {
    loading.value = true
    listRole(proxy?.addDateRange(queryParams.value, dateRange.value)).then(res => {
        roleList.value = res.rows
        total.value = res.total
        loading.value = false
    })
  loading.value = true
  listRole(proxy?.addDateRange(queryParams.value, dateRange.value)).then(res => {
    roleList.value = res.rows
    total.value = res.total
    loading.value = false
  })
}
/**
 * 搜索按钮操作
 */
const handleQuery = () => {
    queryParams.value.pageNum = 1;
    getList();
  queryParams.value.pageNum = 1;
  getList();
}
/** 重置 */
const resetQuery = () => {
    dateRange.value = ['', '']
    queryFormRef.value?.resetFields();
    handleQuery();
  dateRange.value = ['', '']
  queryFormRef.value?.resetFields();
  handleQuery();
}
/**删除按钮操作 */
const handleDelete = async (row?: RoleVO) => {
    const roleids = row?.roleId || ids.value;
    await proxy?.$modal.confirm('是否确认删除角色编号为' + roleids + '数据项目');
    await delRole(roleids);
    getList();
    proxy?.$modal.msgSuccess('删除成功');
  const roleids = row?.roleId || ids.value;
  await proxy?.$modal.confirm('是否确认删除角色编号为' + roleids + '数据项目');
  await delRole(roleids);
  getList();
  proxy?.$modal.msgSuccess('删除成功');
}
/** 导出按钮操作 */
const handleExport = () => {
    proxy?.download("system/role/export", {
        ...queryParams.value,
    }, `role_${new Date().getTime()}.xlsx`)
  proxy?.download("system/role/export", {
    ...queryParams.value,
  }, `role_${new Date().getTime()}.xlsx`)
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: RoleVO[]) => {
    ids.value = selection.map((item: RoleVO) => item.roleId);
    single.value = selection.length != 1;
    multiple.value = !selection.length;
  ids.value = selection.map((item: RoleVO) => item.roleId);
  single.value = selection.length != 1;
  multiple.value = !selection.length;
}
/** 角色状态修改 */
const handleStatusChange = async (row: RoleVO) => {
    let text = row.status === "0" ? "启用" : "停用";
    try {
        await proxy?.$modal.confirm('确认要"' + text + '""' + row.roleName + '"角色吗?');
        await changeRoleStatus(row.roleId, row.status);
        proxy?.$modal.msgSuccess(text + "成功");
    } catch {
        row.status = row.status === "0" ? "1" : "0";
    }
  let text = row.status === "0" ? "启用" : "停用";
  try {
    await proxy?.$modal.confirm('确认要"' + text + '""' + row.roleName + '"角色吗?');
    await changeRoleStatus(row.roleId, row.status);
    proxy?.$modal.msgSuccess(text + "成功");
  } catch {
    row.status = row.status === "0" ? "1" : "0";
  }
}
/** 分配用户 */
const handleAuthUser = (row: RoleVO) => {
    router.push("/system/role-auth/user/" + row.roleId);
  router.push("/system/role-auth/user/" + row.roleId);
}
/** 查询菜单树结构 */
const getMenuTreeselect = async () => {
    const res = await menuTreeselect();
    menuOptions.value = res.data;
  const res = await menuTreeselect();
  menuOptions.value = res.data;
}
/** 所有部门节点数据 */
const getDeptAllCheckedKeys = (): any => {
    // 目前被选中的部门节点
    let checkedKeys = deptRef.value?.getCheckedKeys();
    // 半选中的部门节点
    let halfCheckedKeys = deptRef.value?.getHalfCheckedKeys();
    if(halfCheckedKeys) {
      checkedKeys?.unshift.apply(checkedKeys, halfCheckedKeys);
    }
    return checkedKeys
  // 目前被选中的部门节点
  let checkedKeys = deptRef.value?.getCheckedKeys();
  // 半选中的部门节点
  let halfCheckedKeys = deptRef.value?.getHalfCheckedKeys();
  if (halfCheckedKeys) {
    checkedKeys?.unshift.apply(checkedKeys, halfCheckedKeys);
  }
  return checkedKeys
}
/** 重置新增的表单以及其他数据  */
const reset = () => {
    menuRef.value?.setCheckedKeys([]);
    menuExpand.value = false
    menuNodeAll.value = false
    deptExpand.value = true
    deptNodeAll.value = false
    form.value = { ...initForm };
    roleFormRef.value?.resetFields();
  menuRef.value?.setCheckedKeys([]);
  menuExpand.value = false
  menuNodeAll.value = false
  deptExpand.value = true
  deptNodeAll.value = false
  form.value = { ...initForm };
  roleFormRef.value?.resetFields();
}
/** 添加角色 */
const handleAdd = () => {
    dialog.visible = true;
    dialog.title = "添加角色";
    nextTick(() => {
        reset();
        getMenuTreeselect();
    })
  dialog.visible = true;
  dialog.title = "添加角色";
  nextTick(() => {
    reset();
    getMenuTreeselect();
  })
}
/** 修改角色 */
const handleUpdate = async (row?: RoleVO) => {
    const roleId = row?.roleId || ids.value[0]
    const roleMenu = getRoleMenuTreeselect(roleId)
    const { data } = await getRole(roleId);
    dialog.visible = true;
    dialog.title = "修改角色";
    await nextTick(() => {
      reset();
      Object.assign(form.value, data);
      form.value.roleSort = Number(form.value.roleSort);
      nextTick(async () => {
        const res = await roleMenu;
        let checkedKeys = res.checkedKeys;
        checkedKeys.forEach((v) => {
          nextTick(() => {
            menuRef.value?.setChecked(v, true, false);
          })
  const roleId = row?.roleId || ids.value[0]
  const roleMenu = getRoleMenuTreeselect(roleId)
  const { data } = await getRole(roleId);
  dialog.visible = true;
  dialog.title = "修改角色";
  await nextTick(() => {
    reset();
    Object.assign(form.value, data);
    form.value.roleSort = Number(form.value.roleSort);
    nextTick(async () => {
      const res = await roleMenu;
      let checkedKeys = res.checkedKeys;
      checkedKeys.forEach((v) => {
        nextTick(() => {
          menuRef.value?.setChecked(v, true, false);
        })
      })
    })
  })
}
/** 根据角色ID查询菜单树结构 */
const getRoleMenuTreeselect = (roleId: string | number) => {
    return roleMenuTreeselect(roleId).then((res): RoleMenuTree => {
        menuOptions.value = res.data.menus;
        return res.data;
    })
  return roleMenuTreeselect(roleId).then((res): RoleMenuTree => {
    menuOptions.value = res.data.menus;
    return res.data;
  })
}
/** 根据角色ID查询部门树结构 */
const getRoleDeptTreeSelect = async (roleId: string | number) => {
    const res = await deptTreeSelect(roleId);
    deptOptions.value = res.data.depts;
    return res.data;
  const res = await deptTreeSelect(roleId);
  deptOptions.value = res.data.depts;
  return res.data;
}
/** 树权限(展开/折叠)*/
const handleCheckedTreeExpand = (value: boolean, type: string) => {
    if (type == "menu") {
        let treeList = menuOptions.value;
        for (let i = 0; i < treeList.length; i++) {
          if (menuRef.value) {
            menuRef.value.store.nodesMap[treeList[i].id].expanded = value;
          }
        }
    } else if (type == "dept") {
        let treeList = deptOptions.value;
        for (let i = 0; i < treeList.length; i++) {
            if (deptRef.value) {
              deptRef.value.store.nodesMap[treeList[i].id].expanded = value;
            }
        }
  if (type == "menu") {
    let treeList = menuOptions.value;
    for (let i = 0; i < treeList.length; i++) {
      if (menuRef.value) {
        menuRef.value.store.nodesMap[treeList[i].id].expanded = value;
      }
    }
  } else if (type == "dept") {
    let treeList = deptOptions.value;
    for (let i = 0; i < treeList.length; i++) {
      if (deptRef.value) {
        deptRef.value.store.nodesMap[treeList[i].id].expanded = value;
      }
    }
  }
}
/** 树权限(全选/全不选) */
const handleCheckedTreeNodeAll = (value: any, type: string) => {
    if (type == "menu") {
        menuRef.value?.setCheckedNodes(value ? menuOptions.value as any : []);
    } else if (type == "dept") {
        deptRef.value?.setCheckedNodes(value ? deptOptions.value as any : []);
    }
  if (type == "menu") {
    menuRef.value?.setCheckedNodes(value ? menuOptions.value as any : []);
  } else if (type == "dept") {
    deptRef.value?.setCheckedNodes(value ? deptOptions.value as any : []);
  }
}
/** 树权限(父子联动) */
const handleCheckedTreeConnect = (value: any, type: string) => {
    if (type == "menu") {
        form.value.menuCheckStrictly = value;
    } else if (type == "dept") {
        form.value.deptCheckStrictly = value;
    }
  if (type == "menu") {
    form.value.menuCheckStrictly = value;
  } else if (type == "dept") {
    form.value.deptCheckStrictly = value;
  }
}
/** 所有菜单节点数据 */
const getMenuAllCheckedKeys = (): any => {
    // 目前被选中的菜单节点
    let checkedKeys = menuRef.value?.getCheckedKeys();
    // 半选中的菜单节点
    let halfCheckedKeys = menuRef.value?.getHalfCheckedKeys();
    if (halfCheckedKeys) {
      checkedKeys?.unshift.apply(checkedKeys, halfCheckedKeys);
    }
    return checkedKeys;
  // 目前被选中的菜单节点
  let checkedKeys = menuRef.value?.getCheckedKeys();
  // 半选中的菜单节点
  let halfCheckedKeys = menuRef.value?.getHalfCheckedKeys();
  if (halfCheckedKeys) {
    checkedKeys?.unshift.apply(checkedKeys, halfCheckedKeys);
  }
  return checkedKeys;
}
/** 提交按钮 */
const submitForm = () => {
    roleFormRef.value?.validate(async (valid: boolean) => {
        if (valid) {
            form.value.menuIds = getMenuAllCheckedKeys()
            form.value.roleId ? await updateRole(form.value) : await addRole(form.value);
            proxy?.$modal.msgSuccess("操作成功")
            dialog.visible = false
            getList()
        }
    })
  roleFormRef.value?.validate(async (valid: boolean) => {
    if (valid) {
      form.value.menuIds = getMenuAllCheckedKeys()
      form.value.roleId ? await updateRole(form.value) : await addRole(form.value);
      proxy?.$modal.msgSuccess("操作成功")
      dialog.visible = false
      getList()
    }
  })
}
/** 取消按钮 */
const cancel = () => {
    reset()
    dialog.visible = false;
  reset()
  dialog.visible = false;
}
/** 选择角色权限范围触发 */
const dataScopeSelectChange = (value: string) => {
    if (value !== "2") {
        deptRef.value?.setCheckedKeys([])
    }
  if (value !== "2") {
    deptRef.value?.setCheckedKeys([])
  }
}
/** 分配数据权限操作 */
const handleDataScope = async (row: RoleVO) => {
    const roleDeptTreeselect = getRoleDeptTreeSelect(row.roleId);
    const response = await getRole(row.roleId);
    Object.assign(form.value, response.data);
    openDataScope.value = true;
    dialog.title = "分配数据权限";
    await nextTick(async () => {
      const res = await roleDeptTreeselect;
      await nextTick(() => {
        if (deptRef.value) {
          deptRef.value.setCheckedKeys(res.checkedKeys);
        }
      })
  const roleDeptTreeselect = getRoleDeptTreeSelect(row.roleId);
  const response = await getRole(row.roleId);
  Object.assign(form.value, response.data);
  openDataScope.value = true;
  dialog.title = "分配数据权限";
  await nextTick(async () => {
    const res = await roleDeptTreeselect;
    await nextTick(() => {
      if (deptRef.value) {
        deptRef.value.setCheckedKeys(res.checkedKeys);
      }
    })
  })
}
/** 提交按钮(数据权限) */
const submitDataScope = async () => {
    if (form.value.roleId) {
        form.value.deptIds = getDeptAllCheckedKeys();
        await dataScope(form.value);
        proxy?.$modal.msgSuccess("修改成功");
        openDataScope.value = false;
        getList();
    }
  if (form.value.roleId) {
    form.value.deptIds = getDeptAllCheckedKeys();
    await dataScope(form.value);
    proxy?.$modal.msgSuccess("修改成功");
    openDataScope.value = false;
    getList();
  }
}
/** 取消按钮(数据权限)*/
const cancelDataScope = () => {
    dataScopeRef.value?.resetFields();
    form.value = {...initForm};
    openDataScope.value = false;
  dataScopeRef.value?.resetFields();
  form.value = { ...initForm };
  openDataScope.value = false;
}
onMounted(() => {
    getList();
  getList();
});
</script>
src/views/system/role/selectUser.vue
@@ -50,9 +50,9 @@
const props = defineProps({
    roleId: {
        type: [Number, String]
    }
  roleId: {
    type: [Number, String]
  }
})
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
@@ -64,68 +64,68 @@
const userIds = ref<Array<string | number>>([]);
const queryParams = reactive<UserQuery>({
    pageNum: 1,
    pageSize: 10,
    roleId: undefined,
    userName: undefined,
    phonenumber: undefined
  pageNum: 1,
  pageSize: 10,
  roleId: undefined,
  userName: undefined,
  phonenumber: undefined
})
const tableRef = ref<ElTableInstance>();
const queryFormRef = ref<ElFormInstance>();
const show = () => {
    queryParams.roleId = props.roleId;
    getList();
    visible.value = true;
  queryParams.roleId = props.roleId;
  getList();
  visible.value = true;
}
/**
 * 选择行
 */
const clickRow = (row: any) => {
    // ele的bug
    tableRef.value?.toggleRowSelection(row);
  // ele的bug
  tableRef.value?.toggleRowSelection(row);
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: UserVO[]) => {
    userIds.value = selection.map((item: UserVO) => item.userId);
  userIds.value = selection.map((item: UserVO) => item.userId);
}
/** 查询数据 */
const getList = async () => {
    const res = await unallocatedUserList(queryParams);
    userList.value = res.rows;
    total.value = res.total;
  const res = await unallocatedUserList(queryParams);
  userList.value = res.rows;
  total.value = res.total;
}
/** 搜索按钮操作 */
const handleQuery = () => {
    queryParams.pageNum = 1;
    getList();
  queryParams.pageNum = 1;
  getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
    queryFormRef.value?.resetFields();
    getList();
  queryFormRef.value?.resetFields();
  getList();
}
const emit = defineEmits(["ok"]);
/**选择授权用户操作 */
const handleSelectUser = async () => {
    const roleId = queryParams.roleId;
    const ids = userIds.value.join(',');
    if (ids == "") {
        proxy?.$modal.msgError('请选择要分配的用户');
        return;
    }
    await authUserSelectAll({ roleId, userIds: ids });
    proxy?.$modal.msgSuccess('分配成功');
    emit('ok');
    visible.value = false;
  const roleId = queryParams.roleId;
  const ids = userIds.value.join(',');
  if (ids == "") {
    proxy?.$modal.msgError('请选择要分配的用户');
    return;
  }
  await authUserSelectAll({ roleId, userIds: ids });
  proxy?.$modal.msgSuccess('分配成功');
  emit('ok');
  visible.value = false;
}
// 暴露
defineExpose({
    show,
  show,
});
</script>
src/views/system/tenant/index.vue
@@ -82,7 +82,7 @@
        </el-table-column>
      </el-table>
      <pagination v-show="total>0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
    </el-card>
    <!-- 添加或修改租户对话框 -->
    <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
@@ -162,192 +162,192 @@
const tenantFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({
    visible: false,
    title: ''
  visible: false,
  title: ''
});
const initFormData: TenantForm = {
    id: undefined,
    tenantId: undefined,
    contactUserName: '',
    contactPhone: '',
    username: '',
    password: '',
    companyName: '',
    licenseNumber: '',
    domain: '',
    address: '',
    intro: '',
    remark: '',
    packageId: '',
    expireTime: '',
    accountCount: 0,
    status: '0',
  id: undefined,
  tenantId: undefined,
  contactUserName: '',
  contactPhone: '',
  username: '',
  password: '',
  companyName: '',
  licenseNumber: '',
  domain: '',
  address: '',
  intro: '',
  remark: '',
  packageId: '',
  expireTime: '',
  accountCount: 0,
  status: '0',
}
const data = reactive<PageData<TenantForm, TenantQuery>>({
    form: {...initFormData},
    queryParams: {
        pageNum: 1,
        pageSize: 10,
        tenantId: '',
        contactUserName: '',
        contactPhone: '',
        companyName: ''
    },
    rules: {
        id: [{ required: true, message: "id不能为空", trigger: "blur" }],
        tenantId: [{ required: true, message: "租户编号不能为空", trigger: "blur" }],
        contactUserName: [{ required: true, message: "联系人不能为空", trigger: "blur" }],
        contactPhone: [{ required: true, message: "联系电话不能为空", trigger: "blur" }],
        companyName: [{ required: true, message: "企业名称不能为空", trigger: "blur" }],
        username: [
            { required: true, message: "用户名不能为空", trigger: "blur" },
            { min: 2, max: 20, message: '用户名称长度必须介于 2 和 20 之间', trigger: 'blur' }
        ],
        password: [
            { required: true, message: "密码不能为空", trigger: "blur" },
            { min: 5, max: 20, message: '用户密码长度必须介于 5 和 20 之间', trigger: 'blur' }
        ]
    }
  form: { ...initFormData },
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    tenantId: '',
    contactUserName: '',
    contactPhone: '',
    companyName: ''
  },
  rules: {
    id: [{ required: true, message: "id不能为空", trigger: "blur" }],
    tenantId: [{ required: true, message: "租户编号不能为空", trigger: "blur" }],
    contactUserName: [{ required: true, message: "联系人不能为空", trigger: "blur" }],
    contactPhone: [{ required: true, message: "联系电话不能为空", trigger: "blur" }],
    companyName: [{ required: true, message: "企业名称不能为空", trigger: "blur" }],
    username: [
      { required: true, message: "用户名不能为空", trigger: "blur" },
      { min: 2, max: 20, message: '用户名称长度必须介于 2 和 20 之间', trigger: 'blur' }
    ],
    password: [
      { required: true, message: "密码不能为空", trigger: "blur" },
      { min: 5, max: 20, message: '用户密码长度必须介于 5 和 20 之间', trigger: 'blur' }
    ]
  }
});
const { queryParams, form, rules } = toRefs(data);
/** 查询所有租户套餐 */
const getTenantPackage = async () => {
    const res = await selectTenantPackage()
    packageList.value = res.data;
  const res = await selectTenantPackage()
  packageList.value = res.data;
}
/** 查询租户列表 */
const getList = async () => {
    loading.value = true;
    const res = await listTenant(queryParams.value);
    tenantList.value = res.rows;
    total.value = res.total;
    loading.value = false;
  loading.value = true;
  const res = await listTenant(queryParams.value);
  tenantList.value = res.rows;
  total.value = res.total;
  loading.value = false;
}
// 租户套餐状态修改
const handleStatusChange = async (row: TenantVO) => {
    let text = row.status === "0" ? "启用" : "停用";
    try {
        await proxy?.$modal.confirm('确认要"' + text + '""' + row.companyName + '"租户吗?');
        await changeTenantStatus(row.id, row.tenantId, row.status);
        proxy?.$modal.msgSuccess(text + "成功");
    } catch {
        row.status = row.status === "0" ? "1" : "0";
    }
  let text = row.status === "0" ? "启用" : "停用";
  try {
    await proxy?.$modal.confirm('确认要"' + text + '""' + row.companyName + '"租户吗?');
    await changeTenantStatus(row.id, row.tenantId, row.status);
    proxy?.$modal.msgSuccess(text + "成功");
  } catch {
    row.status = row.status === "0" ? "1" : "0";
  }
}
// 取消按钮
const cancel = () => {
    reset();
    dialog.visible = false;
  reset();
  dialog.visible = false;
}
// 表单重置
const reset = () => {
    form.value = {...initFormData};
    tenantFormRef.value?.resetFields();
  form.value = { ...initFormData };
  tenantFormRef.value?.resetFields();
}
/** 搜索按钮操作 */
const handleQuery = () => {
    queryParams.value.pageNum = 1;
    getList();
  queryParams.value.pageNum = 1;
  getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
    queryFormRef.value?.resetFields();
    handleQuery();
  queryFormRef.value?.resetFields();
  handleQuery();
}
// 多选框选中数据
const handleSelectionChange = (selection: TenantVO[]) => {
    ids.value = selection.map(item => item.id);
    single.value = selection.length != 1;
    multiple.value = !selection.length;
  ids.value = selection.map(item => item.id);
  single.value = selection.length != 1;
  multiple.value = !selection.length;
}
/** 新增按钮操作 */
const handleAdd = () => {
    dialog.visible = true;
    dialog.title = "添加租户";
    nextTick(() => {
        reset();
        getTenantPackage();
    })
  dialog.visible = true;
  dialog.title = "添加租户";
  nextTick(() => {
    reset();
    getTenantPackage();
  })
}
/** 修改按钮操作 */
const handleUpdate = (row?: TenantVO) => {
    loading.value = true;
    dialog.visible = true;
    dialog.title = "修改租户";
    nextTick(async () => {
        reset();
        await getTenantPackage();
        const _id = row?.id || ids.value[0];
        const res = await getTenant(_id);
        loading.value = false;
        Object.assign(form.value, res.data)
    })
  loading.value = true;
  dialog.visible = true;
  dialog.title = "修改租户";
  nextTick(async () => {
    reset();
    await getTenantPackage();
    const _id = row?.id || ids.value[0];
    const res = await getTenant(_id);
    loading.value = false;
    Object.assign(form.value, res.data)
  })
}
/** 提交按钮 */
const submitForm = () => {
    tenantFormRef.value?.validate(async (valid: boolean) => {
        if (valid) {
            buttonLoading.value = true;
            if (form.value.id) {
                await updateTenant(form.value).finally(() => buttonLoading.value = false);
            } else {
                await addTenant(form.value).finally(() => buttonLoading.value = false);
            }
            proxy?.$modal.msgSuccess("操作成功");
            dialog.visible = false;
            getList();
        }
    });
  tenantFormRef.value?.validate(async (valid: boolean) => {
    if (valid) {
      buttonLoading.value = true;
      if (form.value.id) {
        await updateTenant(form.value).finally(() => buttonLoading.value = false);
      } else {
        await addTenant(form.value).finally(() => buttonLoading.value = false);
      }
      proxy?.$modal.msgSuccess("操作成功");
      dialog.visible = false;
      getList();
    }
  });
}
/** 删除按钮操作 */
const handleDelete = async (row?: TenantVO) => {
    const _ids = row?.id || ids.value;
    await proxy?.$modal.confirm('是否确认删除租户编号为"' + _ids + '"的数据项?')
    loading.value = true;
    await delTenant(_ids).finally(() => loading.value = false);
    await getList();
    proxy?.$modal.msgSuccess("删除成功");
  const _ids = row?.id || ids.value;
  await proxy?.$modal.confirm('是否确认删除租户编号为"' + _ids + '"的数据项?')
  loading.value = true;
  await delTenant(_ids).finally(() => loading.value = false);
  await getList();
  proxy?.$modal.msgSuccess("删除成功");
}
/** 同步租户套餐按钮操作 */
const handleSyncTenantPackage = async (row: TenantVO) => {
    try {
        await proxy?.$modal.confirm('是否确认同步租户套餐租户编号为"' + row.tenantId + '"的数据项?');
        loading.value = true;
        await syncTenantPackage(row.tenantId, row.packageId);
        await getList();
        proxy?.$modal.msgSuccess("同步成功");
    } catch {return} finally {
        loading.value = false;
    }
  try {
    await proxy?.$modal.confirm('是否确认同步租户套餐租户编号为"' + row.tenantId + '"的数据项?');
    loading.value = true;
    await syncTenantPackage(row.tenantId, row.packageId);
    await getList();
    proxy?.$modal.msgSuccess("同步成功");
  } catch { return } finally {
    loading.value = false;
  }
}
/** 导出按钮操作 */
const handleExport = () => {
    proxy?.download('system/tenant/export', {
        ...queryParams.value
    }, `tenant_${new Date().getTime()}.xlsx`)
  proxy?.download('system/tenant/export', {
    ...queryParams.value
  }, `tenant_${new Date().getTime()}.xlsx`)
}
onMounted(() => {
    getList();
  getList();
})
</script>
src/views/system/tenantPackage/index.vue
@@ -61,7 +61,7 @@
        </el-table-column>
      </el-table>
      <pagination v-show="total>0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
    </el-card>
    <!-- 添加或修改租户套餐对话框 -->
src/views/system/user/index.vue
@@ -211,7 +211,7 @@
            <el-form-item label="状态">
              <el-radio-group v-model="form.status">
                <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{
                    dict.label }}</el-radio>
                  dict.label }}</el-radio>
              </el-radio-group>
            </el-form-item>
          </el-col>
@@ -317,7 +317,7 @@
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const dateRange = ref<[DateModelType, DateModelType]>(['','']);
const dateRange = ref<[DateModelType, DateModelType]>(['', '']);
const deptName = ref('');
const deptOptions = ref<DeptVO[]>([]);
const initPassword = ref('123456');
@@ -325,28 +325,28 @@
const roleOptions = ref<RoleVO[]>([]);
/*** 用户导入参数 */
const upload = reactive<ImportOption>({
    // 是否显示弹出层(用户导入)
    open: false,
    // 弹出层标题(用户导入)
    title: "",
    // 是否禁用上传
    isUploading: false,
    // 是否更新已经存在的用户数据
    updateSupport: 0,
    // 设置上传的请求头部
    headers: { Authorization: "Bearer " + getToken() },
    // 上传的地址
    url: import.meta.env.VITE_APP_BASE_API + "/system/user/importData"
  // 是否显示弹出层(用户导入)
  open: false,
  // 弹出层标题(用户导入)
  title: "",
  // 是否禁用上传
  isUploading: false,
  // 是否更新已经存在的用户数据
  updateSupport: 0,
  // 设置上传的请求头部
  headers: { Authorization: "Bearer " + getToken() },
  // 上传的地址
  url: import.meta.env.VITE_APP_BASE_API + "/system/user/importData"
})
// 列显隐信息
const columns = ref<FieldOption[]>([
    { key: 0, label: `用户编号`, visible: false },
    { key: 1, label: `用户名称`, visible: true },
    { key: 2, label: `用户昵称`, visible: true },
    { key: 3, label: `部门`, visible: true },
    { key: 4, label: `手机号码`, visible: true },
    { key: 5, label: `状态`, visible: true },
    { key: 6, label: `创建时间`, visible: true }
  { key: 0, label: `用户编号`, visible: false },
  { key: 1, label: `用户名称`, visible: true },
  { key: 2, label: `用户昵称`, visible: true },
  { key: 3, label: `部门`, visible: true },
  { key: 4, label: `手机号码`, visible: true },
  { key: 5, label: `状态`, visible: true },
  { key: 6, label: `创建时间`, visible: true }
])
@@ -356,243 +356,243 @@
const uploadRef = ref<ElUploadInstance>();
const dialog = reactive<DialogOption>({
    visible: false,
    title: ''
  visible: false,
  title: ''
});
const initFormData: UserForm = {
    userId: undefined,
    deptId: undefined,
    userName: '',
    nickName: undefined,
    password: '',
    phonenumber: undefined,
    email: undefined,
    sex: undefined,
    status: "0",
    remark: '',
    postIds: [],
    roleIds: []
  userId: undefined,
  deptId: undefined,
  userName: '',
  nickName: undefined,
  password: '',
  phonenumber: undefined,
  email: undefined,
  sex: undefined,
  status: "0",
  remark: '',
  postIds: [],
  roleIds: []
}
const data = reactive<PageData<UserForm, UserQuery>>({
    form: { ...initFormData },
    queryParams: {
        pageNum: 1,
        pageSize: 10,
        userName: '',
        phonenumber: '',
        status: '',
        deptId: ''
    },
    rules: {
        userName: [{ required: true, message: "用户名称不能为空", trigger: "blur" }, { min: 2, max: 20, message: "用户名称长度必须介于 2 和 20 之间", trigger: "blur" }],
        nickName: [{ required: true, message: "用户昵称不能为空", trigger: "blur" }],
        password: [{ required: true, message: "用户密码不能为空", trigger: "blur" }, { min: 5, max: 20, message: "用户密码长度必须介于 5 和 20 之间", trigger: "blur" }],
        email: [{ type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"] }],
        phonenumber: [{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur" }]
    }
  form: { ...initFormData },
  queryParams: {
    pageNum: 1,
    pageSize: 10,
    userName: '',
    phonenumber: '',
    status: '',
    deptId: ''
  },
  rules: {
    userName: [{ required: true, message: "用户名称不能为空", trigger: "blur" }, { min: 2, max: 20, message: "用户名称长度必须介于 2 和 20 之间", trigger: "blur" }],
    nickName: [{ required: true, message: "用户昵称不能为空", trigger: "blur" }],
    password: [{ required: true, message: "用户密码不能为空", trigger: "blur" }, { min: 5, max: 20, message: "用户密码长度必须介于 5 和 20 之间", trigger: "blur" }],
    email: [{ type: "email", message: "请输入正确的邮箱地址", trigger: ["blur", "change"] }],
    phonenumber: [{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur" }]
  }
})
const { queryParams, form, rules } = toRefs<PageData<UserForm, UserQuery>>(data)
/** 通过条件过滤节点  */
const filterNode = (value: string, data: any) => {
    if (!value) return true
    return data.label.indexOf(value) !== -1
  if (!value) return true
  return data.label.indexOf(value) !== -1
}
/** 根据名称筛选部门树 */
watchEffect(
    () => {deptTreeRef.value?.filter(deptName.value);},
    {
        flush: 'post' // watchEffect会在DOM挂载或者更新之前就会触发,此属性控制在DOM元素更新后运行
    }
  () => { deptTreeRef.value?.filter(deptName.value); },
  {
    flush: 'post' // watchEffect会在DOM挂载或者更新之前就会触发,此属性控制在DOM元素更新后运行
  }
);
/** 查询部门下拉树结构 */
const getTreeSelect = async () => {
    const res = await api.deptTreeSelect();
    deptOptions.value = res.data;
  const res = await api.deptTreeSelect();
  deptOptions.value = res.data;
};
/** 查询用户列表 */
const getList = async () => {
    loading.value = true;
    const res = await api.listUser(proxy?.addDateRange(queryParams.value, dateRange.value));
    loading.value = false;
    userList.value = res.rows;
    total.value = res.total;
  loading.value = true;
  const res = await api.listUser(proxy?.addDateRange(queryParams.value, dateRange.value));
  loading.value = false;
  userList.value = res.rows;
  total.value = res.total;
}
/** 节点单击事件 */
const handleNodeClick = (data: DeptVO) => {
    queryParams.value.deptId = data.id;
    handleQuery()
  queryParams.value.deptId = data.id;
  handleQuery()
}
/** 搜索按钮操作 */
const handleQuery = () => {
    queryParams.value.pageNum = 1
    getList()
  queryParams.value.pageNum = 1
  getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
    dateRange.value = ['','']
    queryFormRef.value?.resetFields();
    queryParams.value.pageNum = 1;
    queryParams.value.deptId = undefined;
    deptTreeRef.value?.setCurrentKey(undefined);
    handleQuery();
  dateRange.value = ['', '']
  queryFormRef.value?.resetFields();
  queryParams.value.pageNum = 1;
  queryParams.value.deptId = undefined;
  deptTreeRef.value?.setCurrentKey(undefined);
  handleQuery();
}
/** 删除按钮操作 */
const handleDelete = async (row?: UserVO) => {
    const userIds = row?.userId || ids.value;
    const [err] = await to(proxy?.$modal.confirm('是否确认删除用户编号为"' + userIds + '"的数据项?') as any);
    if (!err) {
        await api.delUser(userIds);
        await getList();
        proxy?.$modal.msgSuccess("删除成功");
    }
  const userIds = row?.userId || ids.value;
  const [err] = await to(proxy?.$modal.confirm('是否确认删除用户编号为"' + userIds + '"的数据项?') as any);
  if (!err) {
    await api.delUser(userIds);
    await getList();
    proxy?.$modal.msgSuccess("删除成功");
  }
}
/** 用户状态修改  */
const handleStatusChange = async (row: UserVO) => {
    let text = row.status === "0" ? "启用" : "停用"
    try {
        await proxy?.$modal.confirm('确认要"' + text + '""' + row.userName + '"用户吗?');
        await api.changeUserStatus(row.userId, row.status);
        proxy?.$modal.msgSuccess(text + "成功");
    } catch (err) {
        row.status = row.status === "0" ? "1" : "0";
    }
  let text = row.status === "0" ? "启用" : "停用"
  try {
    await proxy?.$modal.confirm('确认要"' + text + '""' + row.userName + '"用户吗?');
    await api.changeUserStatus(row.userId, row.status);
    proxy?.$modal.msgSuccess(text + "成功");
  } catch (err) {
    row.status = row.status === "0" ? "1" : "0";
  }
}
/** 跳转角色分配 */
const handleAuthRole = (row: UserVO) => {
    const userId = row.userId;
    router.push("/system/user-auth/role/" + userId);
  const userId = row.userId;
  router.push("/system/user-auth/role/" + userId);
}
/** 重置密码按钮操作 */
const handleResetPwd = async (row: UserVO) => {
    const [err, res] = await to(ElMessageBox.prompt('请输入"' + row.userName + '"的新密码', "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        closeOnClickModal: false,
        inputPattern: /^.{5,20}$/,
        inputErrorMessage: "用户密码长度必须介于 5 和 20 之间",
    }))
    if (!err) {
        await api.resetUserPwd(row.userId, res.value);
        proxy?.$modal.msgSuccess("修改成功,新密码是:" + res.value);
    }
  const [err, res] = await to(ElMessageBox.prompt('请输入"' + row.userName + '"的新密码', "提示", {
    confirmButtonText: "确定",
    cancelButtonText: "取消",
    closeOnClickModal: false,
    inputPattern: /^.{5,20}$/,
    inputErrorMessage: "用户密码长度必须介于 5 和 20 之间",
  }))
  if (!err) {
    await api.resetUserPwd(row.userId, res.value);
    proxy?.$modal.msgSuccess("修改成功,新密码是:" + res.value);
  }
}
/** 选择条数  */
const handleSelectionChange = (selection: UserVO[]) => {
    ids.value = selection.map((item) => item.userId);
    single.value = selection.length != 1;
    multiple.value = !selection.length;
  ids.value = selection.map((item) => item.userId);
  single.value = selection.length != 1;
  multiple.value = !selection.length;
}
/** 导入按钮操作 */
const handleImport = () => {
    upload.title = "用户导入";
    upload.open = true;
  upload.title = "用户导入";
  upload.open = true;
}
/** 导出按钮操作 */
const handleExport = () => {
    proxy?.download("system/user/export", {
        ...queryParams.value,
    }, `user_${new Date().getTime()}.xlsx`);
  proxy?.download("system/user/export", {
    ...queryParams.value,
  }, `user_${new Date().getTime()}.xlsx`);
};
/** 下载模板操作 */
const importTemplate = () => {
    proxy?.download("system/user/importTemplate", {
    }, `user_template_${new Date().getTime()}.xlsx`);
  proxy?.download("system/user/importTemplate", {
  }, `user_template_${new Date().getTime()}.xlsx`);
}
/**文件上传中处理 */
const handleFileUploadProgress = () => {
    upload.isUploading = true;
  upload.isUploading = true;
}
/** 文件上传成功处理 */
const handleFileSuccess = (response: any, file: UploadFile) => {
    upload.open = false;
    upload.isUploading = false;
    uploadRef.value?.handleRemove(file);
    ElMessageBox.alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true });
    getList();
  upload.open = false;
  upload.isUploading = false;
  uploadRef.value?.handleRemove(file);
  ElMessageBox.alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true });
  getList();
}
/** 提交上传文件 */
function submitFileForm() {
    uploadRef.value?.submit();
  uploadRef.value?.submit();
}
/** 初始化部门数据 */
const initTreeData = async () => {
    // 判断部门的数据是否存在,存在不获取,不存在则获取
    if (deptOptions.value === undefined) {
        const { data } = await treeselect();
        deptOptions.value = data;
    }
  // 判断部门的数据是否存在,存在不获取,不存在则获取
  if (deptOptions.value === undefined) {
    const { data } = await treeselect();
    deptOptions.value = data;
  }
}
/** 重置操作表单 */
const reset = () => {
    form.value = { ...initFormData };
    userFormRef.value?.resetFields();
  form.value = { ...initFormData };
  userFormRef.value?.resetFields();
}
/** 取消按钮 */
const cancel = () => {
    reset();
    dialog.visible = false;
  reset();
  dialog.visible = false;
}
/** 新增按钮操作 */
const handleAdd = () => {
    dialog.visible = true;
    dialog.title = "新增用户";
    nextTick(async () => {
        reset();
        await initTreeData();
        const { data } = await api.getUser();
        postOptions.value = data.posts;
        roleOptions.value = data.roles;
        form.value.password = initPassword.value;
    })
  dialog.visible = true;
  dialog.title = "新增用户";
  nextTick(async () => {
    reset();
    await initTreeData();
    const { data } = await api.getUser();
    postOptions.value = data.posts;
    roleOptions.value = data.roles;
    form.value.password = initPassword.value;
  })
}
/** 修改按钮操作 */
const handleUpdate = (row?: UserForm) => {
    dialog.visible = true;
    dialog.title = "修改用户";
    nextTick(async () => {
        reset();
        await initTreeData();
        const userId = row?.userId || ids.value[0]
        const { data } = await api.getUser(userId)
        Object.assign(form.value, data.user);
        postOptions.value = data.posts;
        roleOptions.value = data.roles;
        form.value.postIds = data.postIds;
        form.value.roleIds = data.roleIds;
        form.value.password = "";
    })
  dialog.visible = true;
  dialog.title = "修改用户";
  nextTick(async () => {
    reset();
    await initTreeData();
    const userId = row?.userId || ids.value[0]
    const { data } = await api.getUser(userId)
    Object.assign(form.value, data.user);
    postOptions.value = data.posts;
    roleOptions.value = data.roles;
    form.value.postIds = data.postIds;
    form.value.roleIds = data.roleIds;
    form.value.password = "";
  })
}
/** 提交按钮 */
const submitForm = () => {
    userFormRef.value?.validate(async (valid: boolean) => {
        if (valid) {
            form.value.userId ? await api.updateUser(form.value) : await api.addUser(form.value);
            proxy?.$modal.msgSuccess("操作成功");
            dialog.visible = false;
            await getList();
        }
    })
  userFormRef.value?.validate(async (valid: boolean) => {
    if (valid) {
      form.value.userId ? await api.updateUser(form.value) : await api.addUser(form.value);
      proxy?.$modal.msgSuccess("操作成功");
      dialog.visible = false;
      await getList();
    }
  })
}
@@ -600,23 +600,23 @@
 * 关闭用户弹窗
 */
const closeDialog = () => {
    dialog.visible = false;
    resetForm();
  dialog.visible = false;
  resetForm();
}
/**
 * 重置表单
 */
const resetForm = () => {
    userFormRef.value?.resetFields();
    userFormRef.value?.clearValidate();
  userFormRef.value?.resetFields();
  userFormRef.value?.clearValidate();
    form.value.id = undefined;
    form.value.status = '1';
  form.value.id = undefined;
  form.value.status = '1';
}
onMounted(() => {
    getTreeSelect() // 初始化部门数据
    getList() // 初始化列表数据
  getTreeSelect() // 初始化部门数据
  getList() // 初始化列表数据
});
</script>
src/views/system/user/profile/index.vue
@@ -70,22 +70,22 @@
const activeTab = ref("userinfo");
const state = ref<Record<string, any>>({
    user: {},
    roleGroup: '',
    postGroup: ''
  user: {},
  roleGroup: '',
  postGroup: ''
});
const userForm = ref({});
const getUser = async () => {
    const res = await getUserProfile();
    state.value.user = res.data.user;
    userForm.value = { ...res.data.user }
    state.value.roleGroup = res.data.roleGroup;
    state.value.postGroup = res.data.postGroup;
  const res = await getUserProfile();
  state.value.user = res.data.user;
  userForm.value = { ...res.data.user }
  state.value.roleGroup = res.data.roleGroup;
  state.value.postGroup = res.data.postGroup;
};
onMounted(() => {
    getUser();
  getUser();
})
</script>
src/views/tool/gen/basicInfoForm.vue
@@ -34,16 +34,16 @@
import { propTypes } from "@/utils/propTypes";
const prop = defineProps({
    info: propTypes.any.def({})
  info: propTypes.any.def({})
});
const infoForm = computed(() => prop.info)
// 表单校验
const rules = ref({
    tableName: [{ required: true, message: "请输入表名称", trigger: "blur" }],
    tableComment: [{ required: true, message: "请输入表描述", trigger: "blur" }],
    className: [{ required: true, message: "请输入实体类名称", trigger: "blur" }],
    functionAuthor: [{ required: true, message: "请输入作者", trigger: "blur" }]
  tableName: [{ required: true, message: "请输入表名称", trigger: "blur" }],
  tableComment: [{ required: true, message: "请输入表描述", trigger: "blur" }],
  className: [{ required: true, message: "请输入实体类名称", trigger: "blur" }],
  functionAuthor: [{ required: true, message: "请输入作者", trigger: "blur" }]
});
</script>
src/views/tool/gen/editTable.vue
@@ -135,8 +135,8 @@
/** 提交按钮 */
const submitForm = () => {
  const basicForm = basicInfo.value.$refs.basicInfoForm;
  const genForm = genInfo.value.$refs.genInfoForm;
  const basicForm = basicInfo.value?.$refs.basicInfoForm;
  const genForm = genInfo.value?.$refs.genInfoForm;
  Promise.all([basicForm, genForm].map(getFormPromise)).then(async res => {
    const validateResult = res.every(item => !!item);
@@ -167,7 +167,7 @@
  });
}
const close = () => {
  const obj = {path: "/tool/gen", query: {t: Date.now(), pageNum: route.query.pageNum}};
  const obj = { path: "/tool/gen", query: { t: Date.now(), pageNum: route.query.pageNum } };
  proxy?.$tab.closeOpenPage(obj);
}
src/views/tool/gen/genInfoForm.vue
@@ -246,11 +246,11 @@
// 表单校验
const rules = ref({
  tplCategory: [{required: true, message: "请选择生成模板", trigger: "blur"}],
  packageName: [{required: true, message: "请输入生成包路径", trigger: "blur"}],
  moduleName: [{required: true, message: "请输入生成模块名", trigger: "blur"}],
  businessName: [{required: true, message: "请输入生成业务名", trigger: "blur"}],
  functionName: [{required: true, message: "请输入生成功能名", trigger: "blur"}]
  tplCategory: [{ required: true, message: "请选择生成模板", trigger: "blur" }],
  packageName: [{ required: true, message: "请输入生成包路径", trigger: "blur" }],
  moduleName: [{ required: true, message: "请输入生成模块名", trigger: "blur" }],
  businessName: [{ required: true, message: "请输入生成业务名", trigger: "blur" }],
  functionName: [{ required: true, message: "请输入生成功能名", trigger: "blur" }]
});
const subSelectChange = () => {
  infoForm.value.subTableFkName = "";
src/views/tool/gen/importTable.vue
@@ -26,7 +26,7 @@
        <el-table-column prop="createTime" label="创建时间"></el-table-column>
        <el-table-column prop="updateTime" label="更新时间"></el-table-column>
      </el-table>
      <pagination v-show="total>0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
    </el-row>
    <template #footer>
      <div class="dialog-footer">
@@ -51,11 +51,11 @@
const queryFormRef = ref<ElFormInstance>();
const queryParams = reactive<DbTableQuery>({
    pageNum: 1,
    pageSize: 10,
    dataName: '',
    tableName: '',
    tableComment: ''
  pageNum: 1,
  pageSize: 10,
  dataName: '',
  tableName: '',
  tableComment: ''
});
const dataNameList = ref<Array<string>>([]);
@@ -63,53 +63,53 @@
/** 查询参数列表 */
const show = (dataName: string) => {
    getDataNameList();
    if(dataName){
      queryParams.dataName = dataName;
    } else {
      queryParams.dataName = 'master';
    }
    getList();
    visible.value = true;
  getDataNameList();
  if (dataName) {
    queryParams.dataName = dataName;
  } else {
    queryParams.dataName = 'master';
  }
  getList();
  visible.value = true;
}
/** 单击选择行 */
const clickRow = (row: DbTableVO) => {
    // ele bug
    tableRef.value?.toggleRowSelection(row);
  // ele bug
  tableRef.value?.toggleRowSelection(row);
}
/** 多选框选中数据 */
const handleSelectionChange = (selection: DbTableVO[]) => {
    tables.value = selection.map(item => item.tableName);
  tables.value = selection.map(item => item.tableName);
}
/** 查询表数据 */
const getList = async () => {
    const res = await listDbTable(queryParams);
    dbTableList.value = res.rows;
    total.value = res.total;
  const res = await listDbTable(queryParams);
  dbTableList.value = res.rows;
  total.value = res.total;
}
/** 搜索按钮操作 */
const handleQuery = () => {
    queryParams.pageNum = 1;
    getList();
  queryParams.pageNum = 1;
  getList();
}
/** 重置按钮操作 */
const resetQuery = () => {
    queryFormRef.value?.resetFields();
    handleQuery();
  queryFormRef.value?.resetFields();
  handleQuery();
}
/** 导入按钮操作 */
const handleImportTable = async () => {
    const tableNames = tables.value.join(",");
    if (tableNames == "") {
        proxy?.$modal.msgError("请选择要导入的表");
        return;
    }
    const res = await importTable({ tables: tableNames, dataName: queryParams.dataName });
    proxy?.$modal.msgSuccess(res.msg);
    if (res.code === 200) {
        visible.value = false;
        emit("ok");
    }
  const tableNames = tables.value.join(",");
  if (tableNames == "") {
    proxy?.$modal.msgError("请选择要导入的表");
    return;
  }
  const res = await importTable({ tables: tableNames, dataName: queryParams.dataName });
  proxy?.$modal.msgSuccess(res.msg);
  if (res.code === 200) {
    visible.value = false;
    emit("ok");
  }
}
/** 查询多数据源名称 */
const getDataNameList = async () => {
@@ -118,6 +118,6 @@
}
defineExpose({
    show,
  show,
});
</script>
src/views/tool/gen/index.vue
@@ -136,31 +136,31 @@
const importRef = ref<InstanceType<typeof ImportTable>>();
const queryParams = ref<TableQuery>({
    pageNum: 1,
    pageSize: 10,
    tableName: '',
    tableComment: '',
    dataName: ""
  pageNum: 1,
  pageSize: 10,
  tableName: '',
  tableComment: '',
  dataName: ""
})
const preview = ref <any>({
    data: {},
    activeName: 'domain.java'
const preview = ref<any>({
  data: {},
  activeName: 'domain.java'
})
const dialog = reactive<DialogOption>({
    visible: false,
    title: '代码预览'
  visible: false,
  title: '代码预览'
});
onActivated(() => {
    const time = route.query.t;
    if (time != null && time != uniqueId.value) {
        uniqueId.value = time as string;
        queryParams.value.pageNum = Number(route.query.pageNum);
        dateRange.value = ['', ''];
        queryFormRef.value?.resetFields();
        getList();
    }
  const time = route.query.t;
  if (time != null && time != uniqueId.value) {
    uniqueId.value = time as string;
    queryParams.value.pageNum = Number(route.query.pageNum);
    dateRange.value = ['', ''];
    queryFormRef.value?.resetFields();
    getList();
  }
})
/** 查询多数据源名称 */
@@ -171,81 +171,81 @@
/** 查询表集合 */
const getList = async () => {
    loading.value = true;
    const res = await listTable(proxy?.addDateRange(queryParams.value, dateRange.value));
    tableList.value = res.rows;
    total.value = res.total;
    loading.value = false;
  loading.value = true;
  const res = await listTable(proxy?.addDateRange(queryParams.value, dateRange.value));
  tableList.value = res.rows;
  total.value = res.total;
  loading.value = false;
}
/** 搜索按钮操作 */
const handleQuery = () => {
    queryParams.value.pageNum = 1;
    getList();
  queryParams.value.pageNum = 1;
  getList();
}
/** 生成代码操作 */
const handleGenTable = async (row?: TableVO) => {
    const tbIds = row?.tableId || ids.value;
    if (tbIds == "") {
        proxy?.$modal.msgError('请选择要生成的数据');
        return;
    }
    if (row?.genType === "1") {
        await genCode(row.tableId);
        proxy?.$modal.msgSuccess('成功生成到自定义路径:' + row.genPath);
    } else {
        proxy?.$download.zip('/tool/gen/batchGenCode?tableIdStr=' + tbIds, 'ruoyi.zip');
    }
  const tbIds = row?.tableId || ids.value;
  if (tbIds == "") {
    proxy?.$modal.msgError('请选择要生成的数据');
    return;
  }
  if (row?.genType === "1") {
    await genCode(row.tableId);
    proxy?.$modal.msgSuccess('成功生成到自定义路径:' + row.genPath);
  } else {
    proxy?.$download.zip('/tool/gen/batchGenCode?tableIdStr=' + tbIds, 'ruoyi.zip');
  }
}
/** 同步数据库操作 */
const handleSynchDb = async (row: TableVO) => {
    const tableId = row.tableId;
    await proxy?.$modal.confirm('确认要强制同步"' + row.tableName + '"表结构吗?');
    await synchDb(tableId);
    proxy?.$modal.msgSuccess('同步成功');
  const tableId = row.tableId;
  await proxy?.$modal.confirm('确认要强制同步"' + row.tableName + '"表结构吗?');
  await synchDb(tableId);
  proxy?.$modal.msgSuccess('同步成功');
}
/** 打开导入表弹窗 */
const openImportTable = () => {
    importRef.value.show(queryParams.value.dataName);
  importRef.value?.show(queryParams.value.dataName);
}
/** 重置按钮操作 */
const resetQuery = () => {
    dateRange.value = ['', ''];
    queryFormRef.value?.resetFields();
    handleQuery();
  dateRange.value = ['', ''];
  queryFormRef.value?.resetFields();
  handleQuery();
}
/** 预览按钮 */
const handlePreview = async (row: TableVO) => {
    const res = await previewTable(row.tableId);
    preview.value.data = res.data;
    dialog.visible = true;
    preview.value.activeName = 'domain.java';
  const res = await previewTable(row.tableId);
  preview.value.data = res.data;
  dialog.visible = true;
  preview.value.activeName = 'domain.java';
}
/** 复制代码成功 */
const copyTextSuccess = () => {
    proxy?.$modal.msgSuccess('复制成功');
  proxy?.$modal.msgSuccess('复制成功');
}
// 多选框选中数据
const handleSelectionChange = (selection: TableVO[]) => {
    ids.value = selection.map(item => item.tableId);
    single.value = selection.length != 1;
    multiple.value = !selection.length;
  ids.value = selection.map(item => item.tableId);
  single.value = selection.length != 1;
  multiple.value = !selection.length;
}
/** 修改按钮操作 */
const handleEditTable = (row?: TableVO) => {
    const tableId = row?.tableId || ids.value[0];
    router.push({ path: '/tool/gen-edit/index/' + tableId, query: { pageNum: queryParams.value.pageNum } });
  const tableId = row?.tableId || ids.value[0];
  router.push({ path: '/tool/gen-edit/index/' + tableId, query: { pageNum: queryParams.value.pageNum } });
}
/** 删除按钮操作 */
const handleDelete = async (row?: TableVO) => {
    const tableIds = row?.tableId || ids.value;
    await proxy?.$modal.confirm('是否确认删除表编号为"' + tableIds + '"的数据项?');
    await delTable(tableIds);
    getList();
    proxy?.$modal.msgSuccess('删除成功');
  const tableIds = row?.tableId || ids.value;
  await proxy?.$modal.confirm('是否确认删除表编号为"' + tableIds + '"的数据项?');
  await delTable(tableIds);
  getList();
  proxy?.$modal.msgSuccess('删除成功');
}
onMounted(() => {
    getList();
    getDataNameList();
  getList();
  getDataNameList();
})
</script>